全部博文(478)
分类: Android平台
2018-03-05 17:06:06
原文地址:TP驱动分析(下) 作者:jerry20000
三,如何上报数据的?fts_work_func
点击(此处)折叠或打开
可以看到fts_work_func直接调用了fts_read_data()函数。
下面具体分析fts_read_data()函数:
点击(此处)折叠或打开
NOTE1: buf[0] = 3 + k*6
为什么要这样写?
先来看datasheet吧。
当K=0时,buf[0] = 3; 先从03h这里读取x,y的坐标;
当K=1时,buf[0] = 9; 从09h这里读取x,y的坐标;
……
NOTE2: ret=fts_i2c_rxdata(buf, 6);
追踪一下代码,不难发现调用过程是这样的:
fts_i2c_rxdata(u8 *rxdata, int length)
----> i2c_transfer(this_client->adapter, &msg, 1)
--------> adap->algo->master_xfer(adap, msgs, num);
//在这里其实就是imap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num);
再回到fts_i2c_rxdata(buf, 6)函数,其代码贴出如下:
static int fts_i2c_rxdata(u8 *rxdata, int length)
{
struct i2c_msg msg;
msg.addr = this_client->addr;
msg.flags = 0;
msg.len = 1;
msg.buf = rxdata;
ret = i2c_transfer(this_client->adapter, &msg, 1);
msg.addr = this_client->addr;
msg.flags = I2C_M_RD;
msg.len = length;
msg.buf = rxdata;
ret = i2c_transfer(this_client->adapter, &msg, 1);
}//省略了一些语句。
上面可以看到i2c_transfer被调用了两次,也就是执行了两次的i2c读/写过程。为什么要这样呢?
第一个i2c_msg 数据结构完成写操作,写入的数值为待读出的寄存器编号;第二个i2c_msg 数据结
构完成读操作,从先前指定的寄存器中读出数据。即一次完整的读操作其实是要先进行写、再进行读的。
NOTE3: id = buf[2]>>4;
如果k=0,即从触摸IC寄存器的03h处开始读数据到buf中,那么这里的buf[2]即是05h,即:
buf[2]>>4,即可取buf的第4位到最高位的数据,即取出Touch ID,它表示第几个触摸点。(注意这里定义的buf是int 类型,故buf是32bit, 高16位在这里用不到。)
NOTE4: touch_event = buf[0]>>6;
按上面的分析可以知道,buf[0]其实是对应着03h,帮把buf[0]右移6位,即对应着第一个点的Event Flag。