I.MX6 内部有个以太网 MAC 外设,也就是 ENET,需要外接一个 PHY 芯片来实现网络通信功能,也就是内部
MAC+外部 PHY 芯片的方案。DM9000 就是一个 MAC+PHY 芯片,之所以用DM9000是因为有些芯片内部没
有MAC外设。此处使用I.MX6系列芯片内部集成有MAC,网络芯片选型为KSZ9301。
网卡启动过程:
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_MICREL、CONFIG_PHY_ATHEROS等)初始化相应一个或多个系列网卡,其中就有我们项目中使用的micrel(ksz9031)系列网卡以及sabresd公版所使用的aheros(AR8031)系列网卡。
phy_env_init():初始化关于phy的一些uboot环境变量,这里我们不需要关心。
board_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芯片。
为了注册ksz9031的驱动,需要定义CONFIG_PHY_MICREL宏,为了探测到MDIO上我们的phy芯片,需要用调用fecmxc_initialize_multi(bd,-1,CONFIG_FEC_MXC_PHYADDR,IMX_FEC_BASE)
CONFIG_FEC_MXC_PHYADDR就是我们的网卡芯片的器件地址,可通过电路图得知该地址为3,也就是说需要把CONFIG_FEC_MXC_PHYADDR宏定义为数值3。
此处的CONFIG_FEC_MXC_PHYADDR也可以在uboot中使用命令mii info查看,0x03即为所求
把include/configs/mx6sabre_common.h中的#define CONFIG_FEC_MXC_PHYADDR 1修改为3
uboot上电后必须引导内核正常启动,再进入uboot界面进行ping服务器IP才能通畅。不能不引导内核直接进入uboot交互界面,去ping服务器ip,否则网络不通。
具体为什么会这样,也不太清楚。。。。。。。。
如果网络还有问题可以查看网络芯片的复位引脚是否设置正确,文件在:
/board/freescale/mx6sabresd/mx6sabresd.c中
也可能需要对芯片重新置位,将上图gpio_set_value附近的代码修改如下:
udelay(20000);
gpio_set_value(IMX_GPIO_NR(3,23),0);
udelay(20000);
gpio_set_value(IMX_GPIO_NR(3,23),1);
udelay(20000);