正点原子阿尔法板无法使用触摸屏问题
在我之前复刻智能家居项目时,发现无法使用触摸屏。当时面临诸多因素,如会不会是我的内核问题、设备树问题还是屏幕驱动问题等,当时我也只是看了一些基础课程刚上手,看着头大,于是选择取巧,用mgftool里的官方zImage和里面的设备树进行后续编程。项目完成后,对linux、设备树、驱动有了一定了解,现在回头解决这个问题。
问题背景
在我之前复刻智能家居项目时,发现无法使用触摸屏。当时面临诸多因素,如会不会是我的内核问题、设备树问题还是屏幕驱动问题等,当时我也只是看了一些基础课程刚上手,看着头大,于是选择取巧,用mgftool里的官方zImage和里面的设备树进行后续编程。项目完成后,对linux、设备树、驱动有了一定了解,现在回头解决这个问题。
解决过程
经过思考分三步骤探索
1、先了解触摸屏驱动和设备树如何联系起来(正点原子视频)
视频中提到,NXP 官方的 Linux 内核默认已经开启了 LCD 驱动 。 LCD内有显存(RAM),为了方便操作,提出了Framebuffer,通过操作Framebuffer来访问显存。linux设备树下会存在一个/dev/fbx。一般不会直接操作fb进行写,一般直接通过ui库进行。还提到evk,设备树应该搞eck那个。通过视频了解到之前我在测试时,碰到的lcd显示屏花屏是因为源码中设备树使用的是四寸屏幕,而我使用的是七寸屏幕,屏幕驱动的设备树是不一样的。
2、根据出厂内核,倒推出内核配置,检查是否是内核某些编译选项没有打开。
3、判断当初是设备树问题还是内核问题。
制定好思路,开始进行以下探索
1、先整一个纯净的设备树,然后添加LCD屏幕设备树节点。
我从源码里拷贝了一份imx6ull-alientek-emmc.dts文件,在这个基础上添加lcd设备树节点,但碰到了kernel panic。明显是设备树的问题,我很疑惑,然后在官方的设备树用官方的imx6ul-14×14-evk.dts的基础上添加设备树,lcd屏幕显示就没问题。当时我还觉得正点原子怎么源码的设备树都有问题,后来才发现我是个joker。用imx6ull-alientek-emmc.dts时,我定义的lcdif在上面,下面还有一个lcdif,就覆盖了我的节点。修改后测试成功,lcd成功显示。
也不禁感叹,恐惧来源于未知。原来之前一直困扰我的触摸屏问题,只是我不了解触摸屏驱动相关的知识。
2、触摸屏无法使用
本以为一切正常,但在进行测试项目代码时,发现触摸屏无法使用。我要用如下指令,查看了输入设备。
# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="20cc000.snvs:snvs-powerkey"
P: Phys=snvs-pwrkey/input0
S: Sysfs=/devices/platform/soc/2000000.aips-bus/20cc000.snvs/20cc000.snvs:snvs-powerkey/input/input0
U: Uniq=
H: Handlers=kbd event0 evbug
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="iMX6UL TouchScreen Controller"
P: Phys=
S: Sysfs=/devices/platform/soc/2000000.aips-bus/2040000.tsc/input/input1
U: Uniq=
H: Handlers=mouse0 event1 evbug
B: PROP=0
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=3
下面那个应该就是触摸屏来着,看输出的信息。对比了一下我那个可以正常使用的设备树,发现除了lcd屏幕的驱动,还需要电容触摸芯片的驱动,需要添加触摸芯片节点。但依旧无法使用。后面根据DeepSeek,也进行了一些探索。通过dmesg | grep -iE "ft5x06|i2c|input|touch"查看是否有输入事件上报。输出以下信息,DS说根据内核日志中的 evbug 输出,触摸事件已成功上报到输入子系统(input1 设备),但 Qt 应用未响应触摸。但我依旧定位不到问题(功力有限)。
后来我灵机一动,将正常能用的设备树装载到板子里,同样输出输入设备信息。就看出了差别,定位到了问题。正常的设备树是显示出来了一个名为goodix-ts的设备,而不正常的仅仅是显示一个iMX6UL TouchScreen Controller。ts是touchscreen的节点,所以问题显然是出现在了触摸芯片驱动节点上。
# ls /dev/input
event0 event1 event2 mice
# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="20cc000.snvs:snvs-powerkey"
P: Phys=snvs-pwrkey/input0
S: Sysfs=/devices/platform/soc/2000000.aips-bus/20cc000.snvs/20cc000.snvs:snvs-powerkey/input/input0
U: Uniq=
H: Handlers=kbd event0 evbug
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0018 Vendor=dead Product=beef Version=28bb
N: Name="goodix-ts"
P: Phys=input/ts
S: Sysfs=/devices/virtual/input/input2
U: Uniq=
H: Handlers=event1 evbug
B: PROP=3
B: EV=b
B: KEY=e520 0 0 0 0 0 0 0 0 0 0
B: ABS=2658000 0
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="gpio_keys@0"
P: Phys=gpio-keys/input0
S: Sysfs=/devices/platform/gpio_keys@0/input/input3
U: Uniq=
H: Handlers=kbd event2 evbug
B: PROP=0
B: EV=100003
B: KEY=40000 0 0 0
3、设备树添加触摸芯片节点,ts_test程序乱跑。
对比正点原子的开发板的文档,发现设备树的信息配错了,修改之后,ts_test(触摸屏测试程序,配置完带qt的根文件系统就会有)可以正常运行。但ts_test会乱跑,重新启动,发现了下列内核打印信息。其实就是设备树引脚被占用,修改了一下设备树就行。因为这个设备树是官方设备树,有些引脚被他定义了,需要注释掉。
[ 2.468673] imx6ul-pinctrl 20e0000.iomuxc: pin MX6UL_PAD_GPIO1_IO09 already requested by 20e0000.iomuxc; cannot claim for 1-0014
[ 2.480446] imx6ul-pinctrl 20e0000.iomuxc: pin-32 (1-0014) status -22
[ 2.486983] imx6ul-pinctrl 20e0000.iomuxc: could not request pin 32 (MX6UL_PAD_GPIO1_IO09) from group tscgrp on device 20e0000.iomuxc
[ 2.499137] goodix-ts 1-0014: Error applying setting, reverse things back
[ 2.506134] <<-GTP-INFO->> GTP Driver Version: gt9xx driver Rleased <2021/11/27> Based V2.4
[ 2.514567] <<-GTP-INFO->> GTP I2C Address: 0x14
[ 2.519225] goodix-ts 1-0014: Failed to get reset gpio
[ 2.524461] goodix-ts: probe of 1-0014 failed with error -1
[ 2.530480] imx6ul-pinctrl 20e0000.iomuxc: pin MX6UL_PAD_GPIO1_IO09 already requested by 20e0000.iomuxc; cannot claim for 2040000.tsc
[ 2.542852] imx6ul-pinctrl 20e0000.iomuxc: pin-32 (2040000.tsc) status -22
[ 2.549776] imx6ul-pinctrl 20e0000.iomuxc: could not request pin 32 (MX6UL_PAD_GPIO1_IO09) from group tscgrp on device 20e0000.iomuxc
[ 2.561953] imx6ul-tsc 2040000.tsc: Error applying setting, reverse things back
[ 2.570871] input: iMX6UL TouchScreen Controller as /devices/platform/soc/2000000.aips-bus/2040000.tsc/input/input1
[ 2.585058] read sensor who am i (0x0)error !
[ 2.589493] fxls8471: probe of 0-001e failed with error -22
本以为成功解决,但内核还是打印了下列信息
[ 2.482165] goodix-ts 1-0014: Failed to get reset gpio
[ 2.487448] goodix-ts: probe of 1-0014 failed with error -1
[ 2.494989] input: iMX6UL TouchScreen Controller as /devices/platform/soc/2000000.aips-bus/2040000.tsc/input/input1
这个时候我就比较蒙圈了。反复检查了设备树的引脚有没有被占用。发现确实没有呀。后来,通过对比正点原子提供的手册的触摸芯片节点信息,和我自己正常能够运行的设备树节点信息,发现二者的i2c地址不一样,按理来说,硬件一样,地址应该要是一样的。突然就想到,我这个屏幕是闲鱼上买的,自然地址就不一样。然后就重新修改了一下i2c地址,参考网上的一些设备树节点配置,问题解决。
更多推荐



所有评论(0)