diff mbox

spi: spidev_test: Added functionalities

Message ID 1424891324-24784-1-git-send-email-adrianremonda@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

adrianremonda@gmail.com Feb. 25, 2015, 7:08 p.m. UTC
This is a patch that add functionalities to the spidev_test tool found
in Documentation/spi/spidev_test.c.

- Cleaned hexadecimal dump
- Added verbose mode to see the transmitting sequence
- Added input buffer from the terminal. Now it is possible to send
  string and hexadecimal data as an input parameter:

  Example that shows verbose mode and a sending sequence:

  root@microZed:~# ./a.out -D /dev/spidev32766.1 -p "\x23ab1" -v
  spi mode: 0x0
  bits per word: 8
  max speed: 500000 Hz (500 KHz)
  TX | 23 61 62 31 __ __ __ __  | #ab1
  RX | FF FF FF FF __ __ __ __  | ....

	modified:   Documentation/spi/spidev_test.c

Signed-off-by: Adrian Remonda <adrianremonda@gmail.com>
---
 Documentation/spi/spidev_test.c | 118 +++++++++++++++++++++++++++++++++-------
 1 file changed, 98 insertions(+), 20 deletions(-)

Comments

Mark Brown Feb. 26, 2015, 2:01 a.m. UTC | #1
On Wed, Feb 25, 2015 at 08:08:44PM +0100, Adrian Remonda wrote:
> This is a patch that add functionalities to the spidev_test tool found
> in Documentation/spi/spidev_test.c.

> - Cleaned hexadecimal dump
> - Added verbose mode to see the transmitting sequence
> - Added input buffer from the terminal. Now it is possible to send
>   string and hexadecimal data as an input parameter:

Since this is doing several different things then it should be a series
of patches rather than a single patch - please see SubmittingPatches for
advice on how to prepare patches for submission.  It is hard to review
changes which do more than one thing.
Jonathan Corbet Feb. 27, 2015, 10:11 p.m. UTC | #2
On Wed, 25 Feb 2015 20:08:44 +0100
Adrian Remonda <adrianremonda@gmail.com> wrote:

> This is a patch that add functionalities to the spidev_test tool found
> in Documentation/spi/spidev_test.c.

This seems good.  But our hope is to move useful code out of
Documentation; care to submit a patch putting it properly somewhere under
tools/?

