1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_spi_linux: 2*61c4878aSAndroid Build Coastguard Worker 3*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::spi 4*61c4878aSAndroid Build Coastguard Worker 5*61c4878aSAndroid Build Coastguard Worker============ 6*61c4878aSAndroid Build Coastguard Workerpw_spi_linux 7*61c4878aSAndroid Build Coastguard Worker============ 8*61c4878aSAndroid Build Coastguard Worker.. pigweed-module:: 9*61c4878aSAndroid Build Coastguard Worker :name: pw_spi_linux 10*61c4878aSAndroid Build Coastguard Worker 11*61c4878aSAndroid Build Coastguard Worker``pw_spi_linux`` implements the :ref:`module-pw_spi` interface using the Linux 12*61c4878aSAndroid Build Coastguard Workeruserspace SPIDEV interface. 13*61c4878aSAndroid Build Coastguard Worker 14*61c4878aSAndroid Build Coastguard Worker------------- 15*61c4878aSAndroid Build Coastguard WorkerAPI reference 16*61c4878aSAndroid Build Coastguard Worker------------- 17*61c4878aSAndroid Build Coastguard WorkerThe following classes make up the public API: 18*61c4878aSAndroid Build Coastguard Worker 19*61c4878aSAndroid Build Coastguard Worker``pw::spi::LinuxInitiator`` 20*61c4878aSAndroid Build Coastguard Worker=========================== 21*61c4878aSAndroid Build Coastguard WorkerImplements the ``pw::spi::Initiator`` interface. 22*61c4878aSAndroid Build Coastguard Worker 23*61c4878aSAndroid Build Coastguard Worker``pw::spi::LinuxChipSelector`` 24*61c4878aSAndroid Build Coastguard Worker============================== 25*61c4878aSAndroid Build Coastguard WorkerImplements the ``pw::spi::ChipSelector`` interface. 26*61c4878aSAndroid Build Coastguard Worker 27*61c4878aSAndroid Build Coastguard Worker.. note:: 28*61c4878aSAndroid Build Coastguard Worker 29*61c4878aSAndroid Build Coastguard Worker Chip selection is tied to the ``/dev/spidevB.C`` character device and is 30*61c4878aSAndroid Build Coastguard Worker handled automatically by the kernel, so this class doesn't actually do 31*61c4878aSAndroid Build Coastguard Worker anything. 32*61c4878aSAndroid Build Coastguard Worker 33*61c4878aSAndroid Build Coastguard Worker------ 34*61c4878aSAndroid Build Coastguard WorkerGuides 35*61c4878aSAndroid Build Coastguard Worker------ 36*61c4878aSAndroid Build Coastguard WorkerExample code to use Linux SPI: 37*61c4878aSAndroid Build Coastguard Worker 38*61c4878aSAndroid Build Coastguard Worker.. code-block:: cpp 39*61c4878aSAndroid Build Coastguard Worker 40*61c4878aSAndroid Build Coastguard Worker #include "pw_spi_linux/spi.h" 41*61c4878aSAndroid Build Coastguard Worker #include "pw_status/try.h" 42*61c4878aSAndroid Build Coastguard Worker 43*61c4878aSAndroid Build Coastguard Worker pw::Status SpiExample() { 44*61c4878aSAndroid Build Coastguard Worker constexpr uint32_t kSpiFreq = 24'000'000; 45*61c4878aSAndroid Build Coastguard Worker 46*61c4878aSAndroid Build Coastguard Worker constexpr pw::spi::Config kConfig = { 47*61c4878aSAndroid Build Coastguard Worker .polarity = pw::spi::ClockPolarity::kActiveHigh, 48*61c4878aSAndroid Build Coastguard Worker .phase = pw::spi::ClockPhase::kRisingEdge, 49*61c4878aSAndroid Build Coastguard Worker .bits_per_word = pw::spi::BitsPerWord(8), 50*61c4878aSAndroid Build Coastguard Worker .bit_order = pw::spi::BitOrder::kLsbFirst, 51*61c4878aSAndroid Build Coastguard Worker }; 52*61c4878aSAndroid Build Coastguard Worker 53*61c4878aSAndroid Build Coastguard Worker int fd = open("/dev/spidev0.0", O_RDWR); 54*61c4878aSAndroid Build Coastguard Worker if (fd < 0) { 55*61c4878aSAndroid Build Coastguard Worker return pw::Status::Internal(); 56*61c4878aSAndroid Build Coastguard Worker } 57*61c4878aSAndroid Build Coastguard Worker 58*61c4878aSAndroid Build Coastguard Worker pw::spi::LinuxInitiator initiator(fd, kSpiFreq); 59*61c4878aSAndroid Build Coastguard Worker 60*61c4878aSAndroid Build Coastguard Worker PW_TRY(initiator.Configure(kConfig)); 61*61c4878aSAndroid Build Coastguard Worker 62*61c4878aSAndroid Build Coastguard Worker std::array tx_data = {std::byte(0xAA), std::byte(0x55)}; 63*61c4878aSAndroid Build Coastguard Worker std::array<std::byte, 8> rx_data; 64*61c4878aSAndroid Build Coastguard Worker PW_TRY(initiator.WriteRead(tx_data, rx_data)); 65*61c4878aSAndroid Build Coastguard Worker } 66*61c4878aSAndroid Build Coastguard Worker 67*61c4878aSAndroid Build Coastguard Worker.. _module-pw_spi_linux-cli: 68*61c4878aSAndroid Build Coastguard Worker 69*61c4878aSAndroid Build Coastguard Worker---------------------- 70*61c4878aSAndroid Build Coastguard WorkerCommand-line interface 71*61c4878aSAndroid Build Coastguard Worker---------------------- 72*61c4878aSAndroid Build Coastguard WorkerThis module also provides a tool also named ``pw_spi_linux_cli`` which 73*61c4878aSAndroid Build Coastguard Workerprovides a basic command-line interface to the library. 74*61c4878aSAndroid Build Coastguard Worker 75*61c4878aSAndroid Build Coastguard WorkerUsage: 76*61c4878aSAndroid Build Coastguard Worker 77*61c4878aSAndroid Build Coastguard Worker.. code-block:: none 78*61c4878aSAndroid Build Coastguard Worker 79*61c4878aSAndroid Build Coastguard Worker Usage: pw_spi_linux_cli -D DEVICE -F FREQ [flags] 80*61c4878aSAndroid Build Coastguard Worker 81*61c4878aSAndroid Build Coastguard Worker Required flags: 82*61c4878aSAndroid Build Coastguard Worker -D/--device SPI device path (e.g. /dev/spidev0.0 83*61c4878aSAndroid Build Coastguard Worker -F/--freq SPI clock frequency in Hz (e.g. 24000000) 84*61c4878aSAndroid Build Coastguard Worker 85*61c4878aSAndroid Build Coastguard Worker Optional flags: 86*61c4878aSAndroid Build Coastguard Worker -b/--bits Bits per word, default: 8 87*61c4878aSAndroid Build Coastguard Worker -h/--human Human-readable output (default: binary, unless output to stdout tty) 88*61c4878aSAndroid Build Coastguard Worker -i/--input Input file, or - for stdin 89*61c4878aSAndroid Build Coastguard Worker If not given, no data is sent. 90*61c4878aSAndroid Build Coastguard Worker -l/--lsb LSB first (default: MSB first) 91*61c4878aSAndroid Build Coastguard Worker -m/--mode SPI mode (0-3), default: 0 92*61c4878aSAndroid Build Coastguard Worker -o/--output Output file (default: stdout) 93*61c4878aSAndroid Build Coastguard Worker -r/--rx-count Number of bytes to receive (defaults to size of input) 94*61c4878aSAndroid Build Coastguard Worker 95*61c4878aSAndroid Build Coastguard WorkerExample: 96*61c4878aSAndroid Build Coastguard Worker 97*61c4878aSAndroid Build Coastguard Worker.. code-block:: none 98*61c4878aSAndroid Build Coastguard Worker 99*61c4878aSAndroid Build Coastguard Worker $ echo -n "Hello world" | pw_spi_linux_cli --device=/dev/spidev1.0 \ 100*61c4878aSAndroid Build Coastguard Worker --freq=24000000 --mode=3 --input=- | hexdump -Cv 101