接手的Freescalei.MX 6Q平台,移植了Android 6.0 MNC系统,Kernel (v3.14.52)可以启动了,从其它项目拿了一块Touch Panel过来。需要移植,Touch Panel移植按理是比较简单的,一开始以为最多半天的活,但实际却用了两天时间,中间走了不少弯路。
Touch Panel的Driver IC用的是Goodix 的GT9110,应该属于比较常用的,屏是8 Inch的屏。先查原理图:
原理图TP接了四根线,INT/RESET/SDA/SCL,找到主芯片上位置。
对应的管脚分别是EIM_D21(SCL)/EIM_D28(SDA)/EIM_A25(RST)/DISP0_DAT12(INT)。打开Freescale的工具IO Mux,找到这些脚相对的分别是:
EIM_D21/EIM_D28 为i2c1 的SCL/SDA
EIM_A25为GPIO5_2
DISP0_DAT12为GPIO5_6
管脚查清楚了,开始配置,先配置DTS文件,打开kernel_imx/arch/arm/boot/dts/imx6qdl-sabresd.dtsi文件,找到i2c1。在最后增加:
touchpanel: gd111x@5d {
compatible ="gd,gd111x";
reg = <0x5d>;
interrupt-parent =<&gpio5>;
interrupts = <6 2>;
irq-gpios = <&gpio5 61>;
rst-gpios = <&gpio5 21>;
};
以上配置参考了其它项目的代码,I2C地址为0x5D,实际上配置为0x14也可以,因为Goodix的I2C地址是根据开机时RST/INT的逻辑来决定的。驱动中做了自动适配。
Compatible随便写了一个,只要不容易重名就可以了。
interrupt-parent设置为gpio5
irq-gpios和rst-gpios分别是用于中断和复位的。根据之前查出来的值设置正确。
确认一下i2c1的相关GPIO是否正确,相关的PIN为pinctrl_i2c1
&i2c1 {
clock-frequency = <100000>;
pinctrl-names ="default";
pinctrl-0 = <&pinctrl_i2c1>;
status = "okay";
发现配置不正确,改为正确值。
pinctrl_i2c1: i2c1grp {
fsl,pins = <
- MX6QDL_PAD_CSI0_DAT8__I2C1_SDA 0x4001b8b1
- MX6QDL_PAD_CSI0_DAT9__I2C1_SCL 0x4001b8b1
+ MX6QDL_PAD_EIM_D28__I2C1_SDA 0x4001b8b1
+ MX6QDL_PA