xref: /aosp_15_r20/external/pigweed/pw_spi_linux/docs.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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