Skip to contentSkip to conversation

mpc8323erdb: fix EEPROM page size and get MAC from EEPROM

PATCH New Michael Barkowski 1 participant 1 message Mar 27, 2008 2 messages not in the archive

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): 3.25.2008-az33.freescale.net-23-6334202408432706253232-2644@freescale.com

A message that is not in the archive (sent off-list or not yet received): 3.25.2008-az33.freescale.net-23-6334203713153018753712-3698@freescale.com

#2 lore raw

PATCH v2 1/1 mpc8323erdb: fix EEPROM page size and get MAC from EEPROM

This patch fixes eeprom page size so that you can now write more than 64 bytes at a time.

It also makes the board take MAC addresses, if found, from EEPROM.

User should place up to 4 addresses at offset 0x7f00, for eth{,1,2,3}addr. Any unused addresses should be zero. This group of four six-byte values should have it's CRC at the end. crc32 and eeprom commands can be used to accomplish this.

If CRC fails, MAC addresses come from the environment. If CRC succeeds, the environment is overwritten at startup.

---
Kim,
Please accept this as a follow-on to:
0fa7a1b4719e325fce332689fb8754ec166191ff mpc8323erdb: remove RTC and add EEPROM

 board/freescale/mpc8323erdb/mpc8323erdb.c |   34 +++++++++++++++++++++++++++++
 include/configs/MPC8323ERDB.h             |   10 ++++++-
 lib_ppc/board.c                           |    2 +-
 3 files changed, 43 insertions(+), 3 deletions(-)
board/freescale/mpc8323erdb/mpc8323erdb.c +34 -0
index 88d5e8f..afc0eee 100644
@@ -185,3 +185,37 @@ void ft_board_setup(void *blob, bd_t *bd)
 #endif
 }
 #endif
+
+#if defined(CFG_I2C_MAC_OFFSET)
+int mac_read_from_eeprom(void)
+{
+	uchar buf[28];
+	char str[18];
+	int i = 0;
+	unsigned int crc = 0;
+	unsigned char enetvar[32];
+
+	/* Read MAC addresses from EEPROM */
+	if (eeprom_read(CFG_I2C_EEPROM_ADDR, CFG_I2C_MAC_OFFSET, buf, 28)) {
+		printf("\nEEPROM @ 0x%02x read FAILED!!!\n",
+		       CFG_I2C_EEPROM_ADDR);
+	} else {
+		if (crc32(crc, buf, 24) == *(unsigned int *)&buf[24]) {
+			printf("Reading MAC from EEPROM\n");
+			for (i = 0; i < 4; i++) {
+				if (memcmp(&buf[i * 6], "\0\0\0\0\0\0", 6)) {
+					sprintf(str,
+						"%02X:%02X:%02X:%02X:%02X:%02X",
+						buf[i * 6], buf[i * 6 + 1],
+						buf[i * 6 + 2], buf[i * 6 + 3],
+						buf[i * 6 + 4], buf[i * 6 + 5]);
+					sprintf((char *)enetvar,
+						i ? "eth%daddr" : "ethaddr", i);
+					setenv((char *)enetvar, str);
+				}
+			}
+		}
+	}
+	return 0;
+}
+#endif				/* CONFIG_I2C_MAC_OFFSET */
include/configs/MPC8323ERDB.h +8 -2
index 94c4c6b..3775465 100644
@@ -323,8 +323,11 @@
 /*
  * Config on-board EEPROM
  */
-#define CFG_I2C_EEPROM_ADDR     0x50
-#define CFG_I2C_EEPROM_ADDR_LEN 2
+#define CFG_I2C_EEPROM_ADDR		0x50
+#define CFG_I2C_EEPROM_ADDR_LEN		2
+#define CFG_EEPROM_PAGE_WRITE_BITS	6
+#define CFG_EEPROM_PAGE_WRITE_DELAY_MS	10
+#define CFG_EEPROM_PAGE_WRITE_ENABLE
 
 /*
  * General PCI
@@ -549,6 +552,9 @@
 #define CONFIG_HAS_ETH1				/* add support for "eth1addr" */
 #define CONFIG_ETH1ADDR	00:04:9f:ef:03:02
 
+/* use mac_read_from_eeprom() to read ethaddr from I2C EEPROM (see CFG_I2C_EEPROM) */
+#define CFG_I2C_MAC_OFFSET	0x7f00	/* MAC address offset in I2C EEPROM */
+
 #define CONFIG_IPADDR		10.0.0.2
 #define CONFIG_SERVERIP		10.0.0.1
 #define CONFIG_GATEWAYIP	10.0.0.1
lib_ppc/board.c +1 -1
index ee0213e..85a0733 100644
@@ -862,7 +862,7 @@ void board_init_r (gd_t *id, ulong dest_addr)
 	sc3_read_eeprom();
 #endif
 
-#ifdef CFG_ID_EEPROM
+#if defined (CFG_ID_EEPROM) || defined (CFG_I2C_MAC_OFFSET)
 	mac_read_from_eeprom();
 #endif
 
Signature · 1 line
1.5.3.6