IPQ40xx修改默认的MAC地址
QSDK默认情况下是从ART分区读入MAC地址并初始化系统,主要通过fdt_fixup_ethernet函数修改fdt的mac对应的local-mac-address实现,修改后的代码默认从ethaddr读取mac地址并初始化系统,如果ethaddr的地址无效则继续使用ART分区的地址,这个方案只使用LAN口和WAN的MAC地址,无线的MAC地址可在系统起来后从LAN作为基地址计算写入UCI文件即可,此代码是QSDK SPF11.1的uboot修改方案
Index: board/qca/arm/common/ethaddr.c
===================================================================
--- board/qca/arm/common/ethaddr.c (revision 108)
+++ board/qca/arm/common/ethaddr.c (working copy)
@@ -103,6 +103,43 @@
uchar *mac_addr;
char ethaddr[16] = "ethaddr";
char mac[64];
+
+ /*
+ * if ethaddr valid
+ */
+ if (eth_getenv_enetaddr("ethaddr", enetaddr)) {
+ mac_addr = enetaddr;
+ snprintf(mac, sizeof(mac), "%x:%x:%x:%x:%x:%x",
+ mac_addr[0], mac_addr[1],
+ mac_addr[2], mac_addr[3],
+ mac_addr[4], mac_addr[5]);
+ printf("ENV Base MAC: %s\n", mac);
+ for (i = 0; i < CONFIG_IPQ_NO_MACS; i++) {
+ if (0 == i) {
+ continue;
+ }
+ if (0xFF == mac_addr[5]) {
+ mac_addr[5] = 0x00;
+ if (0xFF == mac_addr[4]) {
+ mac_addr[4] = 0x00;
+ mac_addr[3] = mac_addr[3] + 1;
+ } else {
+ mac_addr[4] = mac_addr[4] + 1;
+ }
+ } else {
+ mac_addr[5] = mac_addr[5] + 1;
+ }
+ snprintf(mac, sizeof(mac), "%x:%x:%x:%x:%x:%x",
+ mac_addr[0], mac_addr[1],
+ mac_addr[2], mac_addr[3],
+ mac_addr[4], mac_addr[5]);
+ snprintf(ethaddr, sizeof(ethaddr), "eth%daddr", i);
+ setenv(ethaddr, mac);
+ printf("Set tmp env %s=%s From ENV\n", ethaddr, mac);
+ }
+ return;
+ }
+
/* Get the MAC address from ART partition */
ret = get_eth_mac_address(enetaddr, CONFIG_IPQ_NO_MACS);
for (i = 0; (ret >= 0) && (i < CONFIG_IPQ_NO_MACS); i++) {
@@ -120,6 +157,7 @@
mac_addr[2], mac_addr[3],
mac_addr[4], mac_addr[5]);
setenv(ethaddr, mac);
+ printf("Set tmp env %s=%s From ART\n", ethaddr, mac);
}
snprintf(ethaddr, sizeof(ethaddr), "eth%daddr", (i + 1));
}
浙公网安备 33010602011771号