am335x_evm: read the on-board EEPROM
authorIlya Yanok <ilya.yanok@cogentembedded.com>
Tue, 24 Jul 2012 12:22:19 +0000 (12:22 +0000)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Sat, 1 Sep 2012 12:58:11 +0000 (14:58 +0200)
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>
board/ti/am335x/evm.c

index 0d0affa83322e8b9ec1dcc4d557d93ecdd563366..55e24a8f92b10c597fc99bfebc7cc7ce4e7019f7 100644 (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>
 
 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;