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>
This commit is contained in:
Ilya Yanok 2012-07-24 12:22:19 +00:00 committed by Albert ARIBAUD
parent 89017e150e
commit c59a6a0dac
1 changed files with 70 additions and 2 deletions

View File

@ -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>
@ -21,6 +22,73 @@
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
*/
@ -28,11 +96,11 @@ 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;