linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] spi: spidev_test: Added functionalities
@ 2015-02-25 19:08 Adrian Remonda
  2015-02-26  2:01 ` Mark Brown
  2015-02-27 22:11 ` Jonathan Corbet
  0 siblings, 2 replies; 8+ messages in thread
From: Adrian Remonda @ 2015-02-25 19:08 UTC (permalink / raw)
  Cc: Adrian Remonda, Mark Brown, Jonathan Corbet,
	open list:SPI SUBSYSTEM, open list:DOCUMENTATION, open list

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(-)

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);
 
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] spi: spidev_test: Added functionalities
  2015-02-25 19:08 [PATCH] spi: spidev_test: Added functionalities Adrian Remonda
@ 2015-02-26  2:01 ` Mark Brown
  2015-02-27 22:11 ` Jonathan Corbet
  1 sibling, 0 replies; 8+ messages in thread
From: Mark Brown @ 2015-02-26  2:01 UTC (permalink / raw)
  To: Adrian Remonda
  Cc: Jonathan Corbet, open list:SPI SUBSYSTEM,
	open list:DOCUMENTATION, open list

[-- Attachment #1: Type: text/plain, Size: 640 bytes --]

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.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] spi: spidev_test: Added functionalities
  2015-02-25 19:08 [PATCH] spi: spidev_test: Added functionalities Adrian Remonda
  2015-02-26  2:01 ` Mark Brown
@ 2015-02-27 22:11 ` Jonathan Corbet
  2015-02-28  7:27   ` Mark Brown
  2015-03-01 18:28   ` AdrianRemonda
  1 sibling, 2 replies; 8+ messages in thread
From: Jonathan Corbet @ 2015-02-27 22:11 UTC (permalink / raw)
  To: Adrian Remonda
  Cc: Mark Brown, open list:SPI SUBSYSTEM, open list:DOCUMENTATION, open list

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

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] spi: spidev_test: Added functionalities
  2015-02-27 22:11 ` Jonathan Corbet
@ 2015-02-28  7:27   ` Mark Brown
  2015-03-01 20:39     ` Jonathan Corbet
  2015-03-01 18:28   ` AdrianRemonda
  1 sibling, 1 reply; 8+ messages in thread
From: Mark Brown @ 2015-02-28  7:27 UTC (permalink / raw)
  To: Jonathan Corbet
  Cc: Adrian Remonda, open list:SPI SUBSYSTEM, open list:DOCUMENTATION,
	open list

[-- Attachment #1: Type: text/plain, Size: 289 bytes --]

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.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] spi: spidev_test: Added functionalities
  2015-02-27 22:11 ` Jonathan Corbet
  2015-02-28  7:27   ` Mark Brown
@ 2015-03-01 18:28   ` AdrianRemonda
  2015-03-04 23:54     ` Mark Brown
  1 sibling, 1 reply; 8+ messages in thread
From: AdrianRemonda @ 2015-03-01 18:28 UTC (permalink / raw)
  To: Jonathan Corbet
  Cc: Mark Brown, open list:SPI SUBSYSTEM, open list:DOCUMENTATION, open list

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


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] spi: spidev_test: Added functionalities
  2015-02-28  7:27   ` Mark Brown
@ 2015-03-01 20:39     ` Jonathan Corbet
  0 siblings, 0 replies; 8+ messages in thread
From: Jonathan Corbet @ 2015-03-01 20:39 UTC (permalink / raw)
  To: Mark Brown
  Cc: Adrian Remonda, open list:SPI SUBSYSTEM, open list:DOCUMENTATION,
	open list

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

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] spi: spidev_test: Added functionalities
  2015-03-01 18:28   ` AdrianRemonda
@ 2015-03-04 23:54     ` Mark Brown
  2015-03-07 17:59       ` AdrianRemonda
  0 siblings, 1 reply; 8+ messages in thread
From: Mark Brown @ 2015-03-04 23:54 UTC (permalink / raw)
  To: AdrianRemonda
  Cc: Jonathan Corbet, open list:SPI SUBSYSTEM,
	open list:DOCUMENTATION, open list

[-- Attachment #1: Type: text/plain, Size: 567 bytes --]

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!).

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] spi: spidev_test: Added functionalities
  2015-03-04 23:54     ` Mark Brown
@ 2015-03-07 17:59       ` AdrianRemonda
  0 siblings, 0 replies; 8+ messages in thread
From: AdrianRemonda @ 2015-03-07 17:59 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, open list:SPI SUBSYSTEM,
	open list:DOCUMENTATION, open list

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



^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-03-07 17:59 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-25 19:08 [PATCH] spi: spidev_test: Added functionalities Adrian Remonda
2015-02-26  2:01 ` Mark Brown
2015-02-27 22:11 ` Jonathan Corbet
2015-02-28  7:27   ` Mark Brown
2015-03-01 20:39     ` Jonathan Corbet
2015-03-01 18:28   ` AdrianRemonda
2015-03-04 23:54     ` Mark Brown
2015-03-07 17:59       ` AdrianRemonda

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).