forked from mirrors/linux
		
	spi: spidev_test: Added input buffer from the terminal
Signed-off-by: Adrian Remonda <adrianremonda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
		
							parent
							
								
									31a5c5a72b
								
							
						
					
					
						commit
						30061915be
					
				
					 1 changed files with 60 additions and 16 deletions
				
			
		| 
						 | 
					@ -37,6 +37,18 @@ static uint32_t speed = 500000;
 | 
				
			||||||
static uint16_t delay;
 | 
					static uint16_t delay;
 | 
				
			||||||
static int verbose;
 | 
					static int verbose;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 hex_dump(const void *src, size_t length, size_t line_size, char *prefix)
 | 
					static void hex_dump(const void *src, size_t length, size_t line_size, char *prefix)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i = 0;
 | 
						int i = 0;
 | 
				
			||||||
| 
						 | 
					@ -64,23 +76,38 @@ static void hex_dump(const void *src, size_t length, size_t line_size, char *pre
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void transfer(int fd)
 | 
					/*
 | 
				
			||||||
 | 
					 *  Unescape - process hexadecimal escape character
 | 
				
			||||||
 | 
					 *      converts shell input "\x23" -> 0x23
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int unespcape(char *_dst, char *_src, size_t len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ret = 0;
 | 
				
			||||||
 | 
						char *src = _src;
 | 
				
			||||||
 | 
						char *dst = _dst;
 | 
				
			||||||
 | 
						unsigned int ch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (*src) {
 | 
				
			||||||
 | 
							if (*src == '\\' && *(src+1) == 'x') {
 | 
				
			||||||
 | 
								sscanf(src + 2, "%2x", &ch);
 | 
				
			||||||
 | 
								src += 4;
 | 
				
			||||||
 | 
								*dst++ = (unsigned char)ch;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								*dst++ = *src++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ret++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int ret;
 | 
						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 = {
 | 
						struct spi_ioc_transfer tr = {
 | 
				
			||||||
		.tx_buf = (unsigned long)tx,
 | 
							.tx_buf = (unsigned long)tx,
 | 
				
			||||||
		.rx_buf = (unsigned long)rx,
 | 
							.rx_buf = (unsigned long)rx,
 | 
				
			||||||
		.len = ARRAY_SIZE(tx),
 | 
							.len = len,
 | 
				
			||||||
		.delay_usecs = delay,
 | 
							.delay_usecs = delay,
 | 
				
			||||||
		.speed_hz = speed,
 | 
							.speed_hz = speed,
 | 
				
			||||||
		.bits_per_word = bits,
 | 
							.bits_per_word = bits,
 | 
				
			||||||
| 
						 | 
					@ -106,8 +133,8 @@ static void transfer(int fd)
 | 
				
			||||||
		pabort("can't send spi message");
 | 
							pabort("can't send spi message");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (verbose)
 | 
						if (verbose)
 | 
				
			||||||
		hex_dump(tx, ARRAY_SIZE(tx), 32, "TX");
 | 
							hex_dump(tx, len, 32, "TX");
 | 
				
			||||||
	hex_dump(rx, ARRAY_SIZE(rx), 32, "RX");
 | 
						hex_dump(rx, len, 32, "RX");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void print_usage(const char *prog)
 | 
					static void print_usage(const char *prog)
 | 
				
			||||||
| 
						 | 
					@ -124,6 +151,7 @@ static void print_usage(const char *prog)
 | 
				
			||||||
	     "  -C --cs-high  chip select active high\n"
 | 
						     "  -C --cs-high  chip select active high\n"
 | 
				
			||||||
	     "  -3 --3wire    SI/SO signals shared\n"
 | 
						     "  -3 --3wire    SI/SO signals shared\n"
 | 
				
			||||||
	     "  -v --verbose  Verbose (show tx buffer)\n"
 | 
						     "  -v --verbose  Verbose (show tx buffer)\n"
 | 
				
			||||||
 | 
						     "  -p            Send data (e.g. \"1234\\xde\\xad\")\n"
 | 
				
			||||||
	     "  -N --no-cs    no chip select\n"
 | 
						     "  -N --no-cs    no chip select\n"
 | 
				
			||||||
	     "  -R --ready    slave pulls low to pause\n"
 | 
						     "  -R --ready    slave pulls low to pause\n"
 | 
				
			||||||
	     "  -2 --dual     dual transfer\n"
 | 
						     "  -2 --dual     dual transfer\n"
 | 
				
			||||||
| 
						 | 
					@ -154,7 +182,7 @@ static void parse_opts(int argc, char *argv[])
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
		int c;
 | 
							int c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24:v", lopts, NULL);
 | 
							c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24p:v", lopts, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (c == -1)
 | 
							if (c == -1)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					@ -199,6 +227,9 @@ static void parse_opts(int argc, char *argv[])
 | 
				
			||||||
		case 'R':
 | 
							case 'R':
 | 
				
			||||||
			mode |= SPI_READY;
 | 
								mode |= SPI_READY;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case 'p':
 | 
				
			||||||
 | 
								input_tx = optarg;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case '2':
 | 
							case '2':
 | 
				
			||||||
			mode |= SPI_TX_DUAL;
 | 
								mode |= SPI_TX_DUAL;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					@ -222,6 +253,9 @@ int main(int argc, char *argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int ret = 0;
 | 
						int ret = 0;
 | 
				
			||||||
	int fd;
 | 
						int fd;
 | 
				
			||||||
 | 
						uint8_t *tx;
 | 
				
			||||||
 | 
						uint8_t *rx;
 | 
				
			||||||
 | 
						int size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	parse_opts(argc, argv);
 | 
						parse_opts(argc, argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -266,7 +300,17 @@ int main(int argc, char *argv[])
 | 
				
			||||||
	printf("bits per word: %d\n", bits);
 | 
						printf("bits per word: %d\n", bits);
 | 
				
			||||||
	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
 | 
						printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	transfer(fd);
 | 
						if (input_tx) {
 | 
				
			||||||
 | 
							size = strlen(input_tx+1);
 | 
				
			||||||
 | 
							tx = malloc(size);
 | 
				
			||||||
 | 
							rx = 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);
 | 
						close(fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue