@@ -15,6 +15,7 @@
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
@@ -30,38 +31,73 @@ static void pabort(const char *s)
}
static const char *device = "/dev/spidev1.1";
+static const char *command = NULL;
static uint8_t mode;
static uint8_t bits = 8;
static uint32_t speed = 500000;
static uint16_t delay;
+uint8_t dummy[] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
+ 0xF0, 0x0D,
+};
+uint8_t *tx, *rx;
+int len = ARRAY_SIZE(dummy);
+
+static void prepare()
+{
+ int fd;
+ tx = malloc(len);
+ if (!tx)
+ pabort("can't allocate tx buffer");
+ rx = malloc(len);
+ if (!rx)
+ pabort("can't allocate rx buffer");
+ memset(tx, 0xff, len);
+ memset(rx, 0xff, len);
+ if (!command) {
+ memcpy(tx, dummy, len);
+ return;
+ }
+ fd = open(command, O_RDONLY);
+ if (fd < 0)
+ pabort("can't open command file");
+ len = read(fd, tx, len);
+ if (len < 0)
+ pabort("can't read command file");
+}
+
static void transfer(int fd)
{
int ret;
- uint8_t tx[] = {
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
- 0xF0, 0x0D,
- };
- uint8_t rx[ARRAY_SIZE(tx)] = {0, };
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
- .len = ARRAY_SIZE(tx),
+ .len = len,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
+ printf("sending:\n");
+ for (ret = 0; ret < len; ret++) {
+ if (!(ret % 6))
+ puts("");
+ printf("%.2X ", tx[ret]);
+ }
+ puts("");
+
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message");
- for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
+ printf("received:\n");
+ for (ret = 0; ret < len; ret++) {
if (!(ret % 6))
puts("");
printf("%.2X ", rx[ret]);
@@ -71,11 +107,12 @@ static void transfer(int fd)
static void print_usage(const char *prog)
{
- printf("Usage: %s [-DsbdlHOLC3]\n", prog);
+ printf("Usage: %s [-DcsbdlHOLC3]\n", prog);
puts(" -D --device device to use (default /dev/spidev1.1)\n"
+ " -c --command command file\n"
" -s --speed max speed (Hz)\n"
" -d --delay delay (usec)\n"
- " -b --bpw bits per word \n"
+ " -b --bpw bits per word\n"
" -l --loop loopback\n"
" -H --cpha clock phase\n"
" -O --cpol clock polarity\n"
@@ -90,6 +127,7 @@ static void parse_opts(int argc, char *argv[])
while (1) {
static const struct option lopts[] = {
{ "device", 1, 0, 'D' },
+ { "command", 1, 0, 'c' },
{ "speed", 1, 0, 's' },
{ "delay", 1, 0, 'd' },
{ "bpw", 1, 0, 'b' },
@@ -105,7 +143,7 @@ static void parse_opts(int argc, char *argv[])
};
int c;
- c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL);
+ c = getopt_long(argc, argv, "D:c:s:d:b:lHOLC3NR", lopts, NULL);
if (c == -1)
break;
@@ -114,6 +152,9 @@ static void parse_opts(int argc, char *argv[])
case 'D':
device = optarg;
break;
+ case 'c':
+ command = optarg;
+ break;
case 's':
speed = atoi(optarg);
break;
@@ -161,6 +202,8 @@ int main(int argc, char *argv[])
parse_opts(argc, argv);
+ prepare();
+
fd = open(device, O_RDWR);
if (fd < 0)
pabort("can't open device");
Currently, spidev_test.c always sends hardcoded data to the device. By fetching this data from a file given as a parameter, one can test real devices. Signed-off-by: Jan Luebbe <jlu@pengutronix.de> --- Documentation/spi/spidev_test.c | 73 +++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 15 deletions(-)