二、网络驱动的读写操作:
读写操作都有两种方式,一种是中断方式,另一种是查询方式。中断方式是指由中断来判断操作是否完成了;查询方式是指查询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来进行操作,读写时序如下:
其中,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芯片手册。