git: 6dc12ecfb268 - main - spi: "-S" option for continuous stream from standard input to bus
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 17 Jan 2026 03:41:38 UTC
The branch main has been updated by adrian:
URL: https://cgit.FreeBSD.org/src/commit/?id=6dc12ecfb268d2d043f9415156d475278f3f714b
commit 6dc12ecfb268d2d043f9415156d475278f3f714b
Author: Sulev-Madis Silber <ketas@si.pri.ee>
AuthorDate: 2026-01-17 03:29:19 +0000
Commit: Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2026-01-17 03:41:33 +0000
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
---
usr.sbin/spi/spi.8 | 7 +++++++
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: