Skip to main content
Version: 5.0

SPI (Linux)

Introduction​

The Apalis standard provides two SPI interfaces compatible with all modules of the Apalis family.

MXM3 PinApalis Signal NameDescription
225SPI1_MOSISPI Master Output, Slave Input; SPI Data Out (DOUT)
223SPI1_MISOSPI Master Input, Slave Output; SPI DATA In (DIN)
227SPI1_CSSPI Chip Select; SPI Enable Signal; SPI Slave Select
221SPI1_CLKSPI Serial Clock; (SCK)
231SPI2_MOSISPI Master Output, Slave Input; SPI Data Out (DOUT)
229SPI2_MISOSPI Master Input, Slave Output; SPI DATA In (DIN)
233SPI2_CSSPI Chip Select; SPI Enable Signal; SPI Slave Select
235SPI2_CLKSPI Serial Clock; (SCK)

The Colibri standard provides one SPI interface compatible with all modules of the Colibri family which historically is called Synchronous Serial Port (SSP).

SODIMM PinColibri Signal NameSSP DescriptionSPI Description
86SSPFRMSynchronous Serial Port FrameSPI Chip Select; SPI Enable Signal; SPI Slave Select
88SSPSCLKSynchronous Serial Port ClockSPI Serial Clock; (SCK)
90SSPRXDSynchronous Serial Port ReceiveSPI Master Input / Slave Output (MISO); SPI DATA In (DIN)
92SSPTXDSynchronous Serial Port TransmitSPI Master Output / Slave Input (MOSI); SPI Data Out (DOUT)

The Verdin Family Specification provides one SPI interface in the category Always Compatible, available on all modules of the Verdin family. The interface features a single chip select pin.

SODIMM PinApalis Signal NameDescription
196SPI_1_CLKSPI Serial Clock; (SCK)
198SPI_1_MISOSPI Master Input, Slave Output; SPI DATA In (DIN)
200SPI_1_MOSISPI Master Output, Slave Input; SPI Data Out (DOUT)
202SPI_1_CSSPI Chip Select; SPI Enable Signal; SPI Slave Select

The standard SPI interfaces are enabled by default. Most modules offer additional (non-standard) SPI interfaces, to enable these device trees or board files aka platform data customization is required.

The Colibri Evaluation Board provides an MCP2515 SPI CAN controller. For Colibri modules the kernel driver for this CAN controller is active by default and no userspace SPI access is possible, i.e. the /dev/spidevA.B device files are not available. See the carrier board section for further information.

Modules​

Apalis​

The Apalis module standard features two generic SPI interface:

SoM InterfaceDevice nodes namesNote
SPI1/dev/apalis-spi1-cs0General Purpose
SPI2/dev/apalis-spi2-cs0General Purpose

To obtain the device nodes names for the Apalis module family:

# ls -l /dev/apalis-spi*

It will display the available Verdin pin-compatible SPIs and display the corresponding names used by the BSP. Those corresponding names are important because the Linux kernel logs will print the real device names (e.g. /dev/spidev3.0), not the Apalis symlinks (e.g. /dev/apalis-spi1-cs0).

For non-standard interfaces, consult the specific SoM datasheet.

Colibri​

The Colibri module standard features only one generic SPI interface:

SoM InterfaceDevice nodes namesNote
SPI1/dev/colibri-spi-cs0General Purpose

To obtain the device nodes names for the Colibri module family:

# ls -l /dev/colibri-spi*

It will display the available Colibri pin-compatible SPIs and display the corresponding names used by the BSP. Those corresponding names are important because the Linux kernel logs will print the real device names (e.g. /dev/spidev3.0), not the Verdin symlinks (e.g. /dev/colibri-spi-cs0).

For non-standard interfaces, consult the specific SoM datasheet.

Verdin​

The Verdin module standard features only one generic SPI interface:

SoM InterfaceDevice nodes namesNote
SPI1/dev/verdin-spi-cs0General Purpose

