跳转至

UART 16550A 与终端规格

1. 设备定位

UART 是来宾固件、内核和 Shell 的唯一字符控制台。设备 MMIO 地址为 0x10000000..0x100000FF,中断源 ID 必须与 FDT 和 PLIC 配置一致。

2. 寄存器模型

  • UART-REQ-001:偏移 0 在 DLAB=0 时,读为 RBR、写为 THR。
  • UART-REQ-002:偏移 5 为 LSR,至少正确维护 Data Ready、THR Empty、Transmitter Empty。
  • UART-REQ-003:为兼容 Linux 8250 驱动,还必须实现 IER、IIR/FCR、LCR、MCR、DLL/DLM 以及目标驱动实际探测的必要行为。
  • UART-REQ-004:寄存器宽度、复位值、只读/写副作用和 DLAB 复用必须明确符合 16550A 兼容语义。

只实现 THR/RBR/LSR 可能不足以通过 Linux 驱动探测,因此实际寄存器最小集必须由真实内核启动验证决定,不能用虚假设备树配置绕过驱动。

3. 发送路径

  1. 来宾写 THR 字节。
  2. UART 将字节写入有界发送缓冲或直接交给非阻塞宿主终端后端。
  3. 只有成功接受字节后才更新 THRE/TEMT。
  4. IER 允许且发送条件满足时,更新 UART 中断原因并驱动 PLIC 中断线。

宿主短写、EINTR 和暂时不可写必须被正确处理,不得静默丢字符或阻塞整个 CPU 无期限等待。

4. 接收路径

  1. 事件循环非阻塞读取宿主标准输入。
  2. 输入字节进入有界接收 FIFO。
  3. FIFO 非空时 LSR.DR 置位;来宾读 RBR 消耗一个字节。
  4. FIFO 状态变化更新 IIR 和接收中断线。
  5. FIFO 满时按确定策略报告 overrun,不允许覆盖未读取字符而无状态记录。

5. 中断行为

  • IER 独立控制接收可用和发送空中断。
  • IIR 返回当前最高优先级原因及“无中断”状态。
  • 当导致中断的条件被清除后必须撤销 UART 到 PLIC 的电平。
  • 读取 IIR、RBR 或 LSR 的副作用必须与寄存器定义一致。

6. 宿主终端 Raw 模式

  • UART-REQ-005:仅当标准输入是可用 TTY 时切换 Raw 模式;非 TTY 情况采用明确错误或管道模式策略。
  • 保存原始 termios 后再修改,禁用宿主回显、规范行缓冲和宿主信号字符处理。
  • Ctrl+C 等控制字节必须传给来宾,不能默认终止模拟器。
  • 必须提供不依赖终端控制字符的受控退出机制,具体组合或外部信号在 CLI 规格冻结。
  • 所有正常退出、启动失败、宿主信号和异常路径都必须幂等恢复原始终端属性。

7. 生命周期安全

终端配置顺序为:校验全部启动资源、保存属性、安装恢复保护、切换 Raw、启动机器。析构/清理必须可重复调用。若切换失败,不得留下部分修改状态。

8. 验收条件

  • 真实 OpenSBI/Linux 输出无丢字节、乱序或宿主重复回显。
  • Shell 可逐字接收普通字符、回车、退格及 Ctrl+C
  • UART 驱动中断和轮询模式均能工作。
  • 启动错误、正常退出和外部终止后宿主终端属性恢复。
  • 大量连续输出和输入 FIFO 溢出路径有真实压力测试。