转自: https://www.ebaina.com/articles/140000004356

声明:因为在开发过程中不同设备会搭载同一芯片,不同设备会有各种不同的硬件设备,因此本文移植的gt911驱动也是以动态加载的方式载入内核的。

gt9xx是一款很常用的触摸屏ic,网上对它在安卓和stm32平台上的使用调试教程较多,但是在海思平台的调试教程较少,下面记录一些我自己移植gt9xx安卓驱动碰到的问题。

开始调试时给到的资料有一份gt9xx的安卓驱动代码,一份移植说明书,一份gt9xx的数据手册(网上都有)。

浏览下代码,使用i2c_add_driver函数添加一个i2c驱动,通过probe函数初始化屏幕,中断,工作队列等等,但是probe函数需要在设备和驱动名字匹配时才会调用,通过查阅驱动移植说明书: 移植说明书

因为我没有改动kernel的代码,所以这边是通过i2c_new_device函数添加i2c设备,注意设备名称要和驱动一样。

#ifdef CONFIG_ARCH_HISI
static struct i2c_board_info hi_info = {
    I2C_BOARD_INFO("Goodix-TS", 0x5d),
};
static struct i2c_client *gt_client;
#endif
...
#ifdef CONFIG_ARCH_HISI
    struct i2c_adapter *adapter;

    adapter = i2c_get_adapter(tp_param[2]);
    if (!adapter) {
        GTP_ERROR("%s : can't get i2c adapter %d\n", __func__, __LINE__);
    }

    gt_client = i2c_new_device(adapter, &hi_info);                               
    if (!gt_client) {
        GTP_ERROR("%s : i2c_new_device failed!\n", __func__);
    }
    gt_client->irq = 45;

    i2c_put_adapter(adapter);                                                    
#endif                                                                           
    ret = i2c_add_driver(&goodix_ts_driver);                                     

如果运气好的话,添加完上面的内容,根据硬件选择正确的复位、中断,i2c控制器(这些可以直接在gt9xx.h文件中配置,注意管脚复用),触摸屏应该就可以正常使用了。

然而,我在调试的时候遇到各种问题,下面做个记录,如果有人和我一样碰到这些问题,希望下面的内容能有帮助。

1. <linux/earlysuspend.h>头文件找不到,这个去网上查了好像是安卓的一种降低功耗的模块,直接用删掉,或者为了代码的美观用宏控制去掉,其他和该模块相关的地方都可以直接去掉。

#ifdef CONFIG_HAS_EARLYSUSPEND
#include <linux/earlysuspend.h>
#endif

2.各种没有见过的宏

这里按照#define定义的名称,结合代码看就是普通的定义复位、中断管脚序号,配置gpio口状态的操作,我这里把下面三个框的内容全删除,把第一个框内按照硬件原理图直接写上gpio口的序号。

3.gt9xx.h里面的CTP_CFG_GROUP配置,造成的问题:

  1)屏幕时而有中断,时而没有。
  2)屏幕只能点击一部分,点击左边和上边区域没有中断。

仔细阅读代码,在probe函数中有个gtp_init_panel(ts)函数,会从ic内部读取信息,打开GTP_DEBUG_ON就可以看到读取的硬件信息了,驱动会根据读取到的sensor_ID 号去选择对应的CTP_CFG_GROUP配置。

但是gt9xx有个固化配置,就是只有发送的配置信息大于芯片中保存的配置时才会使用你发送的CTP_CFG_GROUP配置(不是很懂为什么,但是真的很k eng)。所以这里要注意如果厂家给的CTP_CFG_GROUP配置信息的版本号小于芯片中保存的配置版本,那么CTP_CFG_GROUP配置就不会生效,就会产生各种问题,贴个图说明下:

第一个就是配置版本号了(根据调试信息得出的),第二个和第三个框的是分辨率,我这边是800*1280,十六进制就是 0x320和0x500,可以直接在这里改,用来适配tslib。

在调试的时候就是因为ic中的配置版本比这个0x42大,一直有问题,总是点不到屏幕的左边和上边区域,后来把这个0x42改成0x65(好像比这个大就行),最后终于正常了.

标签: aosp

添加新评论