> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/man4/uart.4.md).

# uart(4)

`uart` — 通用异步收发器（UART）串行驱动

## 名称

`uart`

## 概要

`device uart`

`device puc device uart`

`device scc device uart`

`在 /boot/device.hints 中：hint.uart.0.disabled="1" hint.uart.0.baud="38400" hint.uart.0.port="0x3f8" hint.uart.0.flags="0x10"`

`flags 编码如下：`

`设备可作为系统控制台`

`使用此端口进行远程内核调试`

`将 RX FIFO 触发级别设为 “low”（仅 NS8250）`

`将 RX FIFO 触发级别设为 “medium low”（仅 NS8250）`

`将 RX FIFO 触发级别设为 “medium high”（默认，仅 NS8250）`

`将 RX FIFO 触发级别设为 “high”（仅 NS8250）`

**0x00010** **0x00080** **0x00100** **0x00200** **0x00400** **0x00800**

## 描述

`uart` 设备驱动为各类实现 EIA RS-232C（CCITT V.24）串行通信接口的 UART 提供支持。每个此类接口由 `uart` 驱动的一个独立且分离的实例控制。对于包含多个串行接口或除一个或多个串行接口外还包含其他功能的设备，主要由 [puc(4)](/man4/puc.4.md) 或 [scc(4)](/man4/scc.4.md) 设备驱动提供支持。然而，由 [puc(4)](/man4/puc.4.md) 或 [scc(4)](/man4/scc.4.md) 驱动管理的设备的串行接口各自独立地由 `uart` 驱动控制。因此，[puc(4)](/man4/puc.4.md) 或 [scc(4)](/man4/scc.4.md) 驱动为 `uart` 驱动提供伞式功能，并隐藏了基本组件封装在一起时固有的复杂性。

`uart` 驱动采用模块化设计，可在不同硬件上用于各种用途。以下各节详细讨论各组件。各选项在介绍其适用组件的章节中描述。

### 核心组件

`uart` 驱动的核心是核心组件。它包含总线附着和低级中断处理程序。

### 硬件驱动

核心组件和内核接口通过硬件接口与硬件通信。此接口作为硬件的抽象，允许不同的 UART 用于串行通信。

### 系统设备

系统设备是通过硬件设计或软件设置具有特殊用途的 UART。例如，Sun UltraSparc 机器将 UART 用作其键盘接口。这样的 UART 不能用于通用通信。同样，当内核配置为串行控制台时，相应的 UART 也将成为系统设备，以便内核能在引导过程早期输出引导消息。

### 内核接口

最后一个但同样重要的组件是内核接口。此组件最终决定 UART 如何对内核特别是对用户可见。默认内核接口是 TTY 接口。这允许 UART 用于终端、调制解调器和串行线路 IP 应用。系统设备（串行控制台这一显著例外除外）通常具有专用内核接口。

## 硬件

`uart` 驱动支持以下类别的 UART：

* NS8250：基于 8250、16450、16550、16650、16750 或 16950 UART 的标准硬件。
* SCC：由 [scc(4)](/man4/scc.4.md) 设备驱动支持的串行通信控制器。

## 每秒脉冲（PPS）定时接口

`uart` 驱动能捕获 RFC 2783 中定义的 PPS 定时信息。该 API 通过 ioctl(2) 访问，在 tty 设备上可用。要将 PPS 捕获功能与 ntpd(8) 一起使用，请将 tty 呼出设备 **`/dev/cuau?`** 符号链接到 **`/dev/pps0`**。

`hw.uart.pps_mode` 可调参数为所有 uart 设备配置 PPS 捕获模式；可在 loader.conf(5) 中设置。`dev.uart.0.pps_mode` sysctl 为特定 uart 设备配置 PPS 捕获模式；可在 loader.conf(5) 或 [sysctl.conf(5)](/man5/sysctl.conf.5.md) 中设置。

可用的捕获模式如下：

**0x00** 禁用捕获。 **0x01** 在 CTS 线路上捕获脉冲。 **0x02** 在 DCD 线路上捕获脉冲。

以下值可与捕获模式进行 OR 运算以配置捕获处理选项：

**0x10** 反相脉冲（RS-232 逻辑低 = ASSERT，高 = CLEAR）。 **0x20** 尝试捕获窄脉冲。

当传入 PPS 脉冲宽度小到无法在正常模式下可靠捕获时，添加窄脉冲选项。在窄模式下，驱动使用硬件锁存线路状态变化的能力；并非所有硬件都具备此能力。硬件锁存提供了脉冲发生的可靠指示，但无法区分脉冲的 CLEAR 和 ASSERT 边沿。对于每个检测到的脉冲，驱动合成一个 ASSERT 和一个 CLEAR 事件，使用相同的时间戳。为防止硬件间歇性地看到脉冲两个边沿时产生虚假事件，驱动不会在前一对事件的半秒内生成新的一对事件。正常和窄脉冲模式都可与 ntpd(8) 一起使用。

当与 uart 设备的连接使用 TTL 电平信号，或当 PPS 源发出反相脉冲时，添加反相选项。RFC 2783 在 RS-232 协议上下文中将 ASSERT 事件定义为较高电压线路电平，将 CLEAR 事件定义为较低电压线路电平。TTL 电平连接上的调制解调器控制信号通常与 RS-232 电平反相。例如，载波存在在 RS-232 DCD 线路上由高信号指示，而在 TTL DCD 线路上由低信号指示。这是由于在大多数硬件设计中使用反相线路驱动缓冲器在 TTL 和 RS-232 线路电平之间转换。一般而言，连接到 DB-9 风格连接器的是高达 12 伏的 RS-232 电平信号。连接到嵌入式板卡上的排针或边缘连接器的通常是 3.3 或 5 伏的 TTL 信号。

