
图:两个 UART 设备之间的数据传输
决定传输成功与否的参数如下:- 波特率
- 起始位
- 停止位
- 奇偶校验位
- 数据位
- 流控

图:UART 数据包
UART 特性
下表描述了各应用的 UART 传输模式。表:UART 传输模式
| 子系统 | 传输模式 | 说明 |
|---|---|---|
| Linux |
|
|
| Boot | FIFO |
|
| aDSP | FIFO |
|
UART 接口组件
下表提供了不同子系统的 UART 驱动配置路径。 表:UART 接口:Linux| 文件类型 | 说明 |
|---|---|
| 设备树源文件 |
|
Pinctrl 设置 |
|
| Qualcomm TEE 设置 |
|
| 文件类型 | 说明 |
|---|---|
| QUP v3 串行引擎配置 |
|
| Qualcomm TEE 设置 |
|
| 文件类型 | 说明 |
|---|---|
| QUP v3 串行引擎配置 |
|
| 固件配置设置 |
|
UART API
本节列出以下子系统的 UART API。- Linux: https://github.com/torvalds/linux/blob/master/include/linux/tty.h
- Boot: QcomPkg/Include/HSUart.h
- aDSP: adsp_proc/core/api/buses/uart.h
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- QCS6490 和 QCS5430: https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi
- Dragonwing IQ-9075: https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi
- Dragonwing IQ-615: https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git/tree/arch/arm64/boot/dts/qcom/qcs615.dtsi?h=arm64-for-6.16
注意必须在
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 串行引擎特定实例分配的默认设置。- 为 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。
| 位 | 参数 |
|---|---|
| [0:3] | GPIO 功能 |
| [4:13] | GPIO 编号 |
| [14] | 方向 |
| [15:17] | 上下拉类型 |
| [18:21] | 驱动强度 |
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 固件的示例。
/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 配置可按如下方式覆盖。
UART 工具
本节介绍用于确认 UART 数据传输的 UART 串行接口驱动的各种测试工具和方法。Linux
有关更多详细信息,请参阅 https://docs.kernel.org/admin-guide/serial-console.html。在内核中启用 UART
本节介绍如何在内核中启用 UART。Linux
支持 UART 接口需要以下驱动内核配置。- UART 驱动:https://github.com/torvalds/linux/blob/master/drivers/tty/serial/qcom_geni_serial.c
- 内核
defconfig文件路径:<workspace_path_of_LINUX_kernel_image>/sources/kernel/kernel_platform/kernel/arch/arm64/configs/qcom_defconfig
CONFIG_QCOM_GENI_SE=yCONFIG_SERIAL_QCOM_GENI=y
/arch/arm64/boot/dts/qcom/<chipset>.dtsi 文件中应用以下补丁。
注意您应当编译内核配置和设备树更改。编译完成后,可以将镜像加载到设备以验证接口。有关接口验证的信息,请参阅验证 UART 接口一节。
Boot/aDSP
有关自定义,请参阅 UART 软件设备树配置一节。UART 自定义
有关自定义 UART 软件的信息,请参阅 QUP v3 访问控制自定义。验证 UART 接口
本节介绍 UART 驱动的验证流程,以及 Qualcomm 驱动的测试结果。Linux
要启用 UART 节点,请执行以下操作并编译内核配置。-
要将 UART 状态更改为 OK 并为特定 UART 节点添加别名,请编辑以下 DTSI 文件。
- QCS6490 和 QCS5430: https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi
- Dragonwing IQ-9075: https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi
- Dragonwing IQ-615: https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git/tree/arch/arm64/boot/dts/qcom/qcs615.dtsi?h=arm64-for-6.16
注意启用 SSH shell 或使用 ADB shell 运行命令并在 SSH shell(控制台)窗口中显示输出。有关如何运行 SSH 的更多信息,请参阅使用 SSH 一节。 -
为进行环回测试,在 https://github.com/torvalds/linux/blob/master/drivers/tty/serial/qcom_geni_serial.c 文件中的
qcom_geni_serial.c里禁用if条件。
- 在以下 DTSI 文件中禁用 UART 默认用例。
- QCS6490 和 QCS5430: https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi
- Dragonwing IQ-9075: https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi
- Dragonwing IQ-615: https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git/tree/arch/arm64/boot/dts/qcom/qcs615.dtsi?h=arm64-for-6.16
将显示以下输出。 - 要验证 UART 驱动,请执行以下操作:
- 以 permissive 模式打开 SSH shell 或使用 ADB shell。
- 注册 UART。
以下是示例输出。根据为
serial1 = &uart7添加的别名映射ttyHS1端口,并启用串行引擎。
注意打开两个 SSH shell 或使用 ADB shell,为 UART 环回写入和读取数据。有关如何运行 SSH 的更多信息,请参阅使用 SSH 一节。
- 以 permissive 模式打开 SSH shell 或使用 ADB shell。
- 使用
echo命令传输数据。 - 在 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 文件。- QCS6490 和 QCS5430: https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi
- Dragonwing IQ-9075: https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi
- Dragonwing IQ-615: https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git/tree/arch/arm64/boot/dts/qcom/qcs615.dtsi?h=arm64-for-6.16
- QCS6490 和 QCS5430: https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
- Dragonwing IQ-9075: https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi
- Dragonwing IQ-615: https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git/tree/arch/arm64/boot/dts/qcom/qcs615.dtsi?h=arm64-for-6.16

