Uboot-2015.04版修改ksz9031驱动

嵌入式Linux网络解决方案:

I.MX6 内部有个以太网 MAC 外设,也就是 ENET,需要外接一个 PHY 芯片来实现网络通信功能,也就是内部

MAC+外部 PHY 芯片的方案。DM9000 就是一个 MAC+PHY 芯片,之所以用DM9000是因为有些芯片内部没

有MAC外设。此处使用I.MX6系列芯片内部集成有MAC,网络芯片选型为KSZ9301。

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_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-2015.04版修改ksz9031驱动_第1张图片
至此,uboot的网络应该已经可用。
在这里插入图片描述

注意:

uboot上电后必须引导内核正常启动,再进入uboot界面进行ping服务器IP才能通畅。不能不引导内核直接进入uboot交互界面,去ping服务器ip,否则网络不通。
具体为什么会这样,也不太清楚。。。。。。。。

其他修改:

如果网络还有问题可以查看网络芯片的复位引脚是否设置正确,文件在:
/board/freescale/mx6sabresd/mx6sabresd.c中
Uboot-2015.04版修改ksz9031驱动_第2张图片
也可能需要对芯片重新置位,将上图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);

你可能感兴趣的:(Linux)