你是否曾被Linux内核中复杂的UART驱动代码困扰? 本文将带你以Linux 4.9.88 LTS版本为蓝本,零基础拆解UART子系统的骨架——从最核心的uart_driver、uart_port到硬件操作函数集,彻底理清串口驱动的工作奥秘。无需底层专家,看完你也能修改UART驱动!
▲ UART子系统分层架构及核心结构体关系(图片示意)
UART(通用异步收发传输器)是嵌入式Linux中最常用的低速通信接口。在Linux内核4.9.88中,UART子系统已经高度抽象,向上对接tty层,向下通过uart_driver结构体和uart_port结构体分离“驱动逻辑”与“硬件描述”。掌握这些结构体,你就能轻松为新的串口芯片编写驱动,或者理解现有驱动(如8250、pl011)的运行机制。
整个子系统分为四层:tty核心层(提供/dev/tty*接口)、线路规程(数据加工)、UART核心层(通用逻辑,位于drivers/tty/serial/serial_core.c)和硬件驱动层(具体芯片操作)。4.9.88版本中,UART核心通过uart_driver注册自己,每个物理端口对应一个uart_port,而硬件的具体收发、中断控制则由uart_ops回调实现。
struct uart_driver是UART驱动的“身份证”,定义在#include 。它包含了tty_driver指针、设备号、驱动名称、端口表等。当你调用uart_register_driver()时,内核会分配tty驱动并关联。关键成员如下:
uart_port是UART子系统中最庞大的结构体(超过60个字段),它描述了一个独立串口端口的全部属性。在4.9.88中,它包含了I/O基地址、中断号、波特率、FIFO大小、串口类型(PORT_*)、以及指向uart_ops的指针。注意:port->ops就是硬件驱动提供给你的“开关函数”。
这是驱动开发者必须实现的一组回调。每个函数都操作具体的uart_port硬件。uart_ops直接决定了串口是否能收发数据。例如:
在Linux内核4.9.88中,UART子系统引入了一些优化:比如uart_port中增加了attr_group用于设备属性,更好地支持sysfs;同时中断处理统一使用threaded irq机制(可选)。但核心思想没有变化——仍然是“uart_driver + uart_port + uart_ops”三驾马车。了解这个版本,你就可以向下兼容3.x,向上理解5.x。
在4.9.88源码根目录,使用grep "struct uart_driver" . -R --include="*.h",你会发现在include/linux/serial_core.h中。同样,uart_port结构体也在同一个文件中。这是所有串口驱动的心脏。
为了让你更直观地理解这些结构体如何协同,我们模拟一个最简单的虚拟UART驱动编写流程:
struct uart_driver,设置驱动名、设备号、端口数量。struct uart_ops中的所有必要回调(至少包括startup、shutdown、set_termios、start_tx)。struct uart_port实例,填充I/O资源、irq、ops指针,并调用uart_add_one_port()注册到uart_driver。 💡 UART子系统的本质是:uart_driver提供骨架,uart_port描述个体,uart_ops注入灵魂。在Linux内核4.9.88中,这套设计经历了十余年考验,清晰、稳定、可扩展。掌握了uart_driver结构体和uart_port结构体,你就能驾驭任何串口硬件。
原文链接:深入UART核心 —— 基于4.9.88 LTS版本解析 更新于:2026年2月12日
本文由主机测评网于2026-02-12发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260224966.html