基于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结构必须包含。并放置在结构的第一项。
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结构必须包含。并放置在结构的第一项。
VxWorks 嵌入式 ARM S3C2410 半导体 滤波器 总线 收发器 电路 相关文章:
- 基于VxWorks的NAND FLASH驱动程序设计(07-31)
- 空间机器人中央计算机的双机热备份(08-15)
- 风河VxWorks全新升级尽显Java嵌入式开发优势(09-10)
- 基于VxWorks实时操作系统的通信模型设计(12-03)
- 使用BCM56500实现板级高性能交换型路由器(06-07)
- 基于VxWorks的网络接口设计(06-21)