2. 串口硬件基础:UART协议简介、RS232电平与TTL电平区别、常见串口芯片特性
在嵌入式Linux系统启动早期,串口(UART)是内核与开发者之间最可靠的“生命线”。当网络、USB、显示驱动尚未初始化时,串口几乎是唯一能够输出调试信息的通道。理解串口的硬件基础,是配置早期串口输出和捕获调试信息的先决条件。
2.1 UART协议简介
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种采用异步串行通信的物理层协议。它不需要单独的时钟线,而是通过双方约定相同的波特率(Baud Rate)来同步数据采样点。
2.1.1 数据帧格式
一个标准的UART数据帧由以下部分组成:
- 起始位(Start Bit):逻辑低电平(0),标志数据传输开始。
- 数据位(Data Bits):通常为5~9位,常见配置为8位。
- 校验位(Parity Bit):可选,用于简单的错误检测(奇校验/偶校验/无校验)。
- 停止位(Stop Bit):逻辑高电平(1),标志数据传输结束,常见为1位或2位。
关键参数对齐: 内核早期调试通常使用
115200 8N1 配置,即波特率115200、8位数据位、无校验、1位停止位。
2.2 RS232电平与TTL电平区别
UART协议定义了数据的逻辑格式,但物理层信号的电压标准则有多种。在嵌入式开发中,最常遇到的是TTL电平和RS232电平。混淆这两种电平是导致串口通信失败的常见原因。
| 特性 | TTL电平 (3.3V/5V) | RS232电平 (±12V) |
|---|---|---|
| 逻辑“1” | 2.0V ~ VCC (通常3.3V或5V) | -3V ~ -15V |
| 逻辑“0” | 0V ~ 0.8V | +3V ~ +15V |
| 电压摆幅 | 小 (0~3.3V/5V) | 大 (-15V~+15V) |
| 通信距离 | 短 (通常 < 1.5米) | 长 (可达15米以上) |
| 抗干扰能力 | 弱 | 强 (差分/大摆幅) |
| 常见应用 | SoC内部、开发板、传感器 | 工业设备、PC串口(DB9) |
⚠️ 电平不匹配风险: 将RS232电平(如±12V)直接连接到TTL电平的SoC引脚,会烧毁芯片的GPIO或UART控制器。必须使用电平转换芯片(如MAX3232)进行双向转换。
2.3 常见串口芯片特性
在嵌入式Linux系统中,UART控制器通常集成在SoC内部,但外接的串口芯片(如16550兼容芯片)或SoC内部集成的UART IP(如PL011)决定了驱动程序的编写方式和功能特性。
2.3.1 16550 UART (广泛兼容)
16550是PC时代最经典的UART芯片,其寄存器接口已成为事实上的工业标准。许多SoC内部的UART都提供“16550兼容模式”。
- FIFO深度:16字节(发送和接收各16字节),相比早期8250的1字节FIFO,能显著减少CPU中断频率。
- 寄存器布局:标准8个寄存器(RBR/THR/IER/IIR/FCR/LCR/MCR/LSR),通过基地址+偏移量访问。
- Linux驱动:使用
8250或8250_early驱动,早期调试通常使用earlycon=uart8250,mmio32,0x...。 - 局限性:自动流控(RTS/CTS)支持较弱,波特率生成器精度一般。
2.3.2 PL011 UART (ARM PrimeCell)
PL011是ARM公司设计的PrimeCell系列UART IP核,广泛用于Cortex-A系列SoC(如树莓派、Jetson系列)。
- FIFO深度:16字节(与16550相同),但控制逻辑更现代。
- 寄存器布局:与16550完全不同,使用ARM PrimeCell标准寄存器接口。
- Linux驱动:使用
amba-pl011驱动,早期调试使用earlycon=pl011,mmio32,0x...。 - 优势:内置完善的自动流控、红外支持、可编程采样率,波特率精度更高。
| 特性 | 16550 UART | PL011 UART |
|---|---|---|
| FIFO深度 | 16字节 (Tx/Rx) | 16字节 (Tx/Rx) |
| 寄存器接口 | 标准8寄存器 (PC兼容) | ARM PrimeCell 标准 |
| 自动流控 | 部分支持 (需额外配置) | 完善支持 (硬件RTS/CTS) |
| Linux驱动名称 | 8250 / 8250_early |
amba-pl011 |
| earlycon参数示例 | earlycon=uart8250,mmio32,0x3f8 |
earlycon=pl011,mmio32,0x3f201000 |
| 常见SoC | x86 PC、部分MIPS、旧款ARM | Cortex-A系列 (树莓派、Jetson) |
2.4 如何选择与识别串口芯片
在调试嵌入式Linux启动时,快速识别目标板使用的UART类型是配置 earlycon 的第一步。
- 查看设备树(Device Tree):在
.dts文件中搜索compatible属性,如"ns16550"或"arm,pl011"。 - 查看内核配置:检查
CONFIG_SERIAL_8250或CONFIG_SERIAL_AMBA_PL011是否启用。 - 查看SoC手册:确认UART模块的基地址、中断号以及是否支持FIFO模式。
💡 调试技巧: 如果不确定UART类型,可以尝试在bootloader(如U-Boot)中先测试串口输出。U-Boot通常能自动检测或通过环境变量配置UART参数。如果U-Boot能正常输出,则记录其使用的寄存器基地址和时钟频率,传递给内核的
earlycon 参数。