立创 OPEN HMI 人机交互模块硬件调试与Linux驱动适配实战
立创 OPEN HMI 人机交互模块硬件调试与Linux驱动适配实战最近在做一个工业触摸屏的项目用到了立创EDA推出的OPEN HMI模块。这块板子集成了5寸LCD屏幕、继电器和隔离输入功能挺全的但调试过程中确实遇到了一些硬件和驱动上的“坑”。今天我就把整个硬件调试和Linux驱动适配的过程整理出来希望能帮到正在使用或评估这块板子的朋友。这篇文章会手把手带你走一遍核心流程从硬件功能测试状态确认到SPI Flash烧录的细节再到屏幕校准和色彩顺序修改。整个过程我会结合自己的实际操作把容易出错的地方重点标出来。如果你手头有这块板子或者正在基于全志方案比如荔枝派做嵌入式GUI开发那这篇实战指南应该能让你少走不少弯路。1. 模块功能概览与测试状态拿到一块开发板第一步肯定是搞清楚它有什么功能以及哪些功能是已经验证过的。根据官方资料OPEN HMI模块主要包含以下几个核心功能它们的测试状态各不相同2路继电器输出测试完成。这意味着你可以直接用它们来控制外部设备比如电灯、电机等。继电器是隔离的用起来比较安全。5寸 LCD屏幕测试完成。屏幕显示和触摸功能都已经调通这是人机交互的核心。4路隔离输入未完成测试。这是一个需要注意的地方。隔离输入通常用于采集外部的开关量信号比如按钮、传感器因为“未完成测试”所以如果你要用到这个功能可能需要自己花点时间验证电路和驱动。SPI Flash已完成测试。板载的SPI Flash用于存储系统固件烧录和读写功能是正常的。了解这个状态很重要它能帮你快速判断哪些功能可以“开箱即用”哪些需要投入额外的调试精力。接下来咱们就进入具体的调试环节。2. 硬件调试注意事项在开始烧写程序、驱动屏幕之前有两个硬件相关的问题需要提前了解这能避免你后面踩坑。2.1 硬件修改说明原文中明确提到了一点SDIO接口需要上拉布线需要调整。这听起来可能有点专业我解释一下。SDIO接口通常用于连接Wi-Fi模块、SD卡等设备。接口上的某些信号线比如CMD、DAT线内部是“开漏”或“高阻”状态如果不通过电阻连接到电源即上拉它的电平可能就是不确定的会导致通信失败。注意这个说明可能是针对早期版本或特定使用场景的。如果你拿到的是成品模块可能已经处理好了。但如果你是自己打板或者遇到SDIO设备无法识别的情况首先要检查的就是信号线是否按要求上拉了。2.2 SPI Flash程序烧录详解我们的系统固件是存放在SPI Flash里的。给空的Flash烧写程序或者更新系统都需要用到这个步骤。这里用的工具是sunxi-fel它是全志芯片进入FEL模式一种USB烧录模式后的专用工具。烧录命令如下sudo sunxi-fel -p spiflash-write 0 flashimg.bin我来拆解一下这个命令sunxi-fel全志FEL模式工具。-p表示进行SPI Flash操作。spiflash-write子命令意思是写SPI Flash。0表示从SPI Flash的起始地址0x0开始写入。flashimg.bin你要烧录的固件镜像文件。这里有一个非常关键的注意事项原文用加粗强调了进入FEL模式之后SPI flash的CS片选信号和GND地线要断开再执行以上命令。为什么我猜是因为板子设计上SPI Flash可能和其他器件比如SOC共享了SPI总线。在正常运行时由SOC通过CS信号来选择控制Flash。但在通过USBFEL模式烧写Flash时我们需要让烧录工具通过USB能独占并控制这颗Flash。如果CS脚被板子上的其他电路拉低选中就会产生冲突导致烧写失败。实际操作建议找到板子上SPI Flash的CS引脚和GND引脚。在让板子进入FEL模式通常是通过按住某个按键再上电后先不要急着运行命令。用烙铁或跳线帽暂时断开Flash的CS引脚与SOC的连接或者断开与GND的短接如果存在的话。有些板子可能会设计有测试点或跳线方便断开。断开连接后再在电脑上执行上面的sunxi-fel烧录命令。烧录完成后记得恢复CS引脚的连接然后重启板子。3. Linux驱动层关键操作系统跑起来之后就要让屏幕好好工作了。这里有两个重要的驱动层配置屏幕触摸校准和LCD色彩顺序修改。3.1 屏幕触摸校准5寸电阻屏或电容屏通常都需要校准以确保你手指触摸的位置和系统识别的位置是一致的。在Linux下我们一般用tslib这个开源库来处理触摸屏校准和数据过滤。校准前需要设置一些环境变量告诉tslib我们的触摸屏设备文件、配置文件在哪。最方便的方法是把这些设置加到系统的profile文件里这样每次开机都会自动生效。操作步骤如下通过串口终端登录到你的OPEN HMI开发板。使用vi编辑器打开/etc/profile文件vi /etc/profile按i键进入编辑模式然后滚动到文件末尾。插入以下6行配置代码export TSLIB_TSDEVICE/dev/input/event0 export TSLIB_CALIBFILE/etc/pointercal export TSLIB_CONFFILE/etc/ts.conf export TSLIB_PLUGINDIR/usr/lib/ts export TSLIB_CONSOLEDEVICEnone export TSLIB_FBDEVICE/dev/fb0TSLIB_TSDEVICE指定触摸屏的设备节点通常是/dev/input/event0或event1如果不确定可以用cat /proc/bus/input/devices查看。TSLIB_CALIBFILE校准后产生的数据文件存放路径。TSLIB_CONFFILEtslib的配置文件路径。TSLIB_PLUGINDIRtslib插件存放的目录。TSLIB_CONSOLEDEVICE控制台设备设为none避免冲突。TSLIB_FBDEVICE帧缓冲设备对应我们的LCD屏幕。按ESC键退出编辑模式然后输入:wq保存并退出vi。重启开发板或者执行source /etc/profile让配置立即生效。配置好后就可以运行ts_calibrate命令进行五点校准了。校准过程中依次点击屏幕上的十字光标即可。3.2 LCD屏幕RGB顺序修改RGB666改为BGR666这是一个非常典型的硬件与软件匹配问题。原文提到这个改动是“为了方便硬件布线”。这是什么意思呢LCD屏幕显示颜色需要红R、绿G、蓝B三种数据。SOC的LCD控制器输出这组数据时有一个固定的顺序比如R[5:0], G[5:0], B[5:0]RGB666。屏幕那边的驱动芯片接收数据也期望一个固定的顺序。 如果PCB布线时SOC的R0信号线直接连到了屏幕的R0引脚那就没问题。但有时候为了走线顺畅、避免交叉硬件工程师可能会把线序交换一下比如把SOC的R[5:0]信号线接到了屏幕的B[5:0]引脚上。这样硬件上就变成了BGR的连接方式。如果软件驱动还是按照默认的RGB顺序去发送数据那么屏幕显示的颜色就会完全错乱红色和蓝色会对调。解决办法就是在驱动层修改数据输出顺序让软件发送数据的顺序去匹配硬件实际的连接顺序。原文给出了针对全志平台sun4i DRM驱动的修改方法具体文件是Linux/drivers/gpu/drm/sun4i/sun4i_tcon.c我们需要修改sun4i_tcon_channel_set_status这个函数在启用TCON0通常用于LCD的时候同时设置一个交换R、B通道的寄存器位。找到以下代码段在函数内部case 0: regmap_update_bits(tcon-regs, SUN4I_TCON0_CTL_REG, SUN4I_TCON0_CTL_TCON_ENABLE, enabled ? SUN4I_TCON0_CTL_TCON_ENABLE : 0); // 在这里添加交换R、B的代码 clk tcon-dclk; break;在regmap_update_bits函数调用之后clk tcon-dclk;这行之前添加一行代码regmap_update_bits(tcon-regs, SUN4I_TCON0_CTL_REG, BIT(23), BIT(23)); //SWAP R、B引脚这行代码的作用是向SUN4I_TCON0_CTL_REG寄存器的第23位写入1。根据全志芯片的数据手册这个位就是用来控制RGB通道交换的。提示BIT(23)是一个宏表示(1 23)即第23位为1。regmap_update_bits函数会确保只修改我们指定的位第23位将其设置为1而不影响寄存器其他位的值。修改完成后需要重新编译Linux内核并更新到开发板上。重启后LCD的色彩显示就应该正常了。整个调试过程从硬件状态确认到驱动修改基本遵循了“先硬后软”的原则。硬件连接是基础驱动配置是适配。OPEN HMI模块的功能设计很实用参考荔枝派这类成熟的全志方案进行开发也能大大降低软件层面的难度。希望这篇实战记录能帮你顺利点亮屏幕搞定驱动。如果在实际操作中遇到其他问题不妨从硬件连接和内核驱动源码两个方向去排查往往能找到答案。