Skip to main content
UART 设备以异步方式传输数据。因此,发送端 UART 输出位与接收端 UART 采样位之间没有时钟信号进行同步。发送端 UART 不使用时钟信号,而是在被传输的数据包中添加起始位和停止位。这些位定义了数据包的开始和结束。这样,接收端 UART 就知道何时开始读取这些位。当接收端 UART 检测到起始位时,它会以称为波特率的特定频率开始读取传入的位。
两个 UART 设备之间的数据传输

图:两个 UART 设备之间的数据传输

决定传输成功的参数如下:
  • 波特率
  • 起始位
  • 停止位
  • 奇偶校验位
  • 数据位
  • 流控
下图显示了一个 UART 数据包示例。
UART 数据包

图:UART 数据包

UART 特性

下表描述了应用程序的 UART 传输模式。

表:UART 传输模式

子系统传输模式说明
Linux
  • FIFO(低速)
  • CPU DMA(高速)
  • 支持从 300 bps 到 4 Mbps 的波特率。
  • FIFO 模式在其 Rx/Tx 缓冲区和系统内存之间传输数据。
  • DMA 模式在其 Rx/Tx 缓冲区和系统内存之间传输数据。使用支持更高波特率和更大数据包的高速 UART 驱动可获得更好的性能。例如,Bluetooth 无线技术连接模块。
BootFIFO
  • Rx/Tx 每字符 5 位到 8 位。
  • 支持的最大波特率为 115200。
ADSPFIFO
  • Rx/Tx 每字符 5 位到 8 位。
  • 支持的波特率:115200、230400、460800、921600、1000000、3000000 和 6000000。

UART 接口组件

下表提供了不同子系统的 UART 驱动配置的路径。 表:UART 接口:Linux
文件类型说明
设备树源
Pinctrl 设置
Qualcomm TEE 设置
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/<chipset>/QUPAC_Access.c
表:UART 接口:Boot(仅 UEFI)
文件类型说明
QUP v3 串行引擎配置
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/BOOT.MXF.1.0.c1/boot_images/boot/QcomPkg/SocPkg/<chipset>/Settings/UART/UartSettings.c
Qualcomm TEE 设置
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/<chipset>/QUPAC_Access.c
表:UART 接口:ADSP/SLPI
文件类型说明
QUP v3 串行引擎配置
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_common/config/<chipset>/adsp/ssc/qup_devcfg.c
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/<chipset>/fw_devcfg.c
固件配置设置
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/<chipset>/fw_devcfg.c
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/<chipset>/fw_devcfg.xml

UART API

本节列出了以下子系统的 UART API。

UART 软件设备树配置

本节提供有关 UART 设备树配置以及设备节点文档的信息。

Linux

有关内核设备实例的信息,请参阅 https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/serial/qcom%2Cserial-geni-qcom.yaml。 有关 UART 驱动文件的信息,请参阅 https://github.com/torvalds/linux/blob/master/drivers/tty/serial/qcom_geni_serial.c
有关串行引擎 GPIO 的配置设置,请参阅以下 DTSI 文件。
注意必须在 QUPAC_Access.c 文件中对齐 Qualcomm TEE 配置,以确保 GPIO/QUP v3 可以使用。您可以在 /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/<chipset>/QUPAC_Access.c 访问 Qualcomm TEE 镜像。修改所需的设置,或查看为 QUP v3 串行引擎特定实例分配的默认设置。
QUP v3 同时支持启用流控的 4 线 UART 和未启用流控的 2 线 UART。以下 Qualcomm TEE 访问示例控制着两者的条目。启用 UART 协议的 QUP v3 串行引擎配置如下:
  • 为 SE7 启用的默认配置为 HS UART
  • SE5 的 2 线 UART 配置

Boot

可以使用 /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/BOOT.MXF.1.0.c1/boot_images/boot/QcomPkg/SocPkg/<chipset>/Settings/UART/UartSettings.c 文件在启动阶段将 QUP v3 串行引擎配置为 UART。
GPIO 配置 GPIO 配置列于下表中。 表:UART GPIO 配置
位参数
[0:3]GPIO 功能
[4:13]GPIO 编号
[14]方向
[15:17]上下拉类型
[18:21]驱动强度
您必须根据以下位域配置每个 GPIO。

ADSP