## 特殊设备

`uart` 驱动还为每个呼入和呼出“数据”设备支持一个初始状态和一个锁定状态控制设备。数据设备的 termios 设置在首次打开时从相应初始状态设备复制，不继承自之前的打开。在初始状态设备上以常规方式使用 stty(1) 可为你的设置编程初始 termios 状态。

锁定的 termios 状态作为标志禁用 termios 状态的更改。例如，要锁定标志变量如 CRTSCTS，在锁定状态设备上使用 *stty crtscts*。速率和特殊字符可通过将锁定状态设备中的相应值设为任何非零值来锁定。例如，要将速率锁定为 115200，在初始状态设备上使用“`stty 115200`”，在锁定状态设备上使用“`stty 1`”。

与正确连接的外部设备通信的正确程序在几乎任意的初始状态下几乎不需要锁定即可工作，但其他设置可能受益于更改某些默认初始状态并锁定状态。特别是，非（POSIX）标准标志的初始状态应设置为适合所连设备，并可能需要锁定以防止有缺陷的程序更改它们。例如，对于始终支持 RTS/CTS 握手的设备应锁定 CRTSCTS 为开，对于完全不支持它的设备应锁定为关。对于不支持载波的设备应锁定 CLOCAL 为开。如果出于某种原因不希望挂断，可锁定 HUPCL 为关。一般而言，如果某些东西被锁定到错误状态，会发生非常糟糕的事情，对于支持多种设置的设备不应进行锁定。呼入端口上的 CLOCAL 标志应锁定为关以避免某些安全漏洞，但如果呼入端口用于其他用途，则需要由 getty 完成。

## 控制台可调参数

`uart` 驱动可被指定为系统控制台。

**ns8250** 传统 PC UART National Semiconductor 16550 及兼容设备。

**pl011** 常见 ARM UART，基于 ARM Limited 设计。

**`bd`** 忙检测（Busy Detect）。为设备启用所谓的“忙检测”quirk。对于 NS 16550 兼容设备，这将使用启发式方法确保在操作线路控制之前 UART 不再忙。基于 DesignWare 的 UART 由于 UART 中的设计缺陷需要此选项。

**`br`** 波特率（Baudrate）。用于串口通信的数据速率（位每秒）。当设备时钟速率（见下文）设为 0 时，波特率将与除数一起用于在设备首次初始化时计算设备时钟速率。仅允许传统波特率。大于 19200 的速率必须是 19200 的倍数。1200 到 19200 之间的波特率必须是 1200 的倍数。否则，波特率必须是 75 的倍数。值为 '0' 指示 `uart` 驱动不编程波特率除数并按原样使用硬件。

**`ch`** 通道（Channel）。默认为 0。对只有一个通道的 UART 无影响。

**`db`** 数据位（Data bits）。默认为 8。

**`dt`** 设备类型（Device type）。指定用于此设备的 uart 类。

**`io`** I/O 端口地址。指定 Intel 处理器 I/O 空间中 UART 的地址。与‘mm’互斥。

**`mm`** 内存映射 I/O 地址。指定内存映射 UART 的物理地址。与‘io’互斥。

**`pa`** 校验（Parity）。向主机发送数据时使用的校验类型。可为“even”、“odd”、“none”、“zero”（始终将位 8 设为零）、“one”（始终将位 8 设为 1）之一。默认为偶校验。

**`rs`** 寄存器移位（Register shift）。将基寄存器偏移量左移的位数。

**`rw`** 寄存器宽度（Register width）。读写设备寄存器操作的大小。

**`sb`** 停止位（Stopbits）。默认为 1。

**`xo`** 设备时钟（xtal oscillator）。用于设备的振荡器基频。设为 0 且波特率也设了时，UART 的初始化代码将在首次计算并使用该值。当基频与传统波特率匹配不佳时，自动计算的值可能偏差达 5%。

**`hw.uart.console`** 包含若干类似 **`/etc/remote`** 的 tag:value 对，以逗号分隔。

## 文件

**`/dev/ttyu?`** 用于呼入端口 **`/dev/ttyu?.init`** **`/dev/ttyu?.lock`** 相应的呼入初始状态和锁定状态设备 **`/dev/cuau?`** 用于呼出端口 **`/dev/cuau?.init`** **`/dev/cuau?.lock`** 相应的呼入初始状态和锁定状态设备

## 实例

```sh
hw.uart.console="io:0x2f8,br=115200"
```

当内核使用串行控制台端口时，应使用 COM2 而非 COM1，并将波特率设为 115200。

## 参见

cu(1), [puc(4)](/man4/puc.4.md), [scc(4)](/man4/scc.4.md), [termios(4)](/man4/termios.4.md), [tty(4)](/man4/tty.4.md), ttys(5)

## 历史

`uart` 设备驱动首次出现于 FreeBSD 5.2。

## 作者

`uart` 设备驱动和本 man 页面由 Marcel Moolenaar <marcel@xcllnt.net> 编写。

## 缺陷

在互联网出现之前，串口主要用于来自终端的入站连接（直接或通过调制解调器），如今串口主要用于到设备的出站连接，这一演变不幸地将相关文档分散在三个不同的 man 页面中：[termios(4)](/man4/termios.4.md)、[uart(4)](/man4/uart.4.md)、[tty(4)](/man4/tty.4.md)。
