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模块(⭐⭐⭐ 必须掌握))
- [4.1 为什么不能只用 `make kernel_menuconfig`?](#4.1 为什么不能只用
- [五、编译、打包与烧录(⭐⭐ 重点掌握)](#五、编译、打包与烧录(⭐⭐ 重点掌握))
-
- [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:设备树节点修改后不生效
- [问题1:`Error: Driver 'gt9xxnew_ts' is already registered`](#问题1:
- [6.5 使用 `evtest` 工具进行进阶测试(⭐ 了解即可)](#6.5 使用
evtest工具进行进阶测试(⭐ 了解即可))
- 七、功能拓展:添加新的I2C设备(触类旁通)
- 八、面试官提问环节(必考!)
-
- 第1问:如何排查I2C设备(如触摸屏)通信故障?
- [第2问:`make kernel_menuconfig` 和 `make menuconfig` 在TinaSDK中有什么区别?](#第2问:
make kernel_menuconfig和make menuconfig在TinaSDK中有什么区别?) - 第3问:修改设备树后触摸屏不工作,请给出排查思路。
- 九、总结
🎯 本任务的学习目标和重点掌握程度
为了帮助你在实际工作中遇到类似任务时,清楚地知道每一步要做什么,同时也方便领导考核时清晰了解你的技能水平,我们对本任务涉及的每个知识点进行了重要程度分级:
| 分级 | 图标 | 含义 | 工作要求 |
|---|---|---|---|
| 必须掌握 | ⭐⭐⭐ | 独立作业,考核核心 | 能不看文档独立完成,领导要求你必须做到且会重点检查 |
| 重点掌握 | ⭐⭐ | 了解原理,能按文档完成 | 理解原理,出现问题知道去哪里排查 |
| 了解即可 | ⭐ | 知道概念,能复述 | 面试能说清楚,不用实际动手做 |
作为初学者,重点掌握"必须掌握"(⭐⭐⭐)的内容,这是你入门嵌入式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子系统上报给上层应用。
整个适配过程分为三大步骤:
- 编写/修改设备树文件:告诉内核硬件如何连接(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.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 menuconfig 和 make kernel_menuconfig 是完全不同的两个东西:
| 命令 | 作用 | 配置保存位置 |
|---|---|---|
make kernel_menuconfig |
配置Linux内核选项 | 临时 ,执行 make clean 后会丢失 |
make menuconfig |
配置Tina系统的软件包选项 | 永久 ,配置会保存在 .config 中 |
make menuconfig → Kernel 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设备地址可以是
0x14或0x5d,这由复位引脚的上电时序决定。本次适配使用0x14。
3.5 检查引脚冲突(⭐⭐ 重点掌握)
在添加新设备节点时,务必检查新使用的引脚是否已经被其他功能占用。引脚冲突是新手最容易犯的错误之一,往往导致驱动加载失败。本次使用的引脚情况:
| 引脚 | 本任务用途 | 潜在冲突 | 解决方法 |
|---|---|---|---|
| PE12 / PE13 | TWI2 | 可能被其他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驱动的定义:
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 modules → Input 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设备地址错误、引脚配置冲突、供电问题或设备未正确复位。
排查步骤:
- 检查
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设备(如传感器、时钟芯片等)。模板如下:
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";
};
};
添加步骤:
- 确定设备使用的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子系统数据上报流程 |
祝你学得扎实,考核稳过!
