立创 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。但在通过USB(FEL模式)烧写Flash时,我们需要让烧录工具(通过USB)能独占并控制这颗Flash。如果CS脚被板子上的其他电路拉低(选中),就会产生冲突,导致烧写失败。

实际操作建议:

  1. 找到板子上SPI Flash的CS引脚和GND引脚。
  2. 在让板子进入FEL模式(通常是通过按住某个按键再上电)后,先不要急着运行命令。
  3. 用烙铁或跳线帽,暂时断开Flash的CS引脚与SOC的连接(或者断开与GND的短接,如果存在的话)。有些板子可能会设计有测试点或跳线,方便断开。
  4. 断开连接后,再在电脑上执行上面的 sunxi-fel 烧录命令。
  5. 烧录完成后,记得恢复CS引脚的连接,然后重启板子。

3. Linux驱动层关键操作

系统跑起来之后,就要让屏幕好好工作了。这里有两个重要的驱动层配置:屏幕触摸校准和LCD色彩顺序修改。

3.1 屏幕触摸校准

5寸电阻屏或电容屏通常都需要校准,以确保你手指触摸的位置和系统识别的位置是一致的。在Linux下,我们一般用 tslib 这个开源库来处理触摸屏校准和数据过滤。

校准前,需要设置一些环境变量,告诉 tslib 我们的触摸屏设备文件、配置文件在哪。最方便的方法是把这些设置加到系统的profile文件里,这样每次开机都会自动生效。

操作步骤如下:

  1. 通过串口终端登录到你的OPEN HMI开发板。
  2. 使用 vi 编辑器打开 /etc/profile 文件:
    vi /etc/profile
    
  3. 按 i 键进入编辑模式,然后滚动到文件末尾。
  4. 插入以下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_CONSOLEDEVICE=none
    export TSLIB_FBDEVICE=/dev/fb0
    
    • TSLIB_TSDEVICE:指定触摸屏的设备节点,通常是 /dev/input/event0 或 event1,如果不确定可以用 cat /proc/bus/input/devices 查看。
    • TSLIB_CALIBFILE:校准后产生的数据文件存放路径。
    • TSLIB_CONFFILE:tslib的配置文件路径。
    • TSLIB_PLUGINDIR:tslib插件存放的目录。
    • TSLIB_CONSOLEDEVICE:控制台设备,设为 none 避免冲突。
    • TSLIB_FBDEVICE:帧缓冲设备,对应我们的LCD屏幕。
  5. 按 ESC 键退出编辑模式,然后输入 :wq 保存并退出vi。
  6. 重启开发板,或者执行 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模块的功能设计很实用,参考荔枝派这类成熟的全志方案进行开发,也能大大降低软件层面的难度。希望这篇实战记录能帮你顺利点亮屏幕,搞定驱动。如果在实际操作中遇到其他问题,不妨从硬件连接和内核驱动源码两个方向去排查,往往能找到答案。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