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 文件在 boot 中将 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 以下配置是 SSC QUP SE5/6 以 FIFO 模式加载 UART 固件的示例。
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 文件中应用以下补丁。
注意您应当编译内核配置和设备树更改。编译完成后,可以将镜像加载到设备以验证接口。有关接口验证的信息,请参阅验证 UART 接口一节。

Boot/aDSP

有关自定义,请参阅 UART 软件设备树配置一节。

UART 自定义

有关自定义 UART 软件的信息,请参阅 QUP v3 访问控制自定义

验证 UART 接口

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

Linux

要启用 UART 节点,请执行以下操作并编译内核配置。
  1. 要将 UART 状态更改为 OK 并为特定 UART 节点添加别名,请编辑以下 DTSI 文件。
    注意启用 SSH shell 或使用 ADB shell 运行命令并在 SSH shell(控制台)窗口中显示输出。有关如何运行 SSH 的更多信息,请参阅使用 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 的更多信息,请参阅使用 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 文件。