RTL8019的使用及分析2

来源:互联网 发布:网络食品安全管理办法 编辑:程序博客网 时间:2024/05/17 07:01

4、驱动代码分析

 

了解网卡的工作流程,分析分析驱动程序是再好不过的方式了。

网上流传的rtl8019as的驱动还是比较多版本的,这里用的是U-boot-1.1.6中的rtl8019as的驱动:


5、驱动流程总结

 

上面简单的分析了一下在U-boot-1.1.6中的rtl8019as的驱动程序。需要注意的是,这个驱动程序是针对8位DMA的,每次的读写都是一个BYTE.RTL8019AS还支持16位DMA模式,如果使用的是这个模式的话,就需要修改驱动程序了,因为每次DMA的读写单位都是2BYTE.其他还需要注意的是寄存器的地址问题。
下面来稍稍总结一下rtl8019as驱动的工作流程。
eth_init:初始化NIC
A,首先向reset寄存器中写入任意的值,使NIC复位
1,设置CR,设置停机状态位
2,设置DMA模式(8位/16位)
3,传输模式设置为loopback模式
4,配置接收缓冲范围和发送缓冲范围
5,清除中断寄存器位并使能一些中断
6,设置本机的MAC地址
7,设置本机的多播地址
8,配置BOUNDARY寄存器和CURRENT寄存器的初始值(发送缓冲的首地址)
9,置CR为开机模式
10,置传输模式为normal模式

nic_to_pc(读取一帧数据):
将boundary值写入REMOTESTARTADDR
设置REMOTECOUNT为4,然后读取4个字节(rtl8019as的帧头长度)
根据帧头中读到的帧状态,帧长度,下一帧的页地址来读取RAM中的本帧数据
将数据交由上层协议处理
将得到的下一帧的起始页数写入boundary寄存器

eth_rx(读取RAM中接收到的数据):
1,读取中断状态寄存器,并判断其值。
a)当中断状态为RAM溢出位被置位时。
2,此时将NIC设置为停机状态(不接收数据)且设为内部loopback模式。
3,反复调用nic_to_pc一帧一帧的读取数据,直到current和boundary值相等。
4,退出内部loopback模式
b)当中断位表示帧被正确的接收时。
2,反复调用nic_to_pc一帧帧的读取数据,直到current和boundary值相等(此时已无数据所能读)
c)如果没有数据收到
2,退出

eth_send(发送数据):
1,轮询CR寄存器的状态,等待DMA传输的结束
2,在REMOTESTARTADDR中设置传输的起始地址
3,在REMOTEBYTECOUNT中设置传输的长度
4,将CR设置为remote write模式
5,循环将需要发送的数据写入RAM(不够60个字节则用0补全)
6,等待DMA操作完成(轮询中断状态寄存器)
7,清除中断状态寄存器
8,在TRANSMITPAGE中写入初始page
9,在TRANSMITBYTECOUNT中写入传输长度
10,设置CR,启动数据发送

原创粉丝点击