发表了主题帖:
记一次Luckfox幸狐 RV1106 Linux 开发板移植gt911触摸驱动过程中的踩坑排查记录
最近为Luckfox Pico pro max 开发板移植gt911触摸驱动,踩了个不大不小的坑,发现基本没人提及这块,分享出来大家参考
拉取官方SDK不说了,make ARCH=arm menuconfig搜索GT911 ,结果只有一个
选中以后覆盖配置,修改设备树不提,编译时成功踩坑,编译一直不通过,提示:
drivers/input/touchscreen/gt9xx/gt9xx.c: In function 'goodix_ts_probe':
drivers/input/touchscreen/gt9xx/gt9xx.c:2807:72: error: passing argument 4 of 'proc_create' from incompatible pointer type [-Werror=incompatible-pointer-types]
gt91xx_config_proc = proc_create(GT91XX_CONFIG_PROC_FILE, 0664, NULL, &config_proc_ops);
^~~~~~~~~~~~~~~~
In file included from drivers/input/touchscreen/gt9xx/gt9xx.h:28,
from drivers/input/touchscreen/gt9xx/gt9xx.c:51:
./include/linux/proc_fs.h:109:24: note: expected 'const struct proc_ops *' but argument is of type 'const struct file_operations *'
struct proc_dir_entry *proc_create(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct proc_ops *proc_ops);
该错误表示在drivers/input/touchscreen/gt9xx/gt9xx.c 文件的 goodix_ts_probe 函数中,使用 proc_create 函数时,第四个参数的指针类型不兼容。
那就查吧 ,打开gt9xx.c一行行跟代码:
2807行:
gt91xx_config_proc = proc_create(GT91XX_CONFIG_PROC_FILE, 0664, NULL, &config_proc_ops);
根据参数4 &config_proc_ops 定位到定义它的地方是95行,代码如下
static const struct file_operations config_proc_ops = {
.owner = THIS_MODULE,
.read = gt91xx_config_read_proc,
.write = gt91xx_config_write_proc,
};
到这就出问题了,这里定义的 config_proc_ops 是 file_operations类型,而proc_create 函数要求的参数4的指针类型是 proc_ops,所以报错。
这就奇怪了,按理说幸狐官方SDK里的gt9xx.c这个文件肯定是来自goodix官方的,不会产生这种错误,看了下文件开始的声明也确实是官方2.2版的,不管那么多,先去官方找一份2.2的文件进行比对吧。
在https://github.com/goodix/goodix_gt9xx_public 找到了该文件,发现是最新版本2.81。
再次搜索config_proc_ops,在1143行处发现代码已经变为:
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
static const struct proc_ops config_proc_ops = {
.proc_read = gtp_config_read_proc,
.proc_write = gtp_config_write_proc,
};
#else
static const struct file_operations config_proc_ops = {
.read = gtp_config_read_proc,
.write = gtp_config_write_proc,
};
增加了个Linux内核版本的判断,如果内核大于等于5.6,就使用proc_ops类型指针,如果小于,就使用file_operations。
我的Ubuntu内核是6.5 ,因为幸狐官方SDK引用了2.2版本的gt9xx驱动里没有这个内核判断,自然编译报错,猜测是幸狐的研发用的是5.6版本以下内核的Linux,所以没有发现这个问题。
那剩下的就好办了,用GitHub里2.81版的驱动替换幸狐官方sdk的2.2版驱动即可。
以上过程供大家移植gt911驱动时参考。