




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
此文档收集于网络,如有侵权请联系网站删除VxWorks中END与MUX的接口详解(来自VxWorks官方文档)Table10-1中列出了NET_FUNCS结构到MUX层的标准驱动入口函数。在这个表中,函数都是以end为前缀的,但是在实际中这个前缀通常被替换为被驱动的设备名来便于识别,比如In7990代表Lance Ethernet驱动。表 10-1 : END 函数 函数描述endLoad( )载入一个设备到MUX层并将设备与驱动关联endUnload( )从MUX层卸载一个设备或一个设备端口endSend( )从MUX层得到数据并传入物理层endMCastAddrDel( )删除一个在设备上注册的多播地址endMCastAddrGet( )查询在设备上注册的多播地址列表endMCastAddrAdd( )在设备上添加一个多播地址endPollSend( )以查询的方式发送数据,而不是中断方式endPollReceive( )以查询的方式接收数据,而不是中断方式endStart( )连接设备的中断并激活端口endStop( )停止或撤消一个网络设备或端口endAddressForm( )在数据包上添加地址信息endAddrGet( )从数据包中提取地址信息endPacketDataGet( )从数据包中分离地址信息endIoctl( )支持多种IOCTL命令endLoad( )在一个网络端口可以用来收发数据帧之前,相应的设备必须载入到层上并配置正确。muxDevLoad()函数会调用你设备的endLoad()。这个函数用到一个初始化字符串,字符串内容是用户定义的,通常包含识别物理端口的数字,一个中断向量号和内存映射寄存器的地址。endLoad()函数必须被写成二遍算法。在载入过程中要调用两次这个函数。在第一遍里,初始化字符串是空的(全零)。endLoad()函数要核对这个空串并返回被复制到字符串里的设备名。第二次调用endLoad()函数作用在真正的将被用在muxDevLoad()函数中的初始化字符串。endLoad()函数必须返一个指向被它定位的END_OBJ的指针,如果载入失败则返回NULL。通常情况下,endLoad()函数在第二遍执行时将会: 初始化设备和接口 分配并填充END_OBJ结构体 初始化所有必要的私有结构体 解析并处理初始化字符串 创建并填入MIB II接口表 使用nteBufLib中的API创建并初始化一个私有内存池 使用netBufLib分配一个或多个网络缓冲池 填充END_OBJ结构体中被pNetFuncs引用的NET_FUNCS表endLoad()函数基本结构如下:END_OBJ * endLoad ( char * initString, /* defined in endTbl */ void * pBsp /* BSP-specific information (optional) */ ) END_OBJ * newEndObj; if( !initString ) /* initString is NULL, error condition */ /* set errno perhaps */ return( (END_OBJ *) 0 ); else if( initString0 = 0 ) /* initString0 is NULL, pass one */ strcpy( initString, foo ); return( (END_OBJ *) 0 ); else /* initString is not NULL, pass two */ /* initialize device */ newEndObj = (END_OBJ *) malloc( sizeof(END_OBJ) ); /* fill newEndObj and newEndObj-pFuncTable */ /* create and populate the MIB2 interface table */ /* initialize any needed private structures */ /* parse and process initString, and pBsp if necessary */ /* create a private pool of memory using netBufLib API */ /* create network buffer pools using netBufLib API */ return( newEndObj ); endUnload( )endUnload()函数在muxDevUnload()被系统应用调用时才会被调用。在这个过程中,驱动的作用是释放设备。这个函数可以被任何端口调用,前提是之前被endLoad()函数激活。如果一个设备有多个端口被载入了,这个驱动必须在所有被载入的端口都收到卸载命令后才能释放共享资源。endUnload()程序不需要通知服务有关卸载设备的信息。在调用endUUnload()之前,MUX会发送给连接到这个设备上的各个服务一个停止信息。endUnload()的原型如下:STATUS endUnload ( END_OBJ * pEND /* END object */ )endSend( )网络驱动发送数据的程序引用自NET_FUNCS表,这个表在载入操作时被创建。当网络服务发出一个发送命令时MUX将调用这个函数。发送程序要提供mBlk链,这个链描述了要被发送的连接层的数据帧。endSend()的原型如下:STATUS endSend ( END_OBJ * pEND, /* END object */ M_BLK_ID pPkt /* mBlk chain containing the frame */ )这个函数可能返回的状态如下:o OK,成功发送o END_ERR_BLOCK,由于一个如资源不足等暂时的问题引发的发送失败o ERROR,这种情况下,要设置适当的errnoendMCastAddrAdd( )这个函数在设备上注册一个物理层的多播地址。它需要一个指向END_OBJ的指针和一个包含将要被填加的物理地址的字符串作为参数,其中END_OBJ是endLoad()函数返回的。这个程序要根据硬件重新配置接口,以便使硬件从不同的地址接收数据。 NOTE: 为了帮你管理以太网多播地址列表,VxWorks提供了一个etherMultiLib库。endMCastAddrAdd()的原型如下:STATUS endMCastAddrAdd ( END_OBJ * pEND, /* END object */ char * pAddress /* physical address or a reference thereto */ )这个函数可能返回的状态有OK和ERROR(这种条件下,要设置适当的errno)。endMCastAddrDel( )这个函数是从一个设备的多播列表中删除一条以前注册的地址。它需要一个指向END_OBJ的指针和一个包含将被删除的物理地址的字符串作为参数。. NOTE: 为了帮你管理以太网多播地址列表,VxWorks提供了一个etherMultiLib库。The endMCastAddrDel()的原型如下:STATUS endMCastAddrDel ( END_OBJ * pEND, /* END object */ char * pAddress /* physical address, or a reference thereto */ )这个函数可能返回的状态有OK和ERROR(这种条件下,要设置适当的errno)。endMCastAddrGet( )这个函数得到一个包含设备当前所有处于激活状态的多播地址的列表。它需要一个指向END_OBJ的指针和一个指向MULTI_TABLE结构体内存放这个列表位置的指针作为参数。 NOTE: 为了帮你管理以太网多播地址列表,VxWorks提供了一个etherMultiLib库。endMCastAddrGet()的原型如下:STATUS endMCastAddrGet ( END_OBJ * pEND, /* drivers control structure */ MULTI_TABLE * pMultiTable /* container for address list */ )这个函数可能返回的状态有OK和ERROR(这种条件下,要设置适当的errno)。endPollSend( )这个程序提供了一种和中断驱动发送数据等价的轮询模式。这需要直接将数据帧传入下层设备,当这个设备忙或资源不可用的时候要立即退出发送。 NOTE: 当系统调用endPollSend()时,很可能正处在不能响应内核调用的模式下。因此,这个程序不能去完成任何内核的操作,比如操作一个信号量或分配内存。同理,这个程序也不能阻塞或延时,因为可能整个系统都停止。调用endPollSend()的前提是设备已经被设定到轮询模式(通过之前的endIoctl()调用)。endPollSend()程序应该直接将待发送的数帧传上网络,不要在任何输出队列中排队。这个函数需要一个指向END_OBJ结构体的指针和一个包含输出数据的mBlk或mBlk链的引用作为参数。它可能返回的状态有OK或ERROR(在这种情况下,设置相应errno)。endPollSend()的原型为:STATUS endPollSend ( END_OBJ * pEND, /* END object*/ M_BLK_ID pMblk /* mBlk chain: data to be sent */ )endPollReceive( )这个函数通过使用轮询模式而不是中断驱动模式来接收数据。这个程序直接从网络上检查数据帧并将其复制到mBlks中。如果没有可用的数据,则函数返回ERROR。 NOTE: 当系统调用endPollReceive()时,可能正处在一种不响应内核调用的模式中。因此,这个程序不能完成任何内核操作,比如操作信号量或分配内存。同理,这个程序也不能有阻塞和延时,因为整个系统可能停止。使用dPollReceive()程序前提是设备已经设置到轮询模式(能过之前调用endIoctl())。这个程序应该直接从网络上检索数据并将其复制到mBlk。这个函数需要一个指向END_OBJ结构体的指针和一个存放收到的数据的mBlk或mBlk链的引用作为参数。endPollReceive()的原型如下:STATUS endPollReceive ( END_OBJ * pEND, /* returned from endLoad() */ M_BLK_ID pPkt /* mBlk chain: data being received */ )earphone n. 耳机这个函数可能返回OK或一个错误的EAGAIN值(在接收到的数据大于提供的mBlk或没有可用数据时发生)。图书馆管理员endStart( )驱动的endStart()函数用来连接设备中断并激活端口。这个函数需要从endLoad()返回的唯一的端口号作为参数。调用这个函数的前提是每一个端口都处于可激活状态。dilemma n. (进退两难的)困境;窘境endStart()的原型如下:STATUS endStart ( END_OBJ * pEND, /* END object */ )这个函数可能返回OK或ERROR(这种情况下,应该设置相应errno)。canal n. 运河;水道endStop( )vi.受惊吓endStop()函数用来停止一个网络设备,一般是断开中断连接。它不会通过释放已分配的内存来删除设备。这个函数需要一个从endLoad()返回的唯一的端口号作为参数。sparrow n. 麻雀endStop()的原型为:STATUS endStop ( END_OBJ * pEND, /* END object */ )这个函数可能返回OK或ERROR(这种情况下,设置相应的errno)。n 德国人;德语endAddressForm( )endAddressForm()程序的作用是为包含着输出数据的mBlk链添加一个帧头。在向mBlk加入地址段后,这个函数要修改mBlk.mBlkHdr.mLen和mBlk.mBlkHdr.mData成员。 如果mBlk不足以容纳加入的地址信息,必须创建额外的mBlk/clBlk cluster并插入到mBlk链的开头。millipede n.(=millepede) 千足虫网络协议类型可以在pDst.mBlkHdr.reserved中找到。endAddressForm()的返回值是一个到新mBlk链的引用。Lester n. 莱斯特(姓错;男名)endAddressForm()的原型如下:M_BLK_ID endAddressForm ( M_BLK_ID pData /* mBlk chain containing outgoing data */ M_BLK_ID pSrc, /* source address, in an mBlk */ M_BLK_ID pDst, /* destination address, in an mBlk */ BOOL bcastFlag /* use link-level broadcast ? */ )exact adj. 精确的;准确的 NOTE: endLib库包含有一个产生和添加以太网帧头的地址信息程序。这样如果你在使用以太网的话就不用去实现这个函数了。endAddrGet( )这个程序会从mBlk链提供的数据帧中检索出地址信息。如果附加的mBlk参数不是NULL,将会设置mBlk.mBlkHdr.mData和mBlk.mBlkHdr.mLenr的值来表示相应的数据链路层地址的位置和大小。附加的mBlk参数有:pSrc数据帧的本地源地址。pDst数据帧的本地目地地址。pESrc链路的原始源地址,如果没有,则是pSrc的设置。pEDst链路的最终目的地址,如果没有,则是pDst的设置。 NOTE: endLib包含了一个从以太网数据帧头中检索地址值的程序。这样,如果你的驱动用到以太网的话就不需要实现这个程序了。endAddrGet()的原型如下:STATUS endAddrGet ( M_BLK_ID pData, /* mBlk chain containing frame */ M_BLK_ID pSrc, /* local source address, in an mBlk */ M_BLK_ID pDest, /* local destination address, in an mBlk */ M_BLK_ID pESrc, /* actual source address, in an mBlk */ M_BLK_ID pEDest /* actual destination address, in an mBlk */ )这个函数可能的返回值有OK或ERROR(这种情况下,设置适当的errno)endPacketDataGet( )这个程序用来解析一个由mBlk链提供的数据帧。它重置包括大小和偏移量的地址信息,帧中有效数据的偏移量和帧类型到LL_HDR_INFO结构体中,其中LL_HDR_INFO是传入这个函数的参数。 NOTE: endLib 包含有一个从以太网数据帧中解析地址和数据的大小及偏移量还有数据类型的程序。这样你可以在使用以太网的时候不必要自己实现这个函数。endPacketDataGet()的原型如下:STATUS endPacketDataGet ( M_BLK_ID pData, /* mBlk chain containing packet */ LL_HDR_INFO * pHeader /* structure to hold header info */ )这个函数可能返回OK或ERROR(在这种情况下,设置相应errno)。endIoctl( )END可能会需要支持ioctl命令,比如去使用现存IP网络的子层。表10-2是一个通常使用的ioctl命令列表。 WARNING: 如果你正在使用一个来自BSD4.3的驱动,你可能想用已经存在的xxIoctl()作为endIoctl()来使用,这样就忽略了为多播地址维护函数写一个独立的程序。千万不要这么做!你的驱动
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 应急安全培训装置课件
- 无人机资格证试卷(突破训练)附答案详解
- 新生儿真菌感染高危因素与抗真菌治疗原则
- 公司汽油购销合同(标准版)
- 2024年自考专业(金融)题库及参考答案详解(满分必刷)
- 防水补漏工程合同(标准版)
- 计算机三级考前冲刺练习试题【名校卷】附答案详解
- 2025年细胞治疗临床试验审批流程中的临床研究报告数据完整性报告
- 2025年数字化技术在零售门店智能货架商品识别与分析中的应用报告
- 2025年建筑节能新方向:被动式超低能耗建筑技术原理与推广路径研究报告
- 同等学力英语申硕考试词汇(第六版大纲)电子版
- 光伏项目投标方案(技术方案)
- GB/T 44395-2024激光雷达测风数据可靠性评价技术规范
- 公厕保洁服务投标方案
- 模块化炼化设备的设计与集成
- JJF(皖) 174-2024 重点用能单位能源资源计量在线审查规范
- 儿童口腔健康宣教课件
- 工程造价咨询手册模板
- 设备维护服务方案(2篇)
- 医院检验科实验室生物安全程序文件SOP
- 监所防疫知识培训
评论
0/150
提交评论