X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=common%2Fcmd_i2c.c;h=755810d590419c4c5de528a1947a0111ca11d117;hb=461f2274f8d5e15a354ff92648f17c7b2aa76faa;hp=203e803a148b844d35b881a1b66a8ff8828c1428;hpb=8bde7f776c77b343aca29b8c7b58464d915ac245;p=u-boot diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c index 203e803a14..755810d590 100644 --- a/common/cmd_i2c.c +++ b/common/cmd_i2c.c @@ -101,8 +101,31 @@ static uchar i2c_mm_last_chip; static uint i2c_mm_last_addr; static uint i2c_mm_last_alen; +/* If only one I2C bus is present, the list of devices to ignore when + * the probe command is issued is represented by a 1D array of addresses. + * When multiple buses are present, the list is an array of bus-address + * pairs. The following macros take care of this */ + #if defined(CFG_I2C_NOPROBES) +#if defined(CONFIG_I2C_MULTI_BUS) +static struct +{ + uchar bus; + uchar addr; +} i2c_no_probes[] = CFG_I2C_NOPROBES; +#define GET_BUS_NUM i2c_get_bus_num() +#define COMPARE_BUS(b,i) (i2c_no_probes[(i)].bus == (b)) +#define COMPARE_ADDR(a,i) (i2c_no_probes[(i)].addr == (a)) +#define NO_PROBE_ADDR(i) i2c_no_probes[(i)].addr +#else /* single bus */ static uchar i2c_no_probes[] = CFG_I2C_NOPROBES; +#define GET_BUS_NUM 0 +#define COMPARE_BUS(b,i) ((b) == 0) /* Make compiler happy */ +#define COMPARE_ADDR(a,i) (i2c_no_probes[(i)] == (a)) +#define NO_PROBE_ADDR(i) i2c_no_probes[(i)] +#endif /* CONFIG_MULTI_BUS */ + +#define NUM_ELEMENTS_NOPROBE (sizeof(i2c_no_probes)/sizeof(i2c_no_probes[0])) #endif static int @@ -151,7 +174,7 @@ int do_i2c_md ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) */ addr = simple_strtoul(argv[2], NULL, 16); alen = 1; - for(j = 0; j < 8; j++) { + for (j = 0; j < 8; j++) { if (argv[2][j] == '.') { alen = argv[2][j+1] - '0'; if (alen > 4) { @@ -159,9 +182,8 @@ int do_i2c_md ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 1; } break; - } else if (argv[2][j] == '\0') { + } else if (argv[2][j] == '\0') break; - } } /* @@ -185,25 +207,25 @@ int do_i2c_md ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes; - if(i2c_read(chip, addr, alen, linebuf, linebytes) != 0) { - printf("Error reading the chip.\n"); - } else { + if (i2c_read(chip, addr, alen, linebuf, linebytes) != 0) + puts ("Error reading the chip.\n"); + else { printf("%04x:", addr); cp = linebuf; for (j=0; j 0x7e)) - printf("."); + puts ("."); else printf("%c", *cp); cp++; } - printf("\n"); + putc ('\n'); } nbytes -= linebytes; } while (nbytes > 0); @@ -256,17 +278,16 @@ int do_i2c_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) */ addr = simple_strtoul(argv[2], NULL, 16); alen = 1; - for(j = 0; j < 8; j++) { + for (j = 0; j < 8; j++) { if (argv[2][j] == '.') { alen = argv[2][j+1] - '0'; - if(alen > 4) { + if (alen > 4) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } break; - } else if (argv[2][j] == '\0') { + } else if (argv[2][j] == '\0') break; - } } /* @@ -277,16 +298,14 @@ int do_i2c_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) /* * Optional count */ - if(argc == 5) { + if (argc == 5) count = simple_strtoul(argv[4], NULL, 16); - } else { + else count = 1; - } while (count-- > 0) { - if(i2c_write(chip, addr++, alen, &byte, 1) != 0) { - printf("Error writing the chip.\n"); - } + if (i2c_write(chip, addr++, alen, &byte, 1) != 0) + puts ("Error writing the chip.\n"); /* * Wait for the write to complete. The write can take * up to 10mSec (we allow a little more time). @@ -295,11 +314,17 @@ int do_i2c_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) * chip doesn't respond. This apparently isn't a * universal feature so we don't take advantage of it. */ +/* + * No write delay with FRAM devices. + */ +#if !defined(CFG_I2C_FRAM) udelay(11000); +#endif + #if 0 - for(timeout = 0; timeout < 10; timeout++) { + for (timeout = 0; timeout < 10; timeout++) { udelay(2000); - if(i2c_probe(chip) == 0) + if (i2c_probe(chip) == 0) break; } #endif @@ -340,17 +365,16 @@ int do_i2c_crc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) */ addr = simple_strtoul(argv[2], NULL, 16); alen = 1; - for(j = 0; j < 8; j++) { + for (j = 0; j < 8; j++) { if (argv[2][j] == '.') { alen = argv[2][j+1] - '0'; - if(alen > 4) { + if (alen > 4) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } break; - } else if (argv[2][j] == '\0') { + } else if (argv[2][j] == '\0') break; - } } /* @@ -365,19 +389,16 @@ int do_i2c_crc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) */ crc = 0; err = 0; - while(count-- > 0) { - if(i2c_read(chip, addr, alen, &byte, 1) != 0) { + while (count-- > 0) { + if (i2c_read(chip, addr, alen, &byte, 1) != 0) err++; - } crc = crc32 (crc, &byte, 1); addr++; } - if(err > 0) - { - printf("Error reading the chip,\n"); - } else { + if (err > 0) + puts ("Error reading the chip,\n"); + else printf ("%08lx\n", crc); - } return 0; } @@ -435,17 +456,16 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char *argv[]) */ addr = simple_strtoul(argv[2], NULL, 16); alen = 1; - for(j = 0; j < 8; j++) { + for (j = 0; j < 8; j++) { if (argv[2][j] == '.') { alen = argv[2][j+1] - '0'; - if(alen > 4) { + if (alen > 4) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } break; - } else if (argv[2][j] == '\0') { + } else if (argv[2][j] == '\0') break; - } } } @@ -455,17 +475,16 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char *argv[]) */ do { printf("%08lx:", addr); - if(i2c_read(chip, addr, alen, (char *)&data, size) != 0) { - printf("\nError reading the chip,\n"); - } else { + if (i2c_read(chip, addr, alen, (uchar *)&data, size) != 0) + puts ("\nError reading the chip,\n"); + else { data = cpu_to_be32(data); - if(size == 1) { + if (size == 1) printf(" %02lx", (data >> 24) & 0x000000FF); - } else if(size == 2) { + else if (size == 2) printf(" %04lx", (data >> 16) & 0x0000FFFF); - } else { + else printf(" %08lx", data); - } } nbytes = readline (" ? "); @@ -482,19 +501,17 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char *argv[]) #endif } #ifdef CONFIG_BOOT_RETRY_TIME - else if (nbytes == -2) { + else if (nbytes == -2) break; /* timed out, exit the command */ - } #endif else { char *endp; data = simple_strtoul(console_buffer, &endp, 16); - if(size == 1) { + if (size == 1) data = data << 24; - } else if(size == 2) { + else if (size == 2) data = data << 16; - } data = be32_to_cpu(data); nbytes = endp - console_buffer; if (nbytes) { @@ -504,9 +521,11 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char *argv[]) */ reset_cmd_timeout(); #endif - if(i2c_write(chip, addr, alen, (char *)&data, size) != 0) { - printf("Error writing the chip.\n"); - } + if (i2c_write(chip, addr, alen, (uchar *)&data, size) != 0) + puts ("Error writing the chip.\n"); +#ifdef CFG_EEPROM_PAGE_WRITE_DELAY_MS + udelay(CFG_EEPROM_PAGE_WRITE_DELAY_MS * 1000); +#endif if (incrflag) addr += size; } @@ -529,14 +548,15 @@ int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) int j; #if defined(CFG_I2C_NOPROBES) int k, skip; -#endif + uchar bus = GET_BUS_NUM; +#endif /* NOPROBES */ - printf("Valid chip addresses:"); - for(j = 0; j < 128; j++) { + puts ("Valid chip addresses:"); + for (j = 0; j < 128; j++) { #if defined(CFG_I2C_NOPROBES) skip = 0; - for (k = 0; k < sizeof(i2c_no_probes); k++){ - if (j == i2c_no_probes[k]){ + for (k=0; k < NUM_ELEMENTS_NOPROBE; k++) { + if (COMPARE_BUS(bus, k) && COMPARE_ADDR(j, k)) { skip = 1; break; } @@ -544,17 +564,18 @@ int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) if (skip) continue; #endif - if(i2c_probe(j) == 0) { + if (i2c_probe(j) == 0) printf(" %02X", j); - } } - printf("\n"); + putc ('\n'); #if defined(CFG_I2C_NOPROBES) puts ("Excluded chip addresses:"); - for( k = 0; k < sizeof(i2c_no_probes); k++ ) - printf(" %02X", i2c_no_probes[k] ); - puts ("\n"); + for (k=0; k < NUM_ELEMENTS_NOPROBE; k++) { + if (COMPARE_BUS(bus,k)) + printf(" %02X", NO_PROBE_ADDR(k)); + } + putc ('\n'); #endif return 0; @@ -592,7 +613,7 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) */ addr = simple_strtoul(argv[2], NULL, 16); alen = 1; - for(j = 0; j < 8; j++) { + for (j = 0; j < 8; j++) { if (argv[2][j] == '.') { alen = argv[2][j+1] - '0'; if (alen > 4) { @@ -600,9 +621,8 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 1; } break; - } else if (argv[2][j] == '\0') { + } else if (argv[2][j] == '\0') break; - } } /* @@ -610,24 +630,21 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) */ length = 1; length = simple_strtoul(argv[3], NULL, 16); - if(length > sizeof(bytes)) { + if (length > sizeof(bytes)) length = sizeof(bytes); - } /* * The delay time (uSec) is optional. */ delay = 1000; - if (argc > 3) { + if (argc > 3) delay = simple_strtoul(argv[4], NULL, 10); - } /* * Run the loop... */ - while(1) { - if(i2c_read(chip, addr, alen, bytes, length) != 0) { - printf("Error reading the chip.\n"); - } + while (1) { + if (i2c_read(chip, addr, alen, bytes, length) != 0) + puts ("Error reading the chip.\n"); udelay(delay); } @@ -662,8 +679,8 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) */ chip = simple_strtoul(argv[1], NULL, 16); - if(i2c_read(chip, 0, 1, data, sizeof(data)) != 0) { - printf("No SDRAM Serial Presence Detect found.\n"); + if (i2c_read(chip, 0, 1, data, sizeof(data)) != 0) { + puts ("No SDRAM Serial Presence Detect found.\n"); return 1; } @@ -671,7 +688,7 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) for (j = 0; j < 63; j++) { cksum += data[j]; } - if(cksum != data[63]) { + if (cksum != data[63]) { printf ("WARNING: Configuration data checksum failure:\n" " is 0x%02x, calculated 0x%02x\n", data[63], cksum); @@ -680,134 +697,132 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) (data[62] >> 4) & 0x0F, data[62] & 0x0F); printf("Bytes used 0x%02X\n", data[0]); printf("Serial memory size 0x%02X\n", 1 << data[1]); - printf("Memory type "); + puts ("Memory type "); switch(data[2]) { - case 2: printf("EDO\n"); break; - case 4: printf("SDRAM\n"); break; - default: printf("unknown\n"); break; + case 2: puts ("EDO\n"); break; + case 4: puts ("SDRAM\n"); break; + case 8: puts ("DDR2\n"); break; + default: puts ("unknown\n"); break; } - printf("Row address bits "); - if((data[3] & 0x00F0) == 0) { + puts ("Row address bits "); + if ((data[3] & 0x00F0) == 0) printf("%d\n", data[3] & 0x0F); - } else { + else printf("%d/%d\n", data[3] & 0x0F, (data[3] >> 4) & 0x0F); - } - printf("Column address bits "); - if((data[4] & 0x00F0) == 0) { + puts ("Column address bits "); + if ((data[4] & 0x00F0) == 0) printf("%d\n", data[4] & 0x0F); - } else { + else printf("%d/%d\n", data[4] & 0x0F, (data[4] >> 4) & 0x0F); - } printf("Module rows %d\n", data[5]); printf("Module data width %d bits\n", (data[7] << 8) | data[6]); - printf("Interface signal levels "); + puts ("Interface signal levels "); switch(data[8]) { - case 0: printf("5.0v/TTL\n"); break; - case 1: printf("LVTTL\n"); break; - case 2: printf("HSTL 1.5\n"); break; - case 3: printf("SSTL 3.3\n"); break; - case 4: printf("SSTL 2.5\n"); break; - default: printf("unknown\n"); break; + case 0: puts ("5.0v/TTL\n"); break; + case 1: puts ("LVTTL\n"); break; + case 2: puts ("HSTL 1.5\n"); break; + case 3: puts ("SSTL 3.3\n"); break; + case 4: puts ("SSTL 2.5\n"); break; + case 5: puts ("SSTL 1.8\n"); break; + default: puts ("unknown\n"); break; } printf("SDRAM cycle time %d.%d nS\n", (data[9] >> 4) & 0x0F, data[9] & 0x0F); printf("SDRAM access time %d.%d nS\n", (data[10] >> 4) & 0x0F, data[10] & 0x0F); - printf("EDC configuration "); + puts ("EDC configuration "); switch(data[11]) { - case 0: printf("None\n"); break; - case 1: printf("Parity\n"); break; - case 2: printf("ECC\n"); break; - default: printf("unknown\n"); break; - } - if((data[12] & 0x80) == 0) { - printf("No self refresh, rate "); - } else { - printf("Self refresh, rate "); + case 0: puts ("None\n"); break; + case 1: puts ("Parity\n"); break; + case 2: puts ("ECC\n"); break; + default: puts ("unknown\n"); break; } + if ((data[12] & 0x80) == 0) + puts ("No self refresh, rate "); + else + puts ("Self refresh, rate "); switch(data[12] & 0x7F) { - case 0: printf("15.625uS\n"); break; - case 1: printf("3.9uS\n"); break; - case 2: printf("7.8uS\n"); break; - case 3: printf("31.3uS\n"); break; - case 4: printf("62.5uS\n"); break; - case 5: printf("125uS\n"); break; - default: printf("unknown\n"); break; + case 0: puts ("15.625uS\n"); break; + case 1: puts ("3.9uS\n"); break; + case 2: puts ("7.8uS\n"); break; + case 3: puts ("31.3uS\n"); break; + case 4: puts ("62.5uS\n"); break; + case 5: puts ("125uS\n"); break; + default: puts ("unknown\n"); break; } printf("SDRAM width (primary) %d\n", data[13] & 0x7F); - if((data[13] & 0x80) != 0) { + if ((data[13] & 0x80) != 0) { printf(" (second bank) %d\n", 2 * (data[13] & 0x7F)); } - if(data[14] != 0) { + if (data[14] != 0) { printf("EDC width %d\n", data[14] & 0x7F); - if((data[14] & 0x80) != 0) { + if ((data[14] & 0x80) != 0) printf(" (second bank) %d\n", 2 * (data[14] & 0x7F)); - } } printf("Min clock delay, back-to-back random column addresses %d\n", data[15]); - printf("Burst length(s) "); - if(data[16] & 0x80) printf(" Page"); - if(data[16] & 0x08) printf(" 8"); - if(data[16] & 0x04) printf(" 4"); - if(data[16] & 0x02) printf(" 2"); - if(data[16] & 0x01) printf(" 1"); - printf("\n"); + puts ("Burst length(s) "); + if (data[16] & 0x80) puts (" Page"); + if (data[16] & 0x08) puts (" 8"); + if (data[16] & 0x04) puts (" 4"); + if (data[16] & 0x02) puts (" 2"); + if (data[16] & 0x01) puts (" 1"); + putc ('\n'); printf("Number of banks %d\n", data[17]); - printf("CAS latency(s) "); - if(data[18] & 0x80) printf(" TBD"); - if(data[18] & 0x40) printf(" 7"); - if(data[18] & 0x20) printf(" 6"); - if(data[18] & 0x10) printf(" 5"); - if(data[18] & 0x08) printf(" 4"); - if(data[18] & 0x04) printf(" 3"); - if(data[18] & 0x02) printf(" 2"); - if(data[18] & 0x01) printf(" 1"); - printf("\n"); - printf("CS latency(s) "); - if(data[19] & 0x80) printf(" TBD"); - if(data[19] & 0x40) printf(" 6"); - if(data[19] & 0x20) printf(" 5"); - if(data[19] & 0x10) printf(" 4"); - if(data[19] & 0x08) printf(" 3"); - if(data[19] & 0x04) printf(" 2"); - if(data[19] & 0x02) printf(" 1"); - if(data[19] & 0x01) printf(" 0"); - printf("\n"); - printf("WE latency(s) "); - if(data[20] & 0x80) printf(" TBD"); - if(data[20] & 0x40) printf(" 6"); - if(data[20] & 0x20) printf(" 5"); - if(data[20] & 0x10) printf(" 4"); - if(data[20] & 0x08) printf(" 3"); - if(data[20] & 0x04) printf(" 2"); - if(data[20] & 0x02) printf(" 1"); - if(data[20] & 0x01) printf(" 0"); - printf("\n"); - printf("Module attributes:\n"); - if(!data[21]) printf(" (none)\n"); - if(data[21] & 0x80) printf(" TBD (bit 7)\n"); - if(data[21] & 0x40) printf(" Redundant row address\n"); - if(data[21] & 0x20) printf(" Differential clock input\n"); - if(data[21] & 0x10) printf(" Registerd DQMB inputs\n"); - if(data[21] & 0x08) printf(" Buffered DQMB inputs\n"); - if(data[21] & 0x04) printf(" On-card PLL\n"); - if(data[21] & 0x02) printf(" Registered address/control lines\n"); - if(data[21] & 0x01) printf(" Buffered address/control lines\n"); - printf("Device attributes:\n"); - if(data[22] & 0x80) printf(" TBD (bit 7)\n"); - if(data[22] & 0x40) printf(" TBD (bit 6)\n"); - if(data[22] & 0x20) printf(" Upper Vcc tolerance 5%%\n"); - else printf(" Upper Vcc tolerance 10%%\n"); - if(data[22] & 0x10) printf(" Lower Vcc tolerance 5%%\n"); - else printf(" Lower Vcc tolerance 10%%\n"); - if(data[22] & 0x08) printf(" Supports write1/read burst\n"); - if(data[22] & 0x04) printf(" Supports precharge all\n"); - if(data[22] & 0x02) printf(" Supports auto precharge\n"); - if(data[22] & 0x01) printf(" Supports early RAS# precharge\n"); + puts ("CAS latency(s) "); + if (data[18] & 0x80) puts (" TBD"); + if (data[18] & 0x40) puts (" 7"); + if (data[18] & 0x20) puts (" 6"); + if (data[18] & 0x10) puts (" 5"); + if (data[18] & 0x08) puts (" 4"); + if (data[18] & 0x04) puts (" 3"); + if (data[18] & 0x02) puts (" 2"); + if (data[18] & 0x01) puts (" 1"); + putc ('\n'); + puts ("CS latency(s) "); + if (data[19] & 0x80) puts (" TBD"); + if (data[19] & 0x40) puts (" 6"); + if (data[19] & 0x20) puts (" 5"); + if (data[19] & 0x10) puts (" 4"); + if (data[19] & 0x08) puts (" 3"); + if (data[19] & 0x04) puts (" 2"); + if (data[19] & 0x02) puts (" 1"); + if (data[19] & 0x01) puts (" 0"); + putc ('\n'); + puts ("WE latency(s) "); + if (data[20] & 0x80) puts (" TBD"); + if (data[20] & 0x40) puts (" 6"); + if (data[20] & 0x20) puts (" 5"); + if (data[20] & 0x10) puts (" 4"); + if (data[20] & 0x08) puts (" 3"); + if (data[20] & 0x04) puts (" 2"); + if (data[20] & 0x02) puts (" 1"); + if (data[20] & 0x01) puts (" 0"); + putc ('\n'); + puts ("Module attributes:\n"); + if (!data[21]) puts (" (none)\n"); + if (data[21] & 0x80) puts (" TBD (bit 7)\n"); + if (data[21] & 0x40) puts (" Redundant row address\n"); + if (data[21] & 0x20) puts (" Differential clock input\n"); + if (data[21] & 0x10) puts (" Registerd DQMB inputs\n"); + if (data[21] & 0x08) puts (" Buffered DQMB inputs\n"); + if (data[21] & 0x04) puts (" On-card PLL\n"); + if (data[21] & 0x02) puts (" Registered address/control lines\n"); + if (data[21] & 0x01) puts (" Buffered address/control lines\n"); + puts ("Device attributes:\n"); + if (data[22] & 0x80) puts (" TBD (bit 7)\n"); + if (data[22] & 0x40) puts (" TBD (bit 6)\n"); + if (data[22] & 0x20) puts (" Upper Vcc tolerance 5%\n"); + else puts (" Upper Vcc tolerance 10%\n"); + if (data[22] & 0x10) puts (" Lower Vcc tolerance 5%\n"); + else puts (" Lower Vcc tolerance 10%\n"); + if (data[22] & 0x08) puts (" Supports write1/read burst\n"); + if (data[22] & 0x04) puts (" Supports precharge all\n"); + if (data[22] & 0x02) puts (" Supports auto precharge\n"); + if (data[22] & 0x01) puts (" Supports early RAS# precharge\n"); printf("SDRAM cycle time (2nd highest CAS latency) %d.%d nS\n", (data[23] >> 4) & 0x0F, data[23] & 0x0F); printf("SDRAM access from clock (2nd highest CAS latency) %d.%d nS\n", @@ -820,16 +835,16 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) printf("Row active to row active min %d nS\n", data[28]); printf("RAS to CAS delay min %d nS\n", data[29]); printf("Minimum RAS pulse width %d nS\n", data[30]); - printf("Density of each row "); - if(data[31] & 0x80) printf(" 512MByte"); - if(data[31] & 0x40) printf(" 256MByte"); - if(data[31] & 0x20) printf(" 128MByte"); - if(data[31] & 0x10) printf(" 64MByte"); - if(data[31] & 0x08) printf(" 32MByte"); - if(data[31] & 0x04) printf(" 16MByte"); - if(data[31] & 0x02) printf(" 8MByte"); - if(data[31] & 0x01) printf(" 4MByte"); - printf("\n"); + puts ("Density of each row "); + if (data[31] & 0x80) puts (" 512"); + if (data[31] & 0x40) puts (" 256"); + if (data[31] & 0x20) puts (" 128"); + if (data[31] & 0x10) puts (" 64"); + if (data[31] & 0x08) puts (" 32"); + if (data[31] & 0x04) puts (" 16"); + if (data[31] & 0x02) puts (" 8"); + if (data[31] & 0x01) puts (" 4"); + puts ("MByte\n"); printf("Command and Address setup %c%d.%d nS\n", (data[32] & 0x80) ? '-' : '+', (data[32] >> 4) & 0x07, data[32] & 0x0F); @@ -842,21 +857,21 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) printf("Data signal input hold %c%d.%d nS\n", (data[35] & 0x80) ? '-' : '+', (data[35] >> 4) & 0x07, data[35] & 0x0F); - printf("Manufacturer's JEDEC ID "); - for(j = 64; j <= 71; j++) + puts ("Manufacturer's JEDEC ID "); + for (j = 64; j <= 71; j++) printf("%02X ", data[j]); - printf("\n"); + putc ('\n'); printf("Manufacturing Location %02X\n", data[72]); - printf("Manufacturer's Part Number "); - for(j = 73; j <= 90; j++) + puts ("Manufacturer's Part Number "); + for (j = 73; j <= 90; j++) printf("%02X ", data[j]); - printf("\n"); + putc ('\n'); printf("Revision Code %02X %02X\n", data[91], data[92]); printf("Manufacturing Date %02X %02X\n", data[93], data[94]); - printf("Assembly Serial Number "); - for(j = 95; j <= 98; j++) + puts ("Assembly Serial Number "); + for (j = 95; j <= 98; j++) printf("%02X ", data[j]); - printf("\n"); + putc ('\n'); printf("Speed rating PC%d\n", data[126] == 0x66 ? 66 : data[126]); @@ -864,41 +879,129 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } #endif /* CFG_CMD_SDRAM */ +#if defined(CONFIG_I2C_CMD_TREE) +#if defined(CONFIG_I2C_MULTI_BUS) +int do_i2c_bus_num(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + int bus_idx, ret=0; + + if (argc == 1) + /* querying current setting */ + printf("Current bus is %d\n", i2c_get_bus_num()); + else { + bus_idx = simple_strtoul(argv[1], NULL, 10); + printf("Setting bus to %d\n", bus_idx); + ret = i2c_set_bus_num(bus_idx); + if (ret) + printf("Failure changing bus number (%d)\n", ret); + } + return ret; +} +#endif /* CONFIG_I2C_MULTI_BUS */ + +int do_i2c_bus_speed(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + int speed, ret=0; + + if (argc == 1) + /* querying current speed */ + printf("Current bus speed=%d\n", i2c_get_bus_speed()); + else { + speed = simple_strtoul(argv[1], NULL, 10); + printf("Setting bus speed to %d Hz\n", speed); + ret = i2c_set_bus_speed(speed); + if (ret) + printf("Failure changing bus speed (%d)\n", ret); + } + return ret; +} + +int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ +#if defined(CONFIG_I2C_MULTI_BUS) + if (!strncmp(argv[1], "de", 2)) + return do_i2c_bus_num(cmdtp, flag, --argc, ++argv); +#endif /* CONFIG_I2C_MULTI_BUS */ + if (!strncmp(argv[1], "sp", 2)) + return do_i2c_bus_speed(cmdtp, flag, --argc, ++argv); + if (!strncmp(argv[1], "md", 2)) + return do_i2c_md(cmdtp, flag, --argc, ++argv); + if (!strncmp(argv[1], "mm", 2)) + return do_i2c_mm(cmdtp, flag, --argc, ++argv); + if (!strncmp(argv[1], "mw", 2)) + return do_i2c_mw(cmdtp, flag, --argc, ++argv); + if (!strncmp(argv[1], "nm", 2)) + return do_i2c_nm(cmdtp, flag, --argc, ++argv); + if (!strncmp(argv[1], "cr", 2)) + return do_i2c_crc(cmdtp, flag, --argc, ++argv); + if (!strncmp(argv[1], "pr", 2)) + return do_i2c_probe(cmdtp, flag, --argc, ++argv); + if (!strncmp(argv[1], "lo", 2)) + return do_i2c_loop(cmdtp, flag, --argc, ++argv); +#if (CONFIG_COMMANDS & CFG_CMD_SDRAM) + if (!strncmp(argv[1], "sd", 2)) + return do_sdram(cmdtp, flag, --argc, ++argv); +#endif /* CFG_CMD_SDRAM */ + else + printf ("Usage:\n%s\n", cmdtp->usage); + return 0; +} +#endif /* CONFIG_I2C_CMD_TREE */ /***************************************************/ -cmd_tbl_t U_BOOT_CMD(IMD) = MK_CMD_ENTRY( - "imd", 4, 1, do_i2c_md, \ +#if defined(CONFIG_I2C_CMD_TREE) +U_BOOT_CMD( + i2c, 6, 1, do_i2c, + "i2c - I2C sub-system\n", +#if defined(CONFIG_I2C_MULTI_BUS) + "dev [dev] - show or set current I2C bus\n" +#endif /* CONFIG_I2C_MULTI_BUS */ + "i2c speed [speed] - show or set I2C bus speed\n" + "i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device\n" + "i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing)\n" + "i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)\n" + "i2c nm chip address[.0, .1, .2] - write to I2C device (constant address)\n" + "i2c crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n" + "i2c probe - show devices on the I2C bus\n" + "i2c loop chip address[.0, .1, .2] [# of objects] - looping read of device\n" +#if (CONFIG_COMMANDS & CFG_CMD_SDRAM) + "i2c sdram chip - print SDRAM configuration information\n" +#endif /* CFG_CMD_SDRAM */ +); +#endif /* CONFIG_I2C_CMD_TREE */ +U_BOOT_CMD( + imd, 4, 1, do_i2c_md, \ "imd - i2c memory display\n", \ "chip address[.0, .1, .2] [# of objects]\n - i2c memory display\n" \ ); -cmd_tbl_t U_BOOT_CMD(IMM) = MK_CMD_ENTRY( - "imm", 3, 1, do_i2c_mm, +U_BOOT_CMD( + imm, 3, 1, do_i2c_mm, "imm - i2c memory modify (auto-incrementing)\n", "chip address[.0, .1, .2]\n" " - memory modify, auto increment address\n" ); -cmd_tbl_t U_BOOT_CMD(INM) = MK_CMD_ENTRY( - "inm", 3, 1, do_i2c_nm, +U_BOOT_CMD( + inm, 3, 1, do_i2c_nm, "inm - memory modify (constant address)\n", "chip address[.0, .1, .2]\n - memory modify, read and keep address\n" ); -cmd_tbl_t U_BOOT_CMD(IMW) = MK_CMD_ENTRY( - "imw", 5, 1, do_i2c_mw, +U_BOOT_CMD( + imw, 5, 1, do_i2c_mw, "imw - memory write (fill)\n", "chip address[.0, .1, .2] value [count]\n - memory write (fill)\n" ); -cmd_tbl_t U_BOOT_CMD(ICRC) = MK_CMD_ENTRY( - "icrc32", 5, 1, do_i2c_crc, +U_BOOT_CMD( + icrc32, 5, 1, do_i2c_crc, "icrc32 - checksum calculation\n", "chip address[.0, .1, .2] count\n - compute CRC32 checksum\n" ); -cmd_tbl_t U_BOOT_CMD(IPROBE) = MK_CMD_ENTRY( - "iprobe", 1, 1, do_i2c_probe, +U_BOOT_CMD( + iprobe, 1, 1, do_i2c_probe, "iprobe - probe to discover valid I2C chip addresses\n", "\n -discover valid I2C chip addresses\n" ); @@ -906,19 +1009,20 @@ cmd_tbl_t U_BOOT_CMD(IPROBE) = MK_CMD_ENTRY( /* * Require full name for "iloop" because it is an infinite loop! */ -cmd_tbl_t U_BOOT_CMD(ILOOP) = MK_CMD_ENTRY( - "iloop", 5, 1, do_i2c_loop, +U_BOOT_CMD( + iloop, 5, 1, do_i2c_loop, "iloop - infinite loop on address range\n", "chip address[.0, .1, .2] [# of objects]\n" " - loop, reading a set of addresses\n" ); #if (CONFIG_COMMANDS & CFG_CMD_SDRAM) -cmd_tbl_t U_BOOT_CMD(ISDRAM) = MK_CMD_ENTRY( - "isdram", 2, 1, do_sdram, +U_BOOT_CMD( + isdram, 2, 1, do_sdram, "isdram - print SDRAM configuration information\n", "chip\n - print SDRAM configuration information\n" " (valid chip values 50..57)\n" ); #endif + #endif /* CFG_CMD_I2C */