微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > 基于ARM9的VxWorks增强型网络驱动设计

基于ARM9的VxWorks增强型网络驱动设计

时间:04-07 来源:互联网 点击:
4 END驱动程序相关函数的设计

END网络驱动程序相关处理函数的设计是网络驱动和管理的关键部分,它包括ioctl、收/发处理、中断处理函数和网络驱动程序函数。

(1) ioctl函数的编写

ioctl函数主要完成网卡的启动和停止,以及MAC地址的设置等,由文件cs8900aEnd.c中的es8900aloctl()函数实现。在函数中可以通过输入命令行参数分别对设置MAC地址请求、获取MAC地址请求、设置设备标志、获取设备标志、启动轮询操作、结束轮询操作、返网MIB信息、返同第一个最小的缓冲区和返同头的大小等进行参数设置。

(2)数据接收函数的编写

为了保证数据帧接收的实时性,在cs8900aRecv()函数中使用中断的方式处理数据帧的接收。中断中应尽可能做较少的处理,所以当网络设备产生中断时,用户中断服务程序最好包含任务级别的处理服务程序.可以通过调用netJobAdd()实现。它接收一个程序指针和多达5个附加自变量,可以将应用程序用来处理数据包的入口点设定为任务级别。然后把任务放入tNetTask队列,可以用tNetTask来处理任务级别的网路处理。只要tNetTask队列中有函数,它就会一直工作,直到队列为空,进入睡眠状态。

当有数据到达网络设备时,触发中断进入中断服务程序cs8900aEndInt。在中断服务程序里查看中断状态寄存器,如果ReceiveComplete位为高则进入cs8900aMacRxInt()。在cs8900aMacRxInt()中关闭中断.并调用BeOobAdd()将cs8900aEndHandleRcvInt()添加到tNetTask要处理的网络任务队列中。cs8900aEndHandleRevlnt()主要完成以下工作:

通过netClBtkGet()来预定一个clBlk结构;

通过netClBlkJoin()把clBlk结构链接到包含数据包的cluster;

通过netMblkGet()来预定一个mBlk结构;

通过netMblkClJoin()把mBlk连接到clBlk、cluster;

通过netClusterGel()重新预定一个cluster给收缓冲描述符供下次接收使用;

重新开启中断。

(3)数据发送函数的编写

数据帧的发送不采用中断模式,直接调用底层驱动发送函数cs8900aEndSend()。发送的步骤如下:1.用户凋用write()通过socket套接字访问网络;2.网络协议拷贝到网络缓冲区,并调用协议驱动的发送程序;3.协议驱动发送程序调用muxSend()启动发送;4.muxSend()通过调用send()回调函数,把缓冲区传递给END;5.数据发送程序cs8900aEndSend()调用netMblkToBufCopy()将数据拷贝到缓冲中,并立即发送出去。拷贝完成后,调用netMblkClChainFree()释放所有链中的mBlk缓冲并归还到内存池。

(4)修改cs8900a.h文件

由于S3C2410A芯片内部集成了MAC控制器,由芯片内部寄存器进行控制。因此不需要为网卡模块另外分配外设端口或映射寄存器地址。虽然S3C2410A芯片和物理层接口芯片在外部足两个部分,但是从开发的角度看它们是一个整体。在cs8900a.h文件中主要完成一些基本配置的设定:

#define CS_CHIP_FRAME_BUF_SIZE    (2048)
#define CS_PKTPG_DMA_NUM    (0x0024)
#define CS_INIT_DMA_NUM    (3)
#define CS_INIT_INT_NUM   (0)
#define CS_CHIP_MEM_BASE    (0x28100000)
#define CS_CHlP_IO_BASE   (0x28000000)
#define CS_CHIP_IO_0FFSET   (0x300)
#define CS_CHIP_MEM_OFFSET    (0)

(5)修改cs8900aEND.c文件

cs8900aEND.c  主要完成设备驱动程序函数的编写:
//从MIB获取硬件地址
#define END_HADDR(pEnd) ((pEnd)->mib2Tbl.ifPhysAddress.phyAddress)
#defitae END_HADDR_LEN(pEnd) ((pEnd)->mib2Tbl.ifPhysAddress.addrLength)
//配置设定
#define END_BUFSIZ  (ETHERMTU+SIZEOF_ETHERHEADER+6)
#define END_SPEED_10M    10000000    /*10Mbs*/
#define END_SPEED     END_SPEED_10M
//定义名称
#define  DRV_NAME    "cs"
......

然后添加驱动控制结构,其结构如下:

typedef struct end device
{
END_0BJ end    //继承的END_OBJ结构
int unit;     //设备单元数
int ivecBdmaTx;    //bdmaTx中断向量
int ivecBdmaRx;    //bdmaRx中断向量
......
UCHAR csAddr[6];    //以太网地址
CACHE_FUNS * cacheFuns;   //高速缓冲功能函数指针
......
}

该结构中的内容是根据网络设备和用户需要而设计的,其中END_OBJ结构必须包含。并放置在结构的第一项。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top