天嵌TQ_E9卡片電腦移植飛思卡爾yocto L4.1.15_1.0.0_ga 第三篇 新版uboot(2015.04-r0)網絡卡移植(RTL8211E)
經過前面的移植現在板子已經能成功跑起來yocto的2015.04版u-boot,但是如果我們ping主機則會提示不通,這裡我們繼續把u-boot的網絡卡移植上去,畢竟之後的核心移植少不了tftp功能。
uboot-2015-04的獨立phy網絡卡移植本身是很簡單的,這裡主要做個簡單分析。
1.uboot網絡卡初始化整體流程:
該版Uboot中網絡卡的啟動過程如下board_init_f>>board_init_r>>initr_net>>eth_initialize.
在eth_initialize中會執行miiphy_init(),phy_init(),phy_env_init()
2.網絡卡具體初始化:
miiphy_init():初始化mii_devs連結串列,該列表中是一系列象徵mac控制器,每個miid_dev表示一條mdio匯流排,可掛載多個phy裝置。
phy_init():根據巨集定義(例如CONFIG_PHY_REALTEK、CONFIG_PHY_ATHEROS等)初始化相應一個或多個系列網絡卡,其中就有我們專案中使用的realtek(RTL8211E)系列網絡卡以及sabresd公版所使用的aheros(AR8031)系列網絡卡。
phy_env_init():初始化關於phy的一些uboot環境變數,這裡我們不需要關心。
board_eth_init():網絡卡的板級初始化。
3.網絡卡板級具體初始化:
board_eth_init()中會執行setup_iomux_enet(),setup_pcie(),cpu_eth_init()三個函式。
其中setup_iomux_enet()函式配置網絡卡的rgmii介面,一般不用動這部分程式碼。
setup_pcie()配置板子pcie匯流排,具體這裡也不用管。
cpu_eth_init()函式會做些網絡卡的晶片級初始化。
4.網絡卡晶片級具體初始化:
cpu_eth_init()只是呼叫了fecmx_initialize()函式,該函式中則只調用了
Int fecmxc_initialize_multi(bd_t *bd.int phy_id,uinit32_t addr);
作用是初始化掛載在器件地址為phy_id的mdio上的所有phy晶片,具體實現頗覆雜但也比較有意思,有興趣的可以自行研究下,這裡我們知道這些就已經足夠了,如此看來似乎phy_id這個引數名如果改為phy_addr會更容易理解些。
到這裡我們也就已經獲得了移植RTL8211E網絡卡所需要的所有資訊,這裡做個總結:
由步驟2得知為了註冊RTL8211E的驅動,需要定義CONFIG_PHY_REALTEK巨集,為了探測到MDIO上我們的phy晶片(RTL8211E),需要用呼叫fecmxc_initialize_multi(bd,-1,CONFIG_FEC_MXC_PHYADDR,IMX_FEC_BASE),這裡CONFIG_FEC_MXC_PHYADDR就是我們的網絡卡晶片的器件地址,可通過電路圖得知我們的地址為5,也就是說需要把CONFIG_FEC_MXC_PHYADDR巨集定義為數值5。
綜上所述,為了移植我們的網絡卡晶片我們只需要兩個步驟:
1.注掉include/configs/mx6sabre_common.h中的
/* #define CONFIG_PHY_ATHEROS */
並追加
#define CONFIG_PHY_REALTEK
2.把include/configs/mx6sabre_common.h中的
#define CONFIG_FEC_MXC_PHYADDR 1
改為
#define CONFIG_FEC_MXC_PHYADDR 5
注意:在2016.03版本uboot中如果啟動uboot提示找不到FEC PHY需要在drivers/net/phy/phy.c下做如下修改
int __weak get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id)
{
int phy_reg;
mdelay(10);//加入睡眠10ms
...
}