经过前面的移植现在板子已经能成功跑起来yocto的2015.04版u-boot,但是如果我们ping主机则会提示不通,这里我们继续把u-boot的网卡移植上去,毕竟之后的内核移植少不了tftp功能。
uboot-2015-04的独立phy网卡移植本身是很简单的,这里主要做个简单分析。
该版Uboot中网卡的启动过程如下board_init_f>>board_init_r>>initr_net>>eth_initialize.
在eth_initialize中会执行miiphy_init(),phy_init(),phy_env_init()以及board_eth_init四个函数。
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():网卡的板级初始化。
board_eth_init()中会执行setup_iomux_enet(),setup_pcie(),cpu_eth_init()三个函数。
其中setup_iomux_enet()函数配置网卡的rgmii接口,一般不用动这部分代码。
setup_pcie()配置板子pcie总线,具体这里也不用管。
cpu_eth_init()函数会做些网卡的芯片级初始化。
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_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
...
}