OMAPL138 墩泰I2C LCD触控屏驱动程序移植
在嵌入式系统开发中,为特定硬件组件移植驱动程序是常见的任务。本文将深入探讨如何在基于OMAPL138处理器的平台上,为墩泰(GT811)I2C LCD触控屏移植驱动程序。我们将详细分析硬件连接,并重点讲解如何利用Linux内核的设备树(Device Tree Source, DTS)机制来配置相关的引脚复用(pinmux)、中断以及复位信号,确保触控屏能够正常工作。通过本文,读者将了解到从硬件连接到DTS软件配置的完整流程,为类似的项目提供宝贵的参考。
OMAPL138与GT811触控屏概述
OMAPL138是一款由德州仪器(TI)推出的低功耗应用处理器,集成了ARM926EJ-S内核和C674x DSP内核,广泛应用于工业控制、医疗设备和人机界面等领域。其丰富的I/O接口使其能够灵活地连接各种外设。
墩泰GT811是一款常见的电容式触控屏控制器,通常通过I2C接口与主处理器通信,并提供一个中断引脚(INT)用于通知处理器触控事件,以及一个复位引脚(RESET)用于初始化或恢复控制器。
硬件连接分析
在将GT811触控屏连接到OMAPL138平台时,需要关注以下几个关键连接点:
- I2C通信接口: GT811通过I2C接口进行数据传输。根据我们的硬件设计,GT811连接到OMAPL138的I2C1总线上。这意味着OMAPL138的I2C1_SDA和I2C1_SCL引脚需要正确配置为I2C功能。
- 中断引脚(INT): GT811的INT引脚用于在检测到触控事件时向主处理器发送中断信号。此引脚连接到OMAPL138的GPIO1_27。为了及时响应触控事件,GPIO1_27需要配置为中断输入,并设置为下降沿触发,因为GT811通常在检测到事件时将INT引脚拉低。
- 复位引脚(RESET): GT811的RESET引脚用于在驱动程序初始化时对触控控制器进行硬件复位。此引脚连接到OMAPL138的GPIO1_26。GT811通常是拉低复位(active-low reset),因此GPIO1_26需要配置为输出引脚,以便驱动程序能够控制其电平状态。
正确的硬件连接是驱动程序正常工作的基础,而软件配置则负责将这些物理连接映射到操作系统可识别和控制的功能。
软件配置策略:利用设备树(DTS)
在Linux内核中,设备树(Device Tree)是一种用于描述硬件布局的数据结构,它将硬件信息从内核代码中分离出来,使得内核可以更灵活地支持不同的硬件平台。对于OMAPL138这样的嵌入式处理器,引脚复用(pinmux)配置、GPIO功能设置以及中断映射等都通过DTS文件进行。
我们的目标是修改或添加相关DTS节点,以正确配置OMAPL138的引脚,使其能够与GT811触控屏控制器协同工作。在我们的案例中,参考了TQ335x.dts文件(这可能是一个特定板卡或基于AM335x平台的DTS,OMAPL138与AM335x在某些外设和DTS结构上具有相似性,因此可以作为参考),并进行了相应的调整。
Step1. 检查I2C引脚的pinmux配置
OMAPL138的I2C1接口需要两根引脚:SDA(数据线)和SCL(时钟线)。在DTS中,这些引脚的复用功能必须设置为I2C模式。
原始发现: 经过对现有DTS文件(例如TQ335x.dts或OMAPL138相关的DTS)的分析,我们发现i2c1节点已经包含了对I2C1_SDA和I2C1_SCL引脚的正确pinmux配置。该节点的pinctrl-0属性指向的phandler(一个DTS引用)已经完成了I2C1两个引脚的相关配置。
结论: 因此,对于I2C1引脚的pinmux配置,无需进行任何修改。这表明基础的I2C功能在DTS中已经正确设置。
通常,一个I2C引脚的DTS配置可能看起来像这样(仅为示例,具体寄存器值和名称因芯片而异):
&i2c1 {
pinctrl-names = "default";
pinctrl-0 = <&i2c1_pins>; // 指向具体的pinmux配置组
status = "okay";
};
&am33xx_pinmux { // 假设这是OMAPL138的pinmux父节点
i2c1_pins: pinmux_i2c1_pins {
pinctrl-single,pins = <
0x180 (PIN_INPUT_PULLUP | MUX_MODE2) /* i2c1_scl.i2c1_scl */
0x184 (PIN_INPUT_PULLUP | MUX_MODE2) /* i2c1_sda.i2c1_sda */
>;
};
};
上述示例中的MUX_MODE2表示将引脚复用为I2C功能,PIN_INPUT_PULLUP表示上拉输入,这对于I2C总线是常见的配置。由于原始DTS已正确配置,我们无需干预。
Step2. 配置INT和RESET引脚
与I2C引脚不同,中断和复位引脚通常需要根据具体的外设需求进行定制配置。这些引脚通常是通用的GPIO(General Purpose Input/Output),需要将其功能设置为输入(带中断)或输出。
原始发现: 在am33xx_pinmux节点内需要添加引脚配置信息。虽然原始文章没有给出具体的DTS代码片段,但它明确指出了需要配置的引脚和它们的功能。
具体配置内容及DTS示例:
-
中断引脚(INT)配置:GPIO1_27
- 功能: 输入,下降沿触发中断。
- DTS配置思路: 在
am33xx_pinmux节点下,为GPIO1_27创建一个新的pinmux组,将其配置为GPIO输入模式,并确保在设备驱动中能够注册为中断源。 - 示例DTS片段(仅为结构示例,具体值需查阅芯片手册):
&am33xx_pinmux { pinctrl_gt811_int: gt811_int_pins { pinctrl-single,pins = < 0x09C (PIN_INPUT_PULLUP | MUX_MODE7) /* gpio1_27.gpio */ >; }; };-
解释:
0x09C是GPIO1_27引脚的控制寄存器偏移地址(具体值需查阅OMAPL138或AM335x的TRM)。PIN_INPUT_PULLUP表示配置为输入,并启用内部上拉电阻,这有助于确保引脚在空闲时保持高电平。MUX_MODE7通常是GPIO模式(具体模式号需查阅芯片手册)。- 在GT811的I2C设备节点中,需要引用这个pinmux组,并指定中断号和触发方式:
&i2c1 { // ... 其他I2C设备配置 gt811_touch@5d { // 假设GT811的I2C地址是0x5d compatible = "gt,gt811"; // 兼容性字符串,用于匹配驱动 reg = <0x5d>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_gt811_int &pinctrl_gt811_reset>; // 引用GPIO pinmux组 interrupt-parent = <&gpio1>; // 中断父节点为GPIO1控制器 interrupts = <27 IRQ_TYPE_EDGE_FALLING>; // GPIO1的27号引脚,下降沿触发 reset-gpios = <&gpio1 26 GPIO_ACTIVE_LOW>; // 复位引脚配置 // ... 其他GT811特定属性 }; };interrupts = <27 IRQ_TYPE_EDGE_FALLING>;明确了中断引脚是GPIO1的第27个引脚,并且是下降沿触发。内核会根据这个信息将GPIO引脚转换为对应的中断号。
-
复位引脚(RESET)配置:GPIO1_26
- 功能: 输出,控制高低电平以实现拉低复位。
- DTS配置思路: 同样在
am33xx_pinmux节点下,为GPIO1_26创建一个pinmux组,将其配置为GPIO输出模式。 - 示例DTS片段(仅为结构示例,具体值需查阅芯片手册):
&am33xx_pinmux { pinctrl_gt811_reset: gt811_reset_pins { pinctrl-single,pins = < 0x098 (PIN_OUTPUT | MUX_MODE7) /* gpio1_26.gpio */ >; }; };- 解释:
0x098是GPIO1_26引脚的控制寄存器偏移地址。PIN_OUTPUT表示配置为输出模式。MUX_MODE7同样是GPIO模式。- 在GT811的I2C设备节点中,使用
reset-gpios属性来指定复位引脚: reset-gpios = <&gpio1 26 GPIO_ACTIVE_LOW>;指定了复位引脚是GPIO1的第26个引脚,并且是低电平有效复位。
通过上述DTS配置,我们完成了GT811触控屏所需的I2C通信、中断通知和硬件复位功能的所有引脚准备。
驱动程序实现注意事项
在DTS配置完成后,下一步是编写或移植GT811的Linux设备驱动程序。驱动程序将利用DTS中提供的信息来:
- 注册I2C设备: 内核会根据DTS中的
compatible字符串找到对应的I2C驱动,并注册GT811设备。 - 处理中断: 驱动程序会注册一个中断处理函数,当GT811的INT引脚触发中断时,该函数会被调用,从而读取触控数据。
- 控制复位: 在驱动程序的
probe函数中,会通过GPIO接口操作RESET引脚,完成GT811的初始化复位序列。 - 读取触控数据: 通过I2C总线与GT811通信,读取触摸点的坐标、手势等信息,并上报给Linux输入子系统。
常见问题与调试技巧
在驱动移植过程中,可能会遇到各种问题。以下是一些常见的调试技巧:
- 检查内核日志: 使用
dmesg命令查看内核启动日志,检查是否有DTS解析错误、I2C设备探测失败或GPIO相关警告/错误。 - 验证引脚复用: 在系统启动后,可以通过
/sys/kernel/debug/pinctrl/路径下的文件(如果启用了debugfs)或使用devmem2等工具直接读取引脚控制寄存器,验证引脚是否按照DTS的配置正确复用。 - GPIO状态检查: 使用
gpioinfo或/sys/class/gpio下的文件来检查GPIO引脚的当前状态(输入/输出、电平)。 - I2C总线探测: 使用
i2cdetect -y <bus_num>命令来扫描I2C总线,确认GT811的I2C地址是否能被正确识别。 - 示波器/逻辑分析仪: 对于硬件层面的问题,如I2C通信异常、中断信号不触发等,使用示波器或逻辑分析仪直接观察I2C总线波形和GPIO电平变化,是定位问题的最有效方法。
总结
为OMAPL138平台移植墩泰GT811 I2C LCD触控屏驱动程序,核心在于对硬件连接的准确理解和对Linux设备树(DTS)的精细配置。通过本文的详细分析,我们了解到I2C通信引脚通常在现有DTS中已配置妥当,而中断(INT)和复位(RESET)引脚则需要手动在am33xx_pinmux节点下添加GPIO输入(带中断)和GPIO输出的配置。正确的DTS配置是驱动程序能够与硬件正常交互的基石。在完成DTS配置后,结合GT811的Linux驱动程序,即可实现触控屏的完整功能。希望本文能为您的嵌入式系统开发提供清晰的指导和帮助。