调试soc3210的网卡驱动(3)

二、网络驱动的读写操作:

读写操作都有两种方式,一种是中断方式,另一种是查询方式。中断方式是指由中断来判断操作是否完成了;查询方式是指查询OWN的值,直到它变为0,这时操作完成。在这里,我们用查询方式来进行发送,用中断方式接收数据。

1、读取接收到的数据

判断当前的接收描述符的OWN位是否为0,如果为0表示MAC接收数据完毕。否则发生错误,返回。

读取status字段的第15位,如果为1,发生了错误,返回。

读取status字段中的16~29位,获取数据帧长度len,其中最后4个字节为CRC32值。

从addr字段中获取地址,读取该地址的数据,这len-4个字节的数据就是接收到的数据。

清0网口状态寄存器的数据接收相关的中断状态位。

置该接收描述符的OWN位,以准备下次的接收。

2、发送一帧数据

设置发送描述符的地址addr为将要发送数据的缓冲区。

设置发送描述符的控制ctrl的29和30位,表示只发送一帧;设置发送数据的长度。

设置发送描述符的status的OWN。

往发送查询请求寄存器MAC_TX_POLL_REQ,即CSR1写入非零值,这样就开始发送了。

最后查询OWN为是否为0,如果为0,则发送操作完成,然后清零网口状态寄存器的与数据发送相关的中断状态位。

三、MII接口监控PHY:

这里的MII接口是通过SMI来进行操作,读写时序如下:

调试soc3210的网卡驱动

其中,MDC、MDO、MDEN、MDI信号变化,对其操作可通过寄存器的 MAC_SMI_EEPROM_CTL的 19 位至 16 位完成。

而PHY地址是根据PHY芯片的硬件上下拉电阻来决定的,具体对应PHY芯片实际硬件电路图和对应的手册。

Register地址在对应的PHY芯片手册里可以查到。

确定PHY地址还有一个办法,那就是查询PHY的内置ID号一决定PHY地址。查看RTL8201B知道第3个寄存器的值是一个固定值8201,那么设PHY地址从0到30,读取第3个寄存器,判断是否为0xffff,如果是,表示该地址没有PHY芯片,如果是8021,那么得到该PHY芯片的地址,如果是其它值,那么得到其它PHY芯片的地址。

这样,通过SMI接口,就可以读取PHY里面的状态,及修改PHY的设置,从而达到监控PHY的目的。具体各个寄存器的意义对应具体的PHY芯片手册。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwjdyf.html