全志T113-S3双串口配置实战:UART0与UART1并行调试指南

在嵌入式系统开发中,串口调试如同工程师的"听诊器",而全志T113-S3处理器原生支持的多路UART接口往往未被充分利用。本文将深入探讨如何在Tina Linux系统中实现UART0与UART1双通道并行工作,让系统调试与业务通信各司其职。

1. 硬件基础与系统架构解析

全志T113-S3的UART控制器采用ARM标准的PL011架构,但进行了太阳芯(Allwinner)特有的功能扩展。该芯片提供4个独立UART通道,其中UART0默认作为BootROM加载阶段的首选通信接口,这种设计源于历史兼容性考虑。

关键硬件特性对比

特性 UART0 UART1
物理基地址 0x02500000 0x02500400
中断号 34 35
时钟门控 CCU_UART0_BGR_REG CCU_UART1_BGR_REG
默认功能 Bootloader控制台 通常未启用

在Tina Linux的启动流程中,串口配置需要贯穿三个关键阶段:

  1. Boot0阶段 :固化在芯片ROM中的初始加载程序
  2. U-Boot阶段 :二级引导加载环境
  3. Linux内核阶段 :最终操作系统环境

注意:UART1的寄存器地址偏移量0x400是PL011架构的标准设计,每个UART控制器占用1KB地址空间,这个值在后续配置中会多次出现。

2. 底层配置修改实战

2.1 设备树与引脚复用配置

首先需要处理引脚复用冲突,T113-S3的PD21和PD22默认可能被分配给其他功能。修改设备树文件:

// Tina-Linux/device/config/chips/t113/configs/mq_r/board.dts
&pio {
    uart1_pins_a: uart1@0 {
        pins = "PD21", "PD22";
        function = "uart1";
        drive-strength = <10>;
        bias-pull-up;
    };
};

&uart1 {
    pinctrl-names = "default";
    pinctrl-0 = <&uart1_pins_a>;
    status = "okay";
};

常见引脚冲突及解决方案:

  • LCD数据线冲突 :注释掉相关dts节点或重新规划引脚分配
  • SPI片选冲突 :修改SPI设备使能极性
  • GPIO按键冲突 :评估功能优先级,必要时移除次要功能

2.2 U-Boot双重配置调整

U-Boot需要两处关键修改:

  1. defconfig基础配置
# 修改sun8iw20p1_defconfig
CONFIG_CONS_INDEX=2  # 将控制台切换到UART1
CONFIG_SUNXI_SERIAL=y
CONFIG_SERIAL_PL011=y
  1. uboot-board.dts同步更新
// 确保与内核设备树保持一致
&uart1 {
    compatible = "arm,pl011";
    reg = <0x02500400 0x400>;
    interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&ccu CLK_BUS_UART1>;
    resets = <&ccu RST_BUS_UART1>;
    status = "okay";
};

提示:使用 mboot 命令可以验证当前激活的U-Boot配置,避免修改未生效的情况。

3. 内核启动参数精调

3.1 早期控制台参数

修改env.cfg中的启动参数:

# 原始UART0配置
# console=ttyS0,115200 earlyprintk=sunxi-uart,0x02500000

# 修改为UART1配置
console=ttyS1,115200 earlycon=sunxi-uart,0x02500400

参数解析:

  • earlycon :内核早期初始化阶段使用的串口驱动
  • 0x02500400 :UART1的物理基地址
  • ttyS1 :Linux设备节点编号,与UART1对应

3.2 内核配置同步更新

修改config-5.4关键选项:

# 串口设备驱动配置
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_SUNXI=y
CONFIG_SERIAL_SUNXI_CONSOLE=y

# 指定控制台索引
CONFIG_SUNXI_UART1_CONSOLE=y
CONFIG_CMDLINE="console=ttyS1,115200"

4. 系统级整合与验证

4.1 编译流程优化

建议的完整编译顺序:

# 清理旧配置
make clean

# 分步编译
make uboot -j$(nproc)    # 单独编译U-Boot
make kernel -j$(nproc)   # 单独编译内核
make -j$(nproc)          # 编译完整系统

# 打包镜像
pack

常见编译问题处理:

  1. 设备树语法错误

    Error: board.dts:12.1-9 syntax error
    

    解决方案:使用 dtc -I dts -O dtb -o test.dtb board.dts 进行单独验证

  2. 引脚冲突警告

    pinctrl: pin PD21 already claimed by lcd0
    

    解决方案:在相关设备节点添加 status = "disabled"

4.2 运行时验证技巧

多阶段输出验证

  1. Boot0阶段输出

    • 保持连接UART0观察初始启动信息
    • 正常应显示"HELLO! BOOT0 is starting!"
  2. U-Boot阶段切换

    • UART1应开始显示U-Boot启动日志
    • 关键标志:"U-Boot SPL 2021.01"
  3. 内核阶段双通道

    • UART1持续输出内核日志
    • UART0可通过 echo "test" > /dev/ttyS0 验证通路

高级调试技巧

# 查看串口设备注册情况
dmesg | grep ttyS

# 实时监控两个串口
screen /dev/ttyS0 115200
screen /dev/ttyS1 115200

# 压力测试
cat /dev/urandom > /dev/ttyS0 &
cat /dev/urandom > /dev/ttyS1 &

5. 生产环境部署建议

在实际产品中部署双串口方案时,建议考虑以下加固措施:

  1. 电源管理优化

    &uart1 {
        pinctrl-names = "default", "sleep";
        pinctrl-1 = <&uart1_sleep_pins>;
        wakeup-source;
    };
    
  2. 抗干扰设计

    • 在串口线上串联22Ω电阻
    • 添加TVS二极管防护(如SMBJ5.0CA)
    • 使用双绞线连接,长度不超过3米
  3. 系统服务集成 : 创建systemd服务管理串口日志:

    # /etc/systemd/system/uart1-logger.service
    [Unit]
    Description=UART1 System Logger
    
    [Service]
    ExecStart=/bin/bash -c "cat /dev/ttyS1 | logger -t uart1"
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
  4. 性能监控指标

    # 查看串口错误计数
    cat /proc/tty/driver/ttyS
    
    # 监控FIFO溢出
    grep -H "overrun" /proc/interrupts
    

在完成所有配置后,建议进行72小时连续运行测试,特别关注:

  • 高温环境下(85°C)的通信稳定性
  • 长时间大数据量传输的误码率
  • 系统休眠唤醒后的串口恢复情况

更多推荐