本文基于 Q 版本 TP 正常情况下平行移植到 R 版本中,只是记录移植过程中遇到的坑。
具体 TP 驱动框架详细介绍可参考附录文章。
TP 驱动代码路径位于
*R\alps\kernel-4.19\drivers\input\touchscreen*
相比较 10.0 而言,10 的 kernel 版本用的是 kernel-4.9,所以之前的代码路径在
*Q\alps\kernel-4.9\drivers\input\touchscreen*
如何知道项目使用的 kernel 版本,在项目 ProjectConfig.mk 中
LINUX_KERNEL_VERSION = kernel-4.19 决定
当我打开 touchscreen 文件时有点懵圈,R 版本中竟然没有 mediatek 文件夹??
难道一开始 Q 版本中也没有这个文件夹,抱着好奇我去查了下 git log 发现并不是的,一开始版本库中的
源码就是带这个文件夹的。马塞卡,难道这份 R 版本的源码不是完整的还是 MTK 并没有调试好的??
抱着试一试的想法,将 mediatek 整个文件夹拷贝到 R 版本中,然后修改
R\alps\kernel-4.19\drivers\input\touchscreen\Makefile
obj-$(CONFIG_TOUCHSCREEN_MTK_GT911) += mediatek/
编译 mediatek 文件夹,接下来坑爹的各种编译报错就开始了。
首先肯定的是 mediatek 在 Q 中编译是完全没问题的
mtk_tpd.c中的错误
mtk_tpd.c:154:3: error: implicit declaration of function 'pinctrl_select_state' [-Werror,-Wimplicit-function-declaration] pinctrl_select_state(pinctrl1, eint_as_int); mtk_tpd.c:164:4: error: implicit declaration of function 'pinctrl_select_state' [-Werror,-Wimplicit-function-declaration] pinctrl_select_state(pinctrl1, eint_output1); mtk_tpd.c:189:11: error: incompatible integer to pointer conversion assigning to 'struct pinctrl *' from 'int' [-Werror,-Wint-conversion] pinctrl1 = devm_pinctrl_get(&pdev->dev); mtk_tpd.c:195:15: error: incompatible integer to pointer conversion assigning to 'struct pinctrl_state *' from 'int' [-Werror,-Wint-conversion] pins_default = pinctrl_lookup_state(pinctrl1, "default");
一开始以为是 struct 类型和指针 * 的定义错误,将 mtk_tpd.c 中对应 pinctrl_state 的 * 去掉后来发现问题更多了,
后来发现是 调用了未声明的函数,也就是说编译器不知道这个函数的返回值和参数列表,估计和 kernel 版本有关系吧。
解决办法在 kernel-4.19 中 搜索发现定义 pinctrl_select_state 函数的地方
./include/linux/pinctrl/consumer.h:extern struct pinctrl_state * __must_check pinctrl_lookup_state( ./include/linux/pinctrl/consumer.h:static inline struct pinctrl_state * __must_check pinctrl_lookup_state( ./include/linux/pinctrl/consumer.h: s = pinctrl_lookup_state(p, name); ./include/linux/pinctrl/consumer.h: s = pinctrl_lookup_state(p, name);
在 R\alps\kernel-4.19\drivers\input\touchscreen\mediatek\tpd.h 中引用头文件
#include <linux/pinctrl/consumer.h>
gt9xx_driver.c中的错误
gt9xx_driver.c:2215:22: error: variable has incomplete type 'struct sched_param' struct sched_param param = { .sched_priority = 4 }; kernel-4.19/include/linux/sched.h:53:8: note: forward declaration of 'struct sched_param' struct sched_param; ^ 1 error generated.
这问题一开始也不知道怎么解决,后来突然想到去 kernel-4.14 中同级目录下找找看,还真的被我找到了。
低版本的 kernel 引用 #include <uapi/linux/sched/types.h>
解决办法修改 R\alps\kernel-4.19\drivers\input\touchscreen\mediatek\GT911\include\tpd_gt9xx_common.h
#include <uapi/linux/sched/types.h> //for kernel-4.14 //#include <linux/sched.h> // for kernel-4.9
注释 gt9xx_driver.c 中相关 get_boot_mode() 调用
至此编译就 ok 了,再将其它的 dts 、dws config 相关的修改移植过来就好。