架构

UART 驱动程序遵循 Linux TTY 子系统。其架构如下面的图所示。

../../rst_linux/8_uart/figures/tty_subsystem_arch.svg

TTY 框架通过 TTY 核心屏蔽与 TTY 相关的细节,为顶层以字符设备的形式提供了统一的应用接口,并为底层以 TTY 设备/TTY 驱动的形式提供了驱动编写框架。

TTY 框架由 TTY 核心和 TTY 驱动组成。TTY 驱动可以是 SerialUSB 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

是否启用设备

  • “disabled”

  • “okay”

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;
}

编译配置

选择 Device Drivers -> Drivers for Realtek -> UART driver

../../rst_linux/8_uart/figures/uart_driver_configuration.png

UART driver configuration

../../rst_linux/8_uart/figures/general_uart_driver_configuration.png

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.4UART Driver v6.6 获取更多细节。