int get_module_id() { char read_num = 0; int ret = 0, verdor_id = 0,id = 0; ret = fts_read_reg(i2c_client,FTS_REG_VENDOR_ID,&verdor_id); TPD_DMESG("fts ret = %d ,verdor_id = 0x%x.\n",ret,verdor_id); while(ret != 1 && read_num < 5) { ret = fts_read_reg(i2c_client,FTS_REG_VENDOR_ID,&verdor_id); read_num++; } TPD_DMESG("fts ret = %d ,verdor_id = 0x%x.\n",ret,verdor_id); switch(verdor_id) { case MODULE_ID0: id = 0; break; case MODULE_ID1: id = 1; break; case MODULE_ID2: id = 2; break; case MODULE_ID3: id = 3; break; case MODULE_ID4: id = 4; break; default: id = 8; break; } return id; }
/************************************************************************ * Name: fts_tprwreg_store * Brief: read/write register * Input: device, device attribute, char buf, char count * Output: print register value * Return: char count ***********************************************************************/ static ssize_t fts_tprwreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct i2c_client *client = container_of(dev, struct i2c_client, dev); ssize_t num_read_chars = 0; int retval; long unsigned int wmreg=0; u8 regaddr=0xff,regvalue=0xff; u8 valbuf[5]={0}; memset(valbuf, 0, sizeof(valbuf)); mutex_lock(&fts_input_dev->mutex); num_read_chars = count - 1; if (num_read_chars != 2) { if (num_read_chars != 4) { dev_err(dev, "please input 2 or 4 character\n"); goto error_return; } } memcpy(valbuf, buf, num_read_chars); retval = strict_strtoul(valbuf, 16, &wmreg); if (0 != retval) { dev_err(dev, "%s() - ERROR: Could not convert the given input to a number. The given input was: \"%s\"\n", __FUNCTION__, buf); goto error_return; } if (2 == num_read_chars) { /*read register*/ regaddr = wmreg; printk("[focal][test](0x%02x)\n", regaddr); if (fts_read_reg(client, regaddr, ®value) < 0) printk("[Focal] %s : Could not read the register(0x%02x)\n", __func__, regaddr); else printk("[Focal] %s : the register(0x%02x) is 0x%02x\n", __func__, regaddr, regvalue); } else { regaddr = wmreg>>8; regvalue = wmreg; if (fts_write_reg(client, regaddr, regvalue)<0) dev_err(dev, "[Focal] %s : Could not write the register(0x%02x)\n", __func__, regaddr); else dev_dbg(dev, "[Focal] %s : Write 0x%02x into register(0x%02x) successful\n", __func__, regvalue, regaddr); } error_return: mutex_unlock(&fts_input_dev->mutex); return count; }
/************************************************************************ * 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_tpfwver_show * Brief: show tp fw vwersion * Input: device, device attribute, char buf * Output: no * Return: char number ***********************************************************************/ static ssize_t fts_tpfwver_show(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t num_read_chars = 0; u8 fwver = 0; mutex_lock(&fts_input_dev->mutex); if (fts_read_reg(fts_i2c_client, FTS_REG_FW_VER, &fwver) < 0) { mutex_unlock(&fts_input_dev->mutex); return -1; } if (fwver == 255) num_read_chars = snprintf(buf, 128,"get tp fw version fail!\n"); else { num_read_chars = snprintf(buf, 128, "%02X\n", fwver); } mutex_unlock(&fts_input_dev->mutex); return num_read_chars; }