首页 理论教育RTL8019AS网络底层驱动程序设计成果

RTL8019AS网络底层驱动程序设计成果

【摘要】:RTL8019AS的驱动程序包括芯片的初始化程序,接收数据程序和发送数据程序。RTL8019AS有两块内部RAM,一块16KB的RAM,用来存储转发的数据;另一块为32B的RAM。由于RTL8019AS接收或发送是以页为单位的,因此即使某页没有完全填满数据,下一包数据也不能继续使用该页,只能使用新的页。接收数据后,在RTL8019AS中数据的存储格式如图9-14所示。

RTL8019AS的驱动程序包括芯片初始化程序,接收数据程序和发送数据程序。该控制器收发数据以内部的RAM为核心。RTL8019AS有两块内部RAM,一块16KB的RAM,用来存储转发的数据;另一块为32B的RAM。16KB存储区是分页的,每256个字节称为一页,共有64页,程序设计中使用这块RAM存储接收或是发送数据包。由于RTL8019AS接收或发送是以页为单位的,因此即使某页没有完全填满数据,下一包数据也不能继续使用该页,只能使用新的页。并且数据是按页连续存放的,这16KB的RAM可由用户进行配置,一部分用来存放接收的数据包,一部分用来存储发送的数据包,但是地址不能交错。

用户通过DMA方式访问16KB的RAM,该RAM为双端口RAM。双端口是指由两套总线连接该RAM,控制器通过总线a对内部RAM进行DMA访问。为了区别主机和芯片两种访问,称这种访问为本地DMA访问;而由CPU通过总线b进行的RAM访问称为远程访问。用户不用担心两种访问会有冲突,芯片内部有防止冲突的仲裁机构。并且由于CPU一侧的远程访问操作要比本地DMA访问慢得多,所以不需要等待时序,可以和本地访问同时进行,互不影响。

驱动程序将已经封装好的待发送的数据按照指定的格式写入芯片,并启动发送命令,数据被发送出去。同样芯片接收到物理信号后将其还原成数据,按照一定的格式,存入RAM中并通知主程序,下面详细讲解驱动程序。

1.RTL8019AS的初始化

完成复位之后,要对RTL8019AS的工作参数进行设置,以使网卡开始工作。主要的设置内容为:pstart接收缓冲区的起始地址;pstop接收缓冲区的结束页地址;bnry指向最后一个已经读取的页;curr指向当前的接收结束页地址。在设置寄存器的时候,应先使其在停止模式,然后设置。

2.发送数据程序

作为一个集成的以太网芯片,数据的发送校验,总线数据包的碰撞检测与避免是由芯片自己完成的。先将数据按照图9-13所示的格式放入RAM中,设定发送数据的起始页地址和发送的长度,然后填写发送命令,芯片会自动地将数据转化为物理帧格式在物理信道上传输,同时发送的结果会写入状态寄存器。可以通过查询该寄存器判断数据是否成功发送出去,以便进行后续处理。由于该芯片寄存器分为4页,因此对某一寄存器进行操作的时候,首先要明确寄存器所属的页,并选中该页,然后进行相应的操作。主要操作如下:

1)长度判断。因为以太网报文要求最小字节数为60,所以在发送报文前要判断报文长度是否符合标准。若长度过小则添加字段,不能小于最小长度,而最大报文长度则由上层应用控制。

2)选定发送缓冲区。在初始化的时候,系统定义了两个发送缓冲区,当一个缓冲区正在发送数据的时候,如果还有数据需要发送,可以先把数据转移到第二个发送缓冲区中,这样当第一个发送完毕之后,可以立即发送第二个缓冲区中的数据,提高发送效率

3)设置发送字节长度。

4)复制数据。将数据复制到RTL8019AS发送缓冲区,即芯片内部RAM中。

5)发送报文。发送报文时先判断上一个数据报文是否发送完毕,若没有发送完毕则等待或重发,否则发送当前报文。

发送数据时的数据填充格式如图9-13所示。

978-7-111-35607-3-Chapter09-34.jpg

图9-13 发送数据时的数据填充格式

3.接收数据程序

当数据到来的时候,芯片会将物理信号翻译为数据,然后将数据按照图9-14所示的格式放入预先设置的RAM中,主程序通过查询或是接收中断的方式得知有新的数据到来。数据接收到之后,会放到由pstart和pstop两个寄存器所限定的循环列队中,数据的读写受指针curr和bnry的控制,芯片写完接收缓冲区一页,自动的使curr递增;bnry要由用户来操作,每从RAM中取走一页数据,将bnry递减,并写到bnry中。curr和bnry主要用来控制缓冲区中数据的存取,如果curr=bnry+1时,表示没有接收到数据包;当上述条件不成立时,表示接收到新的数据包,然后读取数据包,直到上述条件成立时,表示所有的数据包已经读完,此时停止读取数据包。在初始化的时候使curr=bnry+1。注意,当curr递增到pstop时,将curr置为环形接收区的首页pstart。同样,当bnry加到最后的空页pstop时,同样要手动将bnry变为第一个接收页pstart。这样就可以组成一个循环的数据接收区。接收数据后,在RTL8019AS中数据的存储格式如图9-14所示。

978-7-111-35607-3-Chapter09-35.jpg

图9-14 接收数据的存储格式

主要操作如下:

1)判断curr=bnry+1是否成立,如果不成立,说明有新的数据到来,否则继续查询。

2)若有报文到达,判断报文是否正确。主要是判断接收到报文后,芯片自动计算的CRC校验是否正确。若没有出错标志,则说明报文接收正确。

3)接收到正确的报文后,读出报文到系统缓冲区,否则丢弃。

4)判断接收的数据是否为ARP报文或IP报文,如果是则置相应的标志,否则丢弃。(www.chuimin.cn)

接收数据包流程如图9-15所示。

978-7-111-35607-3-Chapter09-36.jpg

图9-15 接收数据包流程图

4.驱动程序头文件driver.h

驱动程序头文件driver.h定义如下:

978-7-111-35607-3-Chapter09-37.jpg

978-7-111-35607-3-Chapter09-38.jpg

5.驱动程序

该程序定义全局变量,网络底层驱动程序,校验和计算,对CPU和RTL8019AS初始化。

驱动程序driver.c设计如下:

978-7-111-35607-3-Chapter09-39.jpg

978-7-111-35607-3-Chapter09-40.jpg

978-7-111-35607-3-Chapter09-41.jpg

978-7-111-35607-3-Chapter09-42.jpg

978-7-111-35607-3-Chapter09-43.jpg

978-7-111-35607-3-Chapter09-44.jpg

978-7-111-35607-3-Chapter09-45.jpg

978-7-111-35607-3-Chapter09-46.jpg

978-7-111-35607-3-Chapter09-47.jpg

978-7-111-35607-3-Chapter09-48.jpg

978-7-111-35607-3-Chapter09-49.jpg

978-7-111-35607-3-Chapter09-50.jpg