diff --git a/commands/eepromread/board_info.c b/commands/eepromread/board_info.c index 66d000baa..6521b4a64 100644 --- a/commands/eepromread/board_info.c +++ b/commands/eepromread/board_info.c @@ -14,11 +14,11 @@ /* * Attempt to read the board info from an eeprom on this board. - * Currently only supports the BeagleBone and BeagleBone Black. - * In the future, this could be expanded to support cape EEPROMs. */ static int board_info_beaglebone(int fd, i2c_addr_t address, int flags); +static int board_info_cape_a0(int fd, i2c_addr_t address, int flags); +static int board_info_cape_a1(int fd, i2c_addr_t address, int flags); /* Memory Layout of the BeagleBone and BeagleBone Black EEPROM */ typedef struct beaglebone_info @@ -31,6 +31,42 @@ typedef struct beaglebone_info char mac_addrs[3][6]; /* Not set on BeagleBone White */ } beaglebone_info_t; +/* Memory Layout of the Cape EEPROM (A0 Format) - Defined in BBW SRM Rev A5.3 */ +typedef struct cape_info_a0 +{ + uint8_t magic_number[4]; /* Should be 0xaa 0x55 0x33 0xee */ + char revision[2]; /* Should be 'A' '0' */ + char board_name[32]; /* Warning: strings not NULL terminated */ + char version[4]; + char manufacturer[16]; + char partno[16]; + char num_pins[2]; + char serial[12]; + char pin_usage[140]; + char vdd_3v3exp_i[2]; + char vdd_5v_i[2]; + char sys_5v_i[2]; + char dc_supp[2]; +} cape_info_a0_t; + +/* Memory Layout of the Cape EEPROM (A1 Format) - Defined in BBB SRM Rev A5.3 */ +typedef struct cape_info_a1 +{ + uint8_t magic_number[4]; /* Should be 0xaa 0x55 0x33 0xee */ + char revision[2]; /* Should be 'A' '1' */ + char board_name[32]; /* Warning: strings not NULL terminated */ + char version[4]; + char manufacturer[16]; + char partno[16]; + char num_pins[2]; + char serial[12]; + char pin_usage[148]; + char vdd_3v3exp_i[2]; + char vdd_5v_i[2]; + char sys_5v_i[2]; + char dc_supp[2]; +} cape_info_a1_t; + static int board_info_beaglebone(int fd, i2c_addr_t address, int flags) { @@ -58,27 +94,129 @@ board_info_beaglebone(int fd, i2c_addr_t address, int flags) memcpy(s, boneinfo.version, 4); fprintf(stdout, "%-16s: %s\n", "VERSION", s); + memset(s, '\0', 33); memcpy(s, boneinfo.serial_number, 12); fprintf(stdout, "%-16s: %s\n", "SERIAL_NUMBER", s); return 0; } +static int +board_info_cape_a0(int fd, i2c_addr_t address, int flags) +{ + int r; + int i, j; + char s[33]; + cape_info_a0_t capeinfo; + + r = eeprom_read(fd, address, 0x0000, &capeinfo, + sizeof(cape_info_a0_t), flags); + if (r == -1) { + fprintf(stderr, "failed to read cape A0 info r=%d\n", r); + return -1; + } + + fprintf(stdout, "%-16s: 0x%x%x%x%x\n", "MAGIC_NUMBER", + capeinfo.magic_number[0], capeinfo.magic_number[1], + capeinfo.magic_number[2], capeinfo.magic_number[3]); + + memset(s, '\0', 33); + memcpy(s, capeinfo.revision, 2); + fprintf(stdout, "%-16s: %s\n", "REVISION", s); + + memset(s, '\0', 33); + memcpy(s, capeinfo.board_name, 32); + fprintf(stdout, "%-16s: %s\n", "BOARD_NAME", s); + + memset(s, '\0', 33); + memcpy(s, capeinfo.version, 4); + fprintf(stdout, "%-16s: %s\n", "VERSION", s); + + memset(s, '\0', 33); + memcpy(s, capeinfo.manufacturer, 16); + fprintf(stdout, "%-16s: %s\n", "MANUFACTURER", s); + + memset(s, '\0', 33); + memcpy(s, capeinfo.partno, 16); + fprintf(stdout, "%-16s: %s\n", "PART_NUMBER", s); + + memset(s, '\0', 33); + memcpy(s, capeinfo.serial, 12); + fprintf(stdout, "%-16s: %s\n", "SERIAL", s); + + return 0; +} + +static int +board_info_cape_a1(int fd, i2c_addr_t address, int flags) +{ + int r; + int i, j; + char s[33]; + cape_info_a1_t capeinfo; + + r = eeprom_read(fd, address, 0x0000, &capeinfo, + sizeof(cape_info_a1_t), flags); + if (r == -1) { + fprintf(stderr, "failed to read cape A0 info r=%d\n", r); + return -1; + } + + fprintf(stdout, "%-16s: 0x%x%x%x%x\n", "MAGIC_NUMBER", + capeinfo.magic_number[0], capeinfo.magic_number[1], + capeinfo.magic_number[2], capeinfo.magic_number[3]); + + memset(s, '\0', 33); + memcpy(s, capeinfo.revision, 2); + fprintf(stdout, "%-16s: %s\n", "REVISION", s); + + memset(s, '\0', 33); + memcpy(s, capeinfo.board_name, 32); + fprintf(stdout, "%-16s: %s\n", "BOARD_NAME", s); + + memset(s, '\0', 33); + memcpy(s, capeinfo.version, 4); + fprintf(stdout, "%-16s: %s\n", "VERSION", s); + + memset(s, '\0', 33); + memcpy(s, capeinfo.manufacturer, 16); + fprintf(stdout, "%-16s: %s\n", "MANUFACTURER", s); + + memset(s, '\0', 33); + memcpy(s, capeinfo.partno, 16); + fprintf(stdout, "%-16s: %s\n", "PART_NUMBER", s); + + memset(s, '\0', 33); + memcpy(s, capeinfo.serial, 12); + fprintf(stdout, "%-16s: %s\n", "SERIAL", s); + + return 0; +} + int board_info(int fd, i2c_addr_t address, int flags) { int r; - uint8_t magic_number[4]; + uint8_t magic_number[6]; - r = eeprom_read(fd, address, 0x0000, &magic_number, 4, flags); + r = eeprom_read(fd, address, 0x0000, &magic_number, 6, flags); if (r == -1) { printf("%-16s: %s\n", "BOARD_NAME", "UNKNOWN"); return 0; } + /* Check for BeagleBone/BeagleBone Black/Cape Magic Number */ if (magic_number[0] == 0xaa && magic_number[1] == 0x55 && magic_number[2] == 0x33 && magic_number[3] == 0xee) { - board_info_beaglebone(fd, address, flags); + + /* Check if Cape Rev A0, Cape Rev A1, or on-board EEPROM */ + if (magic_number[4] == 'A' && magic_number[5] == '0') { + board_info_cape_a0(fd, address, flags); + } else if (magic_number[4] == 'A' && magic_number[5] == '1') { + board_info_cape_a1(fd, address, flags); + } else { + board_info_beaglebone(fd, address, flags); + } } else { printf("%-16s: %s\n", "BOARD_NAME", "UNKNOWN"); }