一. 简介
正点原子 ALPHA开发板,包括我们移植的 Uboot,都是参考了 NXP(恩智浦)官方的开发板的。
I.MX6UL/ULL 内部有个以太网 MAC 外设,也就是 ENET ,需要外接一个 PHY 芯片来实现网络通信功能,也就是内部 MAC+ 外部 PHY 芯片的方案。
二. NXP官方uboot针对ALPHA开发板网络驱动更改
1. I.MX6U-ALPHA 开发板网络简介
(1) 网络方案:
I.MX6UL/ULL 内部有个以太网 MAC 外设,也就是 ENET ,需要外接一个 PHY 芯片来实现网络通信功能,也就是内部 MAC+ 外部 PHY 芯片的方案。
大家可能听过 DM9000 这个网络芯片,在一些没有内部 MAC 的 CPU 中,比如三星的 2440 , 4412 等,就会采用 DM9000 来实 现联网功能。 DM9000 提供了一个类似 SRAM 的访问接口,主控 CPU 通过这个接口即可与 DM9000 进行通信, DM9000 就是一个 MAC+PHY 芯片。这个方案就相当于外部 MAC+ 外部 PHY 。
I.MX6U 这样的内部 MAC+PHY 芯片与 DM9000 方案比有什么优势吗?那优势大了去了!
首先,是通信效率和速度,一般 SOC 内部的 MAC 是带有一个专用 DMA 的,专门用于 处理网络数据包,采用 SRAM 来读写 DM9000 的速度是压根就没法和内部 MAC+ 外部 PHY 芯 片的速度比。采用外部 DM9000 完全是无奈之举,谁让 2440 , 4412 这些芯片内部没有以太网 外设呢,现在又想用有线网络,没有办法只能找个 DM9000 的方案。从这里也可以看出,三星 的 2440 、 4412 这些芯片设计之初就不是给工业产品用的,他们是给消费类电子使用的,比如手 机、平板等,手机或平板要上网,可以通过 WIFI 或者 4G ,我是没有见过哪个手机或者平板上 网是要接根
网线的。正点原子的 I.MX6U-ALPHA 开发板也可以通过 WIFI 或者 4G 上网,这个 是后话了。
(2) NXP官方IM6ULL开发板与正点原子ALPHA开发板各自所使用的 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 芯片以后如何调整网络驱动,使 网络工作正常。
2. PHY网络芯片LAN8720A
(1) LAN8720A硬件接口
正点原子的 I.MX6U-ALPHA 开发板提供了这两个网络接口,其中 ENET1 和 ENET2 都使用LAN8720A 作为 PHY 芯片。
PHY网络芯片 LAN8720A是通过什么接口与 IMX6ULL芯片连接的?
LAN8720A 内部是有寄存器的, I.MX6ULL 会读取 LAN8720 内部寄存器来判断当前的物理链接状态、连接速度 (10M 还是 100M) 和双工状态 ( 半双工还是全双工 ) 。
I.MX6ULL 通过 MDIO 接口来读取 PHY 芯片的内部寄存器, MDIO 接口有两个引脚, ENET_MDC 和 ENET_MDIO , ENET_MDC 提供时钟, ENET_MDIO 进行数据传输。
一个 MDIO 接口可以管理 32 个 PHY 芯片,同一个 MDIO 接口下的这些 PHY 使用不同的器件地址来做区分, MIDO 接口通过不同的 器件地址即可访问到相应的 PHY 芯片。
对于正点原子的 ALPHA开发板而言, ENET1的PHY ADDR是0x0,ENET2的PHY ADDR是0X1.
网络数据连接:
通过原理图可以知道,拿 网口 ENET1来说,网络数据的传输通过 ENET1_TXD0,ENET1_TXD1,ENET1_TXEN,ENET1_RXD0,ENET1_RXD1,ENET1_RXER这些引脚进行的。
复位引脚:
每个LAN8720都有一个复位引脚,ENET1是SNVS_TAMPER7,ENET2是SNVS_TAMPER8。
(2) LAN8720A驱动说明
注意:IEEE802.3对 网络PHY芯片做了规定,规定了 网络PHY芯片的地址 0~15位共16个寄存器的功能。前 16个寄存器的功能都必须保持一致。而且前 16个寄存器可以保证将 PHY网络芯片驱动起来。
因此,就会存在一个通用 PHY驱动。即通用PHY驱动就能驱动所有的 PHY芯片。
LAN8720驱动,因为所有的PHY,其前16个寄存器一模一样,因此uboot里面已经写好了通用PHY驱动,所以理论上不需要修改。
三. 总结
综上所述,
我们要更改 网络 ENET1 网络或 ENET2 网口驱动,重点是更改三点:
① LAN8720A 的器件 ID,即更改 PHY芯片的 ADDR。
② 删除原有的74LV595相关代码。
③ ENET2 复位引脚初始化,具体就是 添加ALPHA开发板的网络复位IO。