概述
本文将从基础知识说起,详细介绍关于mac_to_mac连接模式的一些概念,并且将结合代码层面进行说明,讲解调试思路。
常见的嵌入式网络架构
嵌入式网络硬件分为两部分:MAC 和 PHY,大家都是通过看数据手册来判断一款 SOC 是否支持网络,如果一款芯片数据手册说自己支持网络,一般都是说的这款 SOC 内置 MAC,MAC 类似 I2C 控制器、SPI 控制器一样的外设。但是光有 MAC还不能直接驱动网络,还需要另外一个芯片:PHY,因此对于内置 MAC 的 SOC,其外部必须搭配一个 PHY 芯片。
一个完整的嵌入式网络接口硬件:
MAC芯片
以ast1520芯片为例子,它自带有两个MAC外设,一个 MAC 连接一个 PHY 芯片形成一个完整网络接口(当然也可以与交换芯片的mac口直接相连,后续有说明)。它内部自带的 ENET 外设其实就是一个网络 MAC,支持 10/100/1000M。实现了三层网络加速,用于加速那些通用的网络协议,比如 IP、TCP、UDP 和 ICMP 等,为客户端应用程序提供加速服务。MAC 内核拥有硬件加速处理单元来提高网络性能,硬件加速单元用于处理 TCP/IP、UDP、ICMP 等协议。通过硬件来处理帧头等信息,效果要比用一大堆软件处理要好很多。ENET 外设有一个专用的 DMA, 此 DMA 用于在 ENET 外设和 SOC 之间传输数据,并且支持可编程的增强型的缓冲描述符。
MAC芯片一般是嵌在了主控芯片的外设上,我们在编写驱动的时候其实并不需要关注 ENET外设的具体内容,因为这部分驱动是 SOC 厂商编写的,我们只需要在此基础上做外部phy芯片的调节即可。
PHY芯片
SOC 可以对 PHY 进行配置或者读取PHY 相关状态,这个就需要 PHY 内部寄存器去实现了。PHY 芯片寄存器地址空间为 5 位,地址 0~31 共 32 个寄存器,IEEE 定义了 0~15 这 16 个寄存器的功能,16~31 这 16 个寄存器由厂商自行实现。也就是说不管你用的哪个厂家的 PHY 芯片,其中 0~15 这 16 个寄存器是一模一样的。仅靠这 16 个寄存器是完全可以驱动起 PHY 芯片的,至少能保证基本的网络数据通信,因此 Linux 内核有通用 PHY 驱动,按道理来讲,不管你使用的哪个厂家的 PHY 芯片,都可以使用 Linux 的这个通用 PHY 驱动来验证网络工作是否正常。
PHY ID 寄存器 1 和 ID 寄存器 2,地址为 2 和 3,后面就成为寄存器 2 和寄存器 3。IEEE 规定寄存器 2 和寄存器 3 为PHY 的 ID 寄存器,这两个寄存器组成一个 32 位的唯一 ID 值。驱动代码里都是通过读取该值匹配相应的phy驱动的。
switch交换芯片
PHY芯片,主要是将这些模拟信号进行解码,通过MII等接口,将数字信号传送出去。在解码的过程中,它只是做信号的转换,而不对数字信号进行任何的处理,即使一帧有问题的数据,它也会如实的转发出去。
switch芯片,应该是对帧数据的内容做处理,更新MAC地址列表等等。集成了多个PHY芯片在里面,可以选择数据发送的通路。常见的交换芯片有Realtek系列、Broadcom系列等。
RJ45接口
网络设备是通过网线连接起来的,插入网线的叫做 RJ45 座,RJ45 座要与 PHY 芯片连接在一起,但是中间需要一个网络变压器,网络编译器用于隔离以及滤波等,网络变压器也是一个芯片但是现在很多 RJ45 座子内部已经集成了网络变压器。RJ45 座子上一般有两个灯,一个黄色(橙色),一个绿色,绿色亮的话表示网络连接正常,黄色闪烁的话说明当前正在进行网络通信。这两个灯由 PHY 芯片控制,PHY 芯片会有两个引脚来连接 RJ45 座上的这两个灯。
如上所说你就是常见的嵌入式网络架构,通常是arm芯片上自带mac芯片,然后外接一个phy芯片来达到上网的功能。但是在嵌入式产品中,典型的如交换机,很可能核心就是一个交换机芯片。高级的交换机芯片允许通过管理口IMP进行配置,这个IMP口通常连接到嵌入式cpu的网口上。这个cpu和交换机芯片都在同一个紧凑电路板上,如果它们之间再经过2个phy,实在浪费钱和电。于是另一种经典应用诞生了: MAC to MAC。
mac_to_mac模式与mac_phy模式的区别
对于PHY芯片来说,它只能实现一路进一路出,而不能实现一路进多路出或者多路进多路出。
对于switch芯片来说,它里面自带了mac控制器,所以可以多进多出的效果,可以把交换芯片当做成一个phy芯片来使用,也可以把switch芯片当做mac控制器来使用,与CPU之间采用MAC-TO-MAC的连接方式。
软件调试思路
①首先还是mdio通路的验证,看switch芯片是否在该工作模式下,如果在uboot提供了mdio读写工具,可以优先考虑在uboot中进行验证。
②看arm的固定连接模式时怎么配置的,先尝试配置设备树的方式,如果不可行,那么再去跟踪mac驱动加载的流程:
1.设置成固定连接速度与工作模式,不与phy进行交换,不去读取phy的信息。
2.禁用掉phy的中断。
3.不进行phy芯片的复位操作。
4.连接模式改成1,认为始终是连接着的。
③arm设置固定连接完毕,mdio通路也是通的,下一步就是交换芯片的配置,把交换芯片对应的mac口设置成固定连接模式即可。