news 2026/6/15 5:09:56

保姆级教程:在Tina Linux (T113-S3)上为UART1配置完整调试通路,从设备树到内核启动参数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:在Tina Linux (T113-S3)上为UART1配置完整调试通路,从设备树到内核启动参数

深入解析T113-S3平台UART调试通路全链路配置

在嵌入式Linux开发中,调试串口的配置往往被视为"黑箱操作"——开发者按照教程修改几个文件,却很少理解背后完整的信号通路如何建立。本文将以全志T113-S3芯片和Tina Linux系统为例,从硬件引脚到内核控制台,完整拆解UART1作为调试串口的配置链路。

1. 硬件层引脚功能映射

任何外设配置的起点都是芯片手册。T113-S3的UART1默认引脚为PD21(TX)和PD22(RX),但这两个引脚通常默认为GPIO或其他功能。我们需要通过三层配置完成引脚功能切换:

  1. 物理层确认:查阅芯片手册确认UART1引脚支持4种复用功能(Function 0-3),其中UART1对应Function 4
  2. 电气特性检查:确保引脚未被用于高电流外设(如LCD驱动),避免信号干扰
  3. 冲突外设处理:常见需要关闭的外设包括:
    • LCD的DE信号(可能占用PD22)
    • SPI0的CS引脚
    • PWM输出通道

提示:使用sunxi-pinctrl工具可以实时查看引脚当前功能状态:

cat /sys/kernel/debug/pinctrl/pio/pinmux-pins

2. 固件层配置联调

2.1 sys_config.fex基础配置

Tina Linux特有的sys_config.fex文件是硬件抽象的第一站。修改target/config/chips/t113/configs/mq_r/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>

关键参数解析:

  • <4>表示引脚功能选择(Function 4)
  • <1>设置内部上拉电阻
  • 最后两个<default>保持驱动强度和斜率控制为默认值

2.2 U-Boot双重配置

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

  1. 驱动选择配置sun8iw20p1_defconfig):

    CONFIG_CONS_INDEX=2 # 0=UART0, 1=UART2, 2=UART1 CONFIG_SUNXI_SERIAL=y
  2. 设备树引脚映射uboot-board.dts):

    &uart1 { pinctrl-0 = <&uart1_pins_a>; status = "okay"; }; &lcd { status = "disabled"; // 解决与PD22的冲突 }

3. 内核层控制台建立

3.1 设备树深度定制

完整的内核设备树配置需要三个关键操作:

// 1. 引脚组定义 uart1_pins_a: uart1@0 { pins = "PD21", "PD22"; function = "uart1"; drive-strength = <10>; bias-pull-up; }; // 2. 设备节点使能 &uart1 { pinctrl-names = "default"; pinctrl-0 = <&uart1_pins_a>; status = "okay"; }; // 3. 时钟配置(确保波特率准确) &uart1 { clocks = <&ccu CLK_BUS_UART1>, <&ccu CLK_UART1>; clock-names = "bus", "mod"; };

3.2 启动参数精密调整

env.cfg中的内核命令行参数需要同步修改:

bootargs=console=ttyS1,115200 earlycon=sunxi-uart,0x02500400 root=/dev/mmcblk0p2 rootwait

地址计算原理:

  • UART0基址:0x02500000
  • 每个UART偏移0x400
  • ∴ UART1地址 = 0x02500000 + 1*0x400 = 0x02500400

4. 全系统编译与调试技巧

4.1 分段验证流程

建议分阶段验证配置正确性:

  1. Boot0阶段:通过J-Link读取芯片寄存器,确认引脚复用配置已生效
  2. U-Boot阶段:在include/configs/sun8iw20p1.h中添加调试打印:
    #define DEBUG_UART_PORT 2 // 对应UART1
  3. 内核阶段:通过earlycon观察最早的打印信息

4.2 常见故障排查表

现象可能原因排查方法
无任何输出引脚功能未切换测量引脚电压/用示波器检查波形
乱码时钟配置错误检查dts中的clock配置
仅部分阶段有输出某层配置遗漏对比本文各节配置项
系统卡死外设冲突检查所有共享引脚的外设状态

5. 进阶:动态切换调试端口

对于需要灵活切换调试端口的场景,可以通过U-Boot环境变量实现动态配置:

# 在U-Boot命令行设置 setenv bootargs ${bootargs} console=ttyS${debug_port},115200 setenv earlycon sunxi-uart,${uart_base} saveenv

配套的自动化检测脚本(保存为/usr/local/bin/uart_switch.sh):

#!/bin/bash DEBUG_PORT=$1 BASE_ADDR=$(( 0x02500000 + ${DEBUG_PORT}*0x400 )) sed -i "s/console=ttyS[0-9]/console=ttyS${DEBUG_PORT}/" /boot/env.cfg sed -i "s/earlycon=sunxi-uart,0x[0-9a-f]*/earlycon=sunxi-uart,0x$(printf '%X' ${BASE_ADDR})/" /boot/env.cfg fw_setenv debug_port ${DEBUG_PORT} fw_setenv uart_base 0x$(printf '%X' ${BASE_ADDR})

使用方式:

./uart_switch.sh 1 # 切换至UART1
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 5:07:50

MLOps生产部署实战:ONNX封装、Triton服务与三层监控

1. 项目概述&#xff1a;这不是“跑通模型”&#xff0c;而是让模型在真实世界里活下来“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题本身就像一句行话暗号&#xff0c;老手一眼就懂&#xff1a;前面三篇已经蹚过了数据清洗、特征工程、…

作者头像 李华
网站建设 2026/6/15 5:07:40

告别黑盒:手把手教你用QtCreator单步调试Qt核心类(以QObject为例)

深入Qt核心&#xff1a;用调试器解剖QObject的运行时秘密在Qt开发的世界里&#xff0c;我们常常把信号槽、对象树这些机制当作理所当然的黑箱魔法。但当你第一次按下F11键&#xff0c;真正步入QObject的构造函数时&#xff0c;那种"原来如此"的顿悟感&#xff0c;是任…

作者头像 李华