啟動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...