I.MX6UL/ULL 内部有个以太网 MAC 外设,也就是 ENET,需要外接一个 PHY 芯片来实现网络通信功能,也就是内部MAC+外部 PHY 芯片的方案。

I.MX6UL/ULL 有两个网络接口 ENET1 和 ENET2,I.MX6U-ALPHA 开发板提供了这两个网络接口,其中 ENET1 和 ENET2 都使用 LAN8720A 作为 PHY 芯片。

NXP 官方的I.MX6ULL EVK 开发板使用 KSZ8081 这颗 PHY 芯片,LAN8720A 相比 KSZ8081 具有体积小、外围器件少、价格便宜等优点。
直接使用 KSZ8081 固然可以,但是我们在实际的产品中不一定会使用 KSZ8081,有时候为了降低成本会选择其他的 PHY 芯片。
这个时候就有个问题:换了PHY 芯片以后网络驱动怎么办?为此,I.MX6U-ALPHA 开发板将 ENET1 和 ENET2的 PHY 换成了LAN8720A,这样就可以给大家讲解更换 PHY 芯片以后如何调整网络驱动,使网络工作正常。

I.MX6U-ALPHA 开发板的 ENET1 引脚与 NXP 官方的 I.MX6ULL EVK 开发板基本一样,唯独复位引脚不同。从图可以看出,I.MX6U-ALPHA 开发板的 ENET1 复位引脚ENET1_RST 接到了 I.M6ULL 的SNVS_TAMPER7 这个引脚上

LAN8720A 内部是有寄存器的,I.MX6ULL 会读取 LAN8720 内部寄存器来判断当前的物理链接状态、 连接速度(10M 还是 100M)和双工状态(半双工还是全双工)。 I.MX6ULL 通过 MDIO接口来读取 PHY 芯片的内部寄存器,MDIO 接口有两个引脚,ENET_MDC 和 ENET_MDIO, ENET_MDC 提供时钟,ENET_MDIO 进行数据传输。一个 MIDO 接口可以管理 32 个 PHY 芯片,同一个 MDIO 接口下的这些 PHY 使用不同的器件地址来做区分,MIDO 接口通过不同的器件地址即可访问到相应的 PHY 芯片。I.MX6U-ALPHA 开发板 ENET1 上连接的 LAN8720A器件地址为 0X0,
所以我们要修改 ENET1 网络驱动的话重点就三点:

①、ENET1 复位引脚初始化。 ENET1_RST -->SNVS_TAMPER7
②、LAN8720A 的器件 ID。0x0
③、LAN8720 驱动

修改 ENET2网络驱动的话重点就三点:

①、ENET1 复位引脚初始化。 ENET1_RST -->SNVS_TAMPER8
②、LAN8720A 的器件 ID。0x1
③、LAN8720 驱动

下面开始修改文件。

  1. 终端输入:gedit include/configs/mx6ull_mybsp_emmc.h

下图为修改后:

  1. 删除 uboot 中 74LV595 的驱动代码,因为 NXP 官方I.MX6ULL EVK 开发板使用 74LV595 来扩展
    IO,两个网络的复位引脚就是由 74LV595 来控制的。I.MX6U-ALPHA 开发板并没有使用
    74LV595,因此我们将代码删除掉。745

终端输入:gedit board/freescale/mx6ull_mybsp_emmc/mx6ull_mybsp_emmc.c

修改前:

#define IOX_SDI IMX_GPIO_NR(5, 10)
#define IOX_STCP IMX_GPIO_NR(5, 7)
#define IOX_SHCP IMX_GPIO_NR(5, 11)
#define IOX_OE IMX_GPIO_NR(5, 8)

修改后:

#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)
  1. ENET1 的复位引脚连接到 SNVS_TAMPER7 上,对应 GPIO5_IO07,ENET2 的复位引脚连 接到
    SNVS_TAMPER8 上,对应 GPIO5_IO08。
    继续在 mx6ull_mybsp_emmc.c 中找到如下代码,将这个结构体全部删除:
static iomux_v3_cfg_t const iox_pads[] = { /* IOX_SDI */ MX6_PAD_BOOT_MODE0__GPIO5_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL), /* IOX_SHCP */ MX6_PAD_BOOT_MODE1__GPIO5_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL), /* IOX_STCP */ MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL), /* IOX_nOE */ MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
};
  1. 继续在mx6ull_mybsp_emmc.c 中找到函数 iox74lv_init和iox74lv_set,将这两个函数全部删除掉!
  2. 在 mx6ull_mybsp_emmc.c 中找到 board_init 函数,此函数是板子初始化函数,会被board_init_r 调用。

