一. 简介
正点原子 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。