VxWorks中END与MUX接口详解

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

VxWorks中END与MUX的接口详解(来自VxWorks官方文档)Table10-1中列出了NET_FUNCS结构到MUX层的标准驱动入口函数。在这个表中,函数都是以end为前缀的,但是在实际中这个前缀通常被替换为被驱动的设备名来便于识别,比如In7990代表LanceEthernet驱动。表10-1:END函数函数描述endLoad()载入一个设备到MUX层并将设备与驱动关联endUnload()从MUX层卸载一个设备或一个设备端口endSend()从MUX层得到数据并传入物理层endMCastAddrDel()删除一个在设备上注册的多播地址endMCastAddrGet()查询在设备上注册的多播地址列表endMCastAddrAdd()在设备上添加一个多播地址endPollSend()以查询的方式发送数据,而不是中断方式endPollReceive()以查询的方式接收数据,而不是中断方式endStart()连接设备的中断并激活端口endStop()停止或撤消一个网络设备或端口endAddressForm()在数据包上添加地址信息endAddrGet()从数据包中提取地址信息endPacketDataGet()从数据包中分离地址信息endIoctl()支持多种IOCTL命令endLoad()在一个网络端口可以用来收发数据帧之前,相应的设备必须载入到MUX层上并配置正确。muxDevLoad()函数会调用你设备的endLoad()。这个函数用到一个初始化字符串,字符串内容是用户定义的,通常包含识别物理端口的数字,一个中断向量号和内存映射寄存器的地址。endLoad()函数必须被写成二遍算法。MUX在载入过程中要调用两次这个函数。在第一遍里,初始化字符串是空的(全零)。endLoad()函数要核对这个空串并返回被复制到字符串里的设备名。第二次调用endLoad()函数作用在真正的将被用在muxDevLoad()函数中的初始化字符串。endLoad()函数必须返一个指向被它定位的END_OBJ的指针,如果载入失败则返回NULL。通常情况下,endLoad()函数在第二遍执行时将会:初始化设备和接口分配并填充END_OBJ结构体初始化所有必要的私有结构体解析并处理初始化字符串创建并填入MIBII接口表使用nteBufLib中的API创建并初始化一个私有内存池使用netBufLib分配一个或多个网络缓冲池填充END_OBJ结构体中被pNetFuncs引用的NET_FUNCS表endLoad()函数基本结构如下: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()endUnload()函数在muxDevUnload()被系统应用调用时才会被调用。在这个过程中,驱动的作用是释放设备。这个函数可以被任何端口调用,前提是之前被endLoad()函数激活。如果一个设备有多个端口被载入了,这个驱动必须在所有被载入的端口都收到卸载命令后才能释放共享资源。endUnload()程序不需要通知服务有关卸载设备的信息。在调用endUUnload()之前,MUX会发送给连接到这个设备上的各个服务一个停止信息。endUnload()的原型如下:STATUSendUnload(END_OBJ*pEND/*ENDobject*/)endSend()网络驱动发送数据的程序引用自NET_FUNCS表,这个表在载入操作时被创建。当网络服务发出一个发送命令时MUX将调用这个函数。发送程序要提供mBlk链,这个链描述了要被发送的连接层的数据帧。endSend()的原型如下:STATUSendSend(END_OBJ*pEND,/*ENDobject*/M_BLK_IDpPkt/*mBlkchaincontainingtheframe*/)这个函数可能返回的状态如下:oOK,成功发送oEND_ERR_BLOCK,由于一个如资源不足等暂时的问题引发的发送失败oERROR,这种情况下,要设置适当的errnoendMCastAddrAdd()这个函数在设备上注册一个物理层的多播地址。它需要一个指向END_OBJ的指针和一个包含将要被填加的物理地址的字符串作为参数,其中END_OBJ是endLoad()函数返回的。这个程序要根据硬件重新配置接口,以便使硬件从不同的地址接收数据。NOTE:为了帮你管理以太网多播地址列表,VxWorks提供了一个etherMultiLib库。endMCastAddrAdd()的原型如下:STATUSendMCastAddrAdd(END_OBJ*pEND,/*ENDobject*/char*pAddress/*physicaladdressorareferencethereto*/)这个函数可能返回的状态有OK和ERROR(这种条件下,要设置适当的errno)。endMCastAddrDel()这个函数是从一个设备的多播列表中删除一条以前注册的地址。它需要一个指向END_OBJ的指针和一个包含将被删除的物理地址的字符串作为参数。.NOTE:为了帮你管理以太网多播地址列表,VxWorks提供了一个etherMultiLib库。TheendMCastAddrDel()的原型如下:STATUSendMCastAddrDel(END_OBJ*pEND,/*ENDobject*/char*pAddress/*physicaladdress,orareferencethereto*/)这个函数可能返回的状态有OK和ERROR(这种条件下,要设置适当的errno)。endMCastAddrGet()这个函数得到一个包含设备当前所有处于激活状态的多播地址的列表。它需要一个指向END_OBJ的指针和一个指向MULTI_TABLE结构体内存放这个列表位置的指针作为参数。NOTE:为了帮你管理以太网多播地址列表,VxWorks提供了一个etherMultiLib库。endMCastAddrGet()的原型如下:STATUSendMCastAddrGet(END_OBJ*pEND,/*driver'scontrolstructure*/MULTI_TABLE*pMultiTable/*containerforaddresslist*/)这个函数可能返回的状态有OK和ERROR(这种条件下,要设置适当的errno)。endPollSend()这个程序提供了一种和中断驱动发送数据等价的轮询模式。这需要直接将数据帧传入下层设备,当这个设备忙或资源不可用的时候要立即退出发送。NOTE:当系统调用endPollSend()时,很可能正处在不能响应内核调用的模式下。因此,这个程序不能去完成任何内核的操作,比如操作一个信号量或分配内存。同理,这个程序也不能阻塞或延时,因为可能整个系统都停止。调用endPollSend()的前提是设备已经被设定到轮询模式(通过之前的endIoctl()调用)。endPollSend()程序应该直接将待发送的数帧传上网络,不要在任何输出队列中排队。这个函数需要一个指向END_OBJ结构体的指针和一个包含输出数据的mBlk或mBlk链的引用作为参数。它可能返回的状态有OK或ERROR(在这种情况下,设置相应errno)。endPollSend()的原型为:STATUSendPollSend(END_OBJ*pEND,/*ENDobject*/M_BLK_IDpMblk/*mBlkchain:datatobesent*/)endPollReceive()这个函数通过使用轮询模式而不是中断驱动模式来接收数据。这个程序直接从网络上检查数据帧并将其复制到mBlks中。如果没有可用的数据,则函数返回ERROR。NOTE:当系统调用endPollReceive()时,可能正处在一种不响应内核调用的模式中。因此,这个程序不能完成任何内核操作,比如操作信号量或分配内存。同理,这个程序也不能有阻塞和延时,因为整个系统可能停止。使用dPollReceive()程序前提是设备已经设置到轮询模式(能过之前调用endIoctl())。这个程序应该直接从网络上检索数据并将其复制到mBlk。这个函数需要一个指向END_OBJ结构体的指针和一个存放收到的数据的mBlk或mBlk链的引用作为参数。endPollReceive()的原型如下:STATUSendPollReceive(END_OBJ*pEND,/*returnedfromendLoad()*/M_BLK_IDpPkt/*mBlkchain:databeingreceived*/)这个函数可能返回OK或一个错误的EAGAIN值(在接收到的数据大于提供的mBlk或没有可用数据时发生)。endStart()驱动的endStart()函数用来连接设备中断并激活端口。这个函数需要从endLoad()返回的唯一的端口号作为参数。调用这个函数的前提是每一个端口都处于可激活状态。endStart()的原型如下:STATUSendStart(END_OBJ*pEND,/*ENDobject*/)这个函数可能返回OK或ERROR(这种情况下,应该设置相应errno)。endStop()endStop()函数用来停止一个网络设备,一般是断开中断连接。它不会通过释放已分配的内存来删除设备。这个函数需要一个从endLoad()返回的唯一的端口号作为参数。endStop()的原型为:STATUSendStop(END_OBJ*pEND,/*ENDobject*/)这个函数可能返回OK或ERROR(这种情况下,设置相应的errno)。endAddressForm()endAddressForm()程序的作用是为包含着输出数据的mBlk链添加一个帧头。在向mBlk加入地址段后,这个函数要修改mBlk.mBlkHdr.mLen和mBlk.mBlkHdr.mData成员。如果mBlk不足以容纳加入的地址信息,必须创建额外的mBlk/clBlkcluster并插入到mBlk链的开头。网络协议类型可以在pDst.mBlkHdr.reserved中找到。endAddressForm()的返回值是一个到新mBlk链的引用。endAddressForm()的原型如下:M_BLK_IDendAddressForm(M_BLK_IDpData/*mBlkchaincontainingoutgoingdata*/M_BL

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功