pw_spi_linux#

SPI interface for Linux userspace

Unstable C++17 C++20

pw_spi_linux implements the pw_spi interface using the Linux userspace SPIDEV interface.

API reference#

The following classes make up the public API:

pw::spi::LinuxInitiator#

Implements the pw::spi::Initiator interface.

pw::spi::LinuxChipSelector#

Implements the pw::spi::ChipSelector interface.

Note

Chip selection is tied to the /dev/spidevB.C character device and is handled automatically by the kernel, so this class doesn’t actually do anything.

Guides#

Example code to use Linux SPI:

#include "pw_spi_linux/spi.h"
#include "pw_status/try.h"

pw::Status SpiExample() {
  constexpr uint32_t kSpiFreq = 24'000'000;

  constexpr pw::spi::Config kConfig = {
      .polarity = pw::spi::ClockPolarity::kActiveHigh,
      .phase = pw::spi::ClockPhase::kRisingEdge,
      .bits_per_word = pw::spi::BitsPerWord(8),
      .bit_order = pw::spi::BitOrder::kLsbFirst,
  };

  int fd = open("/dev/spidev0.0", O_RDWR);
  if (fd < 0) {
    return pw::Status::Internal();
  }

  pw::spi::LinuxInitiator initiator(fd, kSpiFreq);

  PW_TRY(initiator.Configure(kConfig));

  std::array tx_data = {std::byte(0xAA), std::byte(0x55)};
  std::array<std::byte, 8> rx_data;
  PW_TRY(initiator.WriteRead(tx_data, rx_data));
}

Command-line interface#

This module also provides a tool also named pw_spi_linux_cli which provides a basic command-line interface to the library.

Usage:

Usage: pw_spi_linux_cli -D DEVICE -F FREQ [flags]

Required flags:
  -D/--device   SPI device path (e.g. /dev/spidev0.0
  -F/--freq     SPI clock frequency in Hz (e.g. 24000000)

Optional flags:
  -b/--bits     Bits per word, default: 8
  -h/--human    Human-readable output (default: binary, unless output to stdout tty)
  -i/--input    Input file, or - for stdin
                If not given, no data is sent.
  -l/--lsb      LSB first (default: MSB first)
  -m/--mode     SPI mode (0-3), default: 0
  -o/--output   Output file (default: stdout)
  -r/--rx-count Number of bytes to receive (defaults to size of input)

Example:

$ echo -n "Hello world" | pw_spi_linux_cli --device=/dev/spidev1.0 \
  --freq=24000000 --mode=3 --input=- | hexdump -Cv