基于BM3803MG与VxWorks的BSP的设计实现 02
![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
基于BM3803MG与VxWorks的BSP的设计实现 02
2.3 驱动程序的实现
2.3.1 SENS协议栈
VxWorks支持可裁减的增强型网络堆栈SENS(Scalable Enhanced Networks Stack),提供了可替换的网络设备驱动程序。SENS 的基本层次结构与传统的TCP/IP网络协议栈相似,但SENS最大的特点是在数据链路层和网络协议层之间多了MUX层。在SENS中,网络接口的驱动程序即END网络驱动程序处于数据链路层。IP层和TCP/ UDP层合称为网络协议层。在数据链路层和网络协议层之间有应用程序接口(API),这个接口在SENS中称为MUX(Multiplexer)接口。MUX层直接与END 驱动程序相交互,其应用程序提供了独立于网络协议的驱动程序接口,可以与多个独立的END驱动程序同时交互。接口层MUX 起到了隔离网络协议和网络驱动程序的作用,并管理协议层和数据链路层之间的通信,使数据的发送和接收过程变得简单,而不需要通过挂接钩子函数来解决[5]。
2.3.2 编程架构
KSZ8851-16mll BIU主机接口是间接存取数据的总线接口。共享数据总线SD[15:0]由CMD控制信号来决定是地址线还是数据线。由于KSZ8851-16mll 是单端口芯片,外界与芯片只能通过单端口进行交互。下面简单介绍KSZ8851-16mll 的寄存器的读写以及数据的接收与发送过程。
(1)寄存器读写操作
访问KSZ8851-16mll寄存器需要两个步骤:①置CMD为高,写寄存器的偏移地址和字节使能号(BEn)到共享数据总线上;②置CMD为低,读或者写数据到共享数据总线上。
本文网卡芯片采用大端模式,并且芯片的CMD管脚与主机的地址线A2相连,可以得到KSZ8851-16mll 读写寄存器的两个重要操作程序:
读寄存器:
*((volatile unsigned short*)(KS8851_IO_BASE+CMD_HIGH))=(unsigned short)(addr | ((BE1 | BE0) <<
((addr+2) & 0x02)));
*data= *((volatile unsigned short *)(KS8851_IO_BASE +
CMD_LOW ));
写寄存器:
*((volatile unsigned short * )(KS8851_IO_BASE +
CMD_HIGH )) =(UINT16)( addr | ((BE1 | BE0) <<
((addr+2) & 0x02)));
*((volatile unsigned short *)(KS8851_IO_BASE +
CMD_LOW )) = ( UINT16 )( data );
其中,KS8851_IO_BASE表示网卡芯片基地址,CMD_LOW=0(CMD=0),表示共享数据总线是数据线;CMD_HIGH=4(CMD=1),表示共享数据总线是地址线。
(2)数据包接收
KSZ8851-16mll软件驱动以中断方式接收数据包,当操作系统接收到中断时,会调用中断向量表的中断服务程序处理网卡中断(包括对错误的检查和状态的改变),中断服务程序把从网卡的接收缓存传输到系统缓存的所有费时工作都放在任务层里完成。KSZ8851-16mll接收包的具体流程如图3所示。
(3)数据包发送
上层应用程序调用KSZ8851-16mll的发送程序实现通过以太网控制器传送连续的数据块,如图4所示。数据包的发送主要是依靠KSZ8851-16mll中的发送数据缓存区,软件驱动将发送数据写入发送数据缓冲区。当网卡芯片检测到处理器发来的数据发送信号后,将写入发送缓冲区的数据包处理成Ethernet数据包的形式进行发送。如果以太网控制器传输数据时出现错误,用户可以决定重新发送该帧数据还是丢弃该帧数据。
![](http://embed.chinaitlab.com/UploadFiles_4615/201306/20130611110626289.jpg) |
|
|
|
|
|