From c59a6a0dacd4061e9cba6efe6c8fcc99370a74b6 Mon Sep 17 00:00:00 2001 From: Ilya Yanok Date: Tue, 24 Jul 2012 12:22:19 +0000 Subject: [PATCH] am335x_evm: read the on-board EEPROM Read the on-board EEPROM during startup to detect the version of the board we are running on (as for now only BeagleBone vs EVM detection is supported). Signed-off-by: Ilya Yanok --- board/ti/am335x/evm.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file 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 +#include #include #include #include @@ -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; -- 2.7.4