jingleisi 2011-07-30
这段时间在移植LWIP到ucos2上时,需要调试网卡驱动,平台是SOC3210i
就调试这一驱动的过程中尝试由下面的话来概括和感受下调试网卡驱动的过程:
首先我们得知道这个网卡系统实际上是由什么模块组成:
MAC控制器和PHY芯片
那么这两个模块是什么,起什么作用,摘自网络一段话:
网卡工作在osi的最后两层,物理层和数据链路层,物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。物理层的芯片称之为PHY。数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。以太网卡中数据链路层的芯片称之为MAC控制器。很多网卡的这两个部分是做到一起的。
而SOC3210的MAC控制器和PHY是分开两部分的,分别对应实际硬件是:DC2114A和RTL8201B
其中,CPU是与MAC控制器打交道,而MAC控制器再与PHY打交道。那么CPU能不能直接与PHY打交道?那就需要MII接口,即媒体独立接口,通过它应用程序就可以监视和控制PHY。
一、网卡的初始化的流程:
1、复位MAC控制器
设置MAC总线模式寄存器的SWRESET位,并在查询该位,如果被清0了,那么复位成功。
2、设置MAC中断使能位
这里的中断使能位,是指控制器内部的中断配置,选择是否使能发送中断,或者接收中断,这里我们用查询发送,中断接收。所以只
置位了NINTE和RXIE。
3、开始初始化接收和发送描述符
网络数据的接收和发送,都是由MAC的DMA进行数据传输,而DMA就是根据描述符指定的信息来获取正确的数据,描述符是一个链表,其中将表头的指针保存到MAC0_RX_LIST_BASE_ADDR和MAC0_TX_LIST_BASE_ADDR就可以了。对于描述符链表,实际上就是有多个描述符组成,通常,它们的连接方式有两种:环模式和链模式。
这两种模式的区别是:
在“链”模式下,每个描述符中都存有一个指针,指向链表中下一个描述符的地址。在“环”模式下,链表中下一个描述符同当前描述符末尾的地址
间隔是固定的,存放在0号控制状态寄存器即总线模式寄存器中的DSL域中。
这里我们用链模式。也就是每个描述符只能保存一帧数据,同时指向下一个描述符。
在代码中用结构体描述:
58 /* Tx and Rx Descriptor */
59 typedef struct {
60 u32_t status;
61 u32_t ctrl;
62 u32_t addr;
63 u32_t next;
64 } eth_desc_t;