保姆级教程:手把手教你为SAMA5D4开发板移植Linux串口驱动(含设备树配置)
SAMA5D4开发板Linux串口驱动移植实战指南硬件准备与环境搭建在开始SAMA5D4开发板的串口驱动移植前需要做好充分的硬件和软件准备。首先确认手头的开发板型号和版本Microchip SAMA5D4系列包含多个变种确保你使用的是SAMA5D4-Xplained或兼容型号。必备工具清单SAMA5D4开发板及配套电源USB转串口调试工具推荐FTDI芯片方案杜邦线若干用于引脚连接测试万用表用于信号检测开发主机建议Ubuntu 20.04 LTS或更新版本开发环境配置步骤如下安装交叉编译工具链wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz tar xf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz export PATH$PATH:$(pwd)/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin获取Linux内核源码git clone https://github.com/linux4sam/linux-at91.git cd linux-at91 git checkout linux4sam_6.1 -b sama5d4_dev提示建议使用linux4sam官方维护的内核分支避免兼容性问题安装必要依赖包sudo apt install build-essential libncurses-dev bison flex libssl-dev设备树配置详解SAMA5D4的设备树配置是串口驱动移植的核心环节。设备树(Device Tree)作为硬件描述文件需要准确反映开发板的物理连接情况。引脚复用配置SAMA5D4的UART控制器引脚需要通过pinctrl子系统正确配置。查看开发板原理图确认使用的串口接口串口类型控制器编号默认引脚复用功能USART0PD2/PD3USART0USART1PD5/PD6USART1USART2PD7/PD8USART2USART3PB26/PB27USART3USART4PD21/PD22USART4在设备树文件arch/arm/boot/dts/sama5d4.dtsi中已经预定义了串口控制器的基本配置usart3: serialfc00c000 { compatible atmel,at91sam9260-usart; reg 0xfc00c000 0x100; interrupts 34 IRQ_TYPE_LEVEL_HIGH 5; pinctrl-names default; pinctrl-0 pinctrl_usart3 pinctrl_usart3_rts_cts; clocks usart3_clk; clock-names usart; status disabled; };板级设备树定制在板级设备树文件如at91-sama5d4_xplained.dts中启用并配置所需串口usart3 { pinctrl-names default; pinctrl-0 pinctrl_usart3; status okay; }; pinctrl { pinctrl_usart3: usart3-0 { pinmux PIN_PB26__USART3_RXD, PIN_PB27__USART3_TXD; bias-disable; }; };关键配置参数说明status okay启用该串口控制器pinctrl-0指定引脚复用配置bias-disable禁用内部上拉/下拉电阻注意如果使用硬件流控需要额外配置RTS/CTS引脚内核驱动移植实战驱动配置与编译在内核配置中启用串口驱动支持make ARCHarm menuconfig导航至以下选项并确保启用Device Drivers --- Character devices --- Serial drivers --- * Atmel AT91 / AT32 Serial port support * Support for console on Atmel AT91 / AT32 Serial port编译内核和设备树make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- zImage dtbs波特率定制修改默认波特率可能不符合项目需求需要修改驱动源码中的默认设置。打开drivers/tty/serial/atmel_serial.c文件找到初始化代码static struct uart_port atmel_ports[ATMEL_MAX_UART]; static void atmel_init_port(struct atmel_uart_port *atmel_port, struct platform_device *pdev) { struct uart_port *port atmel_port-uart; /* 修改默认波特率为115200 */ port-uartclk 115200; ... }同时更新termios默认设置static struct uart_driver atmel_uart { .init_termios { .c_cflag B115200 | CS8 | CREAD | HUPCL | CLOCAL, .c_ispeed 115200, .c_ospeed 115200, ... } };系统集成与测试验证固件烧录与启动使用SAM-BA工具将编译好的内核和设备树烧录到开发板sam-ba -p serial -b sama5d4-xplained -a nandflash -c erase::0x100000 sam-ba -p serial -b sama5d4-xplained -a nandflash -c write:zImage:0x100000 sam-ba -p serial -b sama5d4-xplained -a nandflash -c write:at91-sama5d4_xplained.dtb:0x180000配置U-Boot启动参数setenv bootargs consolettyS3,115200 root/dev/mmcblk0p2 rootwait rw setenv bootcmd nand read 0x22000000 0x100000 0x80000; nand read 0x21000000 0x180000 0x10000; bootz 0x22000000 - 0x21000000 saveenv功能测试方法基础设备节点检查ls /dev/ttyS* cat /proc/tty/driver/atmel_serial预期输出示例serinfo:1.0 driver revision: 0: uart:ATMEL_SERIAL mmio:0xFC00C000 irq:34 tx:0 rx:0 1: uart:ATMEL_SERIAL mmio:0xFC010000 irq:35 tx:0 rx:0回环测试需要短接TX/RX引脚stty -F /dev/ttyS3 115200 cat /dev/ttyS3 echo test /dev/ttyS3使用microcom进行交互测试busybox microcom -s 115200 /dev/ttyS3性能优化技巧提高FIFO阈值减少中断频率static int atmel_startup(struct uart_port *port) { /* 设置接收FIFO阈值为1/2满 */ atmel_uart_writel(port, ATMEL_US_RTOR, 16); atmel_uart_writel(port, ATMEL_US_CR, ATMEL_US_RSTSTA); ... }启用DMA传输适用于高速场景usart3 { dmas dma0 2 AT91_DMA_CFG_PER_ID(12), dma0 2 AT91_DMA_CFG_PER_ID(13); dma-names tx, rx; };电源管理优化static int atmel_serial_suspend(struct device *dev) { struct atmel_uart_port *atmel_port dev_get_drvdata(dev); /* 保存寄存器状态 */ atmel_port-pm_state.saved_imr atmel_uart_readl(atmel_port-uart, ATMEL_US_IMR); ... }常见问题排查驱动加载失败症状/dev/ttyS*设备节点未生成排查步骤检查内核日志dmesg | grep ttyS确认设备树状态cat /proc/device-tree/serialfc00c000/status验证时钟配置cat /sys/kernel/debug/clk/clk_summary | grep usart通信异常处理症状能收到数据但内容乱码解决方案确认双方波特率一致stty -F /dev/ttyS3检查硬件连接测量TX/RX信号电压应为3.3V确认地线连接良好测试不同波特率下的表现for rate in 9600 19200 38400 57600 115200; do echo Testing $rate baud stty -F /dev/ttyS3 $rate timeout 1 cat /dev/ttyS3 echo TEST /dev/ttyS3 sleep 1 done中断冲突解决症状系统运行不稳定随机崩溃可能原因串口中断与其他外设冲突排查方法查看中断分配情况cat /proc/interrupts | grep atmel在设备树中调整中断优先级usart3: serialfc00c000 { interrupts 34 IRQ_TYPE_LEVEL_HIGH 7; /* 优先级改为7 */ };检查共享中断状态cat /proc/irq/34/spurious在实际项目中遇到最棘手的问题是DMA模式下偶尔出现的数据丢失最终发现是缓存对齐问题通过调整dma缓冲区对齐到32字节后解决static int atmel_uart_allocate_dma(struct uart_port *port) { port-rx_buf dma_alloc_coherent(port-dev, ATMEL_SERIAL_RINGSIZE, port-rx_dma_addr, GFP_KERNEL | GFP_DMA32); ... }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2445851.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!