diff options
author | Ilya Yanok <ilya.yanok@cogentembedded.com> | 2012-07-24 12:22:19 +0000 |
---|---|---|
committer | Albert ARIBAUD <albert.u.boot@aribaud.net> | 2012-09-01 14:58:11 +0200 |
commit | c59a6a0dacd4061e9cba6efe6c8fcc99370a74b6 (patch) | |
tree | 388b9b2577ccaf3f4ebcdce865505129c74187a4 /board/ti | |
parent | 89017e150e2e142c1b6d3239797bcfac47f7f098 (diff) | |
download | u-boot-imx-c59a6a0dacd4061e9cba6efe6c8fcc99370a74b6.zip u-boot-imx-c59a6a0dacd4061e9cba6efe6c8fcc99370a74b6.tar.gz u-boot-imx-c59a6a0dacd4061e9cba6efe6c8fcc99370a74b6.tar.bz2 |
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 <ilya.yanok@cogentembedded.com>
Diffstat (limited to 'board/ti')
-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; |