diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c index 988f91d..c60ec99 100644 --- a/common/cmd_i2c.c +++ b/common/cmd_i2c.c @@ -655,29 +655,120 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) * (most?) embedded boards don't use SDRAM DIMMs. */ #if defined(CONFIG_CMD_SDRAM) +static void print_ddr2_tcyc (u_char const b) +{ + printf ("%d.", (b >> 4) & 0x0F); + switch (b & 0x0F) { + case 0x0: + case 0x1: + case 0x2: + case 0x3: + case 0x4: + case 0x5: + case 0x6: + case 0x7: + case 0x8: + case 0x9: + printf ("%d ns\n", b & 0x0F); + break; + case 0xA: + puts ("25 ns\n"); + break; + case 0xB: + puts ("33 ns\n"); + break; + case 0xC: + puts ("66 ns\n"); + break; + case 0xD: + puts ("75 ns\n"); + break; + default: + puts ("?? ns\n"); + break; + } +} + +static void decode_bits (u_char const b, char const *str[], int const do_once) +{ + u_char mask; + + for (mask = 0x80; mask != 0x00; mask >>= 1, ++str) { + if (b & mask) { + puts (*str); + if (do_once) + return; + } + } +} /* * Syntax: * sdram {i2c_chip} */ -int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +int do_sdram (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { - enum {unknown, EDO, SDRAM, DDR2} type; + enum { unknown, EDO, SDRAM, DDR2 } type; + u_char chip; u_char data[128]; u_char cksum; int j; + static const char *decode_CAS_DDR2[] = { + " TBD", " 6", " 5", " 4", " 3", " 2", " TBD", " TBD" + }; + + static const char *decode_CAS_default[] = { + " TBD", " 7", " 6", " 5", " 4", " 3", " 2", " 1" + }; + + static const char *decode_CS_WE_default[] = { + " TBD", " 6", " 5", " 4", " 3", " 2", " 1", " 0" + }; + + static const char *decode_byte21_default[] = { + " TBD (bit 7)\n", + " Redundant row address\n", + " Differential clock input\n", + " Registerd DQMB inputs\n", + " Buffered DQMB inputs\n", + " On-card PLL\n", + " Registered address/control lines\n", + " Buffered address/control lines\n" + }; + + static const char *decode_byte22_DDR2[] = { + " TBD (bit 7)\n", + " TBD (bit 6)\n", + " TBD (bit 5)\n", + " TBD (bit 4)\n", + " TBD (bit 3)\n", + " Supports partial array self refresh\n", + " Supports 50 ohm ODT\n", + " Supports weak driver\n" + }; + + static const char *decode_row_density_DDR2[] = { + "512 MiB", "256 MiB", "128 MiB", "16 GiB", + "8 GiB", "4 GiB", "2 GiB", "1 GiB" + }; + + static const char *decode_row_density_default[] = { + "512 MiB", "256 MiB", "128 MiB", "64 MiB", + "32 MiB", "16 MiB", "8 MiB", "4 MiB" + }; + if (argc < 2) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } /* * Chip is always specified. - */ - chip = simple_strtoul(argv[1], NULL, 16); + */ + chip = simple_strtoul (argv[1], NULL, 16); - if (i2c_read(chip, 0, 1, data, sizeof(data)) != 0) { + if (i2c_read (chip, 0, 1, data, sizeof (data)) != 0) { puts ("No SDRAM Serial Presence Detect found.\n"); return 1; } @@ -688,15 +779,15 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } if (cksum != data[63]) { printf ("WARNING: Configuration data checksum failure:\n" - " is 0x%02x, calculated 0x%02x\n", - data[63], cksum); + " is 0x%02x, calculated 0x%02x\n", data[63], cksum); } - printf("SPD data revision %d.%d\n", + printf ("SPD data revision %d.%d\n", (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 ("Bytes used 0x%02X\n", data[0]); + printf ("Serial memory size 0x%02X\n", 1 << data[1]); + puts ("Memory type "); - switch(data[2]) { + switch (data[2]) { case 2: type = EDO; puts ("EDO\n"); @@ -714,34 +805,36 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) puts ("unknown\n"); break; } + puts ("Row address bits "); if ((data[3] & 0x00F0) == 0) - printf("%d\n", data[3] & 0x0F); + printf ("%d\n", data[3] & 0x0F); else - printf("%d/%d\n", data[3] & 0x0F, (data[3] >> 4) & 0x0F); + printf ("%d/%d\n", data[3] & 0x0F, (data[3] >> 4) & 0x0F); + puts ("Column address bits "); if ((data[4] & 0x00F0) == 0) - printf("%d\n", data[4] & 0x0F); + printf ("%d\n", data[4] & 0x0F); else - printf("%d/%d\n", data[4] & 0x0F, (data[4] >> 4) & 0x0F); + printf ("%d/%d\n", data[4] & 0x0F, (data[4] >> 4) & 0x0F); switch (type) { case DDR2: - printf("Number of ranks %d\n", - (data[5] & 0x07) + 1); + printf ("Number of ranks %d\n", + (data[5] & 0x07) + 1); break; default: - printf("Module rows %d\n", data[5]); + printf ("Module rows %d\n", data[5]); break; } switch (type) { case DDR2: - printf("Module data width %d bits\n", data[6]); + printf ("Module data width %d bits\n", data[6]); break; default: - printf("Module data width %d bits\n", - (data[7] << 8) | data[6]); + printf ("Module data width %d bits\n", + (data[7] << 8) | data[6]); break; } @@ -758,85 +851,58 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) switch (type) { case DDR2: - printf("SDRAM cycle time %d.", - (data[9] >> 4) & 0x0F); - switch (data[9] & 0x0F) { - case 0x0: - case 0x1: - case 0x2: - case 0x3: - case 0x4: - case 0x5: - case 0x6: - case 0x7: - case 0x8: - case 0x9: - printf("%d ns\n", data[9] & 0x0F); - break; - case 0xA: - puts("25 ns\n"); - break; - case 0xB: - puts("33 ns\n"); - break; - case 0xC: - puts("66 ns\n"); - break; - case 0xD: - puts("75 ns\n"); - break; - default: - puts("?? ns\n"); - break; - } + printf ("SDRAM cycle time "); + print_ddr2_tcyc (data[9]); break; default: - printf("SDRAM cycle time %d.%d nS\n", - (data[9] >> 4) & 0x0F, data[9] & 0x0F); + printf ("SDRAM cycle time %d.%d ns\n", + (data[9] >> 4) & 0x0F, data[9] & 0x0F); break; } switch (type) { case DDR2: - printf("SDRAM access time 0.%d%d ns\n", - (data[10] >> 4) & 0x0F, data[10] & 0x0F); + printf ("SDRAM access time 0.%d%d ns\n", + (data[10] >> 4) & 0x0F, data[10] & 0x0F); break; default: - printf("SDRAM access time %d.%d nS\n", - (data[10] >> 4) & 0x0F, data[10] & 0x0F); + printf ("SDRAM access time %d.%d ns\n", + (data[10] >> 4) & 0x0F, data[10] & 0x0F); break; } puts ("EDC configuration "); - switch(data[11]) { + switch (data[11]) { 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: puts ("15.625 uS\n"); break; - case 1: puts ("3.9 uS\n"); break; - case 2: puts ("7.8 uS \n"); break; - case 3: puts ("31.3 uS\n"); break; - case 4: puts ("62.5 uS\n"); break; - case 5: puts ("125 uS\n"); break; + case 0: puts ("15.625 us\n"); break; + case 1: puts ("3.9 us\n"); break; + case 2: puts ("7.8 us\n"); break; + case 3: puts ("31.3 us\n"); break; + case 4: puts ("62.5 us\n"); break; + case 5: puts ("125 us\n"); break; default: puts ("unknown\n"); break; } switch (type) { case DDR2: - printf("SDRAM width (primary) %d\n", data[13]); + printf ("SDRAM width (primary) %d\n", data[13]); break; default: - printf("SDRAM width (primary) %d\n", data[13] & 0x7F); + printf ("SDRAM width (primary) %d\n", data[13] & 0x7F); if ((data[13] & 0x80) != 0) { - printf(" (second bank) %d\n", - 2 * (data[13] & 0x7F)); + printf (" (second bank) %d\n", + 2 * (data[13] & 0x7F)); } break; } @@ -844,24 +910,24 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) switch (type) { case DDR2: if (data[14] != 0) - printf("EDC width %d\n", data[14]); + printf ("EDC width %d\n", data[14]); break; default: if (data[14] != 0) { - printf("EDC width %d\n", - data[14] & 0x7F); + printf ("EDC width %d\n", + data[14] & 0x7F); if ((data[14] & 0x80) != 0) { - printf(" (second bank) %d\n", - 2 * (data[14] & 0x7F)); + printf (" (second bank) %d\n", + 2 * (data[14] & 0x7F)); } } break; } - if (DDR2 != type ) { - printf("Min clock delay, back-to-back random column addresses " - "%d\n", data[15]); + if (DDR2 != type) { + printf ("Min clock delay, back-to-back random column addresses " + "%d\n", data[15]); } puts ("Burst length(s) "); @@ -871,56 +937,30 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) if (data[16] & 0x02) puts (" 2"); if (data[16] & 0x01) puts (" 1"); putc ('\n'); - printf("Number of banks %d\n", data[17]); + printf ("Number of banks %d\n", data[17]); switch (type) { case DDR2: puts ("CAS latency(s) "); - if (data[18] & 0x83) puts (" TBD"); - if (data[18] & 0x40) puts (" 6"); - if (data[18] & 0x20) puts (" 5"); - if (data[18] & 0x10) puts (" 4"); - if (data[18] & 0x08) puts (" 3"); - if (data[18] & 0x04) puts (" 2"); + decode_bits (data[18], decode_CAS_DDR2, 0); putc ('\n'); break; default: 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"); + decode_bits (data[18], decode_CAS_default, 0); putc ('\n'); break; } if (DDR2 != type) { 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"); + decode_bits (data[19], decode_CS_WE_default, 0); putc ('\n'); } if (DDR2 != type) { 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"); + decode_bits (data[20], decode_CS_WE_default, 0); putc ('\n'); } @@ -935,48 +975,24 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) puts (" TBD (bit 5)\n"); if (data[21] & 0x10) puts (" FET switch external enable\n"); - printf(" %d PLLs on DIMM\n", (data[21] >> 2) & 0x03); + printf (" %d PLLs on DIMM\n", (data[21] >> 2) & 0x03); if (data[20] & 0x11) { - printf(" %d active registers on DIMM\n", - (data[21] & 0x03) + 1); + printf (" %d active registers on DIMM\n", + (data[21] & 0x03) + 1); } break; default: 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"); + else + decode_bits (data[21], decode_byte21_default, 0); break; } switch (type) { case DDR2: - if (data[22] & 0x80) puts (" TBD (bit 7)\n"); - if (data[22] & 0x40) puts (" TBD (bit 6)\n"); - if (data[22] & 0x20) puts (" TBD (bit 5)\n"); - if (data[22] & 0x10) puts (" TBD (bit 4)\n"); - if (data[22] & 0x08) puts (" TBD (bit 3)\n"); - if (data[22] & 0x04) - puts (" Supports parital array self refresh\n"); - if (data[22] & 0x02) - puts (" Supports 50 ohm ODT\n"); - if (data[22] & 0x01) - puts (" Supports weak driver\n"); + decode_bits (data[22], decode_byte22_DDR2, 0); break; default: puts ("Device attributes:\n"); @@ -995,259 +1011,172 @@ int do_sdram ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) switch (type) { case DDR2: - printf("SDRAM cycle time (2nd highest CAS latency) %d.", - (data[23] >> 4) & 0x0F); - - switch (data[23] & 0x0F) { - case 0x0: - case 0x1: - case 0x2: - case 0x3: - case 0x4: - case 0x5: - case 0x6: - case 0x7: - case 0x8: - case 0x9: - printf("%d ns\n", data[23] & 0x0F); - break; - case 0xA: - puts("25 ns\n"); - break; - case 0xB: - puts("33 ns\n"); - break; - case 0xC: - puts("66 ns\n"); - break; - case 0xD: - puts("75 ns\n"); - break; - default: - puts("?? ns\n"); - break; - } + printf ("SDRAM cycle time (2nd highest CAS latency) "); + print_ddr2_tcyc (data[23]); break; default: - printf("SDRAM cycle time (2nd highest CAS latency) %d." - "%d nS\n", (data[23] >> 4) & 0x0F, data[23] & 0x0F); + printf ("SDRAM cycle time (2nd highest CAS latency) %d." + "%d ns\n", (data[23] >> 4) & 0x0F, data[23] & 0x0F); break; } switch (type) { case DDR2: - printf("SDRAM access from clock (2nd highest CAS latency) 0." - "%d%d ns\n", (data[24] >> 4) & 0x0F, data[24] & 0x0F); + printf ("SDRAM access from clock (2nd highest CAS latency) 0." + "%d%d ns\n", (data[24] >> 4) & 0x0F, data[24] & 0x0F); break; default: - printf("SDRAM access from clock (2nd highest CAS latency) %d." - "%d nS\n", (data[24] >> 4) & 0x0F, data[24] & 0x0F); + printf ("SDRAM access from clock (2nd highest CAS latency) %d." + "%d ns\n", (data[24] >> 4) & 0x0F, data[24] & 0x0F); break; } switch (type) { case DDR2: - printf("SDRAM cycle time (3rd highest CAS latency) %d.", - (data[25] >> 4) & 0x0F); - - switch (data[25] & 0x0F) { - case 0x0: - case 0x1: - case 0x2: - case 0x3: - case 0x4: - case 0x5: - case 0x6: - case 0x7: - case 0x8: - case 0x9: - printf("%d ns\n", data[25] & 0x0F); - break; - case 0xA: - puts("25 ns\n"); - break; - case 0xB: - puts("33 ns\n"); - break; - case 0xC: - puts("66 ns\n"); - break; - case 0xD: - puts("75 ns\n"); - break; - default: - puts("?? ns\n"); - break; - } + printf ("SDRAM cycle time (3rd highest CAS latency) "); + print_ddr2_tcyc (data[25]); break; default: - printf("SDRAM cycle time (3rd highest CAS latency) %d." - "%d nS\n", (data[25] >> 4) & 0x0F, data[25] & 0x0F); + printf ("SDRAM cycle time (3rd highest CAS latency) %d." + "%d ns\n", (data[25] >> 4) & 0x0F, data[25] & 0x0F); break; } switch (type) { case DDR2: - printf("SDRAM access from clock (3rd highest CAS latency) 0." - "%d%d ns\n", (data[26] >> 4) & 0x0F, data[26] & 0x0F); + printf ("SDRAM access from clock (3rd highest CAS latency) 0." + "%d%d ns\n", (data[26] >> 4) & 0x0F, data[26] & 0x0F); break; default: - printf("SDRAM access from clock (3rd highest CAS latency) %d." - "%d nS\n", (data[26] >> 4) & 0x0F, data[26] & 0x0F); + printf ("SDRAM access from clock (3rd highest CAS latency) %d." + "%d ns\n", (data[26] >> 4) & 0x0F, data[26] & 0x0F); break; } switch (type) { case DDR2: - printf("Minimum row precharge %d", data[27] >> 2); - switch (data[27] & 0x03) { - case 0x0: puts(".00 ns\n"); break; - case 0x1: puts(".25 ns\n"); break; - case 0x2: puts(".50 ns\n"); break; - case 0x3: puts(".75 ns\n"); break; - } + printf ("Minimum row precharge %d.%02d ns\n", + (data[27] >> 2) & 0x3F, 25 * (data[27] & 0x03)); break; default: - printf("Minimum row precharge %d nS\n", data[27]); + printf ("Minimum row precharge %d ns\n", data[27]); break; } switch (type) { case DDR2: - printf("Row active to row active min %d", data[28] >> 2); - switch (data[28] & 0x03) { - case 0x0: puts(".00 ns\n"); break; - case 0x1: puts(".25 ns\n"); break; - case 0x2: puts(".50 ns\n"); break; - case 0x3: puts(".75 ns\n"); break; - } + printf ("Row active to row active min %d.%02d ns\n", + (data[28] >> 2) & 0x3F, 25 * (data[28] & 0x03)); break; default: - printf("Row active to row active min %d nS\n", data[28]); + printf ("Row active to row active min %d ns\n", data[28]); break; } switch (type) { case DDR2: - printf("RAS to CAS delay min %d", data[29] >> 2); - switch (data[29] & 0x03) { - case 0x0: puts(".00 ns\n"); break; - case 0x1: puts(".25 ns\n"); break; - case 0x2: puts(".50 ns\n"); break; - case 0x3: puts(".75 ns\n"); break; - } + printf ("RAS to CAS delay min %d.%02d ns\n", + (data[29] >> 2) & 0x3F, 25 * (data[29] & 0x03)); break; default: - printf("RAS to CAS delay min %d nS\n", data[29]); + printf ("RAS to CAS delay min %d ns\n", data[29]); break; } - printf("Minimum RAS pulse width %d nS\n", data[30]); + printf ("Minimum RAS pulse width %d ns\n", data[30]); switch (type) { case DDR2: - puts ("Density of each row "); - if (data[31] & 0x80) puts (" 512 MiB\n"); - if (data[31] & 0x40) puts (" 256 MiB\n"); - if (data[31] & 0x20) puts (" 128 MiB\n"); - if (data[31] & 0x10) puts (" 16 GiB\n"); - if (data[31] & 0x08) puts (" 8 GiB\n"); - if (data[31] & 0x04) puts (" 4 GiB\n"); - if (data[31] & 0x02) puts (" 2 GiB\n"); - if (data[31] & 0x01) puts (" 1 GiB\n"); + puts ("Density of each row "); + decode_bits (data[31], decode_row_density_DDR2, 1); + putc ('\n'); break; default: - puts ("Density of each row "); - if (data[31] & 0x80) puts (" 512 MiB\n"); - if (data[31] & 0x40) puts (" 256 MiB\n"); - if (data[31] & 0x20) puts (" 128 MiB\n"); - if (data[31] & 0x10) puts (" 64 MiB\n"); - if (data[31] & 0x08) puts (" 32 MiB\n"); - if (data[31] & 0x04) puts (" 16 MiB\n"); - if (data[31] & 0x02) puts (" 8 MiB\n"); - if (data[31] & 0x01) puts (" 4 MiB\n"); + puts ("Density of each row "); + decode_bits (data[31], decode_row_density_default, 1); + putc ('\n'); break; } switch (type) { case DDR2: - puts("Command and Address setup "); + puts ("Command and Address setup "); if (data[32] >= 0xA0) { - printf("1.%d%d ns\n", - ((data[32] >> 4) & 0x0F) - 10, data[32] & 0x0F); + printf ("1.%d%d ns\n", + ((data[32] >> 4) & 0x0F) - 10, data[32] & 0x0F); } else { - printf("0.%d%d ns\n", - ((data[32] >> 4) & 0x0F), data[32] & 0x0F); + printf ("0.%d%d ns\n", + ((data[32] >> 4) & 0x0F), data[32] & 0x0F); } break; default: - printf("Command and Address setup %c%d.%d nS\n", - (data[32] & 0x80) ? '-' : '+', - (data[32] >> 4) & 0x07, data[32] & 0x0F); + printf ("Command and Address setup %c%d.%d ns\n", + (data[32] & 0x80) ? '-' : '+', + (data[32] >> 4) & 0x07, data[32] & 0x0F); break; } switch (type) { case DDR2: - puts("Command and Address hold "); + puts ("Command and Address hold "); if (data[33] >= 0xA0) { - printf("1.%d%d ns\n", - ((data[33] >> 4) & 0x0F) - 10, data[33] & 0x0F); + printf ("1.%d%d ns\n", + ((data[33] >> 4) & 0x0F) - 10, data[33] & 0x0F); } else { - printf("0.%d%d ns\n", - ((data[33] >> 4) & 0x0F), data[33] & 0x0F); + printf ("0.%d%d ns\n", + ((data[33] >> 4) & 0x0F), data[33] & 0x0F); } break; default: - printf("Command and Address hold %c%d.%d nS\n", - (data[33] & 0x80) ? '-' : '+', - (data[33] >> 4) & 0x07, data[33] & 0x0F); + printf ("Command and Address hold %c%d.%d ns\n", + (data[33] & 0x80) ? '-' : '+', + (data[33] >> 4) & 0x07, data[33] & 0x0F); break; } switch (type) { case DDR2: - printf("Data signal input setup 0.%d%d ns\n", - (data[34] >> 4) & 0x0F, data[34] & 0x0F); + printf ("Data signal input setup 0.%d%d ns\n", + (data[34] >> 4) & 0x0F, data[34] & 0x0F); break; default: - printf("Data signal input setup %c%d.%d nS\n", - (data[34] & 0x80) ? '-' : '+', - (data[34] >> 4) & 0x07, data[34] & 0x0F); + printf ("Data signal input setup %c%d.%d ns\n", + (data[34] & 0x80) ? '-' : '+', + (data[34] >> 4) & 0x07, data[34] & 0x0F); break; } switch (type) { case DDR2: - printf("Data signal input hold 0.%d%d ns\n", - (data[35] >> 4) & 0x0F, data[35] & 0x0F); + printf ("Data signal input hold 0.%d%d ns\n", + (data[35] >> 4) & 0x0F, data[35] & 0x0F); break; default: - printf("Data signal input hold %c%d.%d nS\n", - (data[35] & 0x80) ? '-' : '+', - (data[35] >> 4) & 0x07, data[35] & 0x0F); + printf ("Data signal input hold %c%d.%d ns\n", + (data[35] & 0x80) ? '-' : '+', + (data[35] >> 4) & 0x07, data[35] & 0x0F); break; } puts ("Manufacturer's JEDEC ID "); for (j = 64; j <= 71; j++) - printf("%02X ", data[j]); + printf ("%02X ", data[j]); putc ('\n'); - printf("Manufacturing Location %02X\n", data[72]); + printf ("Manufacturing Location %02X\n", data[72]); puts ("Manufacturer's Part Number "); for (j = 73; j <= 90; j++) - printf("%02X ", data[j]); + printf ("%02X ", data[j]); putc ('\n'); - printf("Revision Code %02X %02X\n", data[91], data[92]); - printf("Manufacturing Date %02X %02X\n", data[93], data[94]); + printf ("Revision Code %02X %02X\n", data[91], data[92]); + printf ("Manufacturing Date %02X %02X\n", data[93], data[94]); puts ("Assembly Serial Number "); for (j = 95; j <= 98; j++) - printf("%02X ", data[j]); + printf ("%02X ", data[j]); putc ('\n'); if (DDR2 != type) { - printf("Speed rating PC%d\n", - data[126] == 0x66 ? 66 : data[126]); + printf ("Speed rating PC%d\n", + data[126] == 0x66 ? 66 : data[126]); } return 0; }