Tina SDK Linux Kernel 基本使用(实战篇:为7寸RGB LCD触摸屏添加驱动支持).md
Tina SDK Linux Kernel 基本使用实战篇为7寸RGB LCD触摸屏添加驱动支持本文基于全志Tina-SDK以100ASK-7 RGB LCD触摸屏为例手把手带你完成从硬件原理图分析、设备树修改、内核模块配置到最终打包烧录与验证的完整流程。你将学会如何为嵌入式Linux系统添加一个全新的硬件外设掌握I2C/Input子系统驱动的实践方法。这是嵌入式Linux驱动开发的经典案例学会它你就能举一反三添加任何挂载在I2C总线上的设备。本文最全比文档文档史上无敌最详细。文章目录Tina SDK Linux Kernel 基本使用实战篇为7寸RGB LCD触摸屏添加驱动支持 本任务的学习目标和重点掌握程度一、项目背景我们要做什么⭐ 了解即可二、内核源码与设备树文件的位置⭐⭐⭐ 必须掌握2.1 内核源码目录2.2 板级配置文件目录⭐⭐⭐⭐ 核心操作区三、设备树修改详解⭐⭐⭐ 必须掌握3.1 解析硬件原理图3.2 确定TWI总线编号3.3 添加TWI2引脚复用配置⭐⭐⭐ 必须掌握3.4 配置TWI2总线并添加触摸屏设备节点⭐⭐⭐ 必须掌握3.5 检查引脚冲突⭐⭐ 重点掌握3.6 Tina SDK中设备树的编译机制⭐⭐ 重点掌握四、内核模块配置⭐⭐⭐ 必须掌握4.1 为什么不能只用 make kernel_menuconfig4.2 TinaSDK的模块管理机制 modules.mk⭐⭐⭐ 必须掌握4.3 在Tina配置中选中GT911模块⭐⭐⭐ 必须掌握五、编译、打包与烧录⭐⭐ 重点掌握5.1 编译内核5.2 打包固件5.3 烧录固件六、验证触摸功能⭐⭐⭐ 必须掌握6.1 检查驱动模块是否加载成功6.2 定位触摸屏对应的event节点6.3 原始数据测试⭐⭐ 重点掌握6.4 常见问题排查问题1Error: Driver gt9xxnew_ts is already registered问题2I2C通信超时Timeout when sending 9th SCL clk问题3设备树节点修改后不生效6.5 使用 evtest 工具进行进阶测试⭐ 了解即可七、功能拓展添加新的I2C设备触类旁通八、面试官提问环节必考第1问如何排查I2C设备如触摸屏通信故障第2问make kernel_menuconfig 和 make menuconfig 在TinaSDK中有什么区别第3问修改设备树后触摸屏不工作请给出排查思路。九、总结 本任务的学习目标和重点掌握程度为了帮助你在实际工作中遇到类似任务时清楚地知道每一步要做什么同时也方便领导考核时清晰了解你的技能水平我们对本任务涉及的每个知识点进行了重要程度分级分级图标含义工作要求必须掌握⭐⭐⭐独立作业考核核心能不看文档独立完成领导要求你必须做到且会重点检查重点掌握⭐⭐了解原理能按文档完成理解原理出现问题知道去哪里排查了解即可⭐知道概念能复述面试能说清楚不用实际动手做作为初学者重点掌握“必须掌握”⭐⭐⭐的内容这是你入门嵌入式Linux驱动的基石。“重点掌握”⭐⭐的内容为辅帮助你构建完整的知识体系。“了解即可”的部分供你开阔眼界后续再深入学习。一、项目背景我们要做什么⭐ 了解即可在嵌入式Linux开发中为开发板添加LCD触摸屏支持是最常见的任务之一。本文将指导你为100ASK_T113s3-Pro开发板添加7寸1024x600分辨率RGB LCD触摸屏的驱动支持。屏幕模块详细信息如下项目规格模组型号100ASK-7RGB LCD-V1.2分辨率1024 x 600触摸芯片汇顶科技GT911 (Goodix GT9xx系列)通信接口I2C全志平台称为TWI即Two-Wire Interface数据手册T113-s3_datasheet_v1.6.pdf第41页触摸屏工作原理简述触摸ICGT911通过I2C总线与主控芯片T113通信当手指触摸屏幕时触摸IC会通过中断引脚通知主控主控通过I2C读取触摸坐标数据并通过Linux的Input子系统上报给上层应用。整个适配过程分为三大步骤编写/修改设备树文件告诉内核硬件如何连接I2C总线、中断引脚、复位引脚等配置内核模块让内核包含GT911驱动编译、烧录与验证生成系统镜像验证触摸功能是否正常工作二、内核源码与设备树文件的位置⭐⭐⭐ 必须掌握在Tina-SDK中与Linux内核相关的代码和配置文件主要分布在以下位置2.1 内核源码目录内容路径快捷命令Linux内核源码lichee/linux-5.4/ckernel内核设备树目录lichee/linux-5.4/arch/arm/boot/dts/cdts父级芯片设备树lichee/linux-5.4/arch/arm/boot/dts/sun8iw20p1.dtsi-sun8iw20p1.dtsi是整个T113芯片的基础设备树文件定义了芯片内置的所有硬件模块I2C/TWI、SPI、UART、GPIO等。我们后续需要在board.dts中引用并配置这些模块。在Tina-SDK中内核源码位于lichee/linux-5.4。为了方便切换目录SDK提供了几个实用的快捷命令前提是已经执行过source build/envsetup.shbash# 切换到内核源码根目录 ckernel # 切换到内核设备树目录arch/arm/boot/dts cdts2.2 板级配置文件目录⭐⭐⭐⭐ 核心操作区这是Tina SDK特有的板级配置文件位置与内核源码分开存放内容路径快捷命令板级设备树device/config/chips/t113/configs/100ask/board.dtsccconfigs板级内核配置device/config/chips/t113/configs/100ask/linux/config-5.4-环境变量配置device/config/chips/t113/configs/100ask/env.cfg-U-Boot设备树device/config/chips/t113/configs/100ask/uboot-board.dts-通过执行ccconfigs可以直接切换到板级配置文件目录。重要说明Tina-SDK将板级配置与内核源码分离这样可以实现一份内核源码适配多个不同硬件板子。这种分离设计的好处是当我们更换开发板或为不同项目定制功能时只需要修改板级配置目录下的文件而内核源码本身可以保持不变。更便于管理和维护。bash# 进入板级配置目录 ccconfigs ls # board.dts config-5.4 config-5.4-mem-optimize特别注意board.dts是一个软链接它实际指向linux-5.4/board.dts。因此我们实际要修改的文件是linux-5.4/board.dtsbashccconfigs cd linux-5.4 ls # board.dts config-5.4 config-5.4-mem-optimize⛔ 重要警告 ⛔make menuconfig和make kernel_menuconfig是完全不同的两个东西命令作用配置保存位置make kernel_menuconfig配置Linux内核选项临时执行make clean后会丢失make menuconfig配置Tina系统的软件包选项永久配置会保存在.config中make menuconfig→Kernel modules在Tina层面选择需要的内核模块永久通过modules.mk机制生效⭐ 重点掌握记住这个区别避免你配置完后一清理环境配置全丢了三、设备树修改详解⭐⭐⭐ 必须掌握3.1 解析硬件原理图根据100ASK-7RGB LCD-V1.2的硬件原理图触摸屏相关的接口如下原理图引脚标号T113对应引脚功能说明CTP_INTPE1触摸中断信号触摸屏有数据时通知主控CTP_RSTPE0触摸复位信号控制触摸IC复位RPI_SCLPE12I2C时钟线RPI_SDAPE13I2C数据线3.2 确定TWI总线编号通过查看数据手册T113-s3_datasheet_v1.6.pdf第41页确认PE12和PE13引脚的功能复用表如下引脚功能选项说明PE12Function 2 twi2 USB …说明PE12可作为TWI2的SCLPE13Function 2 twi2 USB …说明PE13可作为TWI2的SDA因此我们可以确定触摸屏使用的是TWI2总线全志平台称I2C为TWI。3.3 添加TWI2引脚复用配置⭐⭐⭐ 必须掌握打开设备树文件device/config/chips/t113/configs/100ask/linux-5.4/board.dts找到pio节点在其中添加twi2的引脚复用配置cpio { // ... 其他配置保持原有内容不动 // ⭐ 添加 TWI2 引脚复用定义 twi2_pins_a: twi20 { pins PE12, PE13; function twi2; // 将PE12、PE13复用为TWI2功能 drive-strength 10; // 驱动能力10mA }; twi2_pins_b: twi21 { pins PE12, PE13; function gpio_in; // 休眠时将引脚还原为通用GPIO输入模式 }; // ... 其他配置保持原有内容不动 };参数解释pins指定要配置的物理引脚名称。function指定引脚的功能模式twi2代表I2C总线的功能复用gpio_in代表通用输入GPIO模式用于系统休眠时节省功耗。drive-strength指定引脚的驱动电流能力数值越高驱动能力越强适合外围设备较远的场景10是一个常见的中间值。用pio这个节点是T113芯片的通用引脚控制器节点定义了所有引脚的复用模式和电气属性。为什么需要两组配置一个用于正常运行模式default一个用于休眠模式sleep系统可以在两者之间动态切换。3.4 配置TWI2总线并添加触摸屏设备节点⭐⭐⭐ 必须掌握在board.dts文件的末尾或合适位置添加twi2节点配置ctwi2 { clock-frequency 400000; // I2C总线时钟400KHz pinctrl-0 twi2_pins_a; // 正常工作时使用twi2_pins_a配置 pinctrl-1 twi2_pins_b; // 休眠时切换到twi2_pins_b配置 pinctrl-names default, sleep; // 定义两组配置的名称 dmas dma 45, dma 45; // DMA通道配置可选 dma-names tx, rx; status okay; // 启用此I2C总线 // 触摸屏设备节点 (I2C从设备) ctp14 { compatible allwinner,goodix; // 匹配驱动中的名称重要 device_type ctp; // 设备类型电容触摸屏 reg 0x14; // I2C设备地址7位地址 status okay; /* GT9xx 触摸芯片配置参数 */ ctp_name gt9xxnew_ts; // 驱动模块名称 ctp_twi_id 0x2; // 所属TWI总线编号TWI2 ctp_twi_addr 0x14; // 设备地址与reg一致 /* 屏幕触摸范围配置 */ ctp_screen_max_x 0x400; // X轴最大坐标 0x400 1024 ctp_screen_max_y 0x258; // Y轴最大坐标 0x258 600 ctp_revert_x_flag 0x0; // X轴不翻转0不翻转 ctp_revert_y_flag 0x0; // Y轴不翻转 ctp_exchange_x_y_flag 0x0; // XY坐标不交换 /* 引脚配置⭐ 关键 */ ctp_int_port pio PE 1 GPIO_ACTIVE_HIGH; // 中断引脚PE1高电平有效 ctp_wakeup pio PE 0 GPIO_ACTIVE_HIGH; // 唤醒/复位引脚PE0 }; };注意GT911的I2C设备地址可以是0x14或0x5d这由复位引脚的上电时序决定。本次适配使用0x14。3.5 检查引脚冲突⭐⭐ 重点掌握在添加新设备节点时务必检查新使用的引脚是否已经被其他功能占用。引脚冲突是新手最容易犯的错误之一往往导致驱动加载失败。本次使用的引脚情况引脚本任务用途潜在冲突解决方法PE12 / PE13TWI2可能被其他I2C设备使用可以通过全局搜索grep -r PE12 device/检查是否有其他设备配置了这些引脚若有则需协调。3.6 Tina SDK中设备树的编译机制⭐⭐ 重点掌握在TinaSDK中设备树无法单独编译它会与U-Boot、optee等一起打包到最终镜像中。你必须在TinaSDK根目录下执行make或mkernel命令系统才会自动编译设备树。因此任何设备树的修改都需要完整编译系统或至少重新编译内核然后重新打包镜像才能生效。四、内核模块配置⭐⭐⭐ 必须掌握4.1 为什么不能只用make kernel_menuconfig很多初学者会在内核源码目录执行make kernel_menuconfig配置完发现执行make clean后配置丢失了。这是因为在TinaSDK框架中内核的最终配置文件是由多个部分动态合并而成的target/allwinner/generic/config-5.4通用配置device/config/chips/t113/configs/100ask/linux/config-5.4板级配置其他依赖关系直接修改内核的.config文件会在下次合并时被覆盖。4.2 TinaSDK的模块管理机制modules.mk⭐⭐⭐ 必须掌握TinaSDK为每个内核模块在target/allwinner/t113-common/modules.mk中预定义了Kconfig配置项。打开该文件可以看到GT911驱动的定义makefiledefine KernelPackage/touchscreen-gt9xxnew SUBMENU:$(INPUT_MODULES_MENU) TITLE:gt9xxnew support DEPENDS:kmod-input-core KCONFIG: \ CONFIG_INPUT_TOUCHSCREENy \ CONFIG_TOUCHSCREEN_GT9XXNEW_TSy \ ... (其他相关配置) FILES: \ $(LINUX_DIR)/drivers/input/touchscreen/gt9xxnew/gt9xxnew_ts.ko AUTOLOAD:$(call AutoProbe,gt9xxnew_ts) endef这个机制的好处是TinaSDK已经帮我们把GT911驱动的依赖关系和编译规则都处理好了我们只需要像选择普通软件包一样选中它即可。4.3 在Tina配置中选中GT911模块⭐⭐⭐ 必须掌握正确的做法是在TinaSDK根目录执行make menuconfig然后通过Kernel modules→Input modules找到触摸屏相关选项textTina Configuration └─ Kernel modules └─ Input modules └─ kmod-touchscreen-gt9xxnew --- GT9xxnew touchscreen driver按Y键选中此项变为*。然后用方向键移动到最下方的Save保存配置再选择Exit退出。配置成功后稍后执行make时系统会自动编译此模块。补充说明如果你需要修改具体的内核源码如修改驱动代码中的坐标算法仍然需要进入make kernel_menuconfig进行调试但那只是为了测试正式的配置最终还是要在Tina的make menuconfig中固化下来。五、编译、打包与烧录⭐⭐ 重点掌握5.1 编译内核bash# 1. 加载SDK环境 source build/envsetup.sh # 2. 选择开发板配置t113_100ask-tina lunch # 输入数字选择 4 # 3. 编译内核首次或修改内核配置后 mkernel或者直接执行make编译整个系统包括U-Boot、内核、Rootfs等。5.2 打包固件bashpack打包过程中会看到如下输出text... Add partition rootfs.fex ROOTFS_FEX... BuildImg 0 Dragon execute image.cfg SUCCESS! ---image is at--- /home/ubuntu/tina-d1-h/out/t113-100ask/tina_t113-100ask_uart3.img pack finish5.3 烧录固件使用ls -lh命令查看生成的镜像大小确认文件完整后将其复制到Windows系统bashls -lh /home/ubuntu/tina-d1-h/out/t113-100ask/tina_t113-100ask_uart3.img使用PhoenixSuit线刷工具将镜像烧录到开发板的SPI NAND Flash中。六、验证触摸功能⭐⭐⭐ 必须掌握6.1 检查驱动模块是否加载成功系统启动后首先检查内核日志中是否有GT911驱动加载信息bashdmesg | grep -i gt9\|touch您应该能看到类似这样的信息text[ 4.500239] gt9xxnew_ts 2-0014: 2-0014 supply ctp not found, using dummy regulator [ 4.717746] input: gt9xxnew_ts as /devices/virtual/input/input2input: gt9xxnew_ts as /devices/virtual/input/input2这一行表示触摸屏驱动注册成功并创建了input设备节点/dev/input/event2。注意supply ctp not found只是一个警告提示没有为触摸屏单独配置电源管理不影响触摸功能。6.2 定位触摸屏对应的event节点如果系统中有多个input设备键盘、鼠标、触摸屏等可以通过查看/proc/bus/input/devices文件来确定每个设备对应的event节点bashcat /proc/bus/input/devices找到Namegt9xxnew_ts的段落查看其H行HandlerstextI: Bus0018 Vendordead Productbeef Version28bb N: Namegt9xxnew_ts P: PhysA-P S: Sysfs/devices/virtual/input/input2 U: Uniq H: Handlersevent2 B: PROP2 B: EVb B: KEY400007f8000100000000 B: ABS26500000H: Handlersevent2表示该触摸屏对应的设备节点是/dev/input/event2。进阶技巧如果你在编译内核时已经配置好TSLIB触摸屏校准库也可以直接运行ts_test进行可视化测试。后续可以深入学习本节内容的【进阶内容】。6.3 原始数据测试⭐⭐ 重点掌握使用cat命令直接读取event节点可以快速验证触摸屏硬件是否正常工作bashcat /dev/input/event2用手指触摸屏幕终端上会出现二进制乱码输出代表有数据上报。现象结论cat /dev/input/eventX出现乱码输出手触摸时触摸屏工作正常 ✅cat /dev/input/eventX无反应触摸屏未工作需排查 ❌6.4 常见问题排查问题1Error: Driver gt9xxnew_ts is already registered现象insmod时报错该驱动已注册。原因驱动已被编译进内核或已被加载。解决方法直接使用modprobe或确认设备树配置即可无需重复加载。问题2I2C通信超时“Timeout when sending 9th SCL clk”现象系统启动时dmesg出现重复的I2C传输超时错误。原因I2C设备地址错误、引脚配置冲突、供电问题或设备未正确复位。排查步骤检查reg 0x14是否与硬件实际地址一致尝试0x5d。检查引脚是否正确PE0对应GPIO_ACTIVE_HIGH确保复位时序正确。检查pins和function是否与硬件原理图一致。检查系统启动日志中引脚复用是否有冲突。问题3设备树节点修改后不生效原因在TinaSDK中设备树无法单独编译必须重新打包整个镜像。解决方法修改设备树后务必执行make或mkernel重新编译然后执行pack打包最后重新烧录完整镜像。6.5 使用evtest工具进行进阶测试⭐ 了解即可如果需要获取更详细的上报数据坐标值、压力值等可以安装evtest工具bash# 在开发板上运行 evtest /dev/input/event2运行后会显示触摸屏的详细信息坐标范围、分辨率等并实时输出触摸事件数据非常适合调试坐标是否正确、是否反向等问题。七、功能拓展添加新的I2C设备触类旁通掌握了为TWI2添加GT911触摸屏的方法后你可以轻松地为项目添加任何I2C设备如传感器、时钟芯片等。模板如下ctwix { // x 为TWI总线编号 clock-frequency 400000; pinctrl-0 twix_pins_a; pinctrl-1 twix_pins_b; pinctrl-names default, sleep; status okay; new_devicexx { // xx 为设备地址 compatible vendor,device-name; reg xx; // 根据设备驱动要求添加其他属性 status okay; }; };添加步骤确定设备使用的I2C总线编号如TWI1、TWI2。在pio节点中添加引脚复用配置。在对应的twix节点下添加设备子节点。根据设备驱动文档填充设备树属性。配置内核模块如有需要。编译、打包、烧录并验证。修改设备树时每次修改后都需要pack打包整个镜像才能生效。建议将所有I2C设备集中在同一个twix节点下管理便于维护。八、面试官提问环节必考第1问如何排查I2C设备如触摸屏通信故障参考答案排查I2C故障按照以下步骤逐一检查硬件层面用万用表检查供电、SCL/SDA上拉电阻是否正常。引脚配置用dmesg | grep pinctrl检查引脚复用是否正确。I2C通信测试用i2cdetect -y bus号扫描设备地址确认设备是否应答。检查内核日志用dmesg | grep -i i2c\|error查找通信错误如NACK、超时等。检查地址配置确认设备树中的reg属性与硬件实际地址一致GT911常见地址为0x14或0x5d。检查复位时序确认复位引脚ctp_wakeup的上电时序满足芯片要求。第2问make kernel_menuconfig和make menuconfig在TinaSDK中有什么区别参考答案两者作用完全不同命令作用配置保存位置是否永久make kernel_menuconfig配置Linux内核选项临时.config❌ 不永久make clean后丢失make menuconfig配置Tina系统软件包选项Tina.config✅ 永久make menuconfig→Kernel modules在Tina层面选择内核模块通过modules.mk机制✅ 永久第3问修改设备树后触摸屏不工作请给出排查思路。参考答案检查硬件连接确认FPC排线是否插好触摸屏模块供电是否正常。检查设备树引脚配置确认twi2_pins_a中指定的引脚与实际原理图一致PE12/PE13。确认function值是否正确twi2。检查I2C通信执行i2cdetect -y 2扫描TWI2总线确认地址0x14是否出现UU表示设备已注册且有驱动。检查内核日志执行dmesg | grep -i gt9\|error查找驱动加载失败原因。检查地址冲突确认reg地址与设备实际地址一致GT911可能是0x14或0x5d。检查电源触摸屏模块是否需要独立的电源引脚若需要确认设备树中是否已配置。确认工作流程修改设备树后必须执行pack重新打包不能仅替换设备树文件。九、总结本文带你完整走了一遍在Tina-SDK中为7寸1024x600 RGB LCD触摸屏添加驱动支持的流程包括✅ 硬件原理图分析与引脚对应关系确定✅ 设备树修改引脚复用配置 TWI总线配置 触摸设备节点添加✅ 内核模块配置TinaSDK的make menuconfig用法✅ 编译、打包与烧录✅ 触摸功能验证与问题排查✅ 扩展知识为其他I2C设备添加支持的方法这套流程是嵌入式Linux驱动开发的通用方法掌握它你就能触类旁通为任何硬件外设添加Linux驱动支持。下一步学习建议学习Linux I2C子系统和Input子系统的驱动框架。熟悉Linux设备树的语法属性、节点、引用等。尝试修改GT911驱动源码如调整坐标上报算法或增加手势识别功能。进一步学习TSLIB触摸屏校准工具的使用。学习阶段任务⭐ 入门跟着本文做一遍在自己板子上成功点亮触摸屏⭐⭐ 进阶尝试为其他I2C设备如温湿度传感器添加驱动支持⭐⭐⭐ 高级阅读GT911驱动源码理解input子系统数据上报流程祝你学得扎实考核稳过
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2580446.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!