msm8909 触摸屏驱动GT9xx加载流程分析与移植

本文移植流程基于qcom msm8909平台进行,因为平台里android hal 和 frameworks 对TP的支持已经有了,我做的就是将厂家提供的驱动移植进内核并配置对应的dts文件即可

一般驱动移植厂家会提供驱动源码和移植指导书等资料

首先要找到你使用的平台的android内核配置文件是使用的哪一个,一般位于kernel/arch/平台架构/configs/平台文件,如msm8909则是kernel/arch/arm\configsmsm8909-1gb-perf_defconfig

1.内核配置文件将GT9XX参与内核编译相关宏打开

CONFIG_TOUCHSCREEN_GT9XX=y
CONFIG_GT9XX_TOUCHPANEL_UPDATE=y
CONFIG_GT9XX_TOUCHPANEL_DEBUG=y
CONFIG_GT9XX_TOUCHPANEL_DRIVER=y

2.找到内核TP存放目录,一般位于kernel/drivers/input/touchscreen,如将GT9XX的驱动放置于kernel/drivers/input/touchscreen/gt9xx

3.将gt9xx文件夹包含参与编译

找到kernel/drivers/input/touchscreen/Makefile

kernel/drivers/input/touchscreen/Kconfig

msm8909 触摸屏驱动GT9xx加载流程分析与移植_第1张图片

 

 

这样下来,gt9xx的驱动就参与进内核编译了,但要使gt9xx的驱动正常工作,除了硬件正常工作外,我们还需要对dts设备树进行配置,可以参照厂家给的指导书,我们先简单分析下源码

1.先找到kernel/drivers/input/touchscreen/gt9xx/Makefile,我们先看看参与编译的主要文件

其实主要的驱动文件就是gt9xx.c

那们找到gt9xx.c 我们看看驱动是怎么probe的

先找到module_init,module_exit两个函数,这两个函数是驱动加载的开始和结束

跟踪代码可以看到tp驱动是挂在i2c总线上的,那么我们设备树的设备节点的配置也要在i2c总线下。

msm8909 触摸屏驱动GT9xx加载流程分析与移植_第2张图片

现在还没有看到设备的probe函数,我们继续往下看,找到goodix_ts_driver结构体

msm8909 触摸屏驱动GT9xx加载流程分析与移植_第3张图片

现在看到一个goodix_ts_probe,这个是不是就是tp的probe函数了?对的,这个就是的,先不急,我们先把这个结构体看完,要知道,驱动所需要的相关参数可以从dts文件读取,也可以直接在驱动中声明,我们看到结构体中有一个预处理的宏GTP_CONFIG_OF,这个宏打开代表着我们需要读取dts文件,获取一些参数,那么这个宏下面的操作集合也就是读取参数的操作集合,我们先跟进这里看看

msm8909 触摸屏驱动GT9xx加载流程分析与移植_第4张图片

很明显,里面有个compatible,这就代表这当驱动加载的时候会去dts找到同名的设备树节点,获取相关参数,这个对我们后面理解dts有较大的帮助,那么先到这里,讲了这么多还没到probe函数吗?现在就回去我们跟到probe里去看看,驱动到底如何加载

msm8909 触摸屏驱动GT9xx加载流程分析与移植_第5张图片

如上图所示,该函数内容比较长,我只截取了一部分

该函数里实现了对当前驱动版本的打印,编译时间的打印以及i2c地址的打印

后面紧接着初始化i2c客户端,调用读取dts文件函数获取相关参数,对申请gpio脚,复位脚,中断脚,时间同步,i2c通讯测试等一些处理,最终驱动加载成功。

现在来看看dts文件怎么配置,一般dts文件位于kernel/arch/平台架构/boot/dts/平台/平台文件,如msm8909平台的则是kernel/arch/arm/boot/dts/qcom/msm8909*

现在又来一个疑问是那么多的msm8909-*, 我怎么知道是哪一个呢? 

一般的主dts文件就是平台名.dtsi,如:msm8909.dtsi

打开文件看到所有的i2c节点都在soc节点下,我这里将gt9xx挂到i2c_5节点下,然后在kernel/arch/arm/boot/dts/qcom/下全局查找i2c_5发现在msm8909-qrd-skue.dtsi,这样就找到我们改把gt9xx的设备节点配置在哪了

配置信息如下:

goodix_ts@5d {
            compatible = "goodix,gt9xx";
            status = "ok";
            reg = <0x5d>;
            interrupt-parent = <&msm_gpio>;
            interrupts = <13 0x2008>;
            vdd_ana-supply = <&pm8909_l17>;
            vcc_i2c-supply = <&pm8909_l6>;
            goodix,rst-gpio = <&msm_gpio 12 0x00>;
            goodix,irq-gpio = <&msm_gpio 13 0x00>;
            pinctrl-names = "pmx_ts_active","pmx_ts_suspend";
            pinctrl-0 = <&ts_int_active &ts_reset_active>;
            pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;
            goodix,panel-coords = <0 0 480 854>;
            goodix,display-coords = <0 0 480 854>;
            goodix,button-map= <158 102 139>;
            goodix,product-id = "915";
            goodix,cfg-group0 = [
                50 00 04 58 02 05 0D 00 01 0A 28
                0F 50 32 03 05 00 00 00 00 00 00
                08 17 19 1C 14 87 29 0A 4E 50 EB
                04 00 00 00 00 02 11 00 01 00 00
                00 00 00 00 00 00 00 46 64 94 C5
                02 07 00 00 04 9E 48 00 8D 4D 00
                7F 53 00 73 59 00 67 60 00 67 00
                00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00
                00 00 02 04 06 08 0A 0C 0E 10 12
                14 FF FF FF FF 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00
                02 04 06 08 0A 0C 1D 1E 1F 20 21
                22 24 26 28 FF FF FF FF FF FF FF
                FF FF FF 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 5C 01];
            goodix,cfg-group2 = [
                44 00 04 58 02 05 0D 00 02 2A 1E
                0F 41 32 03 05 00 00 00 00 00 00
                04 00 00 00 00 8A 2A 0C 23 1F 05
                0D 00 00 00 9A 02 2D 00 01 00 00
                00 00 00 00 00 00 00 19 5A 94 C5
                02 07 00 00 04 8F 1C 00 71 25 00
                5E 2F 00 4F 3D 00 44 4F 00 44 00
                00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00
                00 00 02 04 06 08 0A 0C 0E 10 12
                14 16 18 FF FF 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 00 00 00
                02 04 06 08 0A 0F 10 12 13 16 18
                1C 1D 1E 1F 20 21 22 24 FF FF FF
                FF FF FF 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 6B 01];
        };

配置dtsi需要注意的:

1:位置一定要对,也就是挂的总线和你使用的总线

2:几个重要的参数,匹配名,中断,复位脚,pinctrl脚等配置

3:tp config数据(这个原厂提供)

 

 

ps:调试过程中遇到的情况.

probe 函数中gtp_i2c_test函数一直出错,i2c通讯出错,没有应答

msm8909 触摸屏驱动GT9xx加载流程分析与移植_第6张图片

解决办法:结果是拿到的TP有问题,有个信号一直不对,换了一块就好了

2:触摸不准

替换原厂提供的cfg数据就好了,这个地方替换的时候需要注意替换在哪个group里面,也就是你读到的sensor id是几,就要配置到哪个group组里

 

剩余的情况,各位就慢慢debug,我也是第一次搞这个,有讲的不好的,还请指教!

你可能感兴趣的:(Android驱动移植,gt9xx,android5.1,android7.1,touch,panel)