]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/cmd_spi.c
ARM Update mach-types
[karo-tx-uboot.git] / common / cmd_spi.c
index ccf9cc2879deeb46d912ade20bd79b91b390bb07..ab7aac780dbd85999ccf8cc65d01c226e7de247b 100644 (file)
 #include <common.h>
 #include <command.h>
 #include <spi.h>
-#include <cmd_spi.h>
 
-#if (CONFIG_COMMANDS & CFG_CMD_SPI)
-
-#define MAX_SPI_BYTES  32      /* max number of bytes we can handle */
-
-/*
- * External table of chip select functions (see the appropriate board
- * support for the actual definition of the table).
+/*-----------------------------------------------------------------------
+ * Definitions
  */
-extern spi_chipsel_type spi_chipsel[];
 
+#ifndef MAX_SPI_BYTES
+#   define MAX_SPI_BYTES 32    /* Maximum number of bytes we can handle */
+#endif
+
+#ifndef CONFIG_DEFAULT_SPI_BUS
+#   define CONFIG_DEFAULT_SPI_BUS      0
+#endif
+#ifndef CONFIG_DEFAULT_SPI_MODE
+#   define CONFIG_DEFAULT_SPI_MODE     SPI_MODE_0
+#endif
 
 /*
  * Values from last command.
  */
-static int   device;
-static int   bitlen;
-static uchar dout[MAX_SPI_BYTES];
-static uchar din[MAX_SPI_BYTES];
+static unsigned int    device;
+static int             bitlen;
+static uchar           dout[MAX_SPI_BYTES];
+static uchar           din[MAX_SPI_BYTES];
 
 /*
  * SPI read/write
@@ -60,8 +63,9 @@ static uchar din[MAX_SPI_BYTES];
  * The command prints out the hexadecimal string received via SPI.
  */
 
-int do_spi (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
+int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
+       struct spi_slave *slave;
        char  *cp = 0;
        uchar tmp;
        int   j;
@@ -78,39 +82,65 @@ int do_spi (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
                        device = simple_strtoul(argv[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("Conversion error on %c, bailing out.\n", *cp);
-                               break;
+               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, giving up.\n", *cp);
+                                       return 1;
+                               }
+                               if((j % 2) == 0)
+                                       dout[j / 2] = (tmp << 4);
+                               else
+                                       dout[j / 2] |= tmp;
                        }
-                       if((j % 2) == 0)
-                               dout[j / 2] = (tmp << 4);
-                       else
-                               dout[j / 2] |= tmp;
                }
        }
 
-printf("spi_chipsel[%d] = %08X\n", device, (uint)spi_chipsel[device]);
-       if(spi_xfer(spi_chipsel[device], bitlen, dout, din) != 0) {
+       if ((bitlen < 0) || (bitlen >  (MAX_SPI_BYTES * 8))) {
+               printf("Invalid bitlen %d, giving up.\n", bitlen);
+               return 1;
+       }
+
+       /* FIXME: Make these parameters run-time configurable */
+       slave = spi_setup_slave(CONFIG_DEFAULT_SPI_BUS, device, 1000000,
+                       CONFIG_DEFAULT_SPI_MODE);
+       if (!slave) {
+               printf("Invalid device %d, giving up.\n", device);
+               return 1;
+       }
+
+       debug ("spi chipsel = %08X\n", device);
+
+       spi_claim_bus(slave);
+       if(spi_xfer(slave, bitlen, dout, din,
+                               SPI_XFER_BEGIN | SPI_XFER_END) != 0) {
                printf("Error with the SPI transaction.\n");
                rcode = 1;
        } else {
-               cp = din;
                for(j = 0; j < ((bitlen + 7) / 8); j++) {
-                       printf("%02X", *cp++);
+                       printf("%02X", din[j]);
                }
                printf("\n");
        }
+       spi_release_bus(slave);
+       spi_free_slave(slave);
 
        return rcode;
 }
 
-#endif /* CFG_CMD_SPI */
+/***************************************************/
 
+U_BOOT_CMD(
+       sspi,   5,      1,      do_spi,
+       "SPI utility commands",
+       "<device> <bit_len> <dout> - Send <bit_len> bits from <dout> out the SPI\n"
+       "<device>  - Identifies the chip select of the device\n"
+       "<bit_len> - Number of bits to send (base 10)\n"
+       "<dout>    - Hexadecimal string that gets sent"
+);