电容触摸屏适配

    本篇需要启动linux系统,所需用到的工具:

    • ts-lib

      • ts_test

      • ts_calibrate

    • evtest

    在前文设备树中,我们就已经对i2c接口的电容触摸屏做了初始化,以下是进行电容触摸屏的调整与测试:

    ls /dev/input   # 查看是否存在input/event0
    
    # 若不存在,找到触摸模块并加载 
    insmod goodix.ko   
    # 如根文件系统未找到goodix.ko,请在linux源码的output目录下查找并放入根文件系统下
    
    # 若存在
    evtest /dev/input/event0  # 使用evtest测试输入的xy坐标数据
    
    # 直观的测试
    ts_test
    
    # 触摸校准工具
    ts_calibrate
    

    但是 ts_calibrate 仅仅是将校准参数写到 /etc/pointcrl文件中,适用于微调,tslib下的工具如 ts_test将会读取此校准文件而表现的触摸正常;而 evtest 读取原始数据、littlevGL程序调用 event0的输入时,并未去解析该参数文件。同样也有一定可能是该触摸屏内置参数即为错误的,难以进行校准。

    测试时,发现xy轴输出互相调换了,请添加或去掉 gt911节点下 的 touchscreen-swapped-x-y 属性

    若是发现触摸屏输出跳动大,屏幕上有些地方检测不到输出,此处采取修改驱动的办法进行解决:通过 i2c 向 电容触摸芯片GT911 写入固定的参数(相当于重刷GT911的固件);

    // 找到一个加载模块时会调用到的函数 
    
    static void goodix_read_config(struct goodix_ts_data *ts)
    {
        u8 config[GOODIX_CONFIG_MAX_LENGTH];
        int error, i;
    
        error = goodix_i2c_read(ts->client, ts->chip->config_addr,
                                config, ts->chip->config_len);
    
    /* end of the code user added */
    
        u8 check_sum = 0;         //校验和
    
        /* 800*480屏使用 */
        u8 write2gt911[GOODIX_CONFIG_911_LENGTH] = {0x42, 0xe0, 0x01, 0x20, 0x03, 0x0a, 0x35, 0x00, 0x01, 0x08, 0x28, 0x08, 0x5a, 0x46, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1a, 0x1e, 0x14, 0x89, 0x2a, 0x09, 0x57, 0x5c, 0xb5, 0x06, 0x00, 0x00, 0x00, 0x02, 0x01, 0x1d, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x82, 0x94, 0xc5, 0x02, 0x07, 0x00, 0x00, 0x04, 0x96, 0x4a, 0x00, 0x85, 0x54, 0x00, 0x77, 0x5f, 0x00, 0x6a, 0x6c, 0x00, 0x5f, 0x7a, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x10, 0x12, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0f, 0x10, 0x12, 0x16, 0x18, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x24, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00};
    
        /* 480*272屏使用 */
        u8 write2gt911[GOODIX_CONFIG_911_LENGTH] = {0x42, 0xe0, 0x01, 0x10, 0x01, 0x0a, 0x3d, 0x00, 0x02, 0x08, 0x28, 0x08, 0x64, 0x46, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1a, 0x1e, 0x14, 0x89, 0x2a, 0x09, 0xc8, 0xca, 0x40, 0x04, 0x00, 0x00, 0x00, 0x61, 0x02, 0x1d, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xfa, 0x94, 0xd5, 0xf4, 0x07, 0x00, 0x00, 0x04, 0x86, 0xa7, 0x00, 0x82, 0xb7, 0x00, 0x80, 0xc8, 0x00, 0x7d, 0xda, 0x00, 0x7c, 0xef, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x10, 0x12, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0f, 0x10, 0x12, 0x16, 0x18, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x24, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01};
    
        write2gt911[GOODIX_CONFIG_911_LENGTH - 1] = 0x01; //update flag
        for (i = 0; i < (GOODIX_CONFIG_911_LENGTH - 2); i++)    //校验和计算
            check_sum += write2gt911[i];
        write2gt911[184] = (~check_sum) + 1; //checksum
    
        error = goodix_i2c_write(ts->client, ts->chip->config_addr, write2gt911, GOODIX_CONFIG_911_LENGTH);
    
        dev_warn(&ts->client->dev,
                "updated the user defined config \n",
                error);
        /* Let the firmware reconfigure itself, so sleep for 10ms */
        usleep_range(10000, 11000);
    
        error = goodix_i2c_read(ts->client, ts->chip->config_addr,
                                config, ts->chip->config_len);
    
    
        for (i = 0; i < GOODIX_CONFIG_911_LENGTH; i++)
        {
            printk("Config Reg 0x%.4X : 0x%.2x,",
                i + 0x8047, config[i]);
        }
    /* end of the code user added */
    
    /* -----------略------------- */
    }
    

    将此驱动编译成模块,使用 insmod加载模块后作为修正屏幕参数所用,控制台将会输出gt911各寄存器的参数;修改完毕后使用rmmod goodix.ko 卸载模块,重新加载正常的驱动。

    若再测试时,发现xy轴输出互相调换了,请添加或去掉gt911节点下的touchscreen-swapped-x-y 属性

    交流与答疑
    对于本节内容,如有疑问,欢迎到 模组使用交流帖 提问或分享经验。