diff options
-rw-r--r-- | board/ti/am335x/evm.c | 72 |
1 files changed, 70 insertions, 2 deletions
diff --git a/board/ti/am335x/evm.c b/board/ti/am335x/evm.c index 0d0affa..55e24a8 100644 --- a/board/ti/am335x/evm.c +++ b/board/ti/am335x/evm.c @@ -14,6 +14,7 @@ */ #include <common.h> +#include <errno.h> #include <asm/arch/cpu.h> #include <asm/arch/hardware.h> #include <asm/arch/common_def.h> @@ -22,17 +23,84 @@ DECLARE_GLOBAL_DATA_PTR; /* + * I2C Address of on-board EEPROM + */ +#define I2C_BASE_BOARD_ADDR 0x50 + +#define NO_OF_MAC_ADDR 3 +#define ETH_ALEN 6 + +#define NAME_LEN 8 + +struct am335x_baseboard_id { + unsigned int magic; + char name[NAME_LEN]; + char version[4]; + char serial[12]; + char config[32]; + char mac_addr[NO_OF_MAC_ADDR][ETH_ALEN]; +}; + +static struct am335x_baseboard_id header; + +static inline int board_is_bone(void) +{ + return !strncmp(header.name, "A335BONE", NAME_LEN); +} + +/* + * Read header information from EEPROM into global structure. + */ +int read_eeprom(void) +{ + /* Check if baseboard eeprom is available */ + if (i2c_probe(I2C_BASE_BOARD_ADDR)) { + printf("Could not probe the EEPROM; something fundamentally " + "wrong on the I2C bus.\n"); + return -ENODEV; + } + + /* read the eeprom using i2c */ + if (i2c_read(I2C_BASE_BOARD_ADDR, 0, 2, (uchar *)&header, + sizeof(header))) { + printf("Could not read the EEPROM; something fundamentally" + " wrong on the I2C bus.\n"); + return -EIO; + } + + if (header.magic != 0xEE3355AA) { + /* + * read the eeprom using i2c again, + * but use only a 1 byte address + */ + if (i2c_read(I2C_BASE_BOARD_ADDR, 0, 1, (uchar *)&header, + sizeof(header))) { + printf("Could not read the EEPROM; something " + "fundamentally wrong on the I2C bus.\n"); + return -EIO; + } + + if (header.magic != 0xEE3355AA) { + printf("Incorrect magic number in EEPROM\n"); + return -EINVAL; + } + } + + return 0; +} + +/* * Basic board specific setup */ int board_init(void) { enable_uart0_pin_mux(); -#ifdef CONFIG_I2C enable_i2c0_pin_mux(); enable_i2c1_pin_mux(); i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); -#endif + if (read_eeprom() < 0) + printf("Could not get board ID.\n"); gd->bd->bi_boot_params = PHYS_DRAM_1 + 0x100; |