On Monday 18 February 2008, Randy Dunlap wrote: > From: Randy Dunlap <[EMAIL PROTECTED]> > > cc: [EMAIL PROTECTED] > cc: [EMAIL PROTECTED] > > Move sample source code to its own source file so that it can be used > easier and build-tested/check/maintained by anyone. > > (Makefile changes are in a separate patch for all of Documentation/.) > > Signed-off-by: Randy Dunlap <[EMAIL PROTECTED]>
Acked-by: David Brownell <[EMAIL PROTECTED]> > --- > Documentation/spi/spidev | 168 ------------------------------- > Documentation/spi/spidev_fdx.c | 158 +++++++++++++++++++++++++++++ > 2 files changed, 160 insertions(+), 166 deletions(-) > > --- linux-2625-rc2-docsrc.orig/Documentation/spi/spidev > +++ linux-2625-rc2-docsrc/Documentation/spi/spidev > @@ -126,8 +126,8 @@ NOTES: > FULL DUPLEX CHARACTER DEVICE API > ================================ > > -See the sample program below for one example showing the use of the full > -duplex programming interface. (Although it doesn't perform a full duplex > +See the spidev_fdx.c sample program for one example showing the use of the > +full duplex programming interface. (Although it doesn't perform a full > duplex > transfer.) The model is the same as that used in the kernel spi_sync() > request; the individual transfers offer the same capabilities as are > available to kernel drivers (except that it's not asynchronous). > @@ -141,167 +141,3 @@ and bitrate for each transfer segment.) > > To make a full duplex request, provide both rx_buf and tx_buf for the > same transfer. It's even OK if those are the same buffer. > - > - > -SAMPLE PROGRAM > -============== > - > --------------------------------- CUT HERE > -#include <stdio.h> > -#include <unistd.h> > -#include <stdlib.h> > -#include <fcntl.h> > -#include <string.h> > - > -#include <sys/ioctl.h> > -#include <sys/types.h> > -#include <sys/stat.h> > - > -#include <linux/types.h> > -#include <linux/spi/spidev.h> > - > - > -static int verbose; > - > -static void do_read(int fd, int len) > -{ > - unsigned char buf[32], *bp; > - int status; > - > - /* read at least 2 bytes, no more than 32 */ > - if (len < 2) > - len = 2; > - else if (len > sizeof(buf)) > - len = sizeof(buf); > - memset(buf, 0, sizeof buf); > - > - status = read(fd, buf, len); > - if (status < 0) { > - perror("read"); > - return; > - } > - if (status != len) { > - fprintf(stderr, "short read\n"); > - return; > - } > - > - printf("read(%2d, %2d): %02x %02x,", len, status, > - buf[0], buf[1]); > - status -= 2; > - bp = buf + 2; > - while (status-- > 0) > - printf(" %02x", *bp++); > - printf("\n"); > -} > - > -static void do_msg(int fd, int len) > -{ > - struct spi_ioc_transfer xfer[2]; > - unsigned char buf[32], *bp; > - int status; > - > - memset(xfer, 0, sizeof xfer); > - memset(buf, 0, sizeof buf); > - > - if (len > sizeof buf) > - len = sizeof buf; > - > - buf[0] = 0xaa; > - xfer[0].tx_buf = (__u64) buf; > - xfer[0].len = 1; > - > - xfer[1].rx_buf = (__u64) buf; > - xfer[1].len = len; > - > - status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer); > - if (status < 0) { > - perror("SPI_IOC_MESSAGE"); > - return; > - } > - > - printf("response(%2d, %2d): ", len, status); > - for (bp = buf; len; len--) > - printf(" %02x", *bp++); > - printf("\n"); > -} > - > -static void dumpstat(const char *name, int fd) > -{ > - __u8 mode, lsb, bits; > - __u32 speed; > - > - if (ioctl(fd, SPI_IOC_RD_MODE, &mode) < 0) { > - perror("SPI rd_mode"); > - return; > - } > - if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) { > - perror("SPI rd_lsb_fist"); > - return; > - } > - if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) { > - perror("SPI bits_per_word"); > - return; > - } > - if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) { > - perror("SPI max_speed_hz"); > - return; > - } > - > - printf("%s: spi mode %d, %d bits %sper word, %d Hz max\n", > - name, mode, bits, lsb ? "(lsb first) " : "", speed); > -} > - > -int main(int argc, char **argv) > -{ > - int c; > - int readcount = 0; > - int msglen = 0; > - int fd; > - const char *name; > - > - while ((c = getopt(argc, argv, "hm:r:v")) != EOF) { > - switch (c) { > - case 'm': > - msglen = atoi(optarg); > - if (msglen < 0) > - goto usage; > - continue; > - case 'r': > - readcount = atoi(optarg); > - if (readcount < 0) > - goto usage; > - continue; > - case 'v': > - verbose++; > - continue; > - case 'h': > - case '?': > -usage: > - fprintf(stderr, > - "usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n", > - argv[0]); > - return 1; > - } > - } > - > - if ((optind + 1) != argc) > - goto usage; > - name = argv[optind]; > - > - fd = open(name, O_RDWR); > - if (fd < 0) { > - perror("open"); > - return 1; > - } > - > - dumpstat(name, fd); > - > - if (msglen) > - do_msg(fd, msglen); > - > - if (readcount) > - do_read(fd, readcount); > - > - close(fd); > - return 0; > -} > --- /dev/null > +++ linux-2625-rc2-docsrc/Documentation/spi/spidev_fdx.c > @@ -0,0 +1,158 @@ > +#include <stdio.h> > +#include <unistd.h> > +#include <stdlib.h> > +#include <fcntl.h> > +#include <string.h> > + > +#include <sys/ioctl.h> > +#include <sys/types.h> > +#include <sys/stat.h> > + > +#include <linux/types.h> > +#include <linux/spi/spidev.h> > + > + > +static int verbose; > + > +static void do_read(int fd, int len) > +{ > + unsigned char buf[32], *bp; > + int status; > + > + /* read at least 2 bytes, no more than 32 */ > + if (len < 2) > + len = 2; > + else if (len > sizeof(buf)) > + len = sizeof(buf); > + memset(buf, 0, sizeof buf); > + > + status = read(fd, buf, len); > + if (status < 0) { > + perror("read"); > + return; > + } > + if (status != len) { > + fprintf(stderr, "short read\n"); > + return; > + } > + > + printf("read(%2d, %2d): %02x %02x,", len, status, > + buf[0], buf[1]); > + status -= 2; > + bp = buf + 2; > + while (status-- > 0) > + printf(" %02x", *bp++); > + printf("\n"); > +} > + > +static void do_msg(int fd, int len) > +{ > + struct spi_ioc_transfer xfer[2]; > + unsigned char buf[32], *bp; > + int status; > + > + memset(xfer, 0, sizeof xfer); > + memset(buf, 0, sizeof buf); > + > + if (len > sizeof buf) > + len = sizeof buf; > + > + buf[0] = 0xaa; > + xfer[0].tx_buf = (__u64) buf; > + xfer[0].len = 1; > + > + xfer[1].rx_buf = (__u64) buf; > + xfer[1].len = len; > + > + status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer); > + if (status < 0) { > + perror("SPI_IOC_MESSAGE"); > + return; > + } > + > + printf("response(%2d, %2d): ", len, status); > + for (bp = buf; len; len--) > + printf(" %02x", *bp++); > + printf("\n"); > +} > + > +static void dumpstat(const char *name, int fd) > +{ > + __u8 mode, lsb, bits; > + __u32 speed; > + > + if (ioctl(fd, SPI_IOC_RD_MODE, &mode) < 0) { > + perror("SPI rd_mode"); > + return; > + } > + if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) { > + perror("SPI rd_lsb_fist"); > + return; > + } > + if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) { > + perror("SPI bits_per_word"); > + return; > + } > + if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) { > + perror("SPI max_speed_hz"); > + return; > + } > + > + printf("%s: spi mode %d, %d bits %sper word, %d Hz max\n", > + name, mode, bits, lsb ? "(lsb first) " : "", speed); > +} > + > +int main(int argc, char **argv) > +{ > + int c; > + int readcount = 0; > + int msglen = 0; > + int fd; > + const char *name; > + > + while ((c = getopt(argc, argv, "hm:r:v")) != EOF) { > + switch (c) { > + case 'm': > + msglen = atoi(optarg); > + if (msglen < 0) > + goto usage; > + continue; > + case 'r': > + readcount = atoi(optarg); > + if (readcount < 0) > + goto usage; > + continue; > + case 'v': > + verbose++; > + continue; > + case 'h': > + case '?': > +usage: > + fprintf(stderr, > + "usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n", > + argv[0]); > + return 1; > + } > + } > + > + if ((optind + 1) != argc) > + goto usage; > + name = argv[optind]; > + > + fd = open(name, O_RDWR); > + if (fd < 0) { > + perror("open"); > + return 1; > + } > + > + dumpstat(name, fd); > + > + if (msglen) > + do_msg(fd, msglen); > + > + if (readcount) > + do_read(fd, readcount); > + > + close(fd); > + return 0; > +} > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/