board_init 会调用 imx_iomux_v3_setup_multiple_pads 和 iox74lv_init 这两个函数来初始化
74lv595 的 GPIO,将这两行删除掉。至此,mx6ull_mybsp_emmc.c 中关于 74LV595 芯片的驱
动代码都删除掉了。

添加 I.MX6U-ALPHA 开发板网络复位引脚驱动

在 mx6ull_mybsp_emmc.c 中找到关键词:
①static iomux_v3_cfg_t const fec1_pads[]
②static iomux_v3_cfg_t const fec2_pads[]

需要追加下面内容:

MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),/* 初始化ETH1 RESET引脚 */

MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),/* 初始化ETH2 RESET引脚 */

继续在文件 mx6ull_mybsp_emmc.c 中找到函数 setup_iomux_fec。将这两个 IO 设置为输出并且硬件复位一下 LAN8720A,这个硬件复位很重要!否则可能导致 uboot 无法识别 LAN8720A。
追加内容如下:

static void setup_iomux_fec(int fec_id)
{if (fec_id == 0){imx_iomux_v3_setup_multiple_pads(fec1_pads,ARRAY_SIZE(fec1_pads));gpio_direction_output(ENET1_RESET, 1);gpio_set_value(ENET1_RESET, 0);mdelay(100);gpio_set_value(ENET1_RESET, 1);}else{imx_iomux_v3_setup_multiple_pads(fec2_pads,ARRAY_SIZE(fec2_pads));gpio_direction_output(ENET2_RESET, 1);gpio_set_value(ENET2_RESET, 0);mdelay(100);gpio_set_value(ENET2_RESET, 1);}
}

修改 drivers/net/phy/phy.c 文件中的函数 genphy_update_link

uboot 中的 LAN8720A 驱动有点问题,打开文件drivers/net/phy/phy.c,找到函数 genphy_update_link,这是个通用 PHY 驱动函数,此函数用于更新 PHY 的连接状态和速度。

终端输入:gedit drivers/net/phy/phy.c
搜索关键字:genphy_update_link
修改如下:

 /* LAN8720 must software*/
#ifdef CONFIG_PHY_SMSCstatic int lan8720_flag = 0;int bmcr_reg = 0;if (lan8720_flag == 0) {bmcr_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);     /* 读取寄存器BMCR默认值 */phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);     /* 软件复位,自动清零 */while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR) & BMCR_RESET) {udelay(100);         }phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg);    /* BMCR写入原来的值 */lan8720_flag = 1;}
#endif

重新编译uboot

./mx6ull_mybsp_emmc.sh

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_mybsp_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

下载烧录验证:

chmod 777 imxdownload  //给予 imxdownload 可执行权限
./imxdownload u-boot.bin /dev/sdg //烧写 u-boot.bin 到 SD 卡中

烧写完成以后将 SD 卡插入 I.MX6U-ALPHA 开发板的 TF 卡槽中,最后设置开发板从 SD卡启动。打开 SecureCRT,设置好开发板所使用的串口并打开,复位开发板。

在 uboot 中使用网络之前要先设置几个环境变量,命令如下:

setenv ipaddr 192.168.1.55
//开发板 IP 地址
setenv ethaddr 00:04:9f:04:d2:35
//开发板网卡 MAC 地址
setenv gatewayip 192.168.1.1
//开发板默认网关
setenv netmask 255.255.255.0
//开发板子网掩码
setenv serverip 192.168.1.250
//服务器地址,也就是 Ubuntu 地址
saveenv
//保存环境变量

SecureCRT的uboot中使用ping命令。

ping 192.168.1.250


有“host 192.168.1.250 is alive”这句,说明 ping 主机成功。

百度快照地址

[I.MX6UL] U-Boot移植(六) 网络驱动修改 LAN8720A_jianqiang.xue的博客-CSDN博客

