环境:RK3566 Android 11,触摸屏型号ilitek ili2130,I2C接口。
收到驱动文件和规格书等资料,粗略看了下驱动文件居然有dts配置参考和驱动的中文说明,属于相对成熟的方案调试会比较容易。
一、代码合并与编译
1、首先将驱动解压到drivers/input/touchscreen/目录下
这个没啥说的直接放进去就行,我们的目录名称为"ilitek_linux_i2c",注意这个名字后面要用。
2、修改dts配置
参考配置
ilitek@41 {
compatible = "tchip,ilitek";
reg = <0x41>;
interrupt-parent = <&msm_gpio>;
interrupts = <13 0x0>;
vdd-supply = <&pm8916_l17>;
vcc_i2c-supply = <&pm8916_l6>;
ilitek,irq-gpio = <&msm_gpio 13 0x0>;
ilitek,reset-gpio = <&msm_gpio 12 0x0>;
ilitek,vbus = "vcc_i2c";
ilitek,vdd = "vdd";
ilitek,name = "ilitek_i2c";
};
根据我们自己的主板修改下
&i2c1 {
status = "okay";
ilitek:ilitek@41 {
compatible = "tchip,ilitek";
reg = <0x41>;
vdd-supply = <&vcc3v3_lcd0_n>;
vcc_i2c-supply = <&vcc_3v3>;
pinctrl-0 = <&ili213x_gpio>;
ilitek,irq-gpio = <&gpio0 RK_PB5 IRQ_TYPE_LEVEL_HIGH>;
ilitek,reset-gpio = <&gpio0 RK_PC8 GPIO_ACTIVE_HIGH>;
ilitek,vbus = "vcc_i2c";
ilitek,vdd = "vdd";
ilitek,name = "ilitek_i2c";
status = "okay";
};
};
这里的i2c1是我们主板的配置,还有ilitek,irq-gpio和ilitek,reset-gpio对应的GPIO0 RK_PB5和gpio0 RK_PC8要看原理图根据自己的主板进行修改。
3、修改Kconfig配置和Makefile
修改drivers/input/touchscreen/Makefile,增加如下内容
obj-$(CONFIG_TOUCHSCREEN_ILITEK_LINUX_I2C) += ilitek_linux_i2c/
注意这里的ilitek_linux_i2c就是第一步解压的驱动目录名,CONFIG_TOUCHSCREEN_ILITEK_LINUX_I2C和后面的 TOUCHSCREEN_ILITEK_LINUX_I2C是关联的,不要填错了。
修改drivers/input/touchscreen/Kconfig,增加如下内容
config TOUCHSCREEN_ILITEK_LINUX_I2C
tristate "ILItek linux i2c support for rockchip platform"
depends on I2C && ARCH_ROCKCHIP
help
Say Y here if you have a touchscreen interface using the ili2130
on Rockchip platform, and your board-specific initialization
code includes that in its table of IIC devices.
If unsure, say N.
至此该触摸屏驱动已合并到内核,但是尚未打开编译开关。可以通过make menuconfig或者直接修改配置文件的方式打开。这里我们直接修改配置文件rockchip_defconfig
4、修改rockchip_defconfig打开编译开关
修改arch/arm64/configs/rockchip_defconfig,增加如下内容
CONFIG_TOUCHSCREEN_ILITEK_LINUX_I2C=y
注意这个CONFIG_TOUCHSCREEN_ILITEK_LINUX_I2C和Kconfig中的配置是关联的,不要填错了。
5、编译
前面四步做完就做好了驱动的合并,技术上讲可以开始编译了;但是先别急着启动,文档显示驱动针对rockchip平台上有适配的,在文件ilitek_ts.h中有宏定义ILITEK_PLAT,修改为
#define ILITEK_PLAT ILITEK_PLAT_ROCKCHIP
再检查下TOUCH_SCREEN_X_MAX和TOUCH_SCREEN_Y_MAX定义是否与自己的触摸屏一致
#define TOUCH_SCREEN_X_MAX 600 //LCD_WIDTH
#define TOUCH_SCREEN_Y_MAX 1024 //LCD_HEIGHT
现在开始编译--编译指令根据自己的情况修改,参考:
make ARCH=arm64 rockchip_defconfig rk356x_evb.config android-11.config rk356x.config
make ARCH=arm64 rk3566-evb5-lp4x-v10.img -j12
驱动明显针对rockchip做了适配,编译一次通过,可以调试了。
二、调试
1、烧录与初步检查
烧录之后检查触摸屏--没有反应;进adb shell用getevent查看,发现驱动正常加载了,划过触摸屏的时候有报点事件;内核日志发现发现大量的i2c通讯错误从开机就出现,伴随着触摸增加,提示---校验和错误;
[ 2.599142] [ILITEK][ERR] [data] ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff, len: [64/64]
[ 2.599173] [ILITEK][ERR] checksum : 3f/ff not matched
[ 2.605205] [ILITEK][ERR] [data] ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff, len: [64/64]
[ 2.605237] [ILITEK][ERR] checksum : 3f/ff not matched
[ 2.611268] [ILITEK][ERR] [data] ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff-ff, len: [64/64]
[ 2.611302] [ILITEK][ERR] checksum : 3f/ff not matched
疑惑:数据包解析是驱动的基本工作,正式发布的驱动不太可能犯这么低级的错误;判断应该是dts配置、中断、干扰或者接线错误导致数据包本身出错了;
2、故障排查
检查触摸屏的dts配置--没有发现错误;检查上电时序--没发现问题,增加上电过程中的延时--错误依旧;用i2cdetect检查---正常;
查看中断:
cat /proc/interrupts | grep ilitek
发现中断一直在增加,不管是否按触摸屏都会一直增加,结合内核日志里报数据包错误(触摸屏驱动),猜测可能是中断被错误触发了;
参考下几位同仁的方法尝试修改中断配置--改上升沿触发,问题依旧;
询问硬件--坚持任务电压、接线都没问题,一时陷入僵局;
3、发现故障原因
找供应商--结果对方压根就是个外行,还得靠自己,各种方法都尝试了还找不到原因一时有点懵逼,咋办呢?
上示波器,测量了供电电压,正常;测量中断----发现一个规律的方波信号,拔掉触摸屏信号扔在;看来就是这个方波信号导致中断被异常触发,导致驱动读取了错误的数据包;
4、查找方波来源解决问题
观察方波发现是很规律的32K信号,烧录之前的固件没有这个32K信号,一般认为是这次修改导致的,就感觉很冤--没改到32K信号相关的呀;
然后意识到——这不就是给无线模块准备的32k外部输入信号嘛,怎么串到这里了?查看原理图--发现中断脚的确有个32k信号复用;深入查dts配置,发现32K的引脚的确也配置了该gpio,关闭后中断脚终于没有这个32K信号了,触摸直接可用了;
还有个问题没搞明白——同样的配置为啥之前的板子没有这个32K信号干扰?有懂的朋友请不吝指教。