Commit 31a16294261a897ab7f59a5c26e4935a851fd410

Authored by Randy Dunlap
Committed by Linus Torvalds
1 parent cf43369d55

documentation: move spidev_fdx example to its own source file

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 <randy.dunlap@oracle.com>
Acked-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 2 changed files with 160 additions and 166 deletions Side-by-side Diff

Documentation/spi/spidev
... ... @@ -126,8 +126,8 @@
126 126 FULL DUPLEX CHARACTER DEVICE API
127 127 ================================
128 128  
129   -See the sample program below for one example showing the use of the full
130   -duplex programming interface. (Although it doesn't perform a full duplex
  129 +See the spidev_fdx.c sample program for one example showing the use of the
  130 +full duplex programming interface. (Although it doesn't perform a full duplex
131 131 transfer.) The model is the same as that used in the kernel spi_sync()
132 132 request; the individual transfers offer the same capabilities as are
133 133 available to kernel drivers (except that it's not asynchronous).
... ... @@ -141,168 +141,4 @@
141 141  
142 142 To make a full duplex request, provide both rx_buf and tx_buf for the
143 143 same transfer. It's even OK if those are the same buffer.
144   -
145   -
146   -SAMPLE PROGRAM
147   -==============
148   -
149   --------------------------------- CUT HERE
150   -#include <stdio.h>
151   -#include <unistd.h>
152   -#include <stdlib.h>
153   -#include <fcntl.h>
154   -#include <string.h>
155   -
156   -#include <sys/ioctl.h>
157   -#include <sys/types.h>
158   -#include <sys/stat.h>
159   -
160   -#include <linux/types.h>
161   -#include <linux/spi/spidev.h>
162   -
163   -
164   -static int verbose;
165   -
166   -static void do_read(int fd, int len)
167   -{
168   - unsigned char buf[32], *bp;
169   - int status;
170   -
171   - /* read at least 2 bytes, no more than 32 */
172   - if (len < 2)
173   - len = 2;
174   - else if (len > sizeof(buf))
175   - len = sizeof(buf);
176   - memset(buf, 0, sizeof buf);
177   -
178   - status = read(fd, buf, len);
179   - if (status < 0) {
180   - perror("read");
181   - return;
182   - }
183   - if (status != len) {
184   - fprintf(stderr, "short read\n");
185   - return;
186   - }
187   -
188   - printf("read(%2d, %2d): %02x %02x,", len, status,
189   - buf[0], buf[1]);
190   - status -= 2;
191   - bp = buf + 2;
192   - while (status-- > 0)
193   - printf(" %02x", *bp++);
194   - printf("\n");
195   -}
196   -
197   -static void do_msg(int fd, int len)
198   -{
199   - struct spi_ioc_transfer xfer[2];
200   - unsigned char buf[32], *bp;
201   - int status;
202   -
203   - memset(xfer, 0, sizeof xfer);
204   - memset(buf, 0, sizeof buf);
205   -
206   - if (len > sizeof buf)
207   - len = sizeof buf;
208   -
209   - buf[0] = 0xaa;
210   - xfer[0].tx_buf = (__u64) buf;
211   - xfer[0].len = 1;
212   -
213   - xfer[1].rx_buf = (__u64) buf;
214   - xfer[1].len = len;
215   -
216   - status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
217   - if (status < 0) {
218   - perror("SPI_IOC_MESSAGE");
219   - return;
220   - }
221   -
222   - printf("response(%2d, %2d): ", len, status);
223   - for (bp = buf; len; len--)
224   - printf(" %02x", *bp++);
225   - printf("\n");
226   -}
227   -
228   -static void dumpstat(const char *name, int fd)
229   -{
230   - __u8 mode, lsb, bits;
231   - __u32 speed;
232   -
233   - if (ioctl(fd, SPI_IOC_RD_MODE, &mode) < 0) {
234   - perror("SPI rd_mode");
235   - return;
236   - }
237   - if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) {
238   - perror("SPI rd_lsb_fist");
239   - return;
240   - }
241   - if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) {
242   - perror("SPI bits_per_word");
243   - return;
244   - }
245   - if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
246   - perror("SPI max_speed_hz");
247   - return;
248   - }
249   -
250   - printf("%s: spi mode %d, %d bits %sper word, %d Hz max\n",
251   - name, mode, bits, lsb ? "(lsb first) " : "", speed);
252   -}
253   -
254   -int main(int argc, char **argv)
255   -{
256   - int c;
257   - int readcount = 0;
258   - int msglen = 0;
259   - int fd;
260   - const char *name;
261   -
262   - while ((c = getopt(argc, argv, "hm:r:v")) != EOF) {
263   - switch (c) {
264   - case 'm':
265   - msglen = atoi(optarg);
266   - if (msglen < 0)
267   - goto usage;
268   - continue;
269   - case 'r':
270   - readcount = atoi(optarg);
271   - if (readcount < 0)
272   - goto usage;
273   - continue;
274   - case 'v':
275   - verbose++;
276   - continue;
277   - case 'h':
278   - case '?':
279   -usage:
280   - fprintf(stderr,
281   - "usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n",
282   - argv[0]);
283   - return 1;
284   - }
285   - }
286   -
287   - if ((optind + 1) != argc)
288   - goto usage;
289   - name = argv[optind];
290   -
291   - fd = open(name, O_RDWR);
292   - if (fd < 0) {
293   - perror("open");
294   - return 1;
295   - }
296   -
297   - dumpstat(name, fd);
298   -
299   - if (msglen)
300   - do_msg(fd, msglen);
301   -
302   - if (readcount)
303   - do_read(fd, readcount);
304   -
305   - close(fd);
306   - return 0;
307   -}
Documentation/spi/spidev_fdx.c
  1 +#include <stdio.h>
  2 +#include <unistd.h>
  3 +#include <stdlib.h>
  4 +#include <fcntl.h>
  5 +#include <string.h>
  6 +
  7 +#include <sys/ioctl.h>
  8 +#include <sys/types.h>
  9 +#include <sys/stat.h>
  10 +
  11 +#include <linux/types.h>
  12 +#include <linux/spi/spidev.h>
  13 +
  14 +
  15 +static int verbose;
  16 +
  17 +static void do_read(int fd, int len)
  18 +{
  19 + unsigned char buf[32], *bp;
  20 + int status;
  21 +
  22 + /* read at least 2 bytes, no more than 32 */
  23 + if (len < 2)
  24 + len = 2;
  25 + else if (len > sizeof(buf))
  26 + len = sizeof(buf);
  27 + memset(buf, 0, sizeof buf);
  28 +
  29 + status = read(fd, buf, len);
  30 + if (status < 0) {
  31 + perror("read");
  32 + return;
  33 + }
  34 + if (status != len) {
  35 + fprintf(stderr, "short read\n");
  36 + return;
  37 + }
  38 +
  39 + printf("read(%2d, %2d): %02x %02x,", len, status,
  40 + buf[0], buf[1]);
  41 + status -= 2;
  42 + bp = buf + 2;
  43 + while (status-- > 0)
  44 + printf(" %02x", *bp++);
  45 + printf("\n");
  46 +}
  47 +
  48 +static void do_msg(int fd, int len)
  49 +{
  50 + struct spi_ioc_transfer xfer[2];
  51 + unsigned char buf[32], *bp;
  52 + int status;
  53 +
  54 + memset(xfer, 0, sizeof xfer);
  55 + memset(buf, 0, sizeof buf);
  56 +
  57 + if (len > sizeof buf)
  58 + len = sizeof buf;
  59 +
  60 + buf[0] = 0xaa;
  61 + xfer[0].tx_buf = (__u64) buf;
  62 + xfer[0].len = 1;
  63 +
  64 + xfer[1].rx_buf = (__u64) buf;
  65 + xfer[1].len = len;
  66 +
  67 + status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
  68 + if (status < 0) {
  69 + perror("SPI_IOC_MESSAGE");
  70 + return;
  71 + }
  72 +
  73 + printf("response(%2d, %2d): ", len, status);
  74 + for (bp = buf; len; len--)
  75 + printf(" %02x", *bp++);
  76 + printf("\n");
  77 +}
  78 +
  79 +static void dumpstat(const char *name, int fd)
  80 +{
  81 + __u8 mode, lsb, bits;
  82 + __u32 speed;
  83 +
  84 + if (ioctl(fd, SPI_IOC_RD_MODE, &mode) < 0) {
  85 + perror("SPI rd_mode");
  86 + return;
  87 + }
  88 + if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) {
  89 + perror("SPI rd_lsb_fist");
  90 + return;
  91 + }
  92 + if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) {
  93 + perror("SPI bits_per_word");
  94 + return;
  95 + }
  96 + if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
  97 + perror("SPI max_speed_hz");
  98 + return;
  99 + }
  100 +
  101 + printf("%s: spi mode %d, %d bits %sper word, %d Hz max\n",
  102 + name, mode, bits, lsb ? "(lsb first) " : "", speed);
  103 +}
  104 +
  105 +int main(int argc, char **argv)
  106 +{
  107 + int c;
  108 + int readcount = 0;
  109 + int msglen = 0;
  110 + int fd;
  111 + const char *name;
  112 +
  113 + while ((c = getopt(argc, argv, "hm:r:v")) != EOF) {
  114 + switch (c) {
  115 + case 'm':
  116 + msglen = atoi(optarg);
  117 + if (msglen < 0)
  118 + goto usage;
  119 + continue;
  120 + case 'r':
  121 + readcount = atoi(optarg);
  122 + if (readcount < 0)
  123 + goto usage;
  124 + continue;
  125 + case 'v':
  126 + verbose++;
  127 + continue;
  128 + case 'h':
  129 + case '?':
  130 +usage:
  131 + fprintf(stderr,
  132 + "usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n",
  133 + argv[0]);
  134 + return 1;
  135 + }
  136 + }
  137 +
  138 + if ((optind + 1) != argc)
  139 + goto usage;
  140 + name = argv[optind];
  141 +
  142 + fd = open(name, O_RDWR);
  143 + if (fd < 0) {
  144 + perror("open");
  145 + return 1;
  146 + }
  147 +
  148 + dumpstat(name, fd);
  149 +
  150 + if (msglen)
  151 + do_msg(fd, msglen);
  152 +
  153 + if (readcount)
  154 + do_read(fd, readcount);
  155 +
  156 + close(fd);
  157 + return 0;
  158 +}