首先 I.MX6Ull是采用 内部 MAC+外部PHY 芯片的方式来进行网络通信,某国际XXX组织规定,所有的PHY芯片内部前16个寄存器必须一模一样,PHY芯片的特殊功能配置在第16个寄存器以后的位置,因此,理论上uboot里边有一个PHY芯片的通用驱动程序,即更换PHY芯片无需更改驱动程序。
I.MX6Ull通过RMII接口和PHY芯片进行网络通信,通过MDIO接口配置PYH内部的寄存器,MDIO最多可以管理32个PHY芯片,每个PHY配片都有一个内部地址进行区分,类似IIC设备的地址,PHYADDR由PHYAD0管脚来决定,高电平PHYADDR=0x01,低电平PHYADDR=0x0
I.MX6ULL EVK 开发板使用 KSZ8081 这颗 PHY 芯片,I.MX6ULL-HYQ-EMMC开发板采用的是LAN8720A 这颗 PHY 芯片,理论上网络驱动程序完全通用,但是I.MX6ULL EVK 开发板的PHY复位引脚是通过74LV595芯片外扩的,我们需要将其相关的代码全部删掉,并添加上LAN8720A复位相关的代码,Uboot的驱动代码都在mx6ull_hyq_emmc.h 和 mx6ull_hyq_emmc.c 这两个文件中
修改 ENET1 网络驱动的话重点就三点:
①、ENET1 复位引脚初始化。
②、LAN8720A 的器件 ID。
③、LAN8720 驱动
目录
1.ENET1 复位引脚初始化
将74LV595芯片相关的代码全部删掉,并添加上LAN8720A复位相关的代码。
2.LAN8720A 的器件 ID。
3.LAN8720 驱动
理论上网络驱动可以通用,但是实测uboot 中的 LAN8720A 驱动有点问题,打开文件
drivers/net/phy/phy.c,找到函数 genphy_update_link,这是个通用 PHY 驱动函数,此函数用于更新 PHY 的连接状态和速度。使用 LAN8720A 的时候需要在此函数中添加一些代码,修改后的
函数 genphy_update_link 如下所示:
增加CONFIG_PHY_SMSC宏定义条件编译,对 SMSC 公司的 PHY进行软件复位,宏定义在mx6ull_hyq_emmc.h头文件中
LAN8720A是 SMSC 公司的 PHY芯片, KSZ8081是MICREL公司的 PHY 芯片,其它PHY公司的宏定义如下
4.网络驱动测试
烧录到SD中复位开发板
网卡2初始化成功
设置环境变量
setenv ipaddr 192.168.0.50 //开发板 IP 地址
setenv ethaddr 00:04:9f:04:d2:35 //开发板网卡 MAC 地址
setenv gatewayip 192.168.0.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.0.105 //服务器地址,也就是 Ubuntu 地址
saveenv //保存环境变量