imx6dl系統每次啟動MAC位址都不一樣

2021-08-28 11:51:58 字數 2611 閱讀 9388

啟動imx6dl,發現每次啟動之後eth0 的mach位址都都是自動獲取,導致每次啟動都不一樣,這個對於ip型(路由器,ip型影音裝置,網路印表機,傳真機等)裝置來說,這是個致命的bug,列印資訊如下。

can device driver inte***ce

2188000.ethernet supply phy not found, using dummy regulator

pps pps0: new pps source ptp0

fec 2188000.ethernet (unregistered net_device): invalid mac address: 00:00:00:00:00:00

fec 2188000.ethernet (unregistered net_device): using random mac address: c6:60:85:f1:12:33

libphy: fec_enet_mii_bus: probed

fec 2188000.ethernet eth0: registered phc device 0

ppp generic driver version 2.4.2

drivers/net/ethernet/freescale/fec_main.c: 

static void fec_get_mac(struct net_device *ndev)}/*

* 3) from flash or fuse (via platform data)

*/if (!is_valid_ether_addr(iap))

/** 4) fec mac registers set by bootloader

*/if (!is_valid_ether_addr(iap))

/** 5) random mac address

*/if (!is_valid_ether_addr(iap))

memcpy(ndev->dev_addr, iap, eth_alen);

/* adjust mac if using macaddr */

if (iap == macaddr)

ndev->dev_addr[eth_alen-1] = macaddr[eth_alen-1] + fep->dev_id;

}

從上面意思的原始碼可以看出,系統通過四種方式去獲取mac位址,如果都不能獲取成功,則會通過第五種方式random生成乙個隨機的mac位址,再寫hw_addr。

所以,我們不去隨機生成mac,而是直接根據cpu序列號生成mac位址,

drivers/net/ethernet/freescale/fec_main.c:

static void fec_get_mac(struct net_device *ndev)}/*

* 3) from flash or fuse (via platform data)

*/if (!is_valid_ether_addr(iap))

/** 4) fec mac registers set by bootloader

*/if (!is_valid_ether_addr(iap))

mem_mac_addr = ioremap(0x021bc410,0x100);

printk("the value is %x\r\n",*(unsigned int *)mem_mac_addr);

#if 0

/** 5) random mac address

*/if (!is_valid_ether_addr(iap))

#endif

ndev->addr_assign_type = net_addr_random;

*mem_mac_addr &=0xfe;

*mem_mac_addr |= 0x02;

ndev->dev_addr[0] = *mem_mac_addr;

ndev->dev_addr[1] = *(mem_mac_addr+1);

ndev->dev_addr[2] = *(mem_mac_addr+2);

ndev->dev_addr[3] = *(mem_mac_addr+3);

ndev->dev_addr[4] = *(mem_mac_addr+0x12);

*(mem_mac_addr+0x13) &=0xfe;

*(mem_mac_addr+0x13) |= 0x02;

ndev->dev_addr[5] = *(mem_mac_addr+0x13);

return ;

// memcpy(ndev->dev_addr, iap, eth_alen);

/* adjust mac if using macaddr */

if (iap == macaddr)

ndev->dev_addr[eth_alen-1] = macaddr[eth_alen-1] + fep->dev_id;

}

搞定!!! 

拓展:1. 怎麼燒寫imx6的mac

2. mac位址查詢

3.imx6 mac位址設定

4. imx6讀取唯一標識uid的方法

IMX6DL 彙編點亮LED燈

除錯uboot使用led閃爍去標註程式執行到 是乙個不錯的方法,在移植uboot的時候,沒有列印,所以需要新增led閃爍彙編,網上資料不知道為什麼這麼少,成功之後需要記錄。晶元 imx6u5d led燈 d6 原理圖可以知道,需要控制gpio引腳key row6,高電平點亮,低電平熄滅。引腳key ...

IMX6ULL啟動流程

假設板子設定為sd tf卡啟動,boot rom程式會做什麼?把程式從sd tf卡讀出來,執行。從 讀?從sd tf卡讀,這需要先初始化sd tf卡 根據efuse或gpio的設定初始化sd tf卡。讀到 去?讀到記憶體即ddr去,這需要先初始化ddr。除了初始化啟動裝置 初始化ddr,還需要初始化...

IMX6ULL uboot啟動分析(六)

已經對board init f函式進行了簡單介紹,在這個函式當中,會呼叫一系列的函式去初始化一些早期的板子外設和gd結構體的成員變數,但是board init f函式並沒有將所有的外設進行初始化,還有一些後續的工作需要完成,這些工作就是由board init r函式去完成。在介紹board init...