电容触摸屏适配
2022-07-06
本篇需要启动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
属性
交流与答疑
对于本节内容,如有疑问,欢迎到 模组使用交流帖 提问或分享经验。