信阳网站建设培训,微信官网网站模板下载安装,网页源码在线查看,商城网站建设哪个公司好引言#xff1a;相信大家在学完相关驱动框架很少真正的运用在实际的产品案例中#xff0c;对设备树以及驱动框架还是非常的陌生#xff0c;其次就是在编写相关驱动还有完成项目任务时的一些思路的引导#xff0c;这些都是需要补足的#xff0c;接下来#xff0c;我们将之… 引言相信大家在学完相关驱动框架很少真正的运用在实际的产品案例中对设备树以及驱动框架还是非常的陌生其次就是在编写相关驱动还有完成项目任务时的一些思路的引导这些都是需要补足的接下来我们将之前理论知识与此文章内容结合真正的将理论运用在实际案例中形成自己的知识框架体系运用在工作中。 须知整个触摸包含了GPIO驱动、中断驱动、i2c驱动、input驱动等是一个复杂的驱动集合这些驱动我们以前在驱动文章中也有跟大家探讨过这一节我们就基于触摸进行分析有用到相关驱动就浅学一下主要目的还是把触摸跑起来先会用会调目前我们常用的Goodix、FocalTech等触摸驱动内核中已经现成的了所以我们理解框架并掌握调试技巧以后基本上可以把屏幕驱动起来。 目录
硬件
驱动
驱动的位置
驱动配置进内核
配置设备树
中断引脚 硬件
其实吧触摸屏种类有很多我碰到过的有i2c、spi、usb等其中i2c使用的频率最高大部分的触摸都是i2c的所以我们这里只讲i2c的触摸屏幕。相信你学完这一种方法其他的也能一通百通。
由于笔者用的是泰山派RK3566也就大致的讲一下我的硬件接口你手里的可能跟我的板载硬件接口不一具体问题具体分析即可屏幕端跟据大家选的触摸常见不同对应的座子规格以及线序相应都会不同跟据我们的经验以及很多厂家的调研触摸大家都是6根线但就这里6根线大家都不按照标准来完全按照心情我猜应该有720种不同的线序所以碰到线序不同的时候我们需要画个转接板如果你量大也可以让厂家定制开模费几千的样子。
我们主要是根据当前自身的硬件设计一个转接板如下触摸链接线序 因此通过设计转接板 如上就是转接板非常的简单不过多讲解了主要就是将线序一一对应上值得注意的是硬件接口位置需要仔细检查一下不要插排线的时因为硬件的设计导致问题的出现。。 驱动
驱动的位置
安卓和linux的触摸驱动位于都位于 SDK/kernel/drivers/input/touchscreen 目录下这个目录下包含了非常多的常用触摸驱动我们当前的目标就是能够把这些驱动用起来理解框架后面在以此为模板自己在去写一个驱动。 通过屏幕实物上IC的丝印或者屏厂家给的资料我们可以得知我们案例中这款触摸使用的触摸IC是经典汇顶GT9271厂家有给触摸参考驱动GT9xx_Driver_for_Android_V2.4_2014112801.rar因为他很经典我们驱动已经支持了所以我们直接在触摸驱动目录下找到汇顶相关的触摸驱动来做修改前期大家如果不熟悉建议就买汇顶的触摸因为驱动比较通用后面熟悉了以后可以使用其他的触摸并根据触摸厂家提供的参考代码修改移植。 汇顶相关的驱动位于 SDK/kernel/drivers/input/touchscreen/gt9xx 下这个驱动包含兼容了gt9开头的大多数系列比如gt911、gt910、gt9271等等。 我们主要关注gt9xx.c触摸功能相关的实现、gt9xx.h头文件、Makefile配置文件其他的.cfg、gt9xx_cfg.h是用于多芯片兼容gt9xx_update.c、gt9xx_firmware.h固件更新与goodix_tool.c调试的。
以上的流程主要是为了找到驱动的位置因此我们不管在做任何驱动的时候需要明确驱动的位置。
驱动配置进内核
相关驱动我们都需要观察配置内核的问题了首先Makefile配置文件就是用来组织编译的所以我们从SDK/kernel/drivers/input/touchscreen/gt9xx目录下的Makefile开始逐步向上分析。
# SPDX-License-Identifier: GPL-2.0# 使用 GPL-2.0 许可证声明# 将 goodix_gt9xx.o 目标文件添加到编译选项 obj-y 中
obj-y goodix_gt9xx.o# 将 gt9xx.o 目标文件添加到 goodix_gt9xx-y 目标列表中用于编译链接
goodix_gt9xx-y gt9xx.o# 将 gt9xx_update.o 目标文件也添加到 goodix_gt9xx-y 目标列表中用于编译链接
goodix_gt9xx-y gt9xx_update.o
SDK/kernel/drivers/input/touchscreen/ 的Makefile
#省略
obj-$(CONFIG_TOUCHSCREEN_GT9XX) gt9xx/
#省略
此时我们看到一个宏CONFIG_TOUCHSCREEN_GT9XX因此Makefile中就是通过这个变量值来判定是否编译gt9xx的这个变量的值有三个y、m、n分别对应配置到内核、模块、不打开我们可以通过暴力手段直接改但这不是明智之举适合用于调试阶段。
obj-y gt9xx/
obj-m gt9xx/
obj-n gt9xx/
此时我们如果看到了CONFIG_TOUCHSCREEN_GT9XX这个变量一定要意识到menuconfig配置的环节这些内容都是在Kconfig实在不清楚在哪你也可以通过grep -r “” . 来找这里只是提供一个思路 在同Makefile同目录下还有一个Kconfig有了这个我们就可以使用menuconfig工具来配置。
config TOUCHSCREEN_GT9XXtristate Goodix gt9xx support for rockchip platformdepends on I2C ARCH_ROCKCHIPhelpSay Y here if you have a touchscreen interface using the gt9xxon Rockchip platform, and your board-specific initializationcode includes that in its table of IIC devices.If unsure, say N.
如上就是Kconfig内容了我们追溯到CONFIG_TOUCHSCREEN_GT9XX就是通过上述的命令来配置到kernel的menuconfig。
因此我们知道相关宏了之后就去kernel目录下 make ARCHarm64 menuconfig 即可。
我们直接在内核里面find即可也就是也就是英文符号的这个 / 键盘问号的下面的这个。通过 1 进行索引进入即可。
然后需要选中配置就行了
因为我们刚刚保存的是.config每次编译的时候脚本都会去组合生产.config所以你的配置就会被覆盖掉这也是很多小伙伴经常提问的为什么配置没生效正确的方式是生成defconfig然后并覆盖到之前的arch/arm64/configs/下代替我们使用的defconfig。
make ARCHarm64 savedefconfig 我们SDK使用的是rockchip_linux_defconfig所以把生成的defconfig复制过去代替rockchip_linux_defconfig我用的是repo带git版本所有我就直接复制过去了如果你没有git管理就先备份一个然后在代替过去避免搞坏了回不去了。再次感谢吴工
mv defconfig arch/arm64/configs/rockchip_linux_defconfig
mv代表“move”移动命令。defconfig当前目录下的一个文件通常是内核或软件构建的默认配置文件。arch/arm64/configs/rockchip_linux_defconfig目标路径表示将文件移动到 arch/arm64/configs/ 目录下并重命名为 rockchip_linux_defconfig。
以上的流程主要是因为本身处于linux系统中对于相关驱动的配置都需要进行menuconfig这一步也是非常的关键。
配置设备树
泰山触摸相关的设备树 SDK\kernel\arch\arm64\boot\dts\rockchip\tspi-rk3566-dsi-v10.dtsi中添加根据 GT9xx_Driver_for_Android_V2.4_2014112801dtsi\goodix-gt9xx.dtsi 参考修改而来。
i2c1 {status okay;ts5d {compatible goodix,gt9xx;reg 0x5d;tp-size 89;max-x 1280;max-y 800;touch-gpio gpio1 RK_PA0 IRQ_TYPE_LEVEL_LOW;reset-gpio gpio1 RK_PA1 GPIO_ACTIVE_LOW;};
};
硬件部分通过原理图可以知道触摸接口用的是i2c1所以我们就直接在i2c1中写触摸。我们原理图中已经对数据线和时钟先进行了上拉。 触摸节点的配置
i2c1 {status okay;ts5d { //触摸子节点compatible goodix,gt9xx; //这个非常重要就是靠这个来匹配的驱动};
};
gt9xx.c触摸部分代码
static struct of_device_id goodix_ts_dt_ids[] {{ .compatible goodix,gt9xx },{ }
};static struct i2c_driver goodix_ts_driver {.probe goodix_ts_probe,.remove goodix_ts_remove,.id_table goodix_ts_id,.driver {.name GTP_I2C_NAME,.of_match_table of_match_ptr(goodix_ts_dt_ids),},
};
因为涉及到iic因此涉及地址如下所示
i2c1 {status okay;ts5d { //触摸子节点compatible goodix,gt9xx;reg 0x5d; //触摸屏地址};
};
因为一个i2c下可以挂载多个从设备既然可以挂那么多设备我们要怎么和单个设备通讯呢地址的作用就来了我想和谁通讯我就叫谁的地址。我们怎么知道用的屏幕的地址是多少呢
我们可以找原厂提供代码案例也可以自己根据数据手册来决定。 我们都知道IIC协议的数据帧格式在一个字节中前七位都是地址后一位是方向因此我们需要找到地址所以呢向右移动位也就是得到了0x5d。 数据手册中有对地址进行描述这里写的是0xBA/0xBB有些同学可能会迷糊上面说的是0x5d这里怎么变了我们上面说的是7位地址这里是8位包含第零位读写位所以我不把0xBB/0xBA右移1位就可以得到0x5D。
i2c1 {status okay;ts5d {compatible goodix,gt9xx;reg 0x5d;tp-size 89; //触摸大小max-x 1280; //屏幕最大值max-y 800; //屏幕最小值};
};
上述内容就是屏幕的大小参数了这个非常重要根据你买的屏幕来填写即可。 //2649行/**************删减***************/if (of_property_read_u32(np, tp-size, val)) {dev_err(client-dev, no max-x defined\n);return -EINVAL;}//2715行if (of_property_read_u32(np, max-x, val)) {dev_err(client-dev, no max-x defined\n);return -EINVAL;}//2720行/**************删减***************///ts-abs_x_max val;if (of_property_read_u32(np, max-y, val)) {dev_err(client-dev, no max-y defined\n);return -EINVAL;}/**************删减***************/
中断引脚
去读取数据方式很多种比如我们可以通过轮询去读但是这样的效率非常低触摸屏已经给我们提供了一个中断引脚下面是触摸屏数据手册中对中断引脚的描述当屏幕被按下INT脚就会输出中断信号我们泰山派配置了中断就可以实现中断来了以后再去读取触摸数据提高了效率。 i2c1 {status okay;ts5d {compatible goodix,gt9xx;reg 0x5d;tp-size 89;max-x 1280;max-y 800;//中断引脚touch-gpio gpio1 RK_PA0 IRQ_TYPE_LEVEL_LOW;};
};
gt9xx.c中会去获取touch-gpio引脚。
//2711行
ts-irq_pin of_get_named_gpio_flags(np, touch-gpio, 0, (enum of_gpio_flags *)(ts-irq_flags));
其次就是另一个复位引脚了如下所示
i2c1 {status okay;ts5d {compatible goodix,gt9xx;reg 0x5d;tp-size 89;max-x 1280;max-y 800;touch-gpio gpio1 RK_PA0 IRQ_TYPE_LEVEL_LOW;//复位引脚reset-gpio gpio1 RK_PA1 GPIO_ACTIVE_LOW;};
};在gt9xx.c中会去获取引脚。
//2712行
ts-rst_pin of_get_named_gpio_flags(np, reset-gpio, 0, rst_flags);
因此就配置完了设备树当然你会问我上面相关参数怎么来的你可以在驱动代码里面中通过查询来索引设备树获取节点的相关函数例如of起始的函数内容或者就是去copy致敬SDK中的相关驱动代码都是可以的更多的还是经验的总结了其次就是最后针对屏幕的触摸点的位置的判别了。 上述的函数是上报触摸的点位这里也需要根据屏幕的参数进行配置也就是屏幕的分辨率此时呢到此为止相关驱动程序已经跑通可以实现你想要的效果了