架构
UART 驱动程序遵循 Linux TTY 子系统。其架构如下面的图所示。
TTY 框架通过 TTY 核心屏蔽与 TTY 相关的细节,为顶层以字符设备的形式提供了统一的应用接口,并为底层以 TTY 设备/TTY 驱动的形式提供了驱动编写框架。
TTY 框架由 TTY 核心和 TTY 驱动组成。TTY 驱动可以是 Serial、 USB CDC ACM class、 虚拟终端(VT) 等。 TTY 串行可以适配其中的 UART 硬件,并且 Realtek UART 驱动是在这一部分实现的。 TTY 线路规程用于帮助 TTY 驱动格式化数据。TTY 设备/TTY 驱动是 TTY 框架的核心逻辑。
实现
UART 驱动程序的实现如下表所列:
驱动程序位置 |
介绍 |
---|---|
<linux>/drivers/rtkdrivers/tty_serial/Kconfig |
UART驱动程序Kconfig |
<linux>/drivers/rtkdrivers/tty_serial/Makefile |
UART驱动程序Makefile |
<linux>/drivers/rtkdrivers/tty_serial/rtk-uart.c |
UART驱动程序代码 |
配置
设备树配置
有三个通用 UART 硬件。它们的设备树节点在 <dts>/rtl8730e-ocp.dtsi
中定义。
以其中的 UART0 节点为例:
Uart0: serial@41004000 {
compatible = "realtek,ameba-uart";
reg = <0x41004000 0x100>;
interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&rcc RTK_CKE_UART0>;
status = "disabled";
};
下面是它的属性描述。
属性 |
描述 |
可配置? |
---|---|---|
compatible |
用于匹配驱动和设备的ID |
否 |
reg |
寄存器资源 |
否 |
interrupts |
SPI 中断 |
否 |
clocks |
UART 时钟节点 |
否 |
status |
是否启用设备
|
是 |
pinctrl 的设备树节点在 <dts>/rtl8730e-pinctrl.dtsi
中定义。
还是以 UART0 为例:
uart0_pins: uart0@0 {
pins {
pinmux = <REALTEK_PINMUX('A', 15, LOG_UART_RTS_CTS)>, // UART0_CTS
<REALTEK_PINMUX('A', 16, LOG_UART_RTS_CTS)>, // UART0_RTS
<REALTEK_PINMUX('A', 2, UART_DATA)>, // UART0_RXD
<REALTEK_PINMUX('A', 3, UART_DATA)>; // UART0_TXD
bias-pull-up;
slew-rate = <0>;
drive-strength = <0>;
};
};
下标列出它的属性描述。
属性 |
描述 |
可配置? |
---|---|---|
pinmux |
UART的引脚复用定义 |
是 |
bias-pull-up |
引脚拉高/拉低状态 |
是 |
slew-rate |
引脚电压转换速率 |
否 |
drive-strength |
引脚驱动强度 |
否 |
请参考 pinmux 规范以获取其他引脚复用选择和其他 UART 硬件引脚分配。
以下是 UART 驱动程序的所有三个 General UART 的别名组:
aliases{
serial0 = &uart0;
serial1 = &uart1;
serial2 = &uart2;
serial3 = &uart3;
}
编译配置
选择
:
UART driver configuration

General UART driver configuration
APIs
用户空间 API
UART 是 TTY 串行设备,也是一种字符设备,因此用户可以通过字符设备接口访问 UART。TTY 子系统提供用户空间接口:
/dev/ttyRTK0 – Realtek UART 硬件的 TTY 串行接口。
用户可以使用此节点来控制 UART 终端并传输数据。以下是命令示例。
发送数据的命令:
echo helloworld > /dev/ttyRTK0
接收数据的命令:
cat /dev/ttyRTK0
用户可以使用命令 stty
来控制 UART 设置。例如,显示设置:
stty -F /dev/ttyRTK0 -a
请参阅演示代码以获取更多详细信息。UART 演示位于 <test>/uart
。
内核空间 API
参考 UART Driver v5.4 或 UART Driver v6.6 获取更多细节。