
图:SPI 数据流
SPI 核心支持双向 SPI 标准、点对点以及控制器-目标(controller-target)协议。SPI 核心使用四条片选线(SPI_CS#_N)来选择要通信的目标设备。以下两条数据线支持双向数据传输。- SPI_DATA_MO_SI:控制器数据输出,目标数据输入。
- SPI_DATA_MI_SO:控制器数据输入,目标数据输出。
| 数据信号 | MOSI:控制器数据输出,目标数据输入。 |
| MISO:控制器数据输入,目标数据输出。 | |
| 控制信号 | SCLK:由控制器生成并输入到所有目标的时钟。 |
| CS:片选,当控制器置位其 CS_N 信号时,对应目标被选中。 |
SPI 特性
本节说明 SPI 串行引擎的传输模式以及各模式适用的不同场景。本节还介绍在各子系统 SPI 驱动中启用的 FIFO 和 DMA。 表: SPI 传输模式| 子系统 | 传输模式 | 说明 |
|---|---|---|
| Linux |
| 支持的最大配置速率为 50 MHz。 |
| Boot | FIFO |
|
| aDSP |
|
|
SPI 接口组件
本节介绍子系统驱动、内核设备树节点及相关文档。 表: SPI 接口:Linux 表: SPI 接口:Boot| 文件类型 | 说明 |
|---|---|
| QUP v3 串行引擎配置 |
|
| Qualcomm TEE 设置 |
|
| 文件类型 | 说明 |
|---|---|
| QUP v3 串行引擎配置 |
|
| 固件配置设置 |
|
| 文件类型 | 说明 |
|---|---|
| QUP v3 串行引擎配置 |
|
| Qualcomm TEE 设置 |
|
SPI API
本节列出以下子系统的 SPI API。- Linux:
- Boot: boot_images/boot/QcomPkg/Include/SpiApi.h
- aDSP/SDC: adsp_proc/core/api/buses/spi_api.h
SPI 软件设备树配置
本节介绍 SPI 设备树配置以及设备节点的相关文档。Linux
有关设备 SPI 的详细信息,请参阅以下 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
pinctrl 配置的内核文档,请参阅以下文件。
- 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
Documentation/devicetree/bindings/pinctrl/qcom,<chipset>-tlmm.yaml
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 状态。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。
注意在更改统一可扩展固件接口(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 固件的示例。
/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 配置可按如下方式覆盖。
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 中配置。
/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 接口需要以下驱动内核配置。- 驱动源文件位于 https://github.com/torvalds/linux/blob/master/drivers/spi/spi-geni-qcom.c
- 内核
defconfig文件位于<workspace_path_of_LINUX_kernel_image>/sources/kernel/kernel_platform/kernel/arch/arm64/configs/qcom_defconfig
CONFIG_QCOM_GENI_SE=yCONFIG_SPI_QCOM_GENI=mCONFIG_SPI_SPIDEV=m,用于配置用户空间应用CONFIG_QCOM_GPI_DMA=m,用于启用 GSI 支持
/arch/arm64/boot/dts/qcom/<chipset>.dtsi 文件。
注意您应当编译内核配置和设备树更改。内核编译完成后,可以将镜像加载到设备以验证接口。有关接口验证的信息,请参阅 SPI 验证一节。
SPI 验证
本节介绍 SPI 驱动的验证流程和测试结果。Linux
要交叉编译 SPI 工具,请执行以下操作。- 从
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。 - 安装交叉编译器。
- 运行以下命令设置交叉编译环境。
- 运行以下命令编译工具。
验证 SPI 设备
通过在 SSH shell 中检查dev 节点(/dev/spidev1.0)或使用 ADB shell 来验证驱动。有关如何运行 SSH 的更多信息,请参阅使用 SSH 一节。
- 要验证 SPI 驱动,请执行以下操作:
- 以 permissive 模式打开 SSH shell 或使用 ADB shell。
- 挂载文件系统。
- 使用 SCP 或类似工具传输文件。
例如,
scp spidev_test root@10.92.175.138:/bin。 - 赋予执行权限。
- 验证 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 文件。- 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

