openSUSE:SPI
Configuration
Load spidev kernel module
To be able to access SPI from userspace, you need to load spidev kernel module, at each boot.
modprobe spidev
To load it automatically at each boot, create /etc/modules-load.d/10-spi.conf file with the following content:
# Load spidev.ko spidev
Raspberry Pi
For any Raspberry Pi, you need to enable SPI access by adding the following line to /boot/efi/extraconfig.txt:
dtparam=spi=on
Additionally, it is necessary to manually bind the spidev driver to the spi devices listed under /sys/bus/spi/devices/spi*, e.g. like this:
echo spidev > /sys/bus/spi/devices/spi0.0/driver_override echo spi0.0 > /sys/bus/spi/drivers/spidev/bind
This issue on the Raspbian kernel and the Kernel documentation on the spidev module contain more information on why this is necessary.
spi-tools
spi-tools contains a set of tools to access SPI from command line.
Installation
To install spi-tools, you need to add hardware repo for your openSUSE flavor. For example, for Factory ARM: https://download.opensuse.org/repositories/hardware/openSUSE_Factory_ARM/hardware.repo
One click installation is also available : https://software.opensuse.org/package/spi-tools
List registered SPI devices
ls /dev/spidev*.* will list SPI devices registered on SPI buses. For example, /dev/spidev0.1 is device 1 on SPI bus 0.
Check SPI config
spi-config -d /dev/spidev0.1 -q will return the SPI config for device 1 on SPI bus 0. For RPi3, it will return:
/dev/spidev0.1: mode=0, lsb=0, bits=8, speed=125000000
Read/Write simultaneously
Sending data from command_1 to SPI link and receiving data from SPI link to command_2.
command_1 | spi-pipe -d /dev/spidev0.1 | command_2
Example to send 0x010F value, to device 1 on SPI bus 0, at 10 MHz and display read value as raw hexadecimal value:
echo -n -e "\x01\x0F" | spi-pipe -d /dev/spidev0.1 -s 10000000 | hexdump
Read only
Sending data 0 to SPI link and receiving data from SPI link to command-2.
spi-pipe -d /dev/spidev0.1 < /dev/zero | command_2
Example to read value as raw hexadecimal value from device 1 on SPI bus 0, at 10 MHz:
spi-pipe -d /dev/spidev0.1 -s 10000000 < /dev/zero | hexdump
Write only
Sending data from command-1 to SPI link:
command_1 | spi-pipe -d /dev/spidev0.1
Example to send 0x010F value, to device 1 on SPI bus 0, at 10 MHz:
echo -n -e "\x01\x0F" | spi-pipe -d /dev/spidev0.1 -s 10000000
Python spidev
python3-spidev contains a set of tools to access SPI from python3.
Installation
To install python3-spidev, just install it from main OSS repo. For Leap 15.1, you need to install it from devel:languages:python repo. One click installation is also available : https://software.opensuse.org/package/python3-spidev
Example
Example of a script which configure spidev0.1 at 10 MHz and write 0x0F01 value on SPI bus:
#!/usr/bin/python3 import spidev # Define which bus/device to access spi = spidev.SpiDev() bus = 0 device = 1 spi.open(bus, device) # Settings spi.max_speed_hz = 10000000 # 10 MHz #spi.mode = 0b01 to_send = [0x0F, 0x01] spi.xfer(to_send) # Release SPI spi.close