[I.MX6UL] U-Boot移植(六) 网络驱动修改 LAN8720A(对比原子和NXP官方测试板的网络芯片LAN8720A , KSZ8081 (也是飞凌)唯独复位引脚不同595芯片也涉及改动)相关推荐

  1. [I.MX6UL] U-Boot移植(六) 网络驱动修改 LAN8720A

    I.MX6UL/ULL 内部有个以太网 MAC 外设,也就是 ENET,需要外接一个 PHY 芯片来实现网络通信功能,也就是内部MAC+外部 PHY 芯片的方案. I.MX6UL/ULL 有两个网络接 ...

  2. 重启linux没有网络配置文件,Linux 网络配置 修改DNS配置文件/etc/resolv.conf后,重启网络,DNS配置丢失...

    题记: 在执行命令: ping www.baidu.com ping不通,报错如下: 图1 很明显,这很有可能是DNS配置文件/etc/resolv.conf的问题. 去查看DNS配置文件,果然没有D ...

  3. WinCE的网络驱动实现原理

    1.WinCE的网络通信架构 WinCE的网络通信架构如图1所示,WinCE的网络通信架构中一个重要的角色是网络结构规范(NetworkDriver Interface Specification,N ...

  4. Linux 网络驱动实验(有线)

    目录 嵌入式网络简介 嵌入式下的网络硬件接口 MII/RMII 接口 MDIO 接口 RJ45 接口 I.MX6ULL ENET 接口简介 PHY 芯片详解 PHY 基础知识简介 LAN8720A 详 ...

  5. i.MX6ULL裸机篇(二)NXP官方SDK移植之踩坑 网口驱动

    MX6ULL官方SDK移植之踩坑 网口驱动 一.引言 NXP MX6ULL 网口移植其实主要修改底层驱动程序,LWIP协议通用,一般不用修改,这里主要和大家分享在Linux环境下移植修改网口驱动程序. ...

  6. Linux 网络驱动-内核网络驱动框架(二)

    net_device 结构体 Linux 内核使用 net_device 结构体表示一个具体的网络设备,net_device 是整个网络驱动的 灵魂.网络驱动的核心就是初始化 net_device 结 ...

  7. Y410P用虚拟机装Linux系统,OK6410、Linux2.6.36内核移植,DM9000 驱动移植

    对照这个结构体  将那些进行修改,注意  by  acanoe   的语句为修改重点. // add by acanoe 2 &s3c_device_nand,//这一语句为添加nand  设 ...

  8. linux内核网络驱动框架(linux驱动开发篇)

    网络驱动的核心: 1.就是初始化 net_device 结构体中的各个成员变量, 2.然后将初始化完成以后的 net_device 注册到 Linux 内核中 1.网络设备(用net_device结构 ...

  9. i.MX6ULL系统移植 | 移植NXP官方linux4.1.15内核

    更新时间 更新内容 2021-11-15 初稿完成 2022-07-28 更新网络驱动移植部分 一.NXP官方linux内核 1. 下载 NXP官方linux仓库地址为:https://github. ...

最新文章

  1. Java基础篇:IO流
  2. 子元素绝对定位absolute后,自动撑开宽度
  3. Task.Run vs Task.Factory.StartNew
  4. C# params关键字
  5. C#中排序的多种实现方式
  6. 网页测试本地服务器_音视频开发搭建一个直播服务器
  7. AndroidStudio打开新项目提示:Module: ‘app‘ platform ‘android-29‘ not found
  8. git的常用操作(个人整理使用)
  9. ejb 2.1 jboss_JBoss AS7 JNDI和EJB 3.1命名更改
  10. #淘宝#复制分享宝贝内容,打开淘宝APP,自己主动弹出宝贝提示信息
  11. 在Android NDK下打印log
  12. 编写android驱动程序,Android 驱动编写LED-NDK程序
  13. svn打分支与分支合并回主干
  14. 手把手教你配置苹果APNS推送服务|钿畑的博客 | 钿畑的博客
  15. DEDE织梦标签名称:{/dede:arclist} 详解
  16. python实现阿拉伯数字和罗马数字的互相转换
  17. kubernetes快速部署及常用命令
  18. 教你如何用R进行数据挖掘
  19. 红米6pro刷Android原生,红米6 Pro 魔趣OS 安卓9 MagiskV21版 完美ROOT 纯净完美 原生极简 纯净推荐...
  20. 高德AR驾车导航解决方案

热门文章

  1. python读取txt文件并分割成列表_在python中读取文本文件并将其拆分为单个单词
  2. IDA Pro 7.6 with M1 Max on wine+py3.8
  3. [ 深度学习 ] 胶囊网络(Capsule)
  4. 21天学通C语言-学习笔记(3)
  5. Xilinx SYSMON的应用
  6. 【CSDN官方】C技能树深度测评
  7. Java实现雪景图-Java项目实践学习-涉及Jframe/Jpanel等
  8. ACdream原创群赛(11)の风神日华神专场 C.神奇的%系列一
  9. 汽车大数据洞察:慧数汽车3·15专题篇《2019年汽车产品质量投诉分析》
  10. EPM3128ATC100-10N