# SPI

Source: [https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html](https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html)

串行外设接口 (SPI) 是在全双工模式下工作的同步串行数据链路。SPI 又称为 4 线制串行总线。
Figure : SPI 数据流
                ![](data:image/png;base64,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)

SPI 核心支持双向 SPI 标准、点对点和控制器-目标协议。SPI 核心使用四条片选线路 (SPI\_CS#\_N) 来选择进行通信的目标设备。以下两条数据线路支持双向数据传输。
- SPI\_DATA\_MO\_SI：控制器数据输出，目标数据输入。
- SPI\_DATA\_MI\_SO：控制器数据输入，目标数据输出。

时钟线路使用核心和目标设备为数据输入和输出提供时钟。核心可采用控制器模式或目标模式。核心支持的最大频率为 50 MHz。

传输从片选 (CS\_N) 线路置为有效开始。单次片选置为有效期间传输的数据量由参数 N 控制。在大小为 N 的连续传输期间，可将片选设定为在一段指定的时间内置为无效。一个事务由多个大小为 N 的传输组成。

| 数据信号 | MOSI：主控数据输出，目标数据输入。 |
| --- | --- |
| 数据信号 | MISO：主控数据输入，目标数据输出。 |
| 控制信号 | SCLK：由控制器生成并输入所有目标的时钟。 |
| 控制信号 | CS：片选，当控制器将其 CS\_N 信号置为有效时选择目标。 |
|  |  |

SPI 协议实现不支持数据组帧、流量控制和错误检验。因此，没有用于确认数据已发送或已接收的应答机制。SPI 控制器并不确定目标是否存在或者是否已连接。设备采用控制器/目标关系进行通信，控制器负责启动数据帧。当控制器生成时钟并通过 CS 置为有效选择目标设备后，即可进行单向或双向数据传输。最高支持 26 Mbps 的数据传输速率。传输速率最高可达 50 MHz，每字传输 4 位到 32 位。

## SPI 特性

Source: [https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html](https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html)

本节介绍 SPI 串行引擎传输模式以及支持不同传输模式的各种用例。此外，还介绍各种子系统 SPI 驱动程序中支持的 FIFO 和 DMA。

### Linux

SPI 最高支持 50 MHz 的速度配置。QUP v3 SPI 支持三种模式 – FIFO、DMA 和 GSI。

### 启动

SPI 核心具有以下特性：
- 仅支持 FIFO 模式。
- 传输速率最高 50 MHz。主机根据请求的频率设置最接近的 SPI 时钟频率。
- 每字传输 4 位到 32 位。
- 每条总线最多四条片选 (CS) 线路。
- boot 中不支持 GSI 模式。
- 驱动程序以轮询模式执行。

### aDSP

- SPI 核心允许在控制器与目标之间进行全双工和半双工的同步串行通信。没有显式的通信组帧、错误校验或定义的数据字长。因此，完全是原始位级别的通信。
- SPI 核心具有以下特性：
    - 传输速率最高 50 MHz。主机根据请求的频率设置最接近的 SPI 时钟频率。
    - 每字传输 4 位到 32 位。
    - 每条总线最多四条片选 (CS) 线路。

## SPI 接口

Source: [https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html](https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html)

本节提供有关子系统驱动程序、内核设备树节点和相关文档的信息。

### Linux

| 文件类型 | 说明 |
| --- | --- |
| 设备树源 | <ul class="ul" id="spi_interface__ul_orb_15n_rzb"><br>                                    <li class="li">有关 QUP v3 串行引擎接口设备节点和 SPI 设备节点的芯片组配置的设备树属性，可访问&nbsp;<a href="https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi')">https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi</a></li><br><br>                                    <li class="li">有关 QUP v3 串行引擎设备节点的信息，可参见内核文档，相关网址如下：&nbsp;<a href="https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/spi/qcom%2Cspi-geni-qcom.yaml" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/spi/qcom%2Cspi-geni-qcom.yaml')">https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/spi/qcom%2Cspi-geni-qcom.yaml</a></li><br><br>                                </ul> |
| `Pinctrl` 设置 | 有关 SPI 设备节点的 QUP v3 串行引擎的 GPIO 设置的设备树属性，可访问 [https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi](https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi) |
| TrustZone 设置 | 有关针对不同子系统配置 SPI 的 QUP v3 串行引擎固件中的 TrustZone 访问控制设置，可访问 /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC\_Access.c |

### 启动

| 文件类型 | 说明 |
| --- | --- |
| QUP v3 串行引擎配置 | 要针对 SPI 配置 boot 子系统中的 QUP v3 串行引擎，以及针对 SPI 软件用例配置 GPIO，可访问以下文件路径：<ul class="ul" id="spi_interface__ul_fkh_45n_rzb"><br>                                    <li class="li">QUP v3 串行引擎：&nbsp;<span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/BOOT.MXF.1.0.c1/boot_images/boot/Settings/Soc/&lt;chipset&gt;/Core/Buses/qup_common/&lt;chipset&gt;-qupv3.dtsi</span></li><br><br>                                    <li class="li">GPIO 配置：&nbsp;<span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/BOOT.MXF.1.0.c1/boot_images/boot/Settings/Soc/&lt;chipset&gt;/Core/Buses/qup_common/&lt;chipset&gt;-qupv3-pinctrl.dtsi</span></li><br><br>                                </ul> |
| TrustZone 设置 | 有关针对不同子系统加载SPI 协议的 QUP v3 串行引擎固件中的 TrustZone 访问控制设置，可访问 /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC\_Access.c |

### aDSP/SLPI/SDC

| 文件类型 | 说明 |
| --- | --- |
| QUP v3 串行引擎配置 | 有关 aDSP 子系统中用于启用 SPI 的 QUP v3 串行引擎配置设置，可访问以下文件路径。<ul class="ul" id="spi_interface__ul_vds_kvn_rzb"><br>                                    <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_common/config/&lt;chipset&gt;/adsp/ssc/qup_devcfg.c</span></li><br><br>                                    <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/&lt;chipset&gt;/fw_devcfg.c</span></li><br><br>                                    <li class="li"><span class="ph filepath">settings/buses/qup_common/config/&lt;chipset&gt; /adsp/ssc/qup_devcfg.json</span></li><br><br>                                </ul> |
| 固件配置设置 | 有关在 aDSP 软件中配置 SPI 的 QUP v3 串行引擎固件设置，可参见以下文件。<ul class="ul" id="spi_interface__ul_wpr_p5j_51c"><br>                                    <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/&lt;chipset&gt;/fw_devcfg.c</span></li><br><br>                                    <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/&lt;chipset&gt;/fw_devcfg.xml</span></li><br><br>                                </ul> |

### TrustZone

| 文件类型 | 说明 |
| --- | --- |
| QUP v3 串行引擎配置 | <ul class="ul" id="spi_interface__ul_xr2_vvn_rzb"><br>                                    <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/spi/qupv3/config/&lt;chipset&gt;/tz/spi_devcfg_user.c</span></li><br><br>                                    <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/spi/qupv3/config/&lt;chipset&gt;/tz/spi_devcfg_user.h</span></li><br><br>                                    <li class="li"><span class="ph filepath">/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/spi/qupv3/config/&lt;chipset&gt;/tz/spi_devcfg.xml</span></li><br><br>                                </ul> |
| TrustZone 设置 | /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC\_Access.c |

### SPI API

Source: [https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html](https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html)

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

### Linux

有关 Linux API 的信息，可访问以下 URL。
- [https://github.com/torvalds/linux/blob/master/include/uapi/linux/spi/spidev.h](https://github.com/torvalds/linux/blob/master/include/uapi/linux/spi/spidev.h).
- [https://github.com/torvalds/linux/blob/master/include/linux/spi/spi.h](https://github.com/torvalds/linux/blob/master/include/linux/spi/spi.h).

### 启动

- 该函数由客户端代码调用，用于初始化客户端所使用的 SPI 核心实例。成功后，`spi_handle` 指向 SPI 核心的句柄。

        spi_status spi_open( spi_instance instance, void **spi_handle);Copy to clipboard
- EFI\_QCOM\_SPI\_PROTOCOL 的传输实现。

        spi_status spi_transfer(void	*spi_handle, SpiDeviceInfoType	*devInfo, CONST UINT8	*write_buffer, UINT32	write_len, UINT8	*read_buffer, UINT32	read_len);Copy to clipboard
- 反初始化 SPI 核心。

        spi_status spi_close(void *spi_handle);Copy to clipboard

### aDSP/SDC

- 针对用例在低功耗模式下运行时所需的特定总线速度分配必要的资源。

        spi_status_t spi_setup_island_resource (spi_instance_t instance, uint32 frequency_hz);Copy to clipboard
- 客户端调用 API 来初始化 SPI 端口并获取句柄。该 API 对资源进行分配和初始化，但不与 SPI 硬件通信。这些资源在 `spi_close()` 调用中被释放。

        spi_status_t spi_open (spi_instance_t instance, void **spi_handle);Copy to clipboard
- 启用 SPI 实例使用的时钟、GPIO 以及任何其他电源资源。

        spi_status_t spi_power_on (void *spi_handle);Copy to clipboard
- 在 SPI 总线上以同步或异步方式执行 SPI 全双工、半双工或单工传输。

        spi_status_t spi_full_duplex (void *spi_handle, spi_config_t *config, spi_descriptor_t *desc, uint32 num_descriptors, callback_fn c_fn, void *c_ctxt, uint8 timestamp);Copy to clipboard
- 禁用 SPI 实例使用的时钟、GPIO 以及任何其他电源资源。

        spi_status_t spi_power_off (void *spi_handle);Copy to clipboard
- 反初始化由 `spi_open()` API 分配的资源。

        spi_status_t spi_close (void *spi_handle);Copy to clipboard
- 重新初始化用例在低功耗模式下需要的特定总线速度所需的资源。

        spi_status_t spi_reset_island_resource (spi_instance_t instance);Copy to clipboard

## SPI 软件

Source: [https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html](https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html)

本节提供 SPI 设备树配置的相关信息，以及设备节点的相关文档。

### Linux

有关设备 SPI 的详细信息，可访问 [https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi](https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi)。

有关特定于 SPI 设备节点的内核文档的更多信息，可访问 [https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/spi/qcom%2Cspi-geni-qcom.yaml](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](https://github.com/torvalds/linux/blob/master/drivers/spi/spi-geni-qcom.c)。

    spi@a98000 {
    compatible = "qcom,geni-spi";
    reg = <0 0x00a98000 0 0x4000>;
    clocks = <&gcc GCC_QUPV3_WRAP1_S6_CLK>;
    clock-names = "se";
    pinctrl-names = "default";
    pinctrl-0 = <&qup_spi14_data_clk>, <&qup_spi14_cs>;
    interrupts = <GIC_SPI 368 IRQ_TYPE_LEVEL_HIGH>;
    #address-cells = <1>;
    #size-cells = <0>;
    power-domains = <&rpmhpd SC7280_CX>;
    operating-points-v2 = <&qup_opp_table>;
    interconnects = <&clk_virt MASTER_QUP_CORE_1 0 &clk_virt SLAVE_QUP_CORE_1 0>,	<&gem_noc MASTER_APPSS_PROC 0 &cnoc2 SLAVE_QUP_1 0>;
    interconnect-names = "qup-core", "qup-config";	dmas = <&gpi_dma1 0 6 QCOM_GPI_SPI>,       <&gpi_dma1 1 6 QCOM_GPI_SPI>;
    dma-names = "tx", "rx";
    status = "disabled";
    };Copy to clipboard

有关特定于 GPIO `pinctrl` 配置的内核文档，可访问 [https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi](https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi) 和 Documentation/devicetree/bindings/pinctrl/qcom,&lt;Chipset&gt;-tlmm.yaml。
                QUP v3 串行引擎 GPIO 的相应配置存在/映射到 pinctrl.dtsi 中。

示例：

    qup_spi14_data_clk: qup-spi14-data-clk-state {			pins = "gpio56", "gpio57", "gpio58";			function = "qup16";		};
    		qup_spi14_cs: qup-spi14-cs-state {			pins = "gpio59";			function = "qup16";		};
    		qup_spi14_cs_gpio: qup-spi14-cs-gpio-state {			pins = "gpio59";			function = "gpio";		};
    		qup_spi15_data_clk: qup-spi15-data-clk-state {			pins = "gpio60", "gpio61", "gpio62";			function = "qup17";		};Copy to clipboard

在 /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC\_Access.c 文件中确保特定串行引擎的协议配置采用 SPI 协议。根据需要修改所需的设置，或者参考针对 QUP v3 串行引擎实例分配的默认设置。

以下是用于启用 SPI 的配置示例。

    { QUPV3_0_SE3, QUPV3_PROTOCOL_SPI,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // CAN SPI
    
    { QUPV3_1_SE3, QUPV3_PROTOCOL_SPI,     QUPV3_MODE_FIFO, AC_HLOS,            FALSE, TRUE,  TRUE }, // LS1 SPI
    { QUPV3_1_SE4, QUPV3_PROTOCOL_SPI,     QUPV3_MODE_GSI,  AC_TZ,              FALSE, TRUE,  TRUE }, // SPI -NFC ESE
    { QUPV3_1_SE6, QUPV3_PROTOCOL_SPI,     QUPV3_MODE_GSI,  AC_HLOS,            FALSE, TRUE,  FALSE}, // FP
    
    { QUPV3_SSC_SE2, QUPV3_PROTOCOL_SPI,     QUPV3_MODE_GSI, AC_ADSP_Q6_ELF,  FALSE,      FALSE, FALSE }, // IMU_SPICopy to clipboard

### 启动

根据 DTSI 文件 /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/BOOT.MXF.1.0.c1/boot\_images/boot/Settings/Soc/&lt;chipset&gt;/Core/Buses/qup\_common/&lt;chipset&gt;-qupv3.dtsi 中的 Qualcomm Linux 芯片产品要求来配置 QUP v3 设置。

Note: 要启用所需的 QUP v3 串行引擎，应将 QUP v3 封装程序节点状态更新为 `okay`，并将相应的串行引擎节点更新为 `disabled` 状态。

以下示例节点有助于在 boot 中配置 QUP v3 串行引擎。

**QUP 封装程序节点示例**

           /* QUPV3_0  wrapper  instance */
        TOP_QUP_0{ 
            compatible = "qcom,qup-controller";
            qup_id                      = /bits/  8 <(QUP_0)>;
            core_base_addr              = <QUPV3_0_CORE_BASE_ADDRESS>;
            common_base_addr            = <(QUPV3_0_CORE_COMMON_BASE_ADDRESS)>;
            se_wrapper_base_addr        = <(QUPV3_0_CORE_SE_BASE_ADDRESS)>;
            core_frequency              = <100000000>;
            qup_flags                   = <(QUP_FLAGS_UNUSED)>;
            num_se                      = /bits/ 8 <8>;
            status                      = "okay"; 
    Copy to clipboard

**串行引擎实例的示例节点**

    /*TOP_QUP_0_SE_0  Instance */ 
            TOP_QUP_0_SE_0{
              status                      = "disabled";  (updated to okay if you need the instance to be enabled)
                core_offset                 = <0x00000000>;
                se_flags                    = <(USES_DDR_BUFFER | USES_INTERNAL_DDR_MEM | ENABLE_FATAL_ON_TIMEOUT | POLLED_MODE)>;
                se_index                    = /bits/  8 <0>;
                FIFO_MODE                   = /bits/  8 <1>;
                protocol_supported          = <(I2C_SUPPORTED | UART_SUPPORTED | SPI_SUPPORTED)>;
                interface_supported         = <CORE_IRQ>;
               * gpi_index                   = /bits/ 8 <0xFF>;
                core_irq                    = /bits/ 16 <0>;
                pdc_irq                     = /bits/ 16 <0>;
                gpio_int_num                = /bits/ 16 <0>;
                i2c_hub                     = /bits/ 8  <0>;
                i2c_mm                      = /bits/ 16 <0>;
                SE_EXCLUSIVE                = /bits/  8 <1>;
                pinctrl-names               = "i2c-default", "i2c-sleep","spi-default", "spi-sleep","uart-default", "uart-sleep";
                pinctrl-0                   = <&top_qup0_se0_i2c_active>;
                pinctrl-1                   = <&top_qup0_se0_i2c_sleep>;
                pinctrl-2                   = <&top_qup0_se0_spi_active>;
                pinctrl-3                   = <&top_qup0_se0_spi_sleep>;
                pinctrl-4                   = <&top_qup0_se0_uart_active>;
                pinctrl-5                   = <&top_qup0_se0_uart_sleep>;
    
                se_clock                    = "gcc_qupv3_wrap0_s0_clk";
            };
    Copy to clipboard

关于 `pinctrl` 定义，参见 GPIO 配置文件（位于 /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/BOOT.MXF.1.0.c1/boot\_images/boot/Settings/Soc/&lt;chipset&gt;/Core/Buses/qup\_common/&lt;chipset&gt;-qupv3-pinctrl.dtsi）。

示例 GPIO 配置：

    #define top_qup0_se1_i2c_active_cfg  GPIO_CFG(GPIO_INPUT,GPIO_PULL_UP,GPIO_DRIVE_STRENGTH(200),GPIO_STRONG_PULL)Copy to clipboard

- 当需要使用的配置与默认配置不同时，可在 `<chipset>-qupv3-pinctrl.dtsi` 中修改 GPIO 配置的宏。
- 关于宏定义，可访问头文件路径 Settings/Include/gpio-dt.h。

替换示例 TLMM 节点中的宏。

      /*TOP_QUP0_se1_pinctrl*/
        top_qup0_se1_i2c_active: top_qup0_se1_i2c_active{
        --    config = <&qup0_l0_1 top_qup_i2c_active_cfg>,
                     <&qup0_l1_1 top_qup_i2c_active_cfg>;
       ++  config = <&qup0_l0_1 top_qup0_se1_i2c_active_cfg>,
                     <&qup0_l1_1 top_qup0_se1_i2c_active_cfg>;
        };
    Copy to clipboard

Note: 在更改统一可扩展固件接口 (UEFI) 配置之前验证 TrustZone 设置。确保串行引擎节点处于 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/&lt;chipset&gt;/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/&lt;chipset&gt;/fw\_devcfg.xml）中。

以下配置是向 SSC QUP SE4 中加载 SPI 固件的示例。

    se_cfg se4_cfg = { 0x90000, SE_PROTOCOL_SPI,   	GSI,     TRUE, TRUE };Copy to clipboard

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/&lt;chipset&gt;/adsp/ssc/qup\_instance\_mapping.c 中获取 GPIO 配置。
                可按照如下所示覆盖默认 GPIO 配置。

    {      .instance_id          =  5 ,         //Instance ID
            .qup              =  QUP_SSC,    //QUP Type
            .se_index         =  4,          //SE ID
            .se_data          =  NULL,       //devcfg_map
            .protocol_io_cfg  =  {
                                    TLMM_MAP(TLMM_GPIO_KEEPER ,TLMM_GPIO_2MA,TLMM_GPIO_KEEPER ),              //SLEEP CFG
                                    TLMM_MAP(TLMM_GPIO_NO_PULL,TLMM_GPIO_6MA,TLMM_GPIO_KEEPER ),              //SPI CFG
                                    TLMM_MAP(TLMM_GPIO_NO_PULL,TLMM_GPIO_2MA,TLMM_GPIO_NO_PULL),              //UART CFG
                                    TLMM_MAP(TLMM_GPIO_PULL_UP,TLMM_GPIO_2MA,TLMM_GPIO_NO_PULL),              //I2C CFG
                                    TLMM_MAP(TLMM_GPIO_PULL_UP,TLMM_GPIO_2MA,TLMM_GPIO_KEEPER )               //I3C CFG
                                 },
            .se_exclusive     =  TRUE,
    }
    Copy to clipboard

TLMM\_MAP 是用于初始化工作和休眠状态 GPIO 配置的宏。以下为 TLMM\_MAP 宏的使用示例。

    TLMM_MAP (active state pull type, drive strength, sleep state pull type)Copy to clipboard

### TrustZone

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/&lt;chipset&gt;/tz/spi\_devcfg\_user.h 中添加如下 `#define TZ_USE_SPI_X`（`X` 为 SPI 串行引擎编号）以启用 SPI 的 QUP v3 串行引擎。

    #define TZ_USE_SPI_13 //NFC-eseCopy to clipboard

    #define TZ_USE_SPI_14 //Touch-SPICopy to clipboard

    #define TZ_USE_SPI_15 //FP sensorCopy to clipboard

`TZ_USE_SPI_<num>` 编号基于串行引擎的序列号（从 1 开始）。举例来说，假设有两个 QUP：QUPV3\_0 具有七个串行引擎，QUPV3\_1 具有八个串行引擎，则用户必须启用 QUPV3\_2\_SE2。宏应为 TZ\_USE\_SPI\_9。

GPIO 配置：在以下示例中，根据 MISO 的 PIN 起始索引在 settings/buses/spi/qupv3/config/&lt;chipset&gt;/tz/spi\_devcfg\_user.c 处配置驱动器强度和上下拉。

    spi_plat_device_config_user spi_device_user_config_0 =
     
        {2,2,2,2,-1,-1,-1},    //.drive_strength index: 0 - MISO, 1 - MOSI, 2 - SCLK, 3 - CS_0, 4- CS_1, 5- CS_2, 6- CS_3
                                    	                 value: 0 - 2MA, 1 - 4MA, 2 - 6MA
        {1,1,0,1,-1,-1,-1},    //.pull index: 0 - MISO, 1 - MOSI, 2 - SCLK, 3 - CS_0, 4- CS_1, 5- CS_2, 6- CS_3
                                    value: 0 - NO_PULL, 1 = PULL_DOWN, 2 = KEEPER, 3 = PULL_UP
        0xFF,                 //.gpii_idx 
        0,                   //.mode_select  not supported for TZ
        0,                   //.flags not supported for TZ
    };
    Copy to clipboard

在 QUPAC 策略（位于 /firmware/qualcomm-linux-spf-1-0\_ap\_standard\_oem\_nomodem/TZ.XF.5.0/trustzone\_images/core/settings/buses/qup\_accesscontrol/qupv3/config/&lt;chipset&gt;/QUPAC\_Access.c）中配置对 TrustZone 子系统的访问控制权限。

    const QUPv3_se_security_permissions_type qupv3_perms_iot_rb3[] =
    {
      /*   PeriphID,         ProtocolID,               Mode,  NsOwner,       bAllowFifo, bLoad, bModExcl  */
      { QUPV3_0_SE0, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // LT9611 and QPS615 I2C
      { QUPV3_0_SE1, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // APPS I2C - PCIE/ USB Type C
      { QUPV3_0_SE2, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // SMB / LS1 I2C
      { QUPV3_0_SE3, QUPV3_PROTOCOL_SPI,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // CAN SPI
      { QUPV3_0_SE4, QUPV3_PROTOCOL_UART_4W, QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // LS1 UART
      { QUPV3_0_SE5, QUPV3_PROTOCOL_UART_2W, QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  FALSE, FALSE }, // Debug UART
      { QUPV3_0_SE6, QUPV3_PROTOCOL_UART_2W, QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // WLAN UART
      { QUPV3_0_SE7, QUPV3_PROTOCOL_UART_4W, QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // Hastings BT
      { QUPV3_1_SE0, QUPV3_PROTOCOL_SPMI,    QUPV3_MODE_FIFO, AC_ADSP_Q6_ELF,     TRUE,  TRUE,  FALSE }, // QuP SPMI
      { QUPV3_1_SE1, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // NFC I2C
      { QUPV3_1_SE2, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_FIFO, AC_HLOS,            TRUE,  TRUE,  FALSE }, // HDMI OUT for VIDEOIOBoard
      { QUPV3_1_SE3, QUPV3_PROTOCOL_SPI,     QUPV3_MODE_FIFO, AC_HLOS,            FALSE, TRUE,  TRUE }, // LS1 SPI
      { QUPV3_1_SE4, QUPV3_PROTOCOL_SPI,     QUPV3_MODE_GSI,  AC_TZ,              FALSE, TRUE,  TRUE }, // SPI -NFC ESE
      { QUPV3_1_SE5, QUPV3_PROTOCOL_I2C,     QUPV3_MODE_GSI,  AC_HLOS,            FALSE, TRUE,  FALSE}, // Legacy Touch
      { QUPV3_1_SE6, QUPV3_PROTOCOL_SPI,     QUPV3_MODE_GSI,  AC_HLOS,            FALSE, TRUE,  FALSE}, // FP
      /*QUPV3_1_SE7*/
    };Copy to clipboard

## SPI 调通

Source: [https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html](https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html)

本节介绍如何启用 Qualcomm 平台 SPI 驱动程序。

### Linux

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

## SPI 配置

Source: [https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html](https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html)

本节提供有关 SPI 软件驱动程序内核配置和设备树节点更改的信息。

### Linux

需要以下驱动程序内核配置才能支持 SPI 接口。
- 驱动程序源文件，位于 [https://github.com/torvalds/linux/blob/master/drivers/spi/spi-geni-qcom.c](https://github.com/torvalds/linux/blob/master/drivers/spi/spi-geni-qcom.c)
- 内核 `defconfig` 文件，位于 &lt;workspace\_path\_of\_LINUX\_kernel\_image&gt;\sources\kernel \kernel\_platform\kernel\arch\arm64/configs/qcom\_defconfig

将启用以下内核配置。
- `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/&lt;chipset&gt;.dtsi 文件应用以下补丁。

    diff --git a/arch/arm64/boot/dts/qcom/<chipset>.dtsi b/arch/arm64/boot/dts/qcom/<chipset>.dtsi
    index 82dfa3e..344e99a 100644
    --- a/arch/arm64/boot/dts/qcom/<chipset>.dtsi
    +++ b/arch/arm64/boot/dts/qcom/<chipset>.dtsi
    @@ -6760,3 +6760,12 @@
    <GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>;
     };
     };
    +
    +&spi14 {
    +        status = "ok";
    +        spidev@0 {
    +                compatible = "spidev";
    +                spi-max-frequency = <50000000>;
    +                reg = <0>;
    +        };
    +};
    
    diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
    index d13dc15..36d7914 100644
    --- a/drivers/spi/spidev.c
    +++ b/drivers/spi/spidev.c
    @@ -84,7 +84,7 @@
    static LIST_HEAD(device_list);
    static DEFINE_MUTEX(device_list_lock);
     
    -static unsigned bufsiz = 4096;
    +static unsigned bufsiz = 35000;
    module_param(bufsiz, uint, S_IRUGO);
    MODULE_PARM_DESC(bufsiz, "data bytes in biggest supported SPI message");
     
    @@ -742,6 +742,7 @@
     	{ .compatible = "semtech,sx1301", .data = &spidev_of_check },
     	{ .compatible = "silabs,em3581", .data = &spidev_of_check },
     	{ .compatible = "silabs,si3210", .data = &spidev_of_check },
    +	{ .compatible = "spidev"},
    {},
     };
     MODULE_DEVICE_TABLE(of, spidev_dt_ids);
    Copy to clipboard

Note: 必须编译内核配置和设备树更改。编译后的镜像加载到目标以验证接口。有关接口验证的信息，参见 [SPI 验证](https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html#spi_verification)。

## SPI 验证

Source: [https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html](https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html)

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

### Linux

要交叉编译 SPI 工具，应按照以下步骤操作。
1. 从 yocto/build-qcom-wayland/tmp-glibc/work-shared/&lt;chipset&gt;/kernel-source/tools/spi 访问 SPI 工具。有关 SPI 工具的更多详细信息，可访问 [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/tools/spi](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/tools/spi)。
2. 安装交叉编译器。

        sudo apt-get install gcc-aarch64-linux-gnuCopy to clipboard
3. 通过运行以下命令搭建交叉编译环境。

        export ARCH=arm64export CROSS_COMPILE=aarch64-linux-gnu-Copy to clipboard
4. 通过运行以下命令编译工具。

        makeCopy to clipboard

通过在 SSH shell 中查找 `dev` 节点 (`/dev/spidev1.0`) 来验证驱动程序。

1. 要验证 SPI 驱动程序，应进行以下操作：
    1. 进入 SSH shell。有关如何操作 SSH 的更多信息，可访问 [https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-254Y/how_to.html#how-to-ssh-](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-254Y/how_to.html#how-to-ssh-)。
    2. 挂载文件系统。

            mount -o remount,rw /Copy to clipboard
    3. 使用 SCP 或类似工具传输文件。有关 SSH 操作的更多信息，可访问 [https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-254Y/how_to.html#how-to-ssh-](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-254Y/how_to.html#how-to-ssh-)。
        例如，`scp spidev_test root@10.92.175.138:/bin`
    4. 分配执行权限。

            chmod 777 spidev_testCopy to clipboard
2. 通过运行以下命令验证 SPI 设备。

        ./spidev_test -D /dev/<spidev_node>
        example: ./spidev_test -D /dev/spidev1.0
        ./spidev_test -D /dev/spidev3.0
        Copy to clipboard

随即显示以下输出。

        spi mode: 0x0
        bits per word: 8
        max speed: 500000 Hz (500 KHz)Copy to clipboard

运行以下命令可获得使用信息。

    ./spidev_test -helpCopy to clipboard

随即显示以下输出。

    -D --device   device to use (default /dev/spidev1.1)
    -s --speed    max speed (Hz)
    -d --delay    delay (usec)
    -b --bpw      bits per word
    -i --input    input data from a file (e.g. "test.bin")
    -o --output   output data to a file (e.g. "results.bin")
    -l --loop     loopback
    -H --cpha     clock phase
    -O --cpol     clock polarity
    -L --lsb      least significant bit first
    -C --cs-high  chip select active high
    -3 --3wire    SI/SO signals shared
    -v --verbose  Verbose (show tx buffer)
    -p  Send data (e.g. "1234\xde\xad")
    -N --no-cs    no chip select
      -R --ready    slave pulls low to pause
      -2 --dual     dual transfer
      -4 --quad     quad transfer
      -8 --octal    octal transfer
      -S --size     transfer size
      -I --iter     iterationsCopy to clipboard

## SPI 调试

Source: [https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html](https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html)

本节介绍用于启用 SPI 传输失败日志的 SPI 软件驱动程序的默认日志方法。

### Linux

通过动态调试方法启用 SPI 驱动程序日志。在 &lt;workspace\_path\_of\_LINUX\_kernel\_image&gt;\sources\kernel \kernel\_platform\kernel\arch\arm64/configs/qcom\_defconfig 中启用 `CONFIG_DYNAMIC_DEBUG`，以支持内核驱动程序的动态调试。

要在内核日志 (`dmesg`) 中启用和查看 SPI 驱动程序日志，应运行以下命令。

    mount -t debugfs none /sys/kernel/debug
    echo -n "file spi-geni-qcom.c +p" > /sys/kernel/debug/dynamic_debug/control
    echo -n "file qcom-geni-se.c  +p" > /sys/kernel/debug/dynamic_debug/control
    echo -n "file spidev.c +p" > /sys/kernel/debug/dynamic_debug/control
    echo -n "file gpi.c +p" > /sys/kernel/debug/dynamic_debug/controlCopy to clipboard

## SPI 示例

Source: [https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html](https://docs.qualcomm.com/doc/80-70014-8Y/topic/spi.html)

有关上游设备树参考的信息，可访问 [https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi](https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi)。

有关 Qualcomm Linux 芯片产品设备树节点的信息，可访问 [https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts](https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts)。

Last Published: Aug 22, 2024

[Previous Topic
UART](https://docs.qualcomm.com/bundle/publicresource/80-70014-8Y/topics/uart.md) [Next Topic
I2C](https://docs.qualcomm.com/bundle/publicresource/80-70014-8Y/topics/i2c.md)