Skip to main content
The serial peripheral interface (SPI) is a synchronous serial data link that operates in full duplex mode. SPI is also referred as a 4-wire serial bus.
SPI data flow

Figure : SPI data flow

The SPI core supports the bidirectional SPI standard, point-to-point, and controller-target protocol. The SPI core uses four chip‑select lines (SPI_CS#_N) to select target devices for communication. The following two data lines support the bidirectional data transfer.
  • SPI_DATA_MO_SI: Controller data output, target data input.
  • SPI_DATA_MI_SO: Controller data input, target data output.
Table : Data and control signals in SPI
Data signalsMOSI: Controller data output, target data input.
MISO: Controller data input, target data output.
Control signalsSCLK: A clock generated by the controller and input to all targets.
CS: Chip-select, a target is selected when the controller asserts its CS_N signal.

SPI features

This section explains the SPI serial engine transfer modes and the different scenarios where each mode is used. This section also describes the FIFO and DMA enabled in various subsystem SPI drivers. Table : SPI transfer modes
SubsystemTransfer modeDescription
Linux
  • FIFO (low speed)
  • CPU DMA (high speed)
  • GSI
Supports a maximum configuration speed of 50 MHz.
BootFIFO
  • Transfer rates up to 50 MHz. The host sets the SPI clock frequency nearest to the requested frequency.
  • 4 bits to 32 bits per word of transfer.
  • Maximum of 4 chip selects (CS) per bus.
  • GSI mode isn’t supported on boot.
  • The driver executes in polling mode.
aDSP
  • Full duplex
  • Half duplex
  • Synchronous
  • Serial communication
  • There is no explicit communication framing, error checking, or defined data word length.
  • The communication is strictly at the raw bit level.
  • Transfer rates up to 50 MHz. The host sets the SPI clock frequency nearest to the requested frequency.
  • 4 bits to 32 bits per word of transfer.
  • Maximum of 4 chip selects (CS) per bus.

SPI interface components

This section provides information about the subsystem drivers, kernel device tree nodes, and related documentation. Table : SPI interface: Linux
File typeDescription
Device tree source
Pinctrl settings
Qualcomm TEE settings
  • /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
Table : SPI interface: Boot
File typeDescription
QUP v3 serial engine configuration
  • QUP v3 serial engine: /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 configurations: /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 settings
  • /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
Table : SPI interface: aDSP/SLPI/SDC
File typeDescription
QUP v3 serial engine configuration
  • /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 configuration settings
  • /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
Table : SPI interface: Qualcomm TEE
File typeDescription
QUP v3 serial engine configuration
  • /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 settings
  • /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 APIs

SPI APIs for the following subsystems are listed in this section.

SPI software device tree configuration

This section provides information on the SPI device tree configuration and documentation for the device nodes.

Linux

For device SPI details, see the following DTSI files. For more information about kernel documentation specific to the SPI device nodes, see https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/spi/qcom%2Cspi-geni-qcom.yaml, and SPI driver file at https://github.com/torvalds/linux/blob/master/drivers/spi/spi-geni-qcom.c.
For kernel documentation specific to the GPIO pinctrl configuration, see the following files. The corresponding configurations of the QUP v3 serial engine GPIOs are present and mapped in the pinctrl.dtsi. For example:
Ensure that the protocol configuration for a particular serial engine uses the SPI protocol in the file at /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. Modify the required settings if needed or see the default settings assigned for QUP v3 serial engine instances. Following is the sample configuration for enabling the SPI.

Boot

Configure the QUP v3 settings according to the Qualcomm Linux chip product requirements in the /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 file.
NoteTo enable the required QUP v3 serial engine, update the QUP v3 wrapper node status to okay, and the respective serial engine node to disabled state.
The following sample nodes help to configure the QUP v3 serial engine in boot. QUP wrapper node sample
Sample node of serial engine instance
For pinctrl definitions, see the GPIO configuration file at /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. Sample GPIO configuration:
  • In <chipset>-qupv3-pinctrl.dtsi modify the macro with the GPIO configuration when the requirements are different from the default configuration.
  • For the macro definition, see the header file path at Settings/Include/gpio-dt.h.
Replace macro in sample TLMM node.
NoteVerify Qualcomm TEE settings before changing the unified extensible firmware interface (UEFI) configuration. Ensure that the serial engine node is in FIFO_MODE and accessible from the application processor. Verify that the loaded protocol is according to the requirement.

aDSP/SDC

The firmware loads SSC QUP during the bootup sequence of the aDSP subsystem. The configuration file is present in the aDSP build at /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 and /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. The following configuration is a sample of the SSC QUP SE4 loaded with the SPI firmware.
GPIO configuration: Each serial engine in the QUP common driver is configured with the default GPIO configuration. The GPIO configuration is picked up by the QUP common driver according to the protocol loaded for the serial engine at /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. The default GPIO configuration can be overwritten as follows.
TLMM_MAP is a macro to initialize the active and sleep state GPIO configurations. For example, sample usage of the TLMM_MAP macro.

Qualcomm TEE

The QUP v3 access configuration settings are at /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. To enable the QUP v3 serial engine for SPI in /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, add #define TZ_USE_SPI_X (X is the SPI serial engine number) as follows.
The TZ_USE_SPI_<num> number is based on the serial number of the serial engine (starting from one). For example, if there are two QUPs: QUPV3_0 with seven serial engines and QUPV3_1 with eight serial engines, the user must enable QUPV3_2_SE2. The macro should be TZ_USE_SPI_9. GPIO configuration: In the following example, drive strength and pull are configured according to the PIN starting index from MISO at settings/buses/spi/qupv3/config/<chipset>/tz/spi_devcfg_user.c.
Access control permission to the Qualcomm TEE subsystem is configured in the QUPAC policy at /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

This section describes how to enable the Qualcomm Linux SPI drivers.

Linux

To verify SPI communication with the device, kernel configuration must be enabled. The CONFIG_SPI_SPIDEV=m setting is enabled in the corresponding <chipset> defconfig file. Enable the specific QUP v3 SPI serial engine instance in the kernel device tree.

SPI configuration

This section provides information about the SPI software driver kernel configuration and device tree node changes.

Linux

The following driver kernel configurations are required to support the SPI interface. The following kernel configurations must be enabled.
  • CONFIG_QCOM_GENI_SE=y
  • CONFIG_SPI_QCOM_GENI=m
  • CONFIG_SPI_SPIDEV=m to configure user space applications
  • CONFIG_QCOM_GPI_DMA=m to enable GSI support
To enable the SPI node for the loopback validation, apply the following patch to the /arch/arm64/boot/dts/qcom/<chipset>.dtsi file.
NoteYou should compile the kernel configuration and device tree changes. After the kernel is compiled, you can load the images to the device to verify the interface. For information about interface verification, see the SPI verification section.

SPI verification

This section describes the validation procedure and test results for the SPI drivers.

Linux

To cross-compile the SPI tools, do the following.
  1. Access the SPI tool from yocto/build-qcom-wayland/tmp-glibc/work-shared/<chipset>/kernel-source/tools/spi. For more details about the SPI tool, see https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/tools/spi.
  2. Install cross compiler.
  3. Set up the environment for cross-compilation by running the following command.
  4. Compile the tool by running the following command.

Verify SPI device

Verify the driver by checking for dev node (/dev/spidev1.0) in the SSH shell or use the ADB shell. For more information about how to run SSH, see the Use SSH section.
  1. To verify the SPI driver, do the following:
    1. Open the SSH shell in permissive mode or use the ADB shell.
    2. Mount the file system.
    3. Transfer files using SCP or similar tools. For example, scp spidev_test root@10.92.175.138:/bin.
    4. Assign permission to execute.
  2. Verify an SPI device. Command format ./spidev_test -D /dev/<spidev_node>.
    The following output is displayed.
Run the following command for information about usage.
The following output is displayed.

SPI debugging

This section describes the default logging method of the SPI software driver to enable logging the SPI transfer failures.

Linux

The SPI driver logs are enabled through a dynamic debugging method. Enable CONFIG_DYNAMIC_DEBUG in <workspace_path_of_LINUX_kernel_image>/sources/kernel/kernel_platform/kernel/arch/arm64/configs/qcom_defconfig to support the dynamic debugging of the kernel drivers. To enable and view the SPI driver logs in the kernel logs (dmesg), run the following command.

SPI examples

For information about the upstream device tree reference, see the following DTSI files. For information about device-tree node for the Qualcomm Linux hardware SoCs, see the following DTSI files.