主题 : tiny210v2 开发板中,关于 goodix GT801 驱动的一些理解 复制链接 | 浏览器收藏 | 打印
级别: 骑士
UID: 5844
精华: 9
发帖: 64
金钱: 770 两
威望: 154 点
贡献值: 9 点
综合积分: 308 分
注册时间: 2009-05-11
最后登录: 2019-05-14
楼主  发表于: 2012-11-12 21:19

 tiny210v2 开发板中,关于 goodix GT801 驱动的一些理解

管理提醒: 本帖被 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 的芯片手册发送给我一份就太感谢了。




*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2012-11-12 21:56
很不错,支持一下:)
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
贡献值: 27 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
2楼  发表于: 2012-11-12 22:00
可以邮件索取试试
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.