固件在 ADSP 子系统的启动序列期间加载 SSC QUP。因此,配置文件位于 ADSP 构建中的 /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/<chipset>/fw_devcfg.c。 以下配置是在 FIFO 模式下加载了 UART 固件的 SSC QUP SE5/6 的示例。
GPIO 配置:QUP 通用驱动程序中的每个串行引擎都按协议使用默认 GPIO 配置进行配置。QUP v3 通用驱动程序会根据串行引擎中加载的协议,从 /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_common/config/<chipset>/adsp/ssc/qup_instance_mapping.c 中获取 GPIO 配置。 可以按如下方式覆盖默认 GPIO 配置。
TLMM_MAP 是用于初始化活动状态和睡眠状态 GPIO 配置的宏。例如,TLMM_MAP 宏的示例用法。

UART 工具

本节提供有关 UART 串行接口驱动的各种测试工具和方法的信息,以确认 UART 数据传输。

Linux

有关更多详细信息,请参阅 https://docs.kernel.org/admin-guide/serial-console.html。

在内核中启用 UART

本节提供有关如何在内核中启用 UART 的信息。

Linux

支持 UART 接口需要以下驱动内核配置。 启用以下内核配置。
  • CONFIG_QCOM_GENI_SE=y
  • CONFIG_SERIAL_QCOM_GENI=y
要为回环验证启用串行节点,请在 /arch/arm64/boot/dts/qcom/<chipset>.dtsi 文件中应用以下补丁。
注意您应当编译内核配置和设备树更改。编译完成后,可以将镜像加载到设备上以验证接口。有关接口验证的信息,请参阅 Verify UART interface 部分。

Boot/ADSP

有关自定义,请参阅 UART software device tree configuration 部分。

UART 自定义

有关自定义 UART 软件的信息,请参阅 QUP v3 access control customization。

验证 UART 接口

本节介绍 UART 驱动的验证过程以及 Qualcomm 驱动的测试结果。

Linux

要启用 UART 节点,请执行以下操作并编译内核配置。
  1. 要将 UART 状态更改为 OK 并为特定 UART 节点添加别名,请编辑以下 DTSI 文件。
    注意启用 SSH shell 或使用 ADB shell 运行命令并在 SSH shell(控制台)窗口中显示输出。有关如何运行 SSH 的更多信息,请参阅 Use SSH 部分。
  2. 为进行回环测试,请在 https://github.com/torvalds/linux/blob/master/drivers/tty/serial/qcom_geni_serial.c 文件的 qcom_geni_serial.c 中禁用 if 条件。
要在 Linux 内核中验证 QUP v3 UART 注册功能,请确保 UART 已正确注册到 TTY 栈。
  1. 在以下 DTSI 文件中禁用 UART 默认用例。
    将显示以下输出。
  2. 要验证 UART 驱动,请执行以下操作:
    1. 以宽容(permissive)模式打开 SSH shell,或使用 ADB shell。
    2. 注册 UART。
      以下是示例输出。
      根据为 serial1 = &uart7 添加的别名映射 ttyHS1 端口并启用串行引擎。
内核中注册的 UART 设备会被列出。UART 驱动遵循测试序列以启用回环。在 DUT 中启用 UART 节点后,运行以下命令以验证在 DTSI 文件中已启用 UART 实例。
注意打开两个 SSH shell 或使用 ADB shell 来写入和读取 UART 回环的数据。有关如何运行 SSH 的更多信息,请参阅 Use SSH 部分。
  1. 以宽容(permissive)模式打开 SSH shell,或使用 ADB shell。
  2. 使用 echo 命令传输数据。
  3. 在 UART 设备节点中读取数据。

调试 UART 问题

本节提供有关在 UART 软件驱动中启用调试日志的信息。

Linux

UART 驱动日志记录通过动态调试方法启用。在 <workspace_path_of_LINUX_kernel_image>/sources/kernel/kernel_platform/kernel/arch/arm64/configs/qcom_defconfig 中启用 CONFIG_DYNAMIC_DEBUG 以支持内核驱动的动态调试。 要在内核日志(dmesg)中启用并查看 UART 驱动日志,请运行以下命令。

UART 示例

有关上游设备树参考的信息,请参阅以下 DTSI 文件。 有关 Qualcomm Linux 硬件 SoC 的设备树节点信息,请参阅以下 DTSI 文件。