[U-Boot] [PATCH v1] cmd: sspi: Add an additional argument to set the bus frequency

Signed-off-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com --- cmd/spi.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/cmd/spi.c b/cmd/spi.c index f16ef9a..b495b87 100644 --- a/cmd/spi.c +++ b/cmd/spi.c @@ -36,51 +36,52 @@ static unsigned int bus; static unsigned int cs; static unsigned int mode; +static unsigned int hz; static int bitlen; static uchar dout[MAX_SPI_BYTES]; static uchar din[MAX_SPI_BYTES];
-static int do_spi_xfer(int bus, int cs) +static int do_spi_xfer(int bus, int cs, unsigned int hz) { struct spi_slave *slave; int ret = 0;
#ifdef CONFIG_DM_SPI char name[30], *str; struct udevice *dev;
snprintf(name, sizeof(name), "generic_%d:%d", bus, cs); str = strdup(name); if (!str) return -ENOMEM; - ret = spi_get_bus_and_cs(bus, cs, 1000000, mode, "spi_generic_drv", + ret = spi_get_bus_and_cs(bus, cs, hz, mode, "spi_generic_drv", str, &dev, &slave); if (ret) return ret; #else - slave = spi_setup_slave(bus, cs, 1000000, mode); + slave = spi_setup_slave(bus, cs, hz, mode); if (!slave) { printf("Invalid device %d:%d\n", bus, cs); return -EINVAL; } #endif
ret = spi_claim_bus(slave); if (ret) goto done; ret = spi_xfer(slave, bitlen, dout, din, SPI_XFER_BEGIN | SPI_XFER_END); #ifndef CONFIG_DM_SPI /* We don't get an error code in this case */ if (ret) ret = -EIO; #endif if (ret) { printf("Error %d during SPI transaction\n", ret); } else { int j;
for (j = 0; j < ((bitlen + 7) / 8); j++) printf("%02X", din[j]); printf("\n"); } @@ -107,70 +108,73 @@ done: int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char *cp = 0; uchar tmp; int j;
/* * We use the last specified parameters, unless new ones are * entered. */
if ((flag & CMD_FLAG_REPEAT) == 0) { if (argc >= 2) { mode = CONFIG_DEFAULT_SPI_MODE; bus = simple_strtoul(argv[1], &cp, 10); if (*cp == ':') { cs = simple_strtoul(cp+1, &cp, 10); } else { cs = bus; bus = CONFIG_DEFAULT_SPI_BUS; } if (*cp == '.') mode = simple_strtoul(cp+1, NULL, 10); } if (argc >= 3) bitlen = simple_strtoul(argv[2], NULL, 10); if (argc >= 4) { cp = argv[3]; for(j = 0; *cp; j++, cp++) { tmp = *cp - '0'; if(tmp > 9) tmp -= ('A' - '0') - 10; if(tmp > 15) tmp -= ('a' - 'A'); if(tmp > 15) { printf("Hex conversion error on %c\n", *cp); return 1; } if((j % 2) == 0) dout[j / 2] = (tmp << 4); else dout[j / 2] |= tmp; } } + if (argc >= 5) + hz = simple_strtoul(argv[4], NULL, 10); }
if ((bitlen < 0) || (bitlen > (MAX_SPI_BYTES * 8))) { printf("Invalid bitlen %d\n", bitlen); return 1; }
- if (do_spi_xfer(bus, cs)) + if (do_spi_xfer(bus, cs, hz)) return 1;
return 0; }
/***************************************************/
U_BOOT_CMD( - sspi, 5, 1, do_spi, + sspi, 6, 1, do_spi, "SPI utility command", - "[<bus>:]<cs>[.<mode>] <bit_len> <dout> - Send and receive bits\n" + "[<bus>:]<cs>[.<mode>] <bit_len> <dout> [<hz>] - Send and receive bits\n" "<bus> - Identifies the SPI bus\n" "<cs> - Identifies the chip select\n" "<mode> - Identifies the SPI mode to use\n" "<bit_len> - Number of bits to send (base 10)\n" - "<dout> - Hexadecimal string that gets sent" + "<dout> - Hexadecimal string that gets sent\n" + "[<clk>] - Bus clock in Hz" );

On Fri, Feb 17, 2017 at 06:27:28PM +0100, Philipp Tomsich wrote:
Signed-off-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com
Please add a bit more information here as to why you need this, in the commit message.
[snip]
if (argc >= 5)
hz = simple_strtoul(argv[4], NULL, 10);
You need an else here to set hz to the previously used value. Thanks!

