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触摸屏添加驱动支持)](#Tina SDK Linux Kernel 基本使用(实战篇:为7寸RGB LCD触摸屏添加驱动支持))
    • [🎯 本任务的学习目标和重点掌握程度](#🎯 本任务的学习目标和重点掌握程度)
    • [一、项目背景:我们要做什么?(⭐ 了解即可)](#一、项目背景:我们要做什么?(⭐ 了解即可))
    • [二、内核源码与设备树文件的位置(⭐⭐⭐ 必须掌握)](#二、内核源码与设备树文件的位置(⭐⭐⭐ 必须掌握))
      • [2.1 内核源码目录](#2.1 内核源码目录)
      • [2.2 板级配置文件目录(⭐⭐⭐⭐ 核心操作区)](#2.2 板级配置文件目录(⭐⭐⭐⭐ 核心操作区))
    • [三、设备树修改详解(⭐⭐⭐ 必须掌握)](#三、设备树修改详解(⭐⭐⭐ 必须掌握))
      • [3.1 解析硬件原理图](#3.1 解析硬件原理图)
      • [3.2 确定TWI总线编号](#3.2 确定TWI总线编号)
      • [3.3 添加TWI2引脚复用配置(⭐⭐⭐ 必须掌握)](#3.3 添加TWI2引脚复用配置(⭐⭐⭐ 必须掌握))
      • [3.4 配置TWI2总线并添加触摸屏设备节点(⭐⭐⭐ 必须掌握)](#3.4 配置TWI2总线并添加触摸屏设备节点(⭐⭐⭐ 必须掌握))
      • [3.5 检查引脚冲突(⭐⭐ 重点掌握)](#3.5 检查引脚冲突(⭐⭐ 重点掌握))
      • [3.6 Tina SDK中设备树的编译机制(⭐⭐ 重点掌握)](#3.6 Tina SDK中设备树的编译机制(⭐⭐ 重点掌握))
    • [四、内核模块配置(⭐⭐⭐ 必须掌握)](#四、内核模块配置(⭐⭐⭐ 必须掌握))
      • [4.1 为什么不能只用 `make kernel_menuconfig`?](#4.1 为什么不能只用 make kernel_menuconfig?)
      • [4.2 TinaSDK的模块管理机制 `modules.mk`(⭐⭐⭐ 必须掌握)](#4.2 TinaSDK的模块管理机制 modules.mk(⭐⭐⭐ 必须掌握))
      • [4.3 在Tina配置中选中GT911模块(⭐⭐⭐ 必须掌握)](#4.3 在Tina配置中选中GT911模块(⭐⭐⭐ 必须掌握))
    • [五、编译、打包与烧录(⭐⭐ 重点掌握)](#五、编译、打包与烧录(⭐⭐ 重点掌握))
      • [5.1 编译内核](#5.1 编译内核)
      • [5.2 打包固件](#5.2 打包固件)
      • [5.3 烧录固件](#5.3 烧录固件)
    • [六、验证触摸功能(⭐⭐⭐ 必须掌握)](#六、验证触摸功能(⭐⭐⭐ 必须掌握))
      • [6.1 检查驱动模块是否加载成功](#6.1 检查驱动模块是否加载成功)
      • [6.2 定位触摸屏对应的event节点](#6.2 定位触摸屏对应的event节点)
      • [6.3 原始数据测试(⭐⭐ 重点掌握)](#6.3 原始数据测试(⭐⭐ 重点掌握))
      • [6.4 常见问题排查](#6.4 常见问题排查)
        • [问题1:`Error: Driver 'gt9xxnew_ts' is already registered`](#问题1:Error: Driver 'gt9xxnew_ts' is already registered)
        • [问题2:I2C通信超时("Timeout when sending 9th SCL clk")](#问题2:I2C通信超时("Timeout when sending 9th SCL clk"))
        • 问题3:设备树节点修改后不生效
      • [6.5 使用 `evtest` 工具进行进阶测试(⭐ 了解即可)](#6.5 使用 evtest 工具进行进阶测试(⭐ 了解即可))
    • 七、功能拓展:添加新的I2C设备(触类旁通)
    • 八、面试官提问环节(必考!)
    • 九、总结

🎯 本任务的学习目标和重点掌握程度

为了帮助你在实际工作中遇到类似任务时,清楚地知道每一步要做什么,同时也方便领导考核时清晰了解你的技能水平,我们对本任务涉及的每个知识点进行了重要程度分级:

分级 图标 含义 工作要求
必须掌握 ⭐⭐⭐ 独立作业,考核核心 能不看文档独立完成,领导要求你必须做到且会重点检查
重点掌握 ⭐⭐ 了解原理,能按文档完成 理解原理,出现问题知道去哪里排查
了解即可 知道概念,能复述 面试能说清楚,不用实际动手做

作为初学者,重点掌握"必须掌握"(⭐⭐⭐)的内容,这是你入门嵌入式Linux驱动的基石。"重点掌握"(⭐⭐)的内容为辅,帮助你构建完整的知识体系。"了解即可"的部分供你开阔眼界,后续再深入学习。

一、项目背景:我们要做什么?(⭐ 了解即可)

在嵌入式Linux开发中,为开发板添加LCD触摸屏支持是最常见的任务之一。本文将指导你为 100ASK_T113s3-Pro开发板 添加 7寸1024x600分辨率RGB LCD触摸屏的驱动支持。

屏幕模块详细信息如下:

项目 规格
模组型号 100ASK-7"RGB LCD-V1.2
分辨率 1024 x 600
触摸芯片 汇顶科技GT911 (Goodix GT9xx系列)
通信接口 I2C(全志平台称为TWI,即Two-Wire Interface)
数据手册 T113-s3_datasheet_v1.6.pdf(第41页)

触摸屏工作原理简述 :触摸IC(GT911)通过I2C总线与主控芯片T113通信,当手指触摸屏幕时,触摸IC会通过中断引脚通知主控,主控通过I2C读取触摸坐标数据,并通过Linux的Input子系统上报给上层应用。

整个适配过程分为三大步骤

  1. 编写/修改设备树文件:告诉内核硬件如何连接(I2C总线、中断引脚、复位引脚等)
  2. 配置内核模块:让内核包含GT911驱动
  3. 编译、烧录与验证:生成系统镜像,验证触摸功能是否正常工作

二、内核源码与设备树文件的位置(⭐⭐⭐ 必须掌握)

在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.sh):

bash

复制代码
# 切换到内核源码根目录
ckernel
# 切换到内核设备树目录(arch/arm/boot/dts)
cdts

2.2 板级配置文件目录(⭐⭐⭐⭐ 核心操作区)

这是Tina SDK特有的板级配置文件位置,与内核源码分开存放:

内容 路径 快捷命令
板级设备树 device/config/chips/t113/configs/100ask/board.dts ccconfigs
板级内核配置 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.dts

bash

复制代码
ccconfigs
cd linux-5.4
ls
# board.dts  config-5.4  config-5.4-mem-optimize

⛔ 重要警告 ⛔make menuconfigmake kernel_menuconfig 是完全不同的两个东西:

命令 作用 配置保存位置
make kernel_menuconfig 配置Linux内核选项 临时 ,执行 make clean 后会丢失
make menuconfig 配置Tina系统的软件包选项 永久 ,配置会保存在 .config
make menuconfigKernel modules 在Tina层面选择需要的内核模块 永久 ,通过 modules.mk 机制生效

⭐ 重点掌握:记住这个区别,避免你配置完后一清理环境配置全丢了!

三、设备树修改详解(⭐⭐⭐ 必须掌握)

3.1 解析硬件原理图

根据100ASK-7"RGB LCD-V1.2的硬件原理图,触摸屏相关的接口如下:

原理图引脚标号 T113对应引脚 功能说明
CTP_INT PE1 触摸中断信号,触摸屏有数据时通知主控
CTP_RST PE0 触摸复位信号,控制触摸IC复位
RPI_SCL PE12 I2C时钟线
RPI_SDA PE13 I2C数据线

3.2 确定TWI总线编号

通过查看数据手册 T113-s3_datasheet_v1.6.pdf 第41页,确认 PE12和PE13引脚的功能复用表如下:

引脚 功能选项 说明
PE12 Function 2 = twi2 + USB + ... 说明PE12可作为TWI2的SCL
PE13 Function 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 的引脚复用配置:

c

复制代码
&pio {
    // ... 其他配置(保持原有内容不动)
    
    // ⭐ 添加 TWI2 引脚复用定义
    twi2_pins_a: twi2@0 {
        pins = "PE12", "PE13";
        function = "twi2";              // 将PE12、PE13复用为TWI2功能
        drive-strength = <10>;          // 驱动能力10mA
    };
    
    twi2_pins_b: twi2@1 {
        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 节点配置:

c

复制代码
&twi2 {
    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从设备)
    ctp@14 {
        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设备地址可以是 0x140x5d,这由复位引脚的上电时序决定。本次适配使用 0x14

3.5 检查引脚冲突(⭐⭐ 重点掌握)

在添加新设备节点时,务必检查新使用的引脚是否已经被其他功能占用。引脚冲突是新手最容易犯的错误之一,往往导致驱动加载失败。本次使用的引脚情况:

引脚 本任务用途 潜在冲突 解决方法
PE12 / PE13 TWI2 可能被其他I2C设备使用 可以通过全局搜索 grep -r "PE12" device/ 检查是否有其他设备配置了这些引脚,若有则需协调。

3.6 Tina SDK中设备树的编译机制(⭐⭐ 重点掌握)

在TinaSDK中,设备树无法单独编译 ,它会与U-Boot、optee等一起打包到最终镜像中。你必须在TinaSDK根目录下执行 makemkernel 命令,系统才会自动编译设备树。因此,任何设备树的修改都需要完整编译系统或至少重新编译内核,然后重新打包镜像才能生效。

四、内核模块配置(⭐⭐⭐ 必须掌握)

4.1 为什么不能只用 make kernel_menuconfig

很多初学者会在内核源码目录执行 make kernel_menuconfig,配置完发现执行 make clean 后配置丢失了。

这是因为在TinaSDK框架中,内核的最终配置文件是由多个部分动态合并而成的:

  1. target/allwinner/generic/config-5.4(通用配置)
  2. device/config/chips/t113/configs/100ask/linux/config-5.4(板级配置)
  3. 其他依赖关系

直接修改内核的 .config 文件会在下次合并时被覆盖。

4.2 TinaSDK的模块管理机制 modules.mk(⭐⭐⭐ 必须掌握)

TinaSDK为每个内核模块在 target/allwinner/t113-common/modules.mk 中预定义了Kconfig配置项。打开该文件,可以看到GT911驱动的定义:

makefile

复制代码
define KernelPackage/touchscreen-gt9xxnew
    SUBMENU:=$(INPUT_MODULES_MENU)
    TITLE:=gt9xxnew support
    DEPENDS:=+kmod-input-core
    KCONFIG:= \
        CONFIG_INPUT_TOUCHSCREEN=y \
        CONFIG_TOUCHSCREEN_GT9XXNEW_TS=y \
        ... (其他相关配置)
    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 modulesInput modules 找到触摸屏相关选项:

text

复制代码
Tina 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 打包固件

bash

复制代码
pack

打包过程中会看到如下输出:

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 finish

5.3 烧录固件

使用 ls -lh 命令查看生成的镜像大小,确认文件完整后将其复制到Windows系统:

bash

复制代码
ls -lh /home/ubuntu/tina-d1-h/out/t113-100ask/tina_t113-100ask_uart3.img

使用 PhoenixSuit(线刷工具)将镜像烧录到开发板的SPI NAND Flash中。

六、验证触摸功能(⭐⭐⭐ 必须掌握)

6.1 检查驱动模块是否加载成功

系统启动后,首先检查内核日志中是否有GT911驱动加载信息:

bash

复制代码
dmesg | 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/input2

input: gt9xxnew_ts as /devices/virtual/input/input2 这一行表示触摸屏驱动注册成功,并创建了input设备节点 /dev/input/event2

注意supply ctp not found 只是一个警告,提示没有为触摸屏单独配置电源管理,不影响触摸功能。

6.2 定位触摸屏对应的event节点

如果系统中有多个input设备(键盘、鼠标、触摸屏等),可以通过查看 /proc/bus/input/devices 文件来确定每个设备对应的event节点:

bash

复制代码
cat /proc/bus/input/devices

找到 Name="gt9xxnew_ts" 的段落,查看其 H 行(Handlers):

text

复制代码
I: Bus=0018 Vendor=dead Product=beef Version=28bb
N: Name="gt9xxnew_ts"
P: Phys=A-P
S: Sysfs=/devices/virtual/input/input2
U: Uniq=
H: Handlers=event2
B: PROP=2
B: EV=b
B: KEY=400007f8000100000000
B: ABS=26500000

H: Handlers=event2 表示该触摸屏对应的设备节点是 /dev/input/event2

💡 进阶技巧 :如果你在编译内核时已经配置好TSLIB(触摸屏校准库),也可以直接运行 ts_test 进行可视化测试。后续可以深入学习本节内容的【进阶内容】。

6.3 原始数据测试(⭐⭐ 重点掌握)

使用 cat 命令直接读取event节点,可以快速验证触摸屏硬件是否正常工作:

bash

复制代码
cat /dev/input/event2

用手指触摸屏幕,终端上会出现二进制乱码输出(代表有数据上报)。

现象 结论
cat /dev/input/eventX 出现乱码输出(手触摸时) 触摸屏工作正常 ✅
cat /dev/input/eventX 无反应 触摸屏未工作,需排查 ❌

6.4 常见问题排查

问题1:Error: Driver 'gt9xxnew_ts' is already registered

现象insmod 时报错该驱动已注册。
原因 :驱动已被编译进内核或已被加载。
解决方法 :直接使用 modprobe 或确认设备树配置即可,无需重复加载。

问题2:I2C通信超时("Timeout when sending 9th SCL clk")

现象 :系统启动时dmesg出现重复的I2C传输超时错误。
原因 :I2C设备地址错误、引脚配置冲突、供电问题或设备未正确复位。
排查步骤

  1. 检查 reg = <0x14> 是否与硬件实际地址一致(尝试 0x5d)。
  2. 检查引脚是否正确:PE0 对应 GPIO_ACTIVE_HIGH,确保复位时序正确。
  3. 检查 pinsfunction 是否与硬件原理图一致。
  4. 检查系统启动日志中引脚复用是否有冲突。
问题3:设备树节点修改后不生效

原因 :在TinaSDK中设备树无法单独编译,必须重新打包整个镜像。
解决方法 :修改设备树后,务必执行 make(或 mkernel)重新编译,然后执行 pack 打包,最后重新烧录完整镜像。

6.5 使用 evtest 工具进行进阶测试(⭐ 了解即可)

如果需要获取更详细的上报数据(坐标值、压力值等),可以安装 evtest 工具:

bash

复制代码
# 在开发板上运行
evtest /dev/input/event2

运行后会显示触摸屏的详细信息(坐标范围、分辨率等),并实时输出触摸事件数据,非常适合调试坐标是否正确、是否反向等问题。

七、功能拓展:添加新的I2C设备(触类旁通)

掌握了为TWI2添加GT911触摸屏的方法后,你可以轻松地为项目添加任何I2C设备(如传感器、时钟芯片等)。模板如下:

c

复制代码
&twix {    // x 为TWI总线编号
    clock-frequency = <400000>;
    pinctrl-0 = <&twix_pins_a>;
    pinctrl-1 = <&twix_pins_b>;
    pinctrl-names = "default", "sleep";
    status = "okay";

    new_device@xx {    // xx 为设备地址
        compatible = "vendor,device-name";
        reg = <xx>;
        // 根据设备驱动要求添加其他属性
        status = "okay";
    };
};

添加步骤:

  1. 确定设备使用的I2C总线编号(如TWI1、TWI2)。
  2. &pio 节点中添加引脚复用配置。
  3. 在对应的 &twix 节点下添加设备子节点。
  4. 根据设备驱动文档填充设备树属性。
  5. 配置内核模块(如有需要)。
  6. 编译、打包、烧录并验证。

修改设备树时,每次修改后都需要 pack 打包整个镜像才能生效。建议将所有I2C设备集中在同一个 &twix 节点下管理,便于维护。

八、面试官提问环节(必考!)

第1问:如何排查I2C设备(如触摸屏)通信故障?

参考答案:排查I2C故障,按照以下步骤逐一检查:

  1. 硬件层面:用万用表检查供电、SCL/SDA上拉电阻是否正常。
  2. 引脚配置 :用 dmesg | grep pinctrl 检查引脚复用是否正确。
  3. I2C通信测试 :用 i2cdetect -y <bus号> 扫描设备地址,确认设备是否应答。
  4. 检查内核日志 :用 dmesg | grep -i "i2c\|error" 查找通信错误(如NACK、超时等)。
  5. 检查地址配置 :确认设备树中的 reg 属性与硬件实际地址一致(GT911常见地址为 0x140x5d)。
  6. 检查复位时序 :确认复位引脚(ctp_wakeup)的上电时序满足芯片要求。

参考答案:两者作用完全不同:

命令 作用 配置保存位置 是否永久
make kernel_menuconfig 配置Linux内核选项 临时 .config ❌ 不永久,make clean 后丢失
make menuconfig 配置Tina系统软件包选项 Tina .config ✅ 永久
make menuconfigKernel modules 在Tina层面选择内核模块 通过 modules.mk 机制 ✅ 永久

第3问:修改设备树后触摸屏不工作,请给出排查思路。

参考答案

  1. 检查硬件连接:确认FPC排线是否插好,触摸屏模块供电是否正常。
  2. 检查设备树引脚配置
    • 确认 twi2_pins_a 中指定的引脚与实际原理图一致(PE12/PE13)。
    • 确认 function 值是否正确(twi2)。
  3. 检查I2C通信 :执行 i2cdetect -y 2 扫描TWI2总线,确认地址 0x14 是否出现 UU(表示设备已注册且有驱动)。
  4. 检查内核日志 :执行 dmesg | grep -i "gt9\|error" 查找驱动加载失败原因。
  5. 检查地址冲突 :确认 reg 地址与设备实际地址一致(GT911可能是 0x140x5d)。
  6. 检查电源:触摸屏模块是否需要独立的电源引脚,若需要确认设备树中是否已配置。
  7. 确认工作流程 :修改设备树后必须执行 pack 重新打包,不能仅替换设备树文件。

九、总结

本文带你完整走了一遍在Tina-SDK中为7寸1024x600 RGB LCD触摸屏添加驱动支持的流程,包括:

  1. ✅ 硬件原理图分析与引脚对应关系确定
  2. ✅ 设备树修改(引脚复用配置 + TWI总线配置 + 触摸设备节点添加)
  3. ✅ 内核模块配置(TinaSDK的 make menuconfig 用法)
  4. ✅ 编译、打包与烧录
  5. ✅ 触摸功能验证与问题排查
  6. ✅ 扩展知识:为其他I2C设备添加支持的方法

这套流程是嵌入式Linux驱动开发的通用方法,掌握它,你就能触类旁通,为任何硬件外设添加Linux驱动支持。


下一步学习建议

  1. 学习Linux I2C子系统和Input子系统的驱动框架。
  2. 熟悉Linux设备树的语法(属性节点引用等)。
  3. 尝试修改GT911驱动源码,如调整坐标上报算法或增加手势识别功能。
  4. 进一步学习TSLIB触摸屏校准工具的使用。
学习阶段 任务
⭐ 入门 跟着本文做一遍,在自己板子上成功点亮触摸屏
⭐⭐ 进阶 尝试为其他I2C设备(如温湿度传感器)添加驱动支持
⭐⭐⭐ 高级 阅读GT911驱动源码,理解input子系统数据上报流程

祝你学得扎实,考核稳过!

相关推荐
十 一 丶1 小时前
如何在客户端实现ssh的免密登录?
运维·rust·ssh
想唱rap2 小时前
应用层HTTPS协议
服务器·网络·c++·网络协议·http·https
前端之虎陈随易2 小时前
为什么今天还会有新语言?MoonBit 想解决什么问题?
大数据·linux·javascript·人工智能·算法·microsoft·typescript
G.晴天2 小时前
Linux常用命令练习流程
java·linux·运维·服务器·tomcat
嵌入式×边缘AI:打怪升级日志2 小时前
Linux 驱动开发核心自测题库(面试官问答版)
linux·运维·驱动开发
想唱rap2 小时前
传输层协议之UDP
java·linux·网络·c++·网络协议·mysql·udp
春蕾夏荷_7282977252 小时前
2、c++ acl tcp服务器客户端简单实例-客户端(2)
服务器·c++·tcp/ip
AIGC设计所2 小时前
网络安全8大就业领域和待遇对比!
运维·开发语言·网络·安全·web安全·php
网安薯条2 小时前
Kali Linux 虚拟机安装与基础配置保姆级图文教程
linux·运维·网络·安全·web安全·网络安全