imx8mp-somdevices: Read MAC from EEPROM and save it in ethaddr environment variable.
authorJosep Orga <jorga@somdevices.com>
Thu, 7 Sep 2023 12:20:22 +0000 (14:20 +0200)
committerJosep Orga <jorga@somdevices.com>
Wed, 13 Sep 2023 07:30:33 +0000 (09:30 +0200)
Signed-off-by: Josep Orga <jorga@somdevices.com>
arch/arm/dts/imx8mp-somdevices.dts
board/somdevices/imx8mp_somdevices/imx8mp_somdevices.c

index b2545f2..bebf28a 100644 (file)
                        };
                };
        };
+
+       eeprom@50 {
+               compatible = "microchip,24c02";
+               reg = <0x50>;
+       };
 };
 
 &i2c2 {
index fb5826a..dd9aff6 100644 (file)
@@ -34,6 +34,10 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #define UART_PAD_CTRL  (PAD_CTL_DSE6 | PAD_CTL_FSEL1)
 #define WDOG_PAD_CTRL  (PAD_CTL_DSE6 | PAD_CTL_ODE | PAD_CTL_PUE | PAD_CTL_PE)
+#define EEPROM_BUS_NUM 0
+#define EEPROM_ADDR            0x50
+#define EEPROM_ADDR_LEN        1
+#define EEPROM_OFFSET  0xFA
 
 static iomux_v3_cfg_t const uart_pads[] = {
        MX8MP_PAD_UART2_RXD__UART2_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
@@ -52,6 +56,67 @@ static void setup_gpmi_nand(void)
 }
 #endif
 
+int set_mac_eeprom(void)
+{
+       struct udevice *dev;
+       u8 buf[6];
+       int ret;
+       /* If ethaddr variable is not set in environment */
+       char ethaddr[18];
+       char *ethaddr_env;
+
+       /* Configure EEPROM: 7bit address 0x50 */
+       ret = i2c_get_chip_for_busnum(EEPROM_BUS_NUM, EEPROM_ADDR, EEPROM_ADDR_LEN, &dev);
+       if (ret) {
+               printf("Cannot find EEPROM for MAC: %d\n", ret);
+               return 0;
+       }
+       /* Reading from EEPROM */
+       if (dm_i2c_read(dev, EEPROM_OFFSET, (u8 *)&buf, sizeof(buf)) < 0) {
+               printf("i2c EEPROM for MAC read failed\n");
+               return 0;
+       }
+       sprintf(ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X",
+                                               buf[0],
+                                               buf[1],
+                                               buf[2],
+                                               buf[3],
+                                               buf[4],
+                                               buf[5]);
+       ethaddr_env = env_get("ethaddr");
+       if (!ethaddr_env) {
+               printf("Setting MAC from EEPROM\n");
+               /* Set ethaddr variable for ethernet */
+               env_set("ethaddr", ethaddr);
+               sprintf(ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X",
+                               0x00,
+                               0xaa,
+                               buf[2],
+                               buf[3],
+                               buf[4],
+                               buf[5]);
+               /* Set eth1addr variable for second ethernet */
+               env_set("eth1addr", ethaddr);
+               env_save();
+       } else {
+               if (strcmp(ethaddr_env, ethaddr)) {
+                       /* Set ethaddr variable for ethernet */
+                       env_set("ethaddr", ethaddr);
+                       sprintf(ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X",
+                                       0x00,
+                                       0xaa,
+                                       buf[2],
+                                       buf[3],
+                                       buf[4],
+                                       buf[5]);
+                       /* Set eth1addr variable for second ethernet */
+                       env_set("eth1addr", ethaddr);
+                       env_save();
+               }
+       }
+       return 0;
+}
+
 int board_early_init_f(void)
 {
        struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
@@ -486,7 +551,7 @@ int board_late_init(void)
        env_set("board_name", "SOMDEVICES");
        env_set("board_rev", "iMX8MP");
 #endif
-
+       set_mac_eeprom();
        return 0;
 }