管理提醒: 本帖被 xoom 执行加亮操作(2012-11-12)
想要了解一下 Touchanel 这部分的内容,手上刚好有 tiny210v2 这个开发板,于是想弄清楚这个板子是怎么实现的。
之前在论坛里发信问过 友善是否可以开源这个部分,但得到的答复是 “板子是定制的,暂不开源”。
通过确认 tinyv210 v2 这个板子使用的 goodix 公司的 GT801 的这个芯片,
在网上想查找一下 GT801 的 datasheet 也找不到,因此无法确认 I2C 通信部分的协议,也就是I2C某个寄存器是什么意思。
在 http://www.goodix.com/technical-support/download/ 可以看到 GT818 芯片的一些信息。
包括移植方法,以及 I2C 通信相关协议。 但 GT818 这个部分似乎和后来确认的 GT810 的 I2C 通信 不一致。
在光盘目录的: Android/rootfs_android4.0.3-20121017.tar.gz
这个根文件系统中的 rootfs_android4.0.3/system/lib/modules/3.0.8-FriendlyARM/kernel/drivers/input/touchscreen 目录中
可以找到针对 3.0.8 kernel 的驱动模块: goodix_touch.ko
------------------------------------------------------------------------
这个文件是 ELF 文件,虽然没有调试符号,但也可以通过 readelf 获取这个文件中的符号,也就是全局变量啊, 全局函数啊,静态函数之类的,
也能够获取到一部分信息包括 调用过 哪些全局函数。
readelf -s goodix_touch.ko
Symbol table '.symtab' contains 84 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 SECTION LOCAL DEFAULT 1
2: 00000000 0 SECTION LOCAL DEFAULT 3
3: 00000000 0 SECTION LOCAL DEFAULT 5
4: 00000000 0 SECTION LOCAL DEFAULT 19
5: 00000000 0 SECTION LOCAL DEFAULT 21
6: 00000000 0 SECTION LOCAL DEFAULT 22
7: 00000000 0 SECTION LOCAL DEFAULT 23
8: 00000000 0 SECTION LOCAL DEFAULT 27
9: 00000000 184 FUNC LOCAL DEFAULT 1 goodix_ts_remove
10: 000000b8 144 FUNC LOCAL DEFAULT 1 goodix_ts_power
11: 0000027c 152 FUNC LOCAL DEFAULT 1 goodix_ts_late_resume
12: 00000314 188 FUNC LOCAL DEFAULT 1 goodix_ts_early_suspend
13: 000003d0 88 FUNC LOCAL DEFAULT 1 goodix_ts_timer_func
14: 00000428 48 FUNC LOCAL DEFAULT 1 goodix_ts_irq_handler
15: 00000000 0 NOTYPE LOCAL DEFAULT 27 .LANCHOR2
16: 00000458 1664 FUNC LOCAL DEFAULT 1 goodix_ts_probe
17: 00000ad8 1012 FUNC LOCAL DEFAULT 1 goodix_ts_work_func
18: 00000000 0 SECTION LOCAL DEFAULT 7
19: 00000000 0 SECTION LOCAL DEFAULT 8
20: 00000000 0 SECTION LOCAL DEFAULT 10
21: 00000000 0 SECTION LOCAL DEFAULT 11
22: 00000000 0 SECTION LOCAL DEFAULT 13
23: 00000000 0 SECTION LOCAL DEFAULT 14
24: 00000000 0 SECTION LOCAL DEFAULT 16
25: 00000000 0 SECTION LOCAL DEFAULT 17
26: 00000000 0 SECTION LOCAL DEFAULT 20
27: 00000000 0 SECTION LOCAL DEFAULT 25
28: 00000000 0 SECTION LOCAL DEFAULT 28
29: 00000000 0 SECTION LOCAL DEFAULT 29
30: 00000000 0 SECTION LOCAL DEFAULT 30
31: 00000000 0 NOTYPE GLOBAL DEFAULT UND input_allocate_device
32: 00000000 0 NOTYPE GLOBAL DEFAULT UND free_irq
33: 00000000 0 NOTYPE GLOBAL DEFAULT UND dev_get_drvdata
34: 00000004 4 OBJECT GLOBAL DEFAULT 27 i2c_connect_client
35: 00000000 312 OBJECT GLOBAL DEFAULT 25 __this_module
36: 00000000 0 NOTYPE GLOBAL DEFAULT UND __aeabi_unwind_cpp_pr0
37: 00000000 0 NOTYPE GLOBAL DEFAULT UND dev_warn
38: 00000000 0 NOTYPE GLOBAL DEFAULT UND unregister_early_suspend
39: 00000000 0 NOTYPE GLOBAL DEFAULT UND __gpio_get_value
40: 00000000 0 NOTYPE GLOBAL DEFAULT UND hrtimer_init
41: 00000000 44 FUNC GLOBAL DEFAULT 5 cleanup_module
42: 00000000 0 NOTYPE GLOBAL DEFAULT UND input_unregister_device
43: 00000000 0 NOTYPE GLOBAL DEFAULT UND memcpy
44: 00000000 0 NOTYPE GLOBAL DEFAULT UND kfree
45: 00000000 0 NOTYPE GLOBAL DEFAULT UND enable_irq
46: 00000000 0 NOTYPE GLOBAL DEFAULT UND gpio_free
47: 00000000 0 NOTYPE GLOBAL DEFAULT UND s3c_gpio_cfgpin
48: 00000000 124 FUNC GLOBAL DEFAULT 3 init_module
49: 00000000 0 NOTYPE GLOBAL DEFAULT UND input_free_device
50: 00000000 0 NOTYPE GLOBAL DEFAULT UND hrtimer_start
51: 00000000 0 NOTYPE GLOBAL DEFAULT UND input_register_device
52: 00000000 0 NOTYPE GLOBAL DEFAULT UND __gpio_to_irq
53: 00000000 0 NOTYPE GLOBAL DEFAULT UND kmem_cache_alloc
54: 00000000 0 NOTYPE GLOBAL DEFAULT UND mini210_get_ctp
55: 00000000 0 NOTYPE GLOBAL DEFAULT UND _dev_info
56: 00000000 0 NOTYPE GLOBAL DEFAULT UND dev_notice
57: 00000000 0 NOTYPE GLOBAL DEFAULT UND i2c_register_driver
58: 00000000 0 NOTYPE GLOBAL DEFAULT UND flush_workqueue
59: 00000000 4 OBJECT GLOBAL DEFAULT 23 s3c_ts_name
60: 00000000 0 NOTYPE GLOBAL DEFAULT UND request_threaded_irq
61: 00000000 0 NOTYPE GLOBAL DEFAULT UND destroy_workqueue
62: 00000000 0 NOTYPE GLOBAL DEFAULT UND gpio_direction_output
63: 00000000 0 NOTYPE GLOBAL DEFAULT UND printk
64: 00000000 0 NOTYPE GLOBAL DEFAULT UND dev_err
65: 00000000 0 NOTYPE GLOBAL DEFAULT UND gpio_direction_input
66: 00000000 0 NOTYPE GLOBAL DEFAULT UND register_early_suspend
67: 00000000 0 NOTYPE GLOBAL DEFAULT UND __memzero
68: 00000000 0 NOTYPE GLOBAL DEFAULT UND input_event
69: 00000000 0 NOTYPE GLOBAL DEFAULT UND input_set_abs_params
70: 00000000 0 NOTYPE GLOBAL DEFAULT UND s3c_gpio_setpull
71: 00000000 0 NOTYPE GLOBAL DEFAULT UND __gpio_set_value
72: 00000000 0 NOTYPE GLOBAL DEFAULT UND queue_work
73: 00000000 0 NOTYPE GLOBAL DEFAULT UND cancel_work_sync
74: 00000000 0 NOTYPE GLOBAL DEFAULT UND gpio_request
75: 00000000 0 NOTYPE GLOBAL DEFAULT UND i2c_transfer
76: 00000000 0 NOTYPE GLOBAL DEFAULT UND hrtimer_cancel
77: 00000000 0 NOTYPE GLOBAL DEFAULT UND i2c_del_driver
78: 00000000 0 NOTYPE GLOBAL DEFAULT UND disable_irq_nosync
79: 00000000 0 NOTYPE GLOBAL DEFAULT UND __alloc_workqueue_key
80: 00000000 0 NOTYPE GLOBAL DEFAULT UND dev_set_drvdata
81: 00000000 0 NOTYPE GLOBAL DEFAULT UND msleep
82: 00000000 0 NOTYPE GLOBAL DEFAULT UND kmalloc_caches
83: 00000000 0 NOTYPE GLOBAL DEFAULT UND disable_irq
通过上面的符号表,可以看到内部的一些函数情况,其中一些标志行的函数
goodix_ts_remove
goodix_ts_power
goodix_ts_late_resume
goodix_ts_early_suspend
goodix_ts_timer_func
goodix_ts_irq_handler
和网上能够找到的一个针对 android 的 goodix 的驱动源代码具有很大的一致性。
https://bitbucket.org/paulobrien/android_kernel_andypad/src/4c6b4f4c48d1/drivers/input/touchscreen/goodix_touch.c?at=master
------------------------------------------------------------------------
看了一下 android 中的这个驱动,
其运作方式和 http://www.goodix.com/technical-support/download/ 提供的文档的工作方式很相似,
大概是 先进行初始化, 然后读取版本等信息, 最后开始扫描触摸信息。
I2C 通信中, slave 是不可以直接将数据发送给 master的。所以如果有数据需要传送,可以通过 GPIO 中断告诉 master 有数据了。
触摸信息如果会通过 GPIO 的 Interrupt 进行触发,则在终端中启动 任务队列,在任务队列中读取 I2C 数据。
如果 GPIO 的 Interrupt 不可用,则启动定周期 timer 处理, 定周期去读取 I2C 数据。
------------------------------------------------------------------------
在 GT818 的文档中,有 I2C 通信部分的协议, 只是可以参考 GT818 的协议去理解 GT801 的实现。
写数据:
START-AddressW-ACK-RegisterH-ACK-RegisterL-ACK-DATA1-ACK-DATA2-ACK-XXXXXXXXX-DATAn-ACK-END
读数据:
START-AddressR-ACK-RegisterH-ACK-RegisterL-ACK-END-START-DATA1-ACK-DATA2-ACK-XXXXXXXXX-DATAn-ACK-END
除了 START / ACK / END 其他字段都是一个字节,也就是:
Register 是 2 个字节。
比如:
RegAddr Dir Name Data
0x06A2 : R/W : Sen_CH0 : 触摸屏 1 号感应线对应的 IC 感应线
如果使用内核的I2C 通信, 写数据的话,可以只是一次写操作就可以。
而读数据则需要先写Register,然后再读数据。
------------------------------------------------------------------------
可以使用 i2c_transfer 这个函数在第一调用中进行发送和读取的功能,看下面的代码就能很清楚:
/*Function as i2c_master_send */
static int i2c_read_bytes(struct i2c_client *client, uint8_t *buf, int len)
{
struct i2c_msg msgs[2];
int ret=-1;
//发送写地址
msgs[0].flags=!I2C_M_RD;//写消息
msgs[0].addr=client->addr;
msgs[0].len=1;
msgs[0].buf=&buf[0];
//接收数据
msgs[1].flags=I2C_M_RD;//读消息
msgs[1].addr=client->addr;
msgs[1].len=len-1;
msgs[1].buf=&buf[1];
ret=i2c_transfer(client->adapter,msgs,2);
return ret;
}
------------------------------------------------------------------------
由于找不到 GT801 的手册,又想要看看 tinyv210 v2 的 GT801 的 I2C 数据到底是什么样子的。
就只能修改了一下 i2c_transfer 这个函数,将所有 I2C 通信的 数据打印出来了,
当然如果有 硬件的 I2C Monitor 的话,也可以直接将 SCL SDA 两根线引出来,看 I2C BUS 上的数据。
int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{
unsigned long orig_jiffies;
int ret, try, cnt, tst;
/* REVISIT the fault reporting model here is weak:
*
* - When we get an error after receiving N bytes from a slave,
* there is no way to report "N".
*
* - When we get a NAK after transmitting N bytes to a slave,
* there is no way to report "N" ... or to let the master
* continue executing the rest of this combined message, if
* that's the appropriate response.
*
* - When for example "num" is two and we successfully complete
* the first message but get an error part way through the
* second, it's unclear whether that should be reported as
* one (discarding status on the second message) or errno
* (discarding status on the first one).
*/
if (adap->algo->master_xfer) {
#ifdef DEBUG
for (ret = 0; ret < num; ret++) {
dev_dbg(&adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
"len=%d%s\n", ret, (msgs[ret].flags & I2C_M_RD)
? 'R' : 'W', msgs[ret].addr, msgs[ret].len,
(msgs[ret].flags & I2C_M_RECV_LEN) ? "+" : "");
}
#endif
if (in_atomic() || irqs_disabled()) {
ret = i2c_trylock_adapter(adap);
if (!ret)
/* I2C activity is ongoing. */
return -EAGAIN;
} else {
i2c_lock_adapter(adap);
}
/* Retry automatically on arbitration loss */
orig_jiffies = jiffies;
for (ret = 0, try = 0; try <= adap->retries; try++) {
ret = adap->algo->master_xfer(adap, msgs, num);
if (ret != -EAGAIN)
break;
if (time_after(jiffies, orig_jiffies + adap->timeout))
break;
}
i2c_unlock_adapter(adap);
//FIXME
//modified for debug log i2c transfering data
for (tst= 0; tst< num; tst++) {
printk("master_xfer[%d] %c, addr=0x%02x, "
"len=%d%s\n", tst, (msgs[tst].flags & I2C_M_RD)
? 'R' : 'W', msgs[tst].addr, msgs[tst].len,
(msgs[tst].flags & I2C_M_RECV_LEN) ? "+" : "", "\n");
printk( "data=[" );
for( cnt=0; cnt< msgs[tst].len; cnt++ ){
printk( "%02x ", msgs[tst].buf[cnt] );
}
printk( "]\n" );
}
return ret;
} else {
dev_dbg(&adap->dev, "I2C level transfers not supported\n");
return -EOPNOTSUPP;
}
}
------------------------------------------------------------------------
这是将模块插入 内核时候的 I2C 数据,
当 master_xfer[0] -> ...... -> master_xfer[N] -> ...... -> master_xfer[0] 的时候,
说明一次 GT801 的 I2C 通信完成。
因为 GT818 的 I2C 通信中,做多的就一次写然后一次读,因此我认为 GT801 也是一样,
N 最多就是 0 和 1。
当 master_xfer[0] 并且是 W 的时候, len 总是 1,这个应该是在写 GT801 的 Register,
下面的这2条log, 我认为 addr=0x55 是 GT801 的 I2C slave address.
data=[00 ] 就是 register。
[ 432.717502] master_xfer[0] W, addr=0x55, len=1
[ 432.717540] data=[00 ]
难道 GT818 的 Register 是 2 bytes,而 GT801 只有 1 byte 吗?
下面的 log中, 我的理解是:
[ 432.723618] 这条数据是 写给 GT801 的 配置信息?
[ 432.872429] 这条数据是 读取 GT801 内部的版本信息。
47 54 38 30 31 5f 31 52 30 38 5f 32 30 31 31 31 32 31 35 30 31 5f 47 6f 6f 64 69 78 5f 54 65 63 68
就是: GT801_1R08_2011121501_Goodix_Tech
在 tiny210 v2 板子上,如果想要 hack 一个驱动,应该可以参考 log 中的 设置参数,以及读取寄存器的 地址吧。
------------------------------------------------------------------------
[root@FA-HF src]# insmod goodix_touch.ko
[ 432.717502] master_xfer[0] W, addr=0x55, len=1
[ 432.717540] data=[00 ]
[ 432.718792] input: goodix_ts_80x as /devices/virtual/input/input4
[ 432.723575] master_xfer[0] W, addr=0x55, len=54
[ 432.723618] data=[30 0f 05 06 28 02 14 14 10 28 b2 01 e0 03 20 ed cb a9 87 65 43 21 00 00 00 00 00 4d c1 20 01 01 41 64 3c 1e 28 0e 00 00 00 00 50 3c 32 71 00 00 00 00 00 00 00 01 ]
[ 432.761103] master_xfer[0] W, addr=0x55, len=1
[ 432.761143] data=[00 ]
[ 432.761170] master_xfer[1] R, addr=0x55, len=34
[ 432.761207] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 432.787651] master_xfer[0] W, addr=0x55, len=2
[ 432.787689] data=[69 ff ]
[ 432.792848] master_xfer[0] W, addr=0x55, len=1
[ 432.792887] data=[00 ]
[ 432.792912] master_xfer[1] R, addr=0x55, len=34
[ 432.792950] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 432.808599] master_xfer[0] W, addr=0x55, len=1
[ 432.808637] data=[00 ]
[ 432.808663] master_xfer[1] R, addr=0x55, len=34
[ 432.808701] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 432.824351] master_xfer[0] W, addr=0x55, len=1
[ 432.824389] data=[00 ]
[ 432.824414] master_xfer[1] R, addr=0x55, len=34
[ 432.828058] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 432.840384] master_xfer[0] W, addr=0x55, len=1
[ 432.843408] data=[00 ]
[ 432.845727] master_xfer[1] R, addr=0x55, len=34
[ 432.850246] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 432.861250] master_xfer[0] W, addr=0x55, len=1
[ 432.865593] data=[6a ]
[ 432.867911] master_xfer[1] R, addr=0x55, len=39
[ 432.872429] data=[47 54 38 30 31 5f 31 52 30 38 5f 32 30 31 31 31 32 31 35 30 31 5f 47 6f 6f 64 69 78 5f 54 65 63 68 20 20 20 20 20 20 ]
[ 432.885687] master_xfer[0] W, addr=0x55, len=1
[ 432.889064] data=[00 ]
[ 432.891396] master_xfer[1] R, addr=0x55, len=34
[ 432.895915] gt80x-ts 2-0055: GT80X Version: GT801_1R08_2011121501_Goodix_Tech
[ 432.903537] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 master_xfer[0] W, addr=0x55, len=2
[ 432.912639] 00 00 63 2f 63 3a 63 c4 00 00 data=[69 00 ]
[ 432.917824] 00 00 00 00 00 00 00 86 ]
[ 432.922885] master_xfer[0] W, addr=0x55, len=1
[ 432.925894] data=[00 ]
[ 432.928235] master_xfer[1] R, addr=0x55, len=34
[ 432.932740] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 433.413004] master_xfer[0] W, addr=0x55, len=1
[ 433.413046] data=[00 ]
[ 433.413073] master_xfer[1] R, addr=0x55, len=34
[ 433.413110] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 433.427442] master_xfer[0] W, addr=0x55, len=1
[ 433.427480] data=[00 ]
[ 433.427506] master_xfer[1] R, addr=0x55, len=34
[ 433.427544] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 433.443185] master_xfer[0] W, addr=0x55, len=1
[ 433.443223] data=[00 ]
[ 433.443249] master_xfer[1] R, addr=0x55, len=34
[ 433.446396] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 433.458937] master_xfer[0] W, addr=0x55, len=1
[ 433.461733] data=[00 ]
[ 433.464061] master_xfer[1] R, addr=0x55, len=34
[ 433.468581] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 433.480911] master_xfer[0] W, addr=0x55, len=1
[ 433.483918] data=[00 ]
[ 433.486249] master_xfer[1] R, addr=0x55, len=34
[ 433.490763] data=[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
------------------------------------------------------------------------
下面的 log 是 进行touch 动作的:
1. 先触摸手指头1,
2. 再触摸手指头2,
3. 手指头2离开
touchpanel 的触摸信息 register 位置是 0x00 ?
读取的数据长度是 34 个字节,
第一个字节好象是 多点触摸数,触摸信息在后面部分,但是仍然和 GT818 的 I2C 协议对不上,
[root@FA-HF src]#
[ 459.305473] master_xfer[0] W, addr=0x55, len=1
[ 459.305516] data=[00 ]
[ 459.305543] master_xfer[1] R, addr=0x55, len=34
[ 459.305581] data=[01 00 01 16 02 3a 1d 71 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.321277] master_xfer[0] W, addr=0x55, len=1
[ 459.321315] data=[00 ]
[ 459.321341] master_xfer[1] R, addr=0x55, len=34
[ 459.321378] data=[01 00 01 16 02 3a 1f 73 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.337037] master_xfer[0] W, addr=0x55, len=1
[ 459.337074] data=[00 ]
[ 459.337100] master_xfer[1] R, addr=0x55, len=34
[ 459.338857] data=[01 00 01 16 02 3a 20 74 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.352768] master_xfer[0] W, addr=0x55, len=1
[ 459.354195] data=[00 ]
[ 459.356522] master_xfer[1] R, addr=0x55, len=34
[ 459.361043] data=[01 00 01 16 02 3a 1f 73 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.373377] master_xfer[0] W, addr=0x55, len=1
[ 459.376368] data=[00 ]
[ 459.378707] master_xfer[1] R, addr=0x55, len=34
[ 459.383330] data=[01 00 01 16 02 3a 21 75 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.395556] master_xfer[0] W, addr=0x55, len=1
[ 459.398564] data=[00 ]
[ 459.400904] master_xfer[1] R, addr=0x55, len=34
[ 459.405408] data=[01 00 01 16 02 3a 1f 73 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.417753] master_xfer[0] W, addr=0x55, len=1
[ 459.420748] data=[00 ]
[ 459.423076] master_xfer[1] R, addr=0x55, len=34
[ 459.427593] data=[01 00 01 16 02 3a 20 74 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.439928] master_xfer[0] W, addr=0x55, len=1
[ 459.442918] data=[00 ]
[ 459.445260] master_xfer[1] R, addr=0x55, len=34
[ 459.449780] data=[01 00 01 17 02 3a 22 77 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.462103] master_xfer[0] W, addr=0x55, len=1
[ 459.465121] data=[00 ]
[ 459.467445] master_xfer[1] R, addr=0x55, len=34
[ 459.471961] data=[01 00 01 17 02 3a 20 75 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.484307] master_xfer[0] W, addr=0x55, len=1
[ 459.487301] data=[00 ]
[ 459.489629] master_xfer[1] R, addr=0x55, len=34
[ 459.494146] data=[01 00 01 17 02 3a 22 77 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.506481] master_xfer[0] W, addr=0x55, len=1
[ 459.509471] data=[00 ]
[ 459.511813] master_xfer[1] R, addr=0x55, len=34
[ 459.516333] data=[01 00 01 17 02 3a 21 76 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.528663] master_xfer[0] W, addr=0x55, len=1
[ 459.531670] data=[00 ]
[ 459.534003] master_xfer[1] R, addr=0x55, len=34
[ 459.538514] data=[01 00 01 17 02 3a 21 76 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.550847] master_xfer[0] W, addr=0x55, len=1
[ 459.553854] data=[00 ]
[ 459.556182] master_xfer[1] R, addr=0x55, len=34
[ 459.560700] data=[01 00 01 17 02 3a 21 76 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.573033] master_xfer[0] W, addr=0x55, len=1
[ 459.576024] data=[00 ]
[ 459.578366] master_xfer[1] R, addr=0x55, len=34
[ 459.582883] data=[01 00 01 17 02 3a 21 76 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.595215] master_xfer[0] W, addr=0x55, len=1
[ 459.598223] data=[00 ]
[ 459.600551] master_xfer[1] R, addr=0x55, len=34
[ 459.605071] data=[01 00 01 17 02 3a 21 76 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.617400] master_xfer[0] W, addr=0x55, len=1
[ 459.620410] data=[00 ]
[ 459.622735] master_xfer[1] R, addr=0x55, len=34
[ 459.627256] data=[01 00 01 17 02 3a 20 75 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.639587] master_xfer[0] W, addr=0x55, len=1
[ 459.642577] data=[00 ]
[ 459.644920] master_xfer[1] R, addr=0x55, len=34
[ 459.649436] data=[01 00 01 17 02 3a 21 76 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.661768] master_xfer[0] W, addr=0x55, len=1
[ 459.664776] data=[00 ]
[ 459.667104] master_xfer[1] R, addr=0x55, len=34
[ 459.671620] data=[01 00 01 17 02 3a 21 76 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.683953] master_xfer[0] W, addr=0x55, len=1
[ 459.686961] data=[00 ]
[ 459.689288] master_xfer[1] R, addr=0x55, len=34
[ 459.693809] data=[01 00 01 17 02 3a 21 76 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.706141] master_xfer[0] W, addr=0x55, len=1
[ 459.709134] data=[00 ]
[ 459.711473] master_xfer[1] R, addr=0x55, len=34
[ 459.715990] data=[01 00 01 17 02 3a 21 76 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.728322] master_xfer[0] W, addr=0x55, len=1
[ 459.731329] data=[00 ]
[ 459.733657] master_xfer[1] R, addr=0x55, len=34
[ 459.738174] data=[01 00 01 17 02 39 22 76 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.750506] master_xfer[0] W, addr=0x55, len=1
[ 459.753514] data=[00 ]
[ 459.755841] master_xfer[1] R, addr=0x55, len=34
[ 459.760362] data=[01 00 01 17 02 39 21 75 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.772768] master_xfer[0] W, addr=0x55, len=1
[ 459.775698] data=[00 ]
[ 459.778029] master_xfer[1] R, addr=0x55, len=34
[ 459.782542] data=[01 00 01 17 02 39 21 75 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.794874] master_xfer[0] W, addr=0x55, len=1
[ 459.797886] data=[00 ]
[ 459.800210] master_xfer[1] R, addr=0x55, len=34
[ 459.804726] data=[01 00 01 17 02 38 1f 72 00 00 00 00 00 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.817059] master_xfer[0] W, addr=0x55, len=1
[ 459.820067] data=[00 ]
[ 459.822394] master_xfer[1] R, addr=0x55, len=34
[ 459.826912] data=[03 00 01 17 02 37 1e 01 27 01 7a 18 2d 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.839249] master_xfer[0] W, addr=0x55, len=1
[ 459.842251] data=[00 ]
[ 459.844579] master_xfer[1] R, addr=0x55, len=34
[ 459.849099] data=[03 00 01 17 02 37 1d 01 27 01 7a 1c 30 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.861435] master_xfer[0] W, addr=0x55, len=1
[ 459.864436] data=[00 ]
[ 459.866763] master_xfer[1] R, addr=0x55, len=34
[ 459.871386] data=[03 00 01 17 02 36 1e 01 27 01 7a 1c 30 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
[ 459.883614] master_xfer[0] W, addr=0x55, len=1
[ 459.886621] data=[00 ]
[ 459.888953] master_xfer[1] R, addr=0x55, len=34
[ 459.893465] data=[03 00 01 17 02 36 1e 01 27 01 7a 1d 31 00 00 00 00 00 63 2f 63 3a 63 c4 00 00 00 00 00 00 00 00 00 86 ]
------------------------------------------------------------------------
如果有兴趣,还可一打印出来 上报给 input core 的 坐标信息来解析 touchpanel 的 I2C 部分。
当然,如果谁有 GT801 的芯片手册发送给我一份就太感谢了。