天嵌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

...

}





你可能感兴趣的:(yocto,bsp,yocto,网卡,移植,bsp,u-boot)