保姆级教程:在Tina Linux (Allwinner T113) 上为UART1配置完整的调试串口功能
全志T113-S3深度开发指南:构建UART1全链路调试控制台
在嵌入式Linux开发中,调试串口如同开发者的"眼睛"和"嘴巴",是系统启动、故障排查和交互操作的核心通道。全志T113-S3作为一款高性能异构多核处理器,搭配Tina Linux开源系统,为开发者提供了丰富的硬件接口配置可能。本文将带您从硬件寄存器到内核驱动,完整构建UART1调试控制台解决方案。
1. 硬件层:引脚功能与时钟配置
任何外设功能的实现都始于硬件基础配置。在全志T113-S3平台上,UART1对应的默认引脚为PD21(TX)和PD22(RX),但实际项目中可能因板级设计需要调整引脚分配。
1.1 sys_config.fex关键配置
sys_config.fex是全志平台特有的硬件描述文件,相当于第二份"设备树",负责引脚复用、时钟等底层硬件配置:
[uart_para] uart_debug_port = 1 ; 将调试端口指定为UART1 uart_debug_tx = port:PD21<4><1><default><default> ; 功能复用选择4(UART1_TX) uart_debug_rx = port:PD22<4><1><default><default> ; 功能复用选择4(UART1_RX) [uart1] uart_used = 1 ; 启用UART1控制器 uart_port = 1 ; 端口号与硬件对应 uart_type = 2 ; 2表示全功能串口 uart_tx = port:PD21<4><1><default><default> uart_rx = port:PD22<4><1><default><default>注意:功能复用编号(尖括号内的数字)需查阅《全志T113芯片手册》中"Pin Function Description"章节确认,不同封装可能有所不同。
1.2 时钟与波特率校准
UART正常工作需要精确的时钟源,在sys_config.fex中补充:
[uart1] uart_baudrate = 115200 ; 默认波特率 uart_clock_src = 1 ; 1表示使用APB2时钟 uart_loopback = 0 ; 回环测试模式关闭2. Bootloader层:双阶段配置策略
全志平台采用Boot0→U-Boot的双阶段启动架构,每个阶段都需要独立配置串口输出。
2.1 U-Boot编译配置
首先确认使用的defconfig文件(通常为sun8iw20p1_defconfig),然后修改:
# 进入U-Boot源码目录 cd lichee/brandy-2.0/u-boot-2018/ # 修改配置 make menuconfig关键配置项路径:
Device Drivers → Serial drivers → [*] SUNXI serial port support (2) Console serial port number (1-4) # 改为2对应UART1或者直接编辑configs/sun8iw20p1_defconfig:
CONFIG_CONS_INDEX=2 CONFIG_SUNXI_UART1=y2.2 uboot-board.dts设备树调整
U-Boot有自己的简化版设备树,需要与内核设备树保持引脚定义一致:
&uart1 { pinctrl-names = "default"; pinctrl-0 = <&uart1_pins_a>; status = "okay"; }; &lcd { status = "disabled"; // 如果与UART1引脚冲突需禁用 };3. 内核层:设备树与驱动协同
Linux内核通过设备树获取硬件信息,通过驱动实现设备控制,二者缺一不可。
3.1 设备树深度解析
完整的内核设备树配置应包含以下部分:
// 引脚控制组定义 &pio { uart1_pins_a: uart1@0 { pins = "PD21", "PD22"; function = "uart1"; drive-strength = <10>; bias-pull-up; // RX引脚建议上拉 }; uart1_pins_b: uart1@1 { pins = "PG6", "PG7"; // 备用引脚组 function = "uart1"; }; }; // UART控制器节点 &uart1 { pinctrl-names = "default", "sleep"; pinctrl-0 = <&uart1_pins_a>; pinctrl-1 = <&uart1_pins_b>; status = "okay"; };3.2 内核启动参数优化
env.cfg中的启动参数决定了内核控制台输出行为:
bootargs=console=ttyS1,115200 earlycon=sunxi-uart,0x02500400 root=/dev/mmcblk0p2 rootwait panic=10关键参数说明:
console=ttyS1:指定ttyS1(UART1)为控制台earlycon:早期控制台地址需对应UART1寄存器基址(0x02500000 + 0x400)
4. 驱动层:内核配置与调试技巧
4.1 内核menuconfig配置
确保以下选项被正确启用:
Device Drivers → Character devices → Serial drivers → [*] SUNXI serial port support [*] Support for console on SUNXI serial port (2) SUNXI UART Console Port Number [*] Enable Earlycon support4.2 调试信息验证
系统启动后,可通过以下命令验证配置:
# 查看串口设备是否存在 ls /dev/ttyS1 # 查看内核启动日志 dmesg | grep ttyS # 检查串口时钟源 cat /sys/kernel/debug/clk/clk_summary | grep uart5. 全链路调试实战
5.1 启动流程分段验证
| 阶段 | 验证方法 | 常见问题 |
|---|---|---|
| Boot0 | 观察上电后第一条输出 | 无输出→检查串口线连接 |
| U-Boot | 检查"U-Boot SPL"标识 | 卡住→defconfig配置错误 |
| Kernel | 看到"Starting kernel..."后输出 | 无输出→earlycon地址错误 |
| Userspace | 出现登录提示符 | 卡住→根文件系统问题 |
5.2 常见故障排查指南
无任何输出
- 确认串口线序正确(TX↔RX交叉连接)
- 测量UART引脚电压(应有3.3V电平)
- 检查Boot0阶段的串口配置
输出乱码
- 确认双方波特率一致(115200,8N1)
- 检查时钟源配置(APB2通常为24MHz)
- 测量时钟信号是否稳定
部分阶段无输出
- 检查U-Boot与内核的console参数一致性
- 确认earlycon地址与UART1匹配(+0x400偏移)
6. 高级配置与性能优化
6.1 多串口并行调试
当需要同时使用多个UART时,设备树应配置为:
&uart0 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&uart0_pins_a>; }; &uart1 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&uart1_pins_a>; };6.2 低功耗模式配置
通过设备树配置睡眠状态下的引脚状态:
&uart1 { pinctrl-names = "default", "sleep"; pinctrl-0 = <&uart1_pins_active>; pinctrl-1 = <&uart1_pins_sleep>; };6.3 DMA模式启用
对于高速数据传输(>1Mbps),建议启用DMA模式:
&uart1 { dmas = <&dma 8>, <&dma 9>; dma-names = "tx", "rx"; };在嵌入式Linux开发实践中,UART配置看似基础却蕴含大量细节。一次我在为客户调试工业控制器时,发现UART1在高温环境下出现数据丢包,最终发现是引脚驱动强度不足导致。将drive-strength从默认的<10>调整为<30>后问题解决,这个小细节让我深刻体会到硬件配置的重要性。
