Skip to main content
串行外设接口(SPI)是一种以全双工模式工作的同步串行数据链路。SPI 也被称为 4 线串行总线。
SPI 数据流

图:SPI 数据流

SPI 核心支持双向 SPI 标准、点对点以及控制器-目标(controller-target)协议。SPI 核心使用四条片选线(SPI_CS#_N)来选择要通信的目标设备。以下两条数据线支持双向数据传输。
  • SPI_DATA_MO_SI:控制器数据输出,目标数据输入。
  • SPI_DATA_MI_SO:控制器数据输入,目标数据输出。
表: SPI 中的数据和控制信号
数据信号MOSI:控制器数据输出,目标数据输入。
MISO:控制器数据输入,目标数据输出。
控制信号SCLK:由控制器生成并输入到所有目标的时钟。
CS:片选,当控制器置位其 CS_N 信号时,对应目标被选中。

SPI 特性

本节说明 SPI 串行引擎的传输模式以及各模式适用的不同场景。本节还介绍在各子系统 SPI 驱动中启用的 FIFO 和 DMA。 表: SPI 传输模式
子系统传输模式说明
Linux
  • FIFO(低速)
  • CPU DMA(高速)
  • GSI
支持的最大配置速率为 50 MHz。
BootFIFO
  • 传输速率最高 50 MHz。主机会将 SPI 时钟频率设置为最接近请求频率的值。
  • 每个传输字 4 位到 32 位。
  • 每条总线最多 4 个片选(CS)。
  • Boot 阶段不支持 GSI 模式。
  • 驱动以轮询模式运行。
aDSP
  • 全双工
  • 半双工
  • 同步
  • 串行通信
  • 没有显式的通信帧、错误校验或定义的数据字长。
  • 通信严格在原始位级别进行。
  • 传输速率最高 50 MHz。主机会将 SPI 时钟频率设置为最接近请求频率的值。
  • 每个传输字 4 位到 32 位。
  • 每条总线最多 4 个片选(CS)。

SPI 接口组件

本节介绍子系统驱动、内核设备树节点及相关文档。 表: SPI 接口: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
表: SPI 接口:Boot
文件类型说明
QUP v3 串行引擎配置
  • QUP v3 串行引擎:/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/BOOT.MXF.1.0.c1/boot_images/boot/Settings/Soc/<chipset>/Core/Buses/qup_common/<chipset>-qupv3.dtsi
  • GPIO 配置:/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/BOOT.MXF.1.0.c1/boot_images/boot/Settings/Soc/<chipset>/Core/Buses/qup_common/<chipset>-qupv3-pinctrl.dtsi
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
表: SPI 接口:aDSP/SLPI/SDC
文件类型说明
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
  • settings/buses/qup_common/config/<chipset>/adsp/ssc/qup_devcfg.json
固件配置设置
  • /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
表: SPI 接口:Qualcomm TEE
文件类型说明
QUP v3 串行引擎配置
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/spi/qupv3/config/<chipset>/tz/spi_devcfg_user.c
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/spi/qupv3/config/<chipset>/tz/spi_devcfg_user.h
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/spi/qupv3/config/<chipset>/tz/spi_devcfg.xml
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

SPI API

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

SPI 软件设备树配置

本节介绍 SPI 设备树配置以及设备节点的相关文档。

Linux

有关设备 SPI 的详细信息,请参阅以下 DTSI 文件。 有关 SPI 设备节点的内核文档的更多信息,请参阅 https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/spi/qcom%2Cspi-geni-qcom.yaml,以及 SPI 驱动文件 https://github.com/torvalds/linux/blob/master/drivers/spi/spi-geni-qcom.c
有关 GPIO pinctrl 配置的内核文档,请参阅以下文件。 QUP v3 串行引擎 GPIO 的相应配置存在于 pinctrl.dtsi 中并已完成映射。 例如:
确保特定串行引擎的协议配置在文件 /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 中使用 SPI 协议。根据需要修改所需设置,或查看为 QUP v3 串行引擎实例分配的默认设置。 以下是启用 SPI 的示例配置。

Boot

根据 Qualcomm Linux 芯片产品的要求,在 /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/BOOT.MXF.1.0.c1/boot_images/boot/Settings/Soc/<chipset>/Core/Buses/qup_common/<chipset>-qupv3.dtsi 文件中配置 QUP v3 设置。
注意要启用所需的 QUP v3 串行引擎,请将 QUP v3 包装器(wrapper)节点状态更新为 okay,并将相应的串行引擎节点更新为 disabled 状态。
以下示例节点有助于在 boot 中配置 QUP v3 串行引擎。 QUP 包装器节点示例
串行引擎实例的节点示例
有关 pinctrl 定义,请参阅 GPIO 配置文件 /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/BOOT.MXF.1.0.c1/boot_images/boot/Settings/Soc/<chipset>/Core/Buses/qup_common/<chipset>-qupv3-pinctrl.dtsi GPIO 配置示例:
  • 当需求与默认配置不同时,在 <chipset>-qupv3-pinctrl.dtsi 中使用 GPIO 配置修改该宏。
  • 有关宏定义,请参阅头文件路径 Settings/Include/gpio-dt.h
在示例 TLMM 节点中替换宏。
注意在更改统一可扩展固件接口(UEFI)配置之前,请先验证 Qualcomm TEE 设置。确保串行引擎节点处于 FIFO_MODE 并且可从应用处理器访问。验证所加载的协议是否符合要求。

aDSP/SDC

固件在 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/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 以下配置是 SSC QUP SE4 加载 SPI 固件的示例。
GPIO 配置:QUP 通用驱动中的每个串行引擎都配置了默认 GPIO 配置。QUP 通用驱动会根据为串行引擎加载的协议,从 /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 宏的示例用法。

Qualcomm TEE

QUP v3 访问配置设置位于 /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/spi/qupv3/interface/spi_devcfg.h 要在 /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/spi/qupv3/config/<chipset>/tz/spi_devcfg_user.h 中为 SPI 启用 QUP v3 串行引擎,请按如下方式添加 #define TZ_USE_SPI_X(X 为 SPI 串行引擎编号)。
TZ_USE_SPI_<num> 的编号基于串行引擎的序号(从一开始)。例如,如果有两个 QUP:QUPV3_0 有七个串行引擎,QUPV3_1 有八个串行引擎,用户需要启用 QUPV3_2_SE2,则宏应为 TZ_USE_SPI_9。 GPIO 配置:在以下示例中,驱动强度和上下拉根据从 MISO 起始的 PIN 索引在 settings/buses/spi/qupv3/config/<chipset>/tz/spi_devcfg_user.c 中配置。
对 Qualcomm TEE 子系统的访问控制权限在 QUPAC 策略中配置,位于 /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

SPI 启动(bringup)

本节介绍如何启用 Qualcomm Linux SPI 驱动。

Linux

要验证与设备的 SPI 通信,必须启用内核配置。在相应的 <chipset> defconfig 文件中启用了 CONFIG_SPI_SPIDEV=m 设置。在内核设备树中启用特定的 QUP v3 SPI 串行引擎实例。

SPI 配置

本节介绍 SPI 软件驱动的内核配置和设备树节点更改。

Linux

支持 SPI 接口需要以下驱动内核配置。 必须启用以下内核配置。
  • CONFIG_QCOM_GENI_SE=y
  • CONFIG_SPI_QCOM_GENI=m
  • CONFIG_SPI_SPIDEV=m,用于配置用户空间应用
  • CONFIG_QCOM_GPI_DMA=m,用于启用 GSI 支持
要为环回验证启用 SPI 节点,请将以下补丁应用到 /arch/arm64/boot/dts/qcom/<chipset>.dtsi 文件。
注意您应当编译内核配置和设备树更改。内核编译完成后,可以将镜像加载到设备以验证接口。有关接口验证的信息,请参阅 SPI 验证一节。

SPI 验证

本节介绍 SPI 驱动的验证流程和测试结果。

Linux

要交叉编译 SPI 工具,请执行以下操作。
  1. yocto/build-qcom-wayland/tmp-glibc/work-shared/<chipset>/kernel-source/tools/spi 获取 SPI 工具。有关 SPI 工具的更多详细信息,请参阅 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/tools/spi
  2. 安装交叉编译器。
  3. 运行以下命令设置交叉编译环境。
  4. 运行以下命令编译工具。

验证 SPI 设备

通过在 SSH shell 中检查 dev 节点(/dev/spidev1.0)或使用 ADB shell 来验证驱动。有关如何运行 SSH 的更多信息,请参阅使用 SSH 一节。
  1. 要验证 SPI 驱动,请执行以下操作:
    1. 以 permissive 模式打开 SSH shell 或使用 ADB shell。
    2. 挂载文件系统。
    3. 使用 SCP 或类似工具传输文件。 例如,scp spidev_test root@10.92.175.138:/bin
    4. 赋予执行权限。
  2. 验证 SPI 设备。命令格式为 ./spidev_test -D /dev/<spidev_node>
    将显示以下输出。
运行以下命令了解使用方法信息。
将显示以下输出。

SPI 调试

本节介绍 SPI 软件驱动的默认日志记录方法,以便记录 SPI 传输失败。

Linux

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

SPI 示例

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