/************************************************************************ * Name: fts_debug_read * Brief:interface of read proc * Input: point to the data, no use, no use, read len, no use, no use * Output: page point to data * Return: read char number ***********************************************************************/ static ssize_t fts_debug_read(struct file *filp, char __user *buff, size_t count, loff_t *ppos) { int ret = 0; int num_read_chars = 0; int readlen = 0; u8 regvalue = 0x00, regaddr = 0x00; unsigned char buf[READ_BUF_SIZE]; switch (proc_operate_mode) { case PROC_UPGRADE: //after calling fts_debug_write to upgrade regaddr = 0xA6; ret = fts_read_reg(fts_i2c_client, regaddr, ®value); if (ret < 0) num_read_chars = sprintf(buf, "%s", "get fw version failed.\n"); else num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue); break; case PROC_READ_REGISTER: readlen = 1; ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); if (ret < 0) { dev_err(&fts_i2c_client->dev, "%s:read iic error\n", __func__); return ret; } num_read_chars = 1; break; case PROC_READ_DATA: readlen = count; ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); if (ret < 0) { dev_err(&fts_i2c_client->dev, "%s:read iic error\n", __func__); return ret; } num_read_chars = readlen; break; case PROC_WRITE_DATA: break; default: break; } if (copy_to_user(buff, buf, num_read_chars)) { dev_err(&fts_i2c_client->dev, "%s:copy to user error\n", __func__); return -EFAULT; } return num_read_chars; }
/************************************************************************ * Name: fts_debug_read * Brief:interface of read proc * Input: point to the data, no use, no use, read len, no use, no use * Output: page point to data * Return: read char number ***********************************************************************/ static int fts_debug_read( char *page, char **start, off_t off, int count, int *eof, void *data ) { int ret = 0; unsigned char buf[READ_BUF_SIZE]; int num_read_chars = 0; int readlen = 0; u8 regvalue = 0x00, regaddr = 0x00; switch (proc_operate_mode) { case PROC_UPGRADE: //after calling fts_debug_write to upgrade regaddr = 0xA6; ret = fts_read_reg(fts_i2c_client, regaddr, ®value); if (ret < 0) num_read_chars = sprintf(buf, "%s", "get fw version failed.\n"); else num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue); break; case PROC_READ_REGISTER: readlen = 1; ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); if (ret < 0) { dev_err(&fts_i2c_client->dev, "%s:read iic error\n", __func__); return ret; } num_read_chars = 1; break; case PROC_READ_DATA: readlen = count; ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); if (ret < 0) { dev_err(&fts_i2c_client->dev, "%s:read iic error\n", __func__); return ret; } num_read_chars = readlen; break; case PROC_WRITE_DATA: break; default: break; } memcpy(page, buf, num_read_chars); return num_read_chars; }
/************************************************************************ * Name: fts_read_Gestruedata * Brief: read data from TP register * Input: no * Output: no * Return: fail <0 ***********************************************************************/ int fts_read_Gestruedata(void) { unsigned char buf[FTS_GESTRUE_POINTS * 3] = { 0 }; int ret = -1; int i = 0; int gestrue_id = 0; buf[0] = 0xd3; pointnum = 0; ret = fts_i2c_read(fts_i2c_client, buf, 1, buf, FTS_GESTRUE_POINTS_HEADER); /*printk( "tpd read FTS_GESTRUE_POINTS_HEADER.\n");*/ if (ret < 0) { printk("%s read touchdata failed.\n", __func__); return ret; } /* FW */ if (fts_updateinfo_curr.CHIP_ID == 0x54 || fts_updateinfo_curr.CHIP_ID == 0x58) { gestrue_id = buf[0]; pointnum = (short)(buf[1]) & 0xff; buf[0] = 0xd3; if ((pointnum * 4 + 8) < 255) { ret = fts_i2c_read(fts_i2c_client, buf, 1, buf, (pointnum * 4 + 8)); } else { ret = fts_i2c_read(fts_i2c_client, buf, 1, buf, 255); ret = fts_i2c_read(fts_i2c_client, buf, 0, buf + 255, (pointnum * 4 + 8) - 255); } if (ret < 0) { printk("%s read touchdata failed.\n", __func__); return ret; } fts_check_gesture(fts_input_dev, gestrue_id); for (i = 0; i < pointnum; i++) { coordinate_x[i] = (((s16) buf[0 + (4 * i)]) & 0x0F) << 8 | (((s16) buf[1 + (4 * i)]) & 0xFF); coordinate_y[i] = (((s16) buf[2 + (4 * i)]) & 0x0F) << 8 | (((s16) buf[3 + (4 * i)]) & 0xFF); } return -1; } /*other IC's gestrue in driver*/ if (0x24 == buf[0]) { gestrue_id = 0x24; fts_check_gesture(fts_input_dev, gestrue_id); printk("%d check_gesture gestrue_id.\n", gestrue_id); return -1; } pointnum = (short)(buf[1]) & 0xff; buf[0] = 0xd3; if ((pointnum * 4 + 8) < 255) { ret = fts_i2c_read(fts_i2c_client, buf, 1, buf, (pointnum * 4 + 8)); } else { ret = fts_i2c_read(fts_i2c_client, buf, 1, buf, 255); ret = fts_i2c_read(fts_i2c_client, buf, 0, buf + 255, (pointnum * 4 + 8) - 255); } if (ret < 0) { printk("%s read touchdata failed.\n", __func__); return ret; } gestrue_id = fetch_object_sample(buf, pointnum); fts_check_gesture(fts_input_dev, gestrue_id); printk("%d read gestrue_id.\n", gestrue_id); for (i = 0; i < pointnum; i++) { coordinate_x[i] = (((s16) buf[0 + (4 * i)]) & 0x0F) << 8 | (((s16) buf[1 + (4 * i)]) & 0xFF); coordinate_y[i] = (((s16) buf[2 + (4 * i)]) & 0x0F) << 8 | (((s16) buf[3 + (4 * i)]) & 0xFF); } return -1; }