您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > vxworks-END驱动编写概述
END驱动编写概述Byfreelife1.介绍增强型网络驱动(END)是SOI模型中数据链路层的实现,它通过MUX函数和网络服务通信。2.驱动操作2.1添加驱动到VxWorks添加驱动到VxWorks系统就像添加其他的应用一样。第一步是编译并把驱动代码包括在VxWorks镜像中。由于VxWorks允许创建一个以上的网络设备,所以必须需要对配置设备的相关的#define进行分组。定义在target/config/bspname/configNet.h里面。以下是网络设备描述的一个例子。在系统中应该添加类似的描述到configNet.h文件中。#defineMOT_FCC_LOAD_FUNCsysMotFccEndLoad#defineMOT_FCC_LOAD_STRINGIMPORTEND_OBJ*MOT_FCC_LOAD_FUNC(char*,void*);在每一个网络设备的配置中,应该定义以上两个常量,以下对着两个常量进行说明:LOAD_FUNC:规定驱动endLoad()函数的入口点。例如,如果驱动的endLoad()入口点是sysMotFccEndLoad(),那么编辑configNet.h包括以下的定义:#defineMOT_FCC_LOAD_FUNCsysMotFccEndLoadLOAD_STRING:在网络初始化过程中,作为initString参数,传递给muxDevLoad()的初始化参数。这个字符串也一并传给endLoad()函数,它的内同取决于驱动的需要。必须编辑endDevTbl()的定义(在configNet.h中规定包括在镜像中的ENDS)从而包含被加载的每一个设备的入口。例如:END_TBL_ENTRYendDevTbl[]={{0,LOAD_FUNC_0,LOAD_STRING_0,BSP_0,NULL,FALSE},{1,LOAD_FUNC_1,LOAD_STRING_1,BSP_1,NULL,FALSE},{0,END_TBL_END,NULL,0,NULL,FALSE},};上面的第一个参数规定设备号。在昀后的FALSE表示入口还没有被处理。在系统成功的加载驱动后,这个值变为TRUE。如果想要禁止系统自动加载驱动,那么可以把这个值设为TRUE。这样,就准备好重新编译VxWorks从而包括新的END驱动。当新编译的VxWorks启动时,系统给在table中每一个设备按照列出来的顺序调用muxDevLoad()。2.2网络初始化步骤在系统启动后,VxWorks产生tUsrRoot任务初始化网络。usrRoot()调用usrNetInit();在1usrNetInit()中调用sockLibAdd(),sockLibAdd()再调用bsdSockLibInit来添加BSDsocket库接口。在usrNetInit()中还调用usrNetProtoInit()来初始化各种协议。usrNetInit()还调用muxDevLoad()和ipAttach()。muxDevLoad()然后调用驱动中的endLoad()函数。在muxDevLoad()加载驱动之后,调用muxDeStart()函数,它调用驱动中的endStart()函数。endStart()函数应该激活驱动并且用相应的中断连接程序把中断服务程序连接到相应的结构和BSP中。下图简单的说明了初始化的过程2.3接收帧当有中断发生的时候,VxWorks调用endStart()函数注册的中断服务程序。中断服务程序应该完成把帧从本地硬件传到可存取的存储器中所需的昀少工作。为了昀小化中断封锁时间,仅仅那些需要昀少执行时间的程序在中断级处理,像错误检查或是设备状态改变。这个程序应该以任务级在所有耗时工作中排队。为了以任务级处理在排队中等待接收的帧,用netJobAdd()函数。这个函数接受一个函数指针以及昀多5个参数(给函数指针指向的函数提供参数)。netJobAdd()函数原型如下:STATUSnetJobAdd(FUNCPTRroutine,intparam1,intparam2,intparam3,intparam4,intparam5)在这里的routine应该是在驱动中以任务级执行帧处理的函数。netJobAdd()函数把这个函数放在tNetTask工作队列中,并且提供合适的信号量唤醒tNetTask。在唤醒之后,tNetTask把函数调用和相应的参数从它的工作队列中取出。然后在它的上下文中执行这些函数直到队列为空。3.编写END驱动3.1驱动用的END数据结构2END_OBJEND所用的核心的数据结构是END_OBJ。驱动应该指定这个结构并在endLoad()函数中初始化它的一些元素。此结构定义在target/h/end.h中。这个结构中的一些元素是由MUX管理的。但是驱动应该设定和管理其他的元素。3.2MUX所用的END函数下表是MUX所用的和驱动之间通信的函数。在本文中,函数用一个一般的“end”前缀,但是在实际的驱动中,此前缀通常被能识别驱动的表示所代替,例如“motFcc”代表MPC8260的快速以太网驱动。函数描述endLoad()把一个设备加载到MUX中,并把驱动和这个设备结合在一起endUnload()从MUX中释放一个设备或者设备上的一个端口endSend()从MUX层接收数据并把它发送到物理层。endMCastAddrDel()从一个设备中注册的广播列表中移出一个广播地址。endMCastAddrGet()检索注册在一个设备中的广播列表endMCastAddrAdd()向注册在一个设备中的列表中增加一个广播地址endPollSend()在查询模式而不是在中断模式下发送帧endPollReceive()在查询模式而不是在中断模式下接收帧endStart()连接设备中断并激活接口endStop()停止或者释放一个网络结构或设备endAddressForm()向一个包中添加地址信息endAddrGet()从一个包中提取地址信息endPacketDataGet()分离包中的地址信息和数据信息endIoctl()支持多种ioctl命令endLoad()在网络接口被用于发送和接收帧之前,这个适当的设备必须被加载到MUX中并被配置。当函数endLoad()在系统启动时被任务tRootTask用于加载设备时,是由muxDevLoad()调用的。此函数接收一个初始化字符串,它的内容一般来说是用户定义的,但是总的来说需要包括能够识别物理接口的设备号,中断向量号,以及存储器映射寄存器的地址。endLoad()必须被写成two-pass算法。在加载过程中,MUX调用此函数两次。在第一次初始化字符串是空的(全0)。endLoad()期望能检测到空字符并返回拷贝到字符串的设备名。第二次调用传给endLoad()函数的是提供给muxDevLoad()的实际的初始化字符串。endLoad()函数必须返回它所分配的指向END_OBJ结构的指针或是当加载失败时返回NULL。一般来说,endLoad()函数在第二次调用的时候,将主要完成以下功能:初始化设备和接口分配并给END_OBJ赋值初始化一些主要的结构分析并处理初始化字符串创建并填充MIBII接口表用netBufLib分配一个或是多个网络缓冲池根据END_OBJ机构中的pNetFuncs来填充NET_FUNCS表3endLoad()函数基于以下的框架END_OBJ*endLoad(char*initString,/*definedinendTbl*/void*pBsp/*BSP-specificinformation(optional)*/){END_OBJ*newEndObj;if(!initString)/*initStringisNULL,errorcondition*/{/*seterrnoperhaps*/return((END_OBJ*)0);}elseif(initString[0]==0)/*initString[0]isNULL,passone*/{strcpy(initString,foo);return((END_OBJ*)0);}else/*initStringisnotNULL,passtwo*/{/*initializedevice*/newEndObj=(END_OBJ*)malloc(sizeof(END_OBJ));/*fillnewEndObjandnewEndObj-pFuncTable*//*createandpopulatetheMIB2interfacetable*//*initializeanyneededprivatestructures*//*parseandprocessinitString,andpBspifnecessary*//*createaprivatepoolofmemoryusingnetBufLibAPI*//*createnetworkbufferpoolsusingnetBufLibAPI*/return(newEndObj);}}endUnload()当muxDevUnload()被调用的时候,endUnload()函数执行。在这个程序中,它负责完成释放设备所需的所有工作。这个函数用于那些已经被endLoad()激活的端口。如果一个设备由多个端口,那么直到所有加载的端口都接受到卸载请求之前,驱动并不释放全局资源。endUnload()函数当卸载设备的时候并不需要通知服务。在调用endUnload()函数之前,NPT给连接到此设备的每一个服务发送一个关闭通知。endUnload()函数的原形如下:STATUSendUnload(END_OBJ*pEND/*ENDobject*/)4endSend()网络驱动发送函数是由在加载过程中创建的NET_FUNCS表所定位的。当网络服务执行发送请求的时候,MUX调用此函数。此发送程序接收表示被发送帧的mBlk链。endSend()函数原形如下:STATUSendSend(END_OBJ*pEND,/*ENDobject*/M_BLK_IDpPkt/*mBlkchaincontainingtheframe*/)如果发送成果那个,此函数返回OK。如果由于象资源不足等的错误发送没完成,它返回END_ERR_BLOCK。endMCastAddrAdd()此函数给设备注册一个物理层的广播地址。他接收指向endLoad()函数返回的END_OBJ结构的指针以及包含被添加的物理地址的字符串。此函数应该按照硬件的规定方式从新配置接口,从而让驱动接收来自规定地址的帧。endMCastAddrAdd()原形如下:STATUSendMCastAddrAdd(END_OBJ*pEND,/*ENDobject*/char*pAddress/*physicaladdress,orareferencethereto*/)此函数返回OK或者ERROR。endMCastAddrDel()此函数从一个设备的广播列表中移出一个以前注册的广播地址。它的参数是指向endLoad()函数返回的END_OBJ结构指针,以及需要被移出的包含物理地址的字符串。endMCastAddrDel()原形如下:STATUSendMCastAddrDel(END_OBJ*pEND,/*ENDobject*/char*pAddress/*physicaladdress,orareferencethereto*/)此函数返回OK或者ERROR。endMCastAddrGet()此函数在设备中有效的包含所有广播地址的列表中检索。它的参数是指向endLoad()函数返回的END_OBJ结构指针,以及指向接收列表的MULTI_TABLE结构。endMCastAddrGet()原形如下:STATUSendMCastAddrGet(5END_OBJ*pEND,/*driver'scontrolstructure*/MULTI_TABLE*p
本文标题:vxworks-END驱动编写概述
链接地址:https://www.777doc.com/doc-1358529 .html