unsigned int max_x;
unsigned int max_y;
+ u32 info_csum;
u32 config_csum;
/* Cached parameters from object table */
int i;
u8 reportid;
u8 buf[data->info.object_num][MXT_OBJECT_SIZE];
+ u8 csum[3];
data->object_table = kcalloc(data->info.object_num,
sizeof(struct mxt_object), GFP_KERNEL);
if (error)
return error;
- /* Vaild Report IDs start counting from 1. */
+ /*
+ * Read Information Block checksum from 3 bytes immediately following
+ * info block
+ */
+ error = mxt_read_reg(client, MXT_OBJECT_START + sizeof(buf),
+ sizeof(csum), csum);
+ if (error)
+ return error;
+
+ data->info_csum = csum[0] | (csum[1] << 8) | (csum[2] << 16);
+ dev_info(dev, "Information Block Checksum = %06x\n", data->info_csum);
+
+ /* Valid Report IDs start counting from 1 */
reportid = 1;
for (i = 0; i < data->info.object_num; i++) {
struct mxt_object *object = &data->object_table[i];
info->family_id, info->variant_id);
}
+static ssize_t mxt_info_csum_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct mxt_data *data = dev_get_drvdata(dev);
+ return scnprintf(buf, PAGE_SIZE, "%06x\n", data->info_csum);
+}
+
static ssize_t mxt_object_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
static DEVICE_ATTR(config_csum, S_IRUGO, mxt_config_csum_show, NULL);
static DEVICE_ATTR(fw_version, S_IRUGO, mxt_fw_version_show, NULL);
static DEVICE_ATTR(hw_version, S_IRUGO, mxt_hw_version_show, NULL);
+static DEVICE_ATTR(info_csum, S_IRUGO, mxt_info_csum_show, NULL);
static DEVICE_ATTR(object, S_IRUGO | S_IWUSR, mxt_object_show,
mxt_object_store);
static DEVICE_ATTR(update_fw, S_IWUSR, NULL, mxt_update_fw_store);
&dev_attr_config_csum.attr,
&dev_attr_fw_version.attr,
&dev_attr_hw_version.attr,
+ &dev_attr_info_csum.attr,
&dev_attr_object.attr,
&dev_attr_update_fw.attr,
NULL