T113-S3开发板调试串口切换实战:从UART0迁移到UART1的完整指南
在嵌入式开发中,调试串口如同工程师的"眼睛",但当默认的UART0被LCD或其他外设占用时,如何快速切换至UART1而不影响原有功能?本文将深入剖析全志T113-S3平台下Tina Linux系统的串口切换全流程,从硬件引脚配置到内核参数调整,手把手解决开发过程中的"盲操作"困境。
1. 硬件基础与问题诊断
T113-S3芯片提供多个UART控制器,但默认调试输出绑定在UART0(PD18/PD19)。当这些引脚被复用为其他功能时(如LCD数据线),开发者会面临两种选择:重新设计硬件或修改软件配置。后者显然更具成本效益。
典型冲突场景检测方法 :
# 查看当前串口映射
cat /proc/tty/driver/serial
# 检查引脚复用状态
sunxi-pin -l | grep PD
常见问题表现:
- Uboot阶段无任何输出
- 内核启动日志消失
-
系统启动后
/dev/ttyS0设备不存在
提示:在修改前,建议先用万用表测量UART1引脚(PD21/PD22)是否已被其他电路占用,避免电平冲突。
2. 系统级配置修改链
2.1 sys_config.fex引脚重定义
首先修改硬件描述文件,路径通常为:
Tina-Linux/config/device/config/chips/t113/configs/[方案名]/sys_config.fex
关键修改项:
[uart_para]
uart_debug_port = 1 ; 将0改为1
uart_debug_tx = port:PD21<4><1><default><default>
uart_debug_rx = port:PD22<4><1><default><default>
[uart1]
uart_used = 1 ; 启用UART1控制器
uart_port = 1
uart_tx = port:PD21<4><1><default><default>
uart_rx = port:PD22<4><1><default><default>
参数说明:
-
<4>表示功能复用选择(具体值需查芯片手册) -
<1>表示上拉电阻使能 - 必须确保与冲突外设(如LCD)的引脚定义不重复
2.2 Uboot双重配置调整
Uboot需要两处关键修改:
- defconfig文件 :
# 修改默认控制台索引
CONFIG_CONS_INDEX=2 # 1对应UART0,2对应UART1
- uboot-board.dts设备树 :
&uart1 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&uart1_pins_a>;
pinctrl-1 = <&uart1_pins_b>;
status = "okay";
};
/ {
chosen {
stdout-path = "serial1:115200n8"; // 关键修改点
};
};
警告:若Uboot阶段仍无输出,可尝试短接TX/RX形成回环测试,确认硬件通路正常。
3. 内核启动参数精调
3.1 环境变量配置
修改
env.cfg
文件中的启动参数:
bootargs=console=ttyS1,115200 earlycon=sunxi-uart,0x02500400 root=/dev/mmcblk0p2 rootwait
地址计算规则:
- UART0基址:0x02500000
- 每个UART偏移0x400
- 因此UART1地址为0x02500400
3.2 内核配置验证
检查Linux内核配置:
make menuconfig ARCH=arm
确保以下选项正确:
Device Drivers → Character devices → Serial drivers →
[*] Sunxi serial port support
(1) Console on Sunxi serial port (NEW)
(ttyS1) Default sunxi serial device (NEW)
4. 全系统编译与深度调试
4.1 分段编译技巧
建议分步执行编译,便于定位问题:
# 单独编译Uboot
mboot
# 单独编译内核
make kernel
# 打包镜像
pack
4.2 典型故障排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Uboot无输出 | 引脚复用冲突 | 检查sys_config.fex与设备树一致性 |
| 内核无日志 | 启动参数错误 | 确认earlycon地址和ttyS编号 |
| 系统启动后无ttyS1 | 驱动未加载 | 检查内核配置CONFIG_SERIAL_SUNXI |
高级调试手段 :
# 查看内核早期打印缓冲区
dmesg | grep -i uart
# 检查串口驱动加载状态
ls /sys/class/tty/ttyS1/device/driver
5. 多串口管理实战技巧
成功切换后,可进一步优化多串口使用:
- 权限管理 :
# 永久设置串口访问权限
echo 'KERNEL=="ttyS1", MODE="0666"' > /etc/udev/rules.d/50-uart.rules
- 性能调优 :
// 示例:修改FIFO阈值提高吞吐量
struct serial_rs485 rs485_conf = {
.flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND,
.delay_rts_before_send = 1,
};
ioctl(fd, TIOCSRS485, &rs485_conf);
- 引脚状态监控脚本 :
#!/usr/bin/env python3
import os
for pin in ["PD21", "PD22"]:
with open(f"/sys/class/gpio/{pin}/value") as f:
print(f"{pin} state: {f.read().strip()}")
在完成所有修改后,建议使用逻辑分析仪捕获串口波形,确认波特率、数据位等参数符合预期。实际项目中,我们曾遇到因硬件滤波电容导致信号畸变的情况,通过减小电容值最终使通信稳定在1Mbps速率。
212

被折叠的 条评论
为什么被折叠?



