1. 程式人生 > >天嵌TQ_E9卡片電腦移植飛思卡爾yocto L4.1.15_1.0.0_ga 第三篇 新版uboot(2015.04-r0)網絡卡移植(RTL8211E)

天嵌TQ_E9卡片電腦移植飛思卡爾yocto L4.1.15_1.0.0_ga 第三篇 新版uboot(2015.04-r0)網絡卡移植(RTL8211E)

經過前面的移植現在板子已經能成功跑起來yocto2015.04u-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()

以及board_eth_init四個函式。

2.網絡卡具體初始化:

miiphy_init():初始化mii_devs連結串列,該列表中是一系列象徵mac控制器,每個miid_dev表示一條mdio匯流排,可掛載多個phy裝置。

phy_init():根據巨集定義(例如CONFIG_PHY_REALTEKCONFIG_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()函式,該函式中則只調用了

fecmxc_initialize_multi(bd,-1,CONFIG_FEC_MXC_PHYADDR,IMX_FEC_BASE)函式,該函式原型為

Int fecmxc_initialize_multi(bd_t *bd.int phy_id,uinit32_t addr);

作用是初始化掛載在器件地址為phy_idmdio上的所有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

...

}