移植Linux串口驱动(含设备树配置))
ARM开发板Linux串口驱动移植实战指南从设备树配置到功能测试硬件准备与环境搭建在开始移植工作前我们需要做好充分的硬件和软件准备。对于SAMA5D4开发板首先要确认硬件连接的正确性。通过开发板原理图我们可以找到串口控制器的物理引脚分布。以USART3为例其TX和RX引脚通常对应特定的GPIO引脚需要根据原理图确认这些引脚没有被其他功能占用。开发环境配置步骤如下准备交叉编译工具链推荐使用Linaro或Buildroot定制获取官方Linux内核源码建议使用与开发板匹配的内核版本安装必要的开发工具sudo apt-get install build-essential libncurses-dev bison flex libssl-dev提示建议使用与开发板厂商推荐的内核版本避免兼容性问题设备树配置详解设备树是现代ARM Linux系统硬件描述的核心。对于SAMA5D4的串口驱动我们需要关注两个关键文件sama5d4.dtsi芯片级定义和板级DTS文件如at91-sama5d4_xplained.dts。典型串口节点配置示例usart3: serialfc00c000 { compatible atmel,at91sam9260-usart; reg 0xfc00c000 0x100; interrupts 34 IRQ_TYPE_LEVEL_HIGH 5; dmas dma0 2 AT91_DMA_CFG_PER_ID(11), dma0 2 AT91_DMA_CFG_PER_ID(12); dma-names tx, rx; clocks usart3_clk; clock-names usart; pinctrl-names default; pinctrl-0 pinctrl_usart3; status okay; };关键配置项说明配置项说明典型值compatible驱动匹配字符串atmel,at91sam9260-usartreg寄存器物理地址和范围0xfc00c000 0x100interrupts中断号和触发方式34 IRQ_TYPE_LEVEL_HIGH 5pinctrl-0引脚控制配置pinctrl_usart3status设备启用状态okay或disabled引脚控制配置需要在pinctrl节点中定义pinctrl_usart3: usart3-0 { atmel,pins AT91_PIOB 18 AT91_PERIPH_A AT91_PINCTRL_NONE /* TXD */ AT91_PIOB 19 AT91_PERIPH_A AT91_PINCTRL_PULL_UP; /* RXD */ };驱动移植关键步骤1. 内核配置检查确保内核配置中已启用相关驱动make menuconfig需要确认以下选项已启用Device Drivers → Character devices → Serial driversAtmel USART supportDMA support for Atmel USART (可选)Console on Atmel USART (如果用作调试串口)2. 驱动代码分析SAMA5D4的串口驱动主要位于drivers/tty/serial/atmel_serial.c驱动注册流程如下平台驱动注册platform_driver_register匹配设备树节点通过of_match_table探测函数初始化硬件atmel_serial_probe注册UART驱动uart_add_one_port波特率修改方法默认波特率在drivers/tty/serial/serial_core.c中定义normal-init_termios.c_cflag B9600 | CS8 | CREAD | HUPCL | CLOCAL;可修改为normal-init_termios.c_cflag B115200 | CS8 | CREAD | HUPCL | CLOCAL;3. 编译与烧录编译内核和设备树make zImage dtbs烧录到开发板后检查串口设备节点是否生成ls /dev/ttyS*功能测试与验证1. 基本功能测试使用stty命令配置串口参数stty -F /dev/ttyS2 115200 cs8 -parenb -cstopb测试发送数据echo test /dev/ttyS2接收数据测试cat /dev/ttyS22. 使用microcom工具测试Busybox提供的microcom工具非常适合快速测试microcom -s 115200 /dev/ttyS2常见问题排查无设备节点检查内核配置是否正确确认设备树status设置为okay查看内核启动日志是否有驱动加载信息数据收发异常确认波特率、数据位、停止位等参数匹配检查硬件连接和电平转换电路使用示波器测量信号波形DMA模式问题检查dmas和dma-names配置确认DMA通道未被其他设备占用在内核配置中启用DMA支持性能优化技巧中断优化调整中断触发阈值使用高性能中断处理函数DMA配置dmas dma0 2 AT91_DMA_CFG_PER_ID(11), dma0 2 AT91_DMA_CFG_PER_ID(12); dma-names tx, rx;电源管理static struct uart_ops atmel_pops { .pm atmel_serial_pm, };RS485支持rs485-rts-delay 0 0; linux,rs485-enabled-at-boot-time;实际项目经验分享在工业现场应用中我们发现几个值得注意的细节长时间运行稳定性测试中建议启用硬件流控RTS/CTS以避免数据丢失在电磁环境复杂的场合适当增加接收端的上拉电阻可以提高抗干扰能力使用DMA模式时建议设置合理的超时时间以避免DMA通道被长期占用一个实用的调试技巧是在驱动中添加自定义调试信息dev_dbg(port-dev, Custom debug: TX count%d, RX count%d\n, port-icount.tx, port-icount.rx);通过sysfs可以动态调整调试级别echo 8 /proc/sys/kernel/printk