(Meanwhile, I've applied this one).

Thanks,

jon
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mark Brown Feb. 28, 2015, 7:27 a.m. UTC | #3
On Fri, Feb 27, 2015 at 03:11:17PM -0700, Jonathan Corbet wrote:

> (Meanwhile, I've applied this one).

Sorry, I shoud've been clearer that my previous mail was intended as a
nack for the patch as submitted - I'd expected SPI documentation/test
code updates to be going via the SPI tree.
adrianremonda@gmail.com March 1, 2015, 6:28 p.m. UTC | #4
On Fri, Feb 27, 2015 at 03:11:17PM -0700, Jonathan Corbet wrote:
> On Wed, 25 Feb 2015 20:08:44 +0100
> Adrian Remonda <adrianremonda@gmail.com> wrote:
> 
> > This is a patch that add functionalities to the spidev_test tool found
> > in Documentation/spi/spidev_test.c.
> 
> This seems good.  But our hope is to move useful code out of
> Documentation; care to submit a patch putting it properly somewhere under
> tools/?
> 
> (Meanwhile, I've applied this one).
> 
> Thanks,
> 
> jon

I apologize for the wrong patch format.
Should I contact the mantainer of the tool path and ask him where to add
it? Or how should I proceed?

Thanks,
Adrian

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jonathan Corbet March 1, 2015, 8:39 p.m. UTC | #5
On Sat, 28 Feb 2015 16:27:42 +0900
Mark Brown <broonie@kernel.org> wrote:

> > (Meanwhile, I've applied this one).  
> 
> Sorry, I shoud've been clearer that my previous mail was intended as a
> nack for the patch as submitted - I'd expected SPI documentation/test
> code updates to be going via the SPI tree.

I begin to understand why docs maintainers tend not to hang around for
long :)

I've dropped the commit.  In the future I'll ignore patches to
Documentation/spi.

jon
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mark Brown March 4, 2015, 11:54 p.m. UTC | #6
On Sun, Mar 01, 2015 at 07:28:41PM +0100, AdrianRemonda wrote:

> I apologize for the wrong patch format.
> Should I contact the mantainer of the tool path and ask him where to add
> it? Or how should I proceed?

I am the relevant maintainer here.  The main thing from my point of view
is to split the three changes you were making out into separate commits
so they can be easily reviewed.  Jon is right that this should be moved
into a better directory but that's a separate issue that can be tackled
separately (though feel free to do it immediately if you like!).
adrianremonda@gmail.com March 7, 2015, 5:59 p.m. UTC | #7
On Wed, Mar 04, 2015 at 11:54:39PM +0000, Mark Brown wrote:
> On Sun, Mar 01, 2015 at 07:28:41PM +0100, AdrianRemonda wrote:
> 
> > I apologize for the wrong patch format.
> > Should I contact the mantainer of the tool path and ask him where to add
> > it? Or how should I proceed?
> 
> I am the relevant maintainer here.  The main thing from my point of view
> is to split the three changes you were making out into separate commits
> so they can be easily reviewed.  Jon is right that this should be moved
> into a better directory but that's a separate issue that can be tackled
> separately (though feel free to do it immediately if you like!).

Thanks. I sent it to you and moved it to the tools dir.

Regards,
Adrian


--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
index 3a2f9d59edab..7fe5ba4b9072 100644
--- a/Documentation/spi/spidev_test.c
+++ b/Documentation/spi/spidev_test.c
@@ -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>
@@ -34,24 +35,55 @@  static uint32_t mode;
 static uint8_t bits = 8;
 static uint32_t speed = 500000;
 static uint16_t delay;
+static int verbose;
 
-static void transfer(int fd)
+uint8_t default_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,
+	0xF0, 0x0D,
+};
+
+uint8_t default_rx[ARRAY_SIZE(default_tx)] = {0, };
+char *input_tx;
+
+static void hexDump(const void *src, size_t length, size_t bLine, char *prefix)
+{
+	int i = 0;
+	char *address = (char *)src;
+	char *line = (char *)address;
+	unsigned char c;
+
+	printf("%s | ", prefix);
+	while (length-- > 0) {
+		printf("%02X ", (unsigned char)*address++);
+		if (!(++i % bLine) || (length == 0 && i % bLine)) {
+			if (length == 0) {
+				while (i++ % bLine)
+					printf("__ ");
+			}
+			printf(" | ");  /* right close */
+			while (line < address) {
+				c = *line++;
+				printf("%c", (c < 33 || c == 255) ? 0x2E : c);
+			}
+			printf("\n");
+			if (length > 0)
+				printf("%s | ", prefix);
+		}
+	}
+}
+
+static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
 {
 	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,
@@ -76,27 +108,54 @@  static void transfer(int fd)
 	if (ret < 1)
 		pabort("can't send spi message");
 
-	for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
-		if (!(ret % 6))
-			puts("");
-		printf("%.2X ", rx[ret]);
+	if (verbose)
+		hexDump(tx, len, 32, "TX");
+	hexDump(rx, len, 32, "RX");
+}
+
+/*
+ *  Unescape - process hexadecimal escape character
+ *      converts shell input "\x23" -> 0x23
+ */
+int unespcape(char *dst, char *src, size_t len)
+{
+	int ret = 0;
+	char *pSrc = src;
+	char *pDst = dst;
+	unsigned int ch;
+
+	while (*pSrc) {
+		if (*pSrc == '\\' && *(pSrc+1) == 'x') {
+			sscanf(pSrc + 2, "%2x", &ch);
+			pSrc += 4;
+			*pDst++ = (unsigned char)ch;
+		} else {
+			*pDst++ = *pSrc++;
+		}
+
+
+		ret++;
 	}
-	puts("");
+	return ret;
+
 }
 
 static void print_usage(const char *prog)
 {
+
 	printf("Usage: %s [-DsbdlHOLC3]\n", prog);
 	puts("  -D --device   device to use (default /dev/spidev1.1)\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"
 	     "  -L --lsb      least significant bit first\n"
 	     "  -C --cs-high  chip select active high\n"
 	     "  -3 --3wire    SI/SO signals shared\n"
+	     "  -v --verbose  Verbose (show tx buffer)\n"
+	     "  -p            Send data (e.g. \"1234\\xde\\xad\")\n"
 	     "  -N --no-cs    no chip select\n"
 	     "  -R --ready    slave pulls low to pause\n"
 	     "  -2 --dual     dual transfer\n"
@@ -120,13 +179,14 @@  static void parse_opts(int argc, char *argv[])
 			{ "3wire",   0, 0, '3' },
 			{ "no-cs",   0, 0, 'N' },
 			{ "ready",   0, 0, 'R' },
+			{ "verbose", 0, 0, 'v' },
 			{ "dual",    0, 0, '2' },
 			{ "quad",    0, 0, '4' },
 			{ NULL, 0, 0, 0 },
 		};
 		int c;
 
-		c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24", lopts, NULL);
+		c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24p:v", lopts, NULL);
 
 		if (c == -1)
 			break;
@@ -168,6 +228,11 @@  static void parse_opts(int argc, char *argv[])
 		case 'R':
 			mode |= SPI_READY;
 			break;
+		case 'p':
+			input_tx = optarg;
+			break;
+		case 'v':
+			verbose = 1;
 		case '2':
 			mode |= SPI_TX_DUAL;
 			break;
@@ -191,6 +256,9 @@  int main(int argc, char *argv[])
 {
 	int ret = 0;
 	int fd;
+	int size;
+	uint8_t *tx;
+	uint8_t *rx;
 
 	parse_opts(argc, argv);
 
@@ -235,7 +303,17 @@  int main(int argc, char *argv[])
 	printf("bits per word: %d\n", bits);
 	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
 
-	transfer(fd);
+	if (input_tx) {
+		size = strlen(input_tx+1);
+		tx = (uint8_t *)malloc(size);
+		rx = (uint8_t *)malloc(size);
+		size = unespcape((char *)tx, input_tx, size);
+		transfer(fd, tx, rx, size);
+		free(rx);
+		free(tx);
+	} else {
+		transfer(fd, default_tx, default_rx, sizeof(default_tx));
+	}
 
 	close(fd);