相比 RTP 电阻触摸屏, CTP 电容触摸屏的调试稍微繁琐一点,CTP 驱动一般由触摸屏原厂提供,经过移植添加到 SDK 中编译和使用
本章节以 GT911 为例来说明一款新的 CTP 的调试和移植过程。
驱动存放路径:source/linux-5.10/drivers/input/touchscreen/gt911
其中 source/linux-5.10/drivers/input/touchscreen/Makefile 修改添加如下:
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
index 75924acd8..4be057598 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -116,3 +116,6 @@ obj-$(CONFIG_TOUCHSCREEN_ROHM_BU21023) += rohm_bu21023.o
obj-$(CONFIG_TOUCHSCREEN_RASPBERRYPI_FW) += raspberrypi-ts.o
obj-$(CONFIG_TOUCHSCREEN_IQS5XX) += iqs5xx.o
obj-$(CONFIG_TOUCHSCREEN_ZINITIX) += zinitix.o
+obj-$(CONFIG_INPUT_TOUCHSCREEN) += gt911/
其中 source/linux-5.10/drivers/input/touchscreen/Kconfig 修改添加如下:
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index a8d18a679..6acdc3b63 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -1344,5 +1344,7 @@ config TOUCHSCREEN_ZINITIX
To compile this driver as a module, choose M here: the
module will be called zinitix.
+source "drivers/input/touchscreen/gt911/Kconfig"
注: 请从触摸屏供应商处获取和内核版本匹配的驱动程序,如果版本不匹配则可能编译出错,需要自行适配。
在 luban 根目录下执行 make km (make kernel-menuconfig),进入 kernel 的功能配置,按如下选择:
Linux
Device Drivers
Input device support
[*] Touchscreens
<M> gt911 based touchscreens
驱动以 ko 的方式编译后,系统启动后在启动脚本 mdev 自动加载,如下:
start(){echo-n"Starting $DAEMON... "start-stop-daemon-S-b-m-p$PIDFILE-x/sbin/mdev---df[$?-eq0]&&echo"OK"||echo"ERROR"# coldplug modulesfind/sys/-namemodalias-print0| \
xargs-0sort-u| \
tr'\n''\0'| \
xargs-0modprobe-abq}
如果不需要自动加载,可注释掉所示代码,仿照其他启动服务自定义加载服务。
DTS 参数配置
board.dts 中要添加的参数选项需要查看驱动代码中所要解析的 dts 参数而添加,示例如下:
GT911 驱动程序中所要解析的 dts 参数
intinput_sensor_startup(enuminput_sensor_type*ctp_type){intret=-1;structctp_config_info*data=container_of(ctp_type,structctp_config_info,input_type);structdevice_node*np=NULL;np=of_find_node_by_name(NULL,"ctp");if(!np){pr_err("ERROR! get ctp_para failed, func:%s, line:%d\n",__func__,__LINE__);gotodevicetree_get_item_err;}if(!of_device_is_available(np)){pr_err("%s: ctp is not used\n",__func__);gotodevicetree_get_item_err;}elsedata->ctp_used=1;ret=of_property_read_u32(np,"ctp_twi_id",&data->twi_id);if(ret){pr_err("get twi_id is fail, %d\n",ret);gotodevicetree_get_item_err;}printk("ctp_twi_id is %d\r\n",data->twi_id);data->wakeup_gpio=of_get_named_gpio(np,"ctp_wakeup",0);printk("wavkeup_gpio %d\r\n",data->wakeup_gpio);data->irq_gpio=of_get_named_gpio(np,"ctp_int_port",0);printk("ctp_int_port %d\r\n",data->irq_gpio);ret=of_property_read_u32(np,"ctp_screen_max_x",&data->screen_max_x);if(ret)pr_err("get ctp_screen_max_x is fail, %d\n",ret);ret=of_property_read_u32(np,"ctp_screen_max_y",&data->screen_max_y);if(ret)pr_err("get screen_max_y is fail, %d\n",ret);ret=of_property_read_u32(np,"ctp_revert_x_flag",&data->revert_x_flag);if(ret)pr_err("get revert_x_flag is fail, %d\n",ret);ret=of_property_read_u32(np,"ctp_revert_y_flag",&data->revert_y_flag);if(ret)pr_err("get revert_y_flag is fail, %d\n",ret);ret=of_property_read_u32(np,"ctp_exchange_x_y_flag",&data->exchange_x_y_flag);if(ret)pr_err("get ctp_exchange_x_y_flag is fail, %d\n",ret);ret=of_property_read_u32(np,"ctp_abs_max_x",&data->abs_max_x);if(ret)pr_err("get ctp_abs_max_x is fail, %d\n",ret);ret=of_property_read_u32(np,"ctp_abs_max_y",&data->abs_max_y);if(ret)pr_err("get ctp_abs_max_y is fail, %d\n",ret);ret=of_property_read_u32(np,"ctp_convert_reslution",&data->convert_reslution);if(ret)pr_err("get convert_reslution is fail, %d\n",ret);printk("screen %d %d %d %d %d abs_x %d abs_y %d convert %d\r\n",data->screen_max_x,data->screen_max_y,data->revert_x_flag,data->revert_y_flag,data->exchange_x_y_flag,data->abs_max_x,data->abs_max_y,data->convert_reslution);return0;devicetree_get_item_err:pr_notice("=========script_get_item_err============\n");returnret;}
board.dts 中所添加的参数项
&twi2 {
pinctrl-names = "default";
pinctrl-0 = <&twi2_pins_a>;
status = "okay";
ctp {
reg = <0x5d>; //CTP 设备地址,可以从规格书中获取
device_type = "ctp"; //默认
status = "okay"; //使能标志
ctp_twi_id = <0x2>; //所挂在的 twi 总线 id
ctp_twi_addr = <0x5d>; //CTP 设备地址,可以从规格书中获取
ctp_screen_max_x = <0x500>; //CTP x 轴的范围
ctp_screen_max_y = <0x320>; //CTP y 轴范围
ctp_revert_x_flag = <0x0>; //CTP x 轴是否翻转
ctp_revert_y_flag = <0x0>; //CTP y 轴是否翻转
ctp_exchange_x_y_flag = <0x0>; //CTP x 轴和 y 轴是否互换
ctp_int_port = <&gpio_a 9 GPIO_ACTIVE_HIGH>; //CTP 中断引脚
ctp_wakeup = <&gpio_a 8 GPIO_ACTIVE_HIGH>; //CTP reset 引脚
CTP 设备地址获取:
从规格书中可以看出 GT911 根据初始化时序的不同支持两种设备地址,默认时序的读写地址为 0xBA/0xBB,读写地址去掉最后一位读写位就是设备地址,即:0x5d
硬件接线示例图如下:
请务必确保 dts 所配置的参数和引脚与硬件原理图一致
测量硬件通路
测量硬件通路是否正常,测量电压信号是否正常
查看打印信息
在 dts 中修改 bootargs,增加“loglevel=8” 调高打印级别,系统启动时或 insmod 驱动模块时看是否有异常打印
获取坐标信息
如果系统有编译 getevent 工具,触摸屏有触摸时进行坐标的打印
# getevent
获取设备信息
# cat /proc/bus/input/devices
例如:(以 xx 为例)
I: Bus=0018Vendor=dead Product=beef Version=28bb
N: Name="goodix-ts"
P: Phys=input/ts
S: Sysfs=/devices/virtual/input/input0
U: Uniq=
H: Handlers=event0
B: PROP=2
B: EV=b
B: KEY=1c00 00000
B: ABS=6e1800000000000