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>
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;