全志D1s RISC-V平台GT1151触摸屏驱动深度适配与实战优化
在嵌入式显示交互项目中,电容触摸屏的稳定驱动往往是决定用户体验的关键一环。全志D1s作为一款基于RISC-V架构的高性价比SoC,在智能家居、工业HMI等领域应用广泛,而GT1151作为汇顶科技推出的成熟电容触摸芯片,以其高灵敏度和多点触控能力成为许多项目的首选。然而,当这两者结合时,开发者往往会遇到一系列架构适配、引脚配置和驱动调试的挑战。本文将基于实际项目经验,深入剖析在全志D1s平台上适配GT1151触摸驱动的完整流程,不仅涵盖基础配置,更会分享多个实战中容易忽略的细节和优化技巧。
1. 开发环境搭建与源码获取
在全志Tina Linux环境下进行驱动开发,首先需要搭建完整的交叉编译环境。D1s采用阿里平头哥C906 RISC-V核心,这意味着我们需要针对RISC-V架构进行专门的工具链配置。
推荐使用官方推荐的编译工具链,可以从全志开发者社区或平头哥开源社区获取。安装完成后,务必验证架构匹配性:
riscv64-unknown-linux-gnu-gcc -v
输出应显示Target: riscv64-unknown-linux-gnu,确认工具链正确。
对于GT1151驱动源码,汇顶科技在GitHub上维护了通用驱动仓库,这是最可靠的起点:
git clone https://github.com/goodix/gt1x_driver_generic.git
这个仓库包含了GT1x系列芯片的通用驱动框架,支持GT1151、GT911、GT928等多个型号。下载后,我们需要将其整合到Tina Linux的kernel源码树中。建议在drivers/input/touchscreen/目录下创建专用目录:
cp -r gt1x_driver_generic tina/lichee/linux-5.4/drivers/input/touchscreen/gt1151_driver
注意:不同版本的Tina Linux可能使用不同内核版本(如4.9、5.4等),路径会有所差异。务必确认你的SDK实际使用的内核版本。
接下来需要修改内核的Kconfig和Makefile,将新驱动纳入编译系统。在drivers/input/touchscreen/Kconfig末尾添加:
source "drivers/input/touchscreen/gt1151_driver/Kconfig"
在对应的Makefile中添加:
obj-$(CONFIG_TOUCHSCREEN_GT1151) += gt1151_driver/
完成这些基础工作后,执行make kernel_menuconfig,在Device Drivers -> Input device support -> Touchscreens中找到并启用GT1151驱动。
2. 设备树配置的精细调整
设备树(Device Tree)是现代Linux内核硬件描述的核心,正确的DTS配置是驱动正常工作的前提。GT1151通过I2C总线与主控通信,同时需要中断和复位引脚。
2.1 I2C引脚复用配置
全志平台将I2C控制器称为TWI(Two-Wire Interface)。以使用TWI2接口(PD20-SCL, PD21-SDA)为例,需要在设备树中正确配置引脚复用:
twi2_pins_a: twi2@0 {
pins = "PD20", "PD21";
function = "twi2";
drive-strength = <10>;
bias-pull-up;
};
twi2_pins_b: twi2@1 {
pins = "PD20", "PD21";
function = "gpio_in";
};
这里有几个关键点需要注意:
- 驱动强度(drive-strength):对于I2C总线,通常设置为10mA即可满足大多数场景。如果布线较长或负载较重,可适当增加到20mA。
- 上拉电阻(bias-pull-up):I2C总线需要上拉电阻,虽然硬件电路通常已包含,但在软件配置中明确声明是个好习惯。
- 睡眠状态配置:
twi2_pins_b定义了睡眠状态下的引脚行为,设置为GPIO输入模式可以降低功耗。
2.2 GT1151设备节点配置
在I2C控制器节点下添加GT1151子节点是配置的核心:
&twi2 {
clock-frequency = <400000>;
pinctrl-0 = <&twi2_pins_a>;
pinctrl-1 = <&twi2_pins_b>;
pinctrl-names = "default", "sleep";
status = "okay";
gt1151: touchscreen@14 {
compatible = "goodix,gt1151";
reg = <0x14>;
interrupt-parent = <&pio>;
interrupts = <PD 12 IRQ_TYPE_EDGE_FALLING>;
reset-gpios = <&pio PD 13 GPIO_ACTIVE_LOW>;
irq-gpios = <&pio PD 12 GPIO_ACTIVE_HIGH>;
/* 触摸屏分辨率配置 */
touchscreen-size-x = <800>;
touchscreen-size-y = <480>;
/* 触摸方向调整(根据实际安装方向) */
touchscreen-inverted-x;
touchscreen-swapped-x-y;
/* 固件配置数据(可选) */
goodix,config-data = [
46 D0 02 00 05 05 3D 14 08 80
32 0F 50 3C 0A 05 00 00 00 00
00 00 00 18 1A 1E 14 8C 2E 0E
33 35 0C 08 00 00 00 82 33 1D
00 00 00 00 00 03 64 32 00 00
00 1A 46 94 C5 02 07 00 00 04
9B 2B 00 8C 36 00 7F 43 00 75
52 00 6D 63 00 6D 00 00 00 00
0

&spm=1001.2101.3001.5002&articleId=153174262&d=1&t=3&u=f7ea2723674b49f3841c58244b47cead)
989

被折叠的 条评论
为什么被折叠?



