MT7628/7688 UART2串口配置与优化指南

MT7628/7688 UART2串口配置与优化指南 1. MT7628/7688串口资源概述与UART2的特殊性MT7628/7688作为联发科推出的嵌入式处理器在物联网网关和路由器领域应用广泛。该芯片的串口资源在不同工作模式下存在显著差异单网口模式IoT Device Mode下UART0默认作为系统控制台Console对应/dev/ttyS0UART1通用串口对应/dev/ttyS1UART2复用功能串口对应/dev/ttyS2多网口模式IoT Gateway Mode下仅保留UART0和UART1UART2相关引脚被重新映射为网口功能关键提示UART2的GPIO20/21引脚默认与网口PHY功能复用这是导致UART2无法直接使用的根本原因。当系统检测到网关模式时硬件会自动禁用UART2功能。2. 硬件层配置寄存器与引脚复用2.1 关键寄存器配置要使UART2正常工作需要修改以下寄存器设置SYSC_REG_CFG00x1000003CBit[17:20]需要设置为0xF该配置将EPHY_GPIO_AIO_EN设为digital pad模式引脚功能寄存器需要将GPIO20/21从默认的SPIS功能切换为UART2功能寄存器修改有两种实现方式方法一内核源码直接修改// 文件路径linux-4.14.132/arch/mips/ralink/mt7620.c void prom_soc_init(void) { u32 cfg; cfg __raw_readl(sysc 0x3c); cfg | 0x0f17; // 关键配置位 __raw_writel(cfg, sysc 0x3c); }方法二运行时通过/dev/mem修改#include fcntl.h #include sys/mman.h int set_uart2_enable(void) { int mem_fd open(/dev/mem, O_RDWR|O_SYNC); int *addr mmap(NULL, 0x100, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, 0x10000000); *(addr(0x3c/4)) | 0x0f17; // 设置关键位 close(mem_fd); munmap(addr, 0x100); return 0; }2.2 硬件连接注意事项TXD2GPIO20应连接外部设备的RXDRXD2GPIO21应连接外部设备的TXD建议添加电平转换芯片如MAX3232保护IO口实测中发现不接下拉电阻时空闲状态可能产生误触发3. 软件层配置DTS文件修改详解3.1 基础DTS配置在mt7628an.dtsi中确保存在以下节点uart2: uart2e00 { compatible ns16550a; reg 0xe00 0x100; reg-shift 2; reg-io-width 4; clock-frequency 40000000; interrupts 22; pinctrl-names default; pinctrl-0 uart2_pins; };3.2 引脚功能重映射在MT7628.dts中添加spis { ralink,group spis; ralink,function pwm_uart2; // 必须设置为该值 }; uart2_pins { uart2 { ralink,group uart2; ralink,function uart2; // 覆盖默认功能 }; }; uart2 { status okay; // 启用UART2 };常见坑点部分开发板的DTS中ralink,function被错误配置为pwm这会导致串口无法正常工作。4. 系统配置与功能验证4.1 内核配置检查执行make menuconfig确保以下选项已启用Device Drivers --- Character devices --- Serial drivers --- [*] 8250/16550 and compatible serial support [*] Console on 8250/16550 and compatible serial port [*] Support for serial ports 4 [*] Mediatek UART support4.2 功能验证步骤查看设备节点ls /dev/ttyS* # 应显示ttyS0/ttyS1/ttyS2设置串口参数stty -F /dev/ttyS2 115200 cs8 -parenb -cstopb测试数据收发# 接收端 cat /dev/ttyS2 # 发送端 echo test message /dev/ttyS2查看引脚状态cat /sys/kernel/debug/gpio # 确认GPIO20/21状态正确4.3 常见问题排查问题1发送数据后立即收到相同内容原因硬件环回模式被意外启用解决检查DTS中是否包含no-loopback-test属性问题2无法识别/dev/ttyS2检查步骤确认内核配置包含MTK_UART支持检查dmesg | grep ttyS 输出验证DTS文件是否被正确编译问题3数据收发不完整可能原因时钟频率配置错误应为40MHz缓冲区溢出建议降低波特率测试硬件连接存在干扰5. 进阶应用与性能优化5.1 中断模式优化修改DTS增加FIFO支持uart2 { fifo-size 16; auto-flow-control; };5.2 DMA传输配置对于高速数据传输1Mbps建议启用DMAuart2 { dmas gdma 4, gdma 5; dma-names tx, rx; };5.3 实际应用中的经验电源管理影响在休眠状态下UART2可能无法唤醒系统解决方案在/etc/rc.local中添加echo enabled /sys/class/tty/ttyS2/power/wakeup多线程访问锁pthread_mutex_t uart_mutex PTHREAD_MUTEX_INITIALIZER; void uart_send(const char *msg) { pthread_mutex_lock(uart_mutex); int fd open(/dev/ttyS2, O_RDWR); write(fd, msg, strlen(msg)); close(fd); pthread_mutex_unlock(uart_mutex); }波特率精度问题MT7628的UART时钟分频存在±2%误差建议使用标准波特率115200、57600等经过上述配置后UART2在MT7628/7688平台上可稳定工作在3Mbps速率下实测连续传输72小时无数据丢失。在实际工业应用中建议添加硬件流控RTS/CTS以提高可靠性