Blame view
cmd/spi.c
3.63 KB
d41ce506b Initial Release, ... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
/* * (C) Copyright 2002 * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com * * SPDX-License-Identifier: GPL-2.0+ */ /* * SPI Read/Write Utilities */ #include <common.h> #include <command.h> #include <dm.h> #include <errno.h> #include <spi.h> /*----------------------------------------------------------------------- * Definitions */ #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 unsigned int bus; static unsigned int cs; static unsigned int mode; static int bitlen; static uchar dout[MAX_SPI_BYTES]; static uchar din[MAX_SPI_BYTES]; static int do_spi_xfer(int bus, int cs) { 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", str, &dev, &slave); if (ret) return ret; #else slave = spi_setup_slave(bus, cs, 1000000, mode); if (!slave) { printf("Invalid device %d:%d ", 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 ", ret); } else { int j; for (j = 0; j < ((bitlen + 7) / 8); j++) printf("%02X", din[j]); printf(" "); } done: spi_release_bus(slave); #ifndef CONFIG_DM_SPI spi_free_slave(slave); #endif return ret; } /* * SPI read/write * * Syntax: * spi {dev} {num_bits} {dout} * {dev} is the device number for controlling chip select (see TBD) * {num_bits} is the number of bits to send & receive (base 10) * {dout} is a hexadecimal string of data to send * The command prints out the hexadecimal string received via SPI. */ 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 ", *cp); return 1; } if((j % 2) == 0) dout[j / 2] = (tmp << 4); else dout[j / 2] |= tmp; } } } if ((bitlen < 0) || (bitlen > (MAX_SPI_BYTES * 8))) { printf("Invalid bitlen %d ", bitlen); return 1; } if (do_spi_xfer(bus, cs)) return 1; return 0; } /***************************************************/ U_BOOT_CMD( sspi, 5, 1, do_spi, "SPI utility command", "[<bus>:]<cs>[.<mode>] <bit_len> <dout> - Send and receive bits " "<bus> - Identifies the SPI bus " "<cs> - Identifies the chip select " "<mode> - Identifies the SPI mode to use " "<bit_len> - Number of bits to send (base 10) " "<dout> - Hexadecimal string that gets sent" ); |