diff options
| author | Sulev-Madis Silber <ketas@si.pri.ee> | 2026-01-16 19:29:19 -0800 |
|---|---|---|
| committer | Adrian Chadd <adrian@FreeBSD.org> | 2026-01-16 19:41:33 -0800 |
| commit | 6dc12ecfb268d2d043f9415156d475278f3f714b (patch) | |
| tree | d5cb67c04f3c35df4f1f996488115bdc77ad613e /usr.sbin | |
| parent | 325baf00735756d024b903bfcee50b4f09e90129 (diff) | |
spi: "-S" option for continuous stream from standard input to bus
created to allow addressable leds to be driven by abusing spi bus as waveform generator. this might have other uses for similar "permanent" spi transfers
Differential Revision: https://reviews.freebsd.org/D54734
Reviewed by: adrian
Diffstat (limited to 'usr.sbin')
| -rw-r--r-- | usr.sbin/spi/spi.8 | 7 | ||||
| -rw-r--r-- | usr.sbin/spi/spi.c | 41 |
2 files changed, 38 insertions, 10 deletions
diff --git a/usr.sbin/spi/spi.8 b/usr.sbin/spi/spi.8 index c3c041fe8e93..d12b7a510aa0 100644 --- a/usr.sbin/spi/spi.8 +++ b/usr.sbin/spi/spi.8 @@ -38,6 +38,7 @@ .Op Fl d Cm r Ns | Ns Cm w Ns | Ns Cm rw .Op Fl f Ar device .Op Fl m Ar mode +.Op Fl S .Op Fl s Ar max-speed .Nm .Op Fl i @@ -145,6 +146,12 @@ caused the LSB to be transmitted and read first. SPI mode, 0 through 3. This defines the clock phase and timing with respect to reading and writing data, as per the SPI specification. +.It Fl S +Constantly stream from +.Xr stdin 3 +to the +.Nm +bus. .It Fl s Ar speed Specify the maximum speed, in Hz, for the SPI clock. The bus will operate at its highest available speed which does not diff --git a/usr.sbin/spi/spi.c b/usr.sbin/spi/spi.c index 351474dde0ba..1ced2371e3d0 100644 --- a/usr.sbin/spi/spi.c +++ b/usr.sbin/spi/spi.c @@ -129,7 +129,7 @@ usage(void) fputs(" - communicate on SPI bus with slave devices\n" "Usage:\n" " spi [-f device] [-d r|w|rw] [-m mode] [-s max-speed] [-c count]\n" - " [-C \"command bytes\"] [-A] [-b] [-L] [-v]\n" + " [-C \"command bytes\"] [-A] [-b] [-L] [-S] [-v]\n" " spi -i [-f device] [-v]\n" " spi -h\n" " where\n" @@ -145,6 +145,7 @@ usage(void) " -i query information about the device\n" " -A uses ASCII for input/output as 2-digit hex values\n" " -b Override output format as binary (only valid with '-A')\n" + " -S constantly stream from stdin to bus\n" " -v verbose output\n" " -h prints this message\n" "\n" @@ -158,11 +159,12 @@ int main(int argc, char *argv[], char *envp[] __unused) { struct spi_options opt; - int err, ch, hdev, finfo, fdir; + int err, ch, hdev, finfo, stream, fdir; char *pstr; char dev_name[PATH_MAX * 2 + 5]; finfo = 0; + stream = 0; fdir = DIR_NONE; hdev = -1; @@ -180,7 +182,7 @@ main(int argc, char *argv[], char *envp[] __unused) opt.ncmd = 0; opt.pcmd = NULL; - while (!err && (ch = getopt(argc, argv, "f:d:m:s:c:C:AbLvih")) != -1) { + while (!err && (ch = getopt(argc, argv, "f:d:m:s:c:C:AbLviSh")) != -1) { switch (ch) { case 'd': if (optarg[0] == 'r') { @@ -275,6 +277,10 @@ main(int argc, char *argv[], char *envp[] __unused) finfo = 1; break; + case 'S': + stream = 1; + break; + default: err = 1; /* FALLTHROUGH */ @@ -358,14 +364,29 @@ main(int argc, char *argv[], char *envp[] __unused) /* do data transfer */ - if (fdir == DIR_READ) { - err = perform_read(hdev, &opt); - } - else if (fdir == DIR_WRITE) { - err = perform_write(hdev, &opt); + if (stream) { + while (!err && !feof(stdin)) { + if (fdir == DIR_READ) { + err = perform_read(hdev, &opt); + } + else if (fdir == DIR_WRITE) { + err = perform_write(hdev, &opt); + } + else if (fdir == DIR_READWRITE) { + err = perform_readwrite(hdev, &opt); + } + } } - else if (fdir == DIR_READWRITE) { - err = perform_readwrite(hdev, &opt); + else { + if (fdir == DIR_READ) { + err = perform_read(hdev, &opt); + } + else if (fdir == DIR_WRITE) { + err = perform_write(hdev, &opt); + } + else if (fdir == DIR_READWRITE) { + err = perform_readwrite(hdev, &opt); + } } the_end: |
