一般来说,平台适配某款新硬件我们只需编译程序源码、配置然后将该款硬件的驱动加入系统就完成了适配工作。
不过,这过程往往会遇到一些问题。
软件上的:平台差异(内核版本、电源管理部分、pin脚管理、平台特有机制),平台特有机制:一些特有api、特有消息机制、特有同步机制。
硬件上的:电路走线是否正确、供电参数、新硬件的特殊初始化。
当然了,这只是前期工作,它能保证平台和新硬件是适配的。如果有一些“优化、指定操作”的话就需要修改对应的驱动代码。
通常来说,驱动代码结构主要分三层:
1.一层--为上层提供ioctl、read、write、poll、sysfs、提交数据通道等特定api。
2.二层--驱动内部配合一层和三层实现一些逻辑。像同异步、irq、电源管理、内核某些子系统交互(input/audio)。
3.三层--驱动主动管理硬件。常有的是power pin、irq pin、rst pin等等引脚。高级点的就是i2c控制器、spi控制器、显存控制器。
我们把握这三层思路去理解代码,可以写出匹配原驱动的“指定操作”的代码了。
调试tp需要注意的:
i2c地址及控制命令,上电和en、rst引脚。
我们顺利加载tp驱动后,在板端:
#ls -l /dev/input/by-path/
lrwxrwxrwx 1 root root 9 Jan 18 10:02 platform-adc-keys-event -> ../event1
lrwxrwxrwx 1 root root 9 Jan 18 10:02 platform-ff110000.i2c-event -> ../event0
lrwxrwxrwx 1 root root 9 Jan 18 10:02 platform-gpio-keys-event -> ../event2
由于tp通过i2c通道进行数据传输,所以我们知道event0所对应的ff110000.i2c节点是我们要的(ff110000是i2cx的基地址)
打开设备树文件:arm64/boot/dts/rockchip/.rk3399-sapphire-excavator-linux.dtb.dts.tmp,因为我们选定设备树名为:rk3399-sapphire-excavator-linux.dts
查找ff110000:
i2c1: i2c@ff110000 {
compatible = "rockchip,rk3399-i2c";
reg = <0x0 0xff110000 0x0 0x1000>;
clocks = <&cru 65>, <&cru 341>;
clock-names = "i2c", "pclk";
interrupts = <0 59 4 0>;
pinctrl-names = "default";
pinctrl-0 = <&i2c1_xfer>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
};
gslX680设备树节点
&i2c1 {
status = "okay";
gslX680:gslX680@40 {
compatible = "GSLX680";
reg = <0x40>;
screen_max_x = <1024>;
screen_max_y = <600>;
touch-gpio = <&gpio1 20 IRQ_TYPE_LEVEL_LOW>;
reset-gpio = <&gpio0 13 GPIO_ACTIVE_HIGH>;
};
}
我们对比下原理图:
知道了,原理图的tp i2c1和设备树的i2c1匹配,那么event0就为我们的input dev。
这时,我们可以:
#hexdump -C /dev/input/event0
00000000 d6 1f f9 50 00 00 00 00 f3 29 03 00 00 00 00 00 |...P.....)......|
00000010 03 00 00 00 d1 01 00 00 d6 1f f9 50 00 00 00 00 |...........P....|
00000020 f3 29 03 00 00 00 00 00 03 00 01 00 97 00 00 00 |.)..............|
00000030 d6 1f f9 50 00 00 00 00 f3 29 03 00 00 00 00 00 |...P.....)......|
00000040 01 00 4a 01 01 00 00 00 d6 1f f9 50 00 00 00 00 |..J........P....|
00000050 f3 29 03 00 00 00 00 00 00 00 00 00 00 00 00 00 |.)..............|
00000060 d6 1f f9 50 00 00 00 00 51 8f 04 00 00 00 00 00 |...P....Q.......|
00000070 01 00 4a 01 00 00 00 00 d6 1f f9 50 00 00 00 00 |..J........P....|
00000080 51 8f 04 00 00 00 00 00 00 00 00 00 00 00 00 00 |Q...............|
驱动走控制台打印:
[ 32.243649] -----touches: 10 -----
[ 32.243997] tp-gsl finger_num = 10
[ 32.244320] tp-gsl before: x[0] = 175, y[0] = 440, id[0] = 0
[ 32.244895] tp-gsl before: x[1] = 269, y[1] = 516, id[1] = 0
[ 32.245424] tp-gsl before: x[2] = 411, y[2] = 438, id[2] = 0
[ 32.245987] tp-gsl before: x[3] = 37, y[3] = 258, id[3] = 0
[ 32.246505] tp-gsl before: x[4] = 560, y[4] = 338, id[4] = 0
[ 32.247058] tp-gsl before: x[5] = 635, y[5] = 83, id[5] = 0
[ 32.247576] tp-gsl before: x[6] = 667, y[6] = 539, id[6] = 0
[ 32.248128] tp-gsl before: x[7] = 777, y[7] = 21, id[7] = 0
[ 32.248645] tp-gsl before: x[8] = 865, y[8] = 520, id[8] = 0
[ 32.249196] tp-gsl before: x[9] = 558, y[9] = 470, id[9] = 0
有这类信息的话,tp就起来了,剩下就是调偏移、精度了。
如果没有的话,tp没能起来。那么,我们耐心地一步一步查找问题。
读者可以参考我的博文《rk3399调试alc5651之操作方法》拉到最后,我提供了一些建议。
获取tp驱动源码