The spi command is rather useful for board verification, bring-up and software testing. One use in our lab is the testing of the clock code, which requires the ability to send data at different SPI clocks.
The changeset adds an additional (optional) positional argument to the 'spi' command that allows the selection of a SPI clock for communication (the previous default of 1MHz is retained, if the argument is omitted).
Signed-off-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com --- cmd/spi.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/cmd/spi.c b/cmd/spi.c index f16ef9a..1cd2ebc 100644 --- a/cmd/spi.c +++ b/cmd/spi.c @@ -30,6 +30,8 @@ # define CONFIG_DEFAULT_SPI_MODE SPI_MODE_0 #endif
+#define SSPI_DEFAULT_HZ 1000000 + /* * Values from last command. */ @@ -40,7 +42,7 @@ static int bitlen; static uchar dout[MAX_SPI_BYTES]; static uchar din[MAX_SPI_BYTES];
-static int do_spi_xfer(int bus, int cs) +static int do_spi_xfer(int bus, int cs, unsigned int hz) { struct spi_slave *slave; int ret = 0; @@ -53,12 +55,12 @@ static int do_spi_xfer(int bus, int cs) str = strdup(name); if (!str) return -ENOMEM; - ret = spi_get_bus_and_cs(bus, cs, 1000000, mode, "spi_generic_drv", + ret = spi_get_bus_and_cs(bus, cs, hz, mode, "spi_generic_drv", str, &dev, &slave); if (ret) return ret; #else - slave = spi_setup_slave(bus, cs, 1000000, mode); + slave = spi_setup_slave(bus, cs, hz, mode); if (!slave) { printf("Invalid device %d:%d\n", bus, cs); return -EINVAL; @@ -109,6 +111,7 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) char *cp = 0; uchar tmp; int j; + unsigned int hz = SSPI_DEFAULT_HZ;
/* * We use the last specified parameters, unless new ones are @@ -149,6 +152,8 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) dout[j / 2] |= tmp; } } + if (argc >= 5) + hz = simple_strtoul(argv[4], NULL, 10); }
if ((bitlen < 0) || (bitlen > (MAX_SPI_BYTES * 8))) { @@ -156,7 +161,7 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return 1; }
- if (do_spi_xfer(bus, cs)) + if (do_spi_xfer(bus, cs, hz)) return 1;
return 0; @@ -165,12 +170,13 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) /***************************************************/
U_BOOT_CMD( - sspi, 5, 1, do_spi, + sspi, 6, 1, do_spi, "SPI utility command", - "[<bus>:]<cs>[.<mode>] <bit_len> <dout> - Send and receive bits\n" + "[<bus>:]<cs>[.<mode>] <bit_len> <dout> [<hz>] - Send and receive bits\n" "<bus> - Identifies the SPI bus\n" "<cs> - Identifies the chip select\n" "<mode> - Identifies the SPI mode to use\n" "<bit_len> - Number of bits to send (base 10)\n" - "<dout> - Hexadecimal string that gets sent" + "<dout> - Hexadecimal string that gets sent\n" + "[<clk>] - Bus clock in Hz (defaults to 1 MHz)" );

On Fri, Feb 17, 2017 at 07:10:08PM +0100, Philipp Tomsich wrote:
The spi command is rather useful for board verification, bring-up and software testing. One use in our lab is the testing of the clock code, which requires the ability to send data at different SPI clocks.
The changeset adds an additional (optional) positional argument to the 'spi' command that allows the selection of a SPI clock for communication (the previous default of 1MHz is retained, if the argument is omitted).
Signed-off-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com
Reviewed-by: Tom Rini trini@konsulko.com

On Fri, Feb 17, 2017 at 11:40 PM, Philipp Tomsich philipp.tomsich@theobroma-systems.com wrote:
The spi command is rather useful for board verification, bring-up and software testing. One use in our lab is the testing of the clock code, which requires the ability to send data at different SPI clocks.
The changeset adds an additional (optional) positional argument to the 'spi' command that allows the selection of a SPI clock for communication (the previous default of 1MHz is retained, if the argument is omitted).
Signed-off-by: Philipp Tomsich philipp.tomsich@theobroma-systems.com
cmd/spi.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/cmd/spi.c b/cmd/spi.c index f16ef9a..1cd2ebc 100644 --- a/cmd/spi.c +++ b/cmd/spi.c @@ -30,6 +30,8 @@ # define CONFIG_DEFAULT_SPI_MODE SPI_MODE_0 #endif
+#define SSPI_DEFAULT_HZ 1000000
/*
- Values from last command.
*/ @@ -40,7 +42,7 @@ static int bitlen; static uchar dout[MAX_SPI_BYTES]; static uchar din[MAX_SPI_BYTES];
-static int do_spi_xfer(int bus, int cs) +static int do_spi_xfer(int bus, int cs, unsigned int hz) { struct spi_slave *slave; int ret = 0; @@ -53,12 +55,12 @@ static int do_spi_xfer(int bus, int cs) str = strdup(name); if (!str) return -ENOMEM;
ret = spi_get_bus_and_cs(bus, cs, 1000000, mode, "spi_generic_drv",
ret = spi_get_bus_and_cs(bus, cs, hz, mode, "spi_generic_drv", str, &dev, &slave); if (ret) return ret;
#else
slave = spi_setup_slave(bus, cs, 1000000, mode);
slave = spi_setup_slave(bus, cs, hz, mode); if (!slave) { printf("Invalid device %d:%d\n", bus, cs); return -EINVAL;
@@ -109,6 +111,7 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) char *cp = 0; uchar tmp; int j;
unsigned int hz = SSPI_DEFAULT_HZ;
Default value for DM_SPI is from DT, so assign 0 for DM_SPI.
thanks!
participants (3)
-
Jagan Teki
-
Philipp Tomsich
-
Tom Rini