尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

嵌入式Linux下SPI转4串口芯片WK2124驱动移植避坑指南(基于Firefly-RK3399实测)

嵌入式Linux下SPI转4串口芯片WK2124驱动移植避坑指南(基于Firefly-RK3399实测) 嵌入式Linux下WK2124驱动移植实战全解析从硬件对接到功能验证在工业控制、物联网网关和边缘计算设备中串口资源紧张是开发者经常面临的挑战。WK2124作为一款通过SPI接口扩展4路UART的芯片以其灵活的波特率配置和独立的256级FIFO成为解决串口扩展需求的优选方案。本文将基于Firefly-RK3399开发板详细剖析WK2124驱动移植的全流程包括硬件设计要点、内核配置技巧、常见编译问题解决方案以及功能验证方法。1. 硬件设计与接口规范1.1 WK2124硬件连接拓扑WK2124作为SPI从设备与主控的连接需要严格遵循信号规范。以下是关键信号连接示意图信号类型连接说明注意事项CS主控SPI片选不可持续拉低需动态控制CLKSPI时钟线建议走线长度≤10cmMOSI主出从入匹配主控SPI模式MISO主入从出需加上拉电阻(4.7kΩ)IRQ中断输出连接至支持中断的GPIORST复位引脚可选用阻容复位电路提示IRQ引脚必须配置为下降沿触发硬件设计时应确保中断信号干净无抖动1.2 电源与时钟设计要点供电方案核心电压3.3V±5%IO电压需与主控电平匹配建议使用LDO稳压器纹波50mV时钟源选择#define WK_CRYSTAL_CLK 24000000 // 24MHz晶振配置修改驱动中的晶振频率定义以匹配实际硬件2. 内核驱动移植全流程2.1 DTS节点配置详解Firefly-RK3399的DTS配置示例spi1 { status okay; max-frequency 10000000; wk212400 { compatible wkmic,wk2124-spi; reg 0; spi-max-frequency 10000000; reset-gpio gpio4 29 GPIO_ACTIVE_LOW; irq-gpio gpio4 30 GPIO_ACTIVE_LOW; }; };关键参数说明spi-max-frequency不得超过芯片规格书限值reset-gpio非必需但建议保留硬件复位能力irq-gpio必须配置且确保GPIO支持中断2.2 驱动编译问题解决方案2.2.1 内核线程工作队列兼容性当出现kthread_work相关错误时启用备用实现方案// 在驱动头文件中添加 #define WK_WORK_KTHREAD2.2.2 串口标志位冲突处理不同内核版本对uart_port.flags的定义差异解决方案// 替换方案1 p-port.flags UPF_FIXED_TYPE | UPF_SKIP_TEST; // 替换方案2 p-port.flags UPF_BOOT_AUTOCONF;2.2.3 实时优先级定义缺失直接使用数值替代宏定义const struct sched_param sched_param {.sched_priority 50}; // 原MAX_RT_PRIO/23. 驱动加载与功能验证3.1 模块加载与设备节点生成加载编译好的驱动模块insmod wk2xxx_spi.ko dmesg | grep wk2xxx # 查看驱动加载日志成功加载后系统将生成设备节点/dev/ttysWK0 /dev/ttysWK1 /dev/ttysWK2 /dev/ttysWK33.2 基础通信测试方案3.2.1 回环测试配置# 终端1设置波特率并开启接收 stty -F /dev/ttysWK1 115200 raw cat /dev/ttysWK1 # 终端2发送测试数据 echo Hello WK2124 /dev/ttysWK13.2.2 跨设备通信测试使用USB转串口模块连接WK2124的UART1与PC# 开发板端发送文件 cat /etc/os-release /dev/ttysWK1 # PC端接收(以minicom为例) minicom -D /dev/ttyUSB0 -b 1152004. 高级功能配置与优化4.1 FIFO深度调优修改驱动中的FIFO阈值配置#define TX_FIFO_TRIGGER_LEVEL 64 // 发送FIFO触发深度 #define RX_FIFO_TRIGGER_LEVEL 32 // 接收FIFO触发深度4.2 硬件流控启用在驱动中取消注释以下宏定义#define WK_FlowControl_FUNCTION对应的DTS需补充CTS/RTS引脚配置flow-control-gpios gpio4 31 GPIO_ACTIVE_LOW, /* CTS */ gpio4 32 GPIO_ACTIVE_LOW; /* RTS */4.3 性能监测与调试启用驱动调试信息输出#define DEBUG通过dmesg -w实时观察数据收发统计[ 1234.567890] wk2124: Port1 TX: 128 bytes/s, RX: 256 bytes/s [ 1234.567895] wk2124: FIFO Status: TX_EMPTY0, RX_FULL1在实际项目部署中我们发现WK2124的中断响应延迟对高波特率(1Mbps)下的稳定性影响显著。通过将中断服务线程优先级调整为实时调度类可有效降低数据丢失率static int wk2124_irq_thread(void *data) { struct sched_param param { .sched_priority 99 }; sched_setscheduler(current, SCHED_FIFO, param); ... }
返回列表