To obtain the device nodes names for the Verdin module family:

# ls -l /dev/verdin-spi*

It will display the available Verdin pin-compatible SPIs and display the corresponding names used by the BSP. Those corresponding names are important because the Linux kernel logs will print the real device names (e.g. /dev/spidev3.0), not the Verdin symlinks (e.g. /dev/verdin-spi-cs0).

For non-standard interfaces, consult the specific SoM datasheet.

info

Verdin iMX8M Mini modules do not have a native CAN Controller. So, for using CAN, it requires the usage of an external CAN Controller through SPI port. You can read more about this at CAN (Linux)

Carrier Boards​

Colibri Evaluation board​

By default our BSPs use the MCP2515 SPI CAN controller as available on our Colibri Evaluation board V3.x.

For eMMC-based SoMs, there is an overlay, colibri-imx6-eval_spidev_overlay.dtbo, so in order to use it, you should add it on the overlays.txt file in the /boot directory. To do this, open the file with the following command and add this overlay binary to the fdt_overlays= variable.

# vi /boot/overlays.txt

In this case, here is how it was before:

fdt_overlays=colibri-imx6_lcd-vga_overlay.dtbo colibri-imx6_stmpe-ts_overlay.dtbo

And here is how it should be after:

fdt_overlays=colibri-imx6_lcd-vga_overlay.dtbo colibri-imx6_stmpe-ts_overlay.dtbo colibri-imx6-eval_spidev_overlay.dtbo

For NAND-based SoMs, in order to use spidev instead one needs to disable (e.g. status = "disabled") the mcp2515 device tree node and enable (e.g. status = "okay") the spidev one and re-generate and deploy the device tree to the target. The specific changes are outlined below, as an example, the device tree for a Colibri iMX7 is given:

diff --git a/arch/arm/boot/dts/imx7-colibri-eval-v3.dtsi b/arch/arm/boot/dts/imx7-colibri-eval-v3.dtsi
index 1db5aa5..28a8bc7 100644
--- a/arch/arm/boot/dts/imx7-colibri-eval-v3.dtsi
+++ b/arch/arm/boot/dts/imx7-colibri-eval-v3.dtsi
@@ -101,14 +101,14 @@
interrupt-parent = <&gpio5>;
interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
spi-max-frequency = <10000000>;
- status = "okay";
+ status = "disabled";
};

spidev0: spidev@0 {
compatible = "toradex,evalspi";
reg = <0>;
spi-max-frequency = <23000000>;
- status = "disabled";
+ status = "okay";
};
};

Aster Carrier Board​

Aster doesn't include the mcp2515 SPI CAN controller, so spidev is enabled by default. As SPI is accessible on both X18 and X20 two chip selects are configured, one for the X18 connector and the other one for the X20 connector. Thus two spidev devices appear, for a Colibri iMX7 e.g. spidev2.0 CS signal is available on X18 ONLY, and spidev2.1 CS signal is available on X20 ONLY. Refer to the following table:

SODIMM PinColibri Signal NameSignalX18 pinX20 pin
86SSPFRMCS03
65CIF_D9CS124
88SSPSCLKCLK623
90SSPRXDMISO521
92SSPTXDMOSI419

User-space access​

SPI access from user-space is provided through the spidev driver which exports device files under /dev. See Documentation/spi/spidev in the kernel sources for more information.

The following shows a read using the sample code in the kernel sources (Documentation/spi/spidev_test.c) using spidev interface:

# spidev_test -D /dev/spidev3.0
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)

Kernel-space drivers​

The Linux kernel already provides drivers for various SPI devices, hence before writing your own driver checking your Linux kernels configuration options and/or searching through the kernel mailing list is best practice.

If you plan to write an SPI device driver you can use the SPI MCP2515 CAN controller driver as an example. The MCP2515 CAN controller is available and connected to the Colibri SPI port on the v3 series of the Colibri Evaluation Board.

Send Feedback!