[U-Boot] [PATCH 5/6] am335x_evm: read the on-board EEPROM

Ilya Yanok ilya.yanok at cogentembedded.com
Fri Jun 8 15:12:13 CEST 2012


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).

CC: Tom Rini <trini at ti.com>
Signed-off-by: Ilya Yanok <ilya.yanok at cogentembedded.com>
---
 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 5e2d53a..e4aadcc 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>
@@ -27,16 +28,83 @@ DECLARE_GLOBAL_DATA_PTR;
 #define UART_SMART_IDLE_EN	(0x1 << 0x3)
 
 /*
+ * 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();
 	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;
 
-- 
1.7.9.5



More information about the U-Boot mailing list