原创 vxworks驱动编写(3)

2006-10-25 16:18 6374 7 5 分类: MCU/ 嵌入式

endUnload( )
当muxDevUnload( )被调用的时候,endUnload( )函数执行。在这个程序中,它负责完成
释放设备所需的所有工作。
这个函数用于那些已经被endLoad( )激活的端口。如果一个设备由多个端口,那么直到
所有加载的端口都接受到卸载请求之前,驱动并不释放全局资源。endUnload( )函数当卸载
设备的时候并不需要通知服务。在调用endUnload( )函数之前,NPT给连接到此设备的每一
个服务发送一个关闭通知。
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 */
)
如果发送成果那个,此函数返回OK。 如果由于象资源不足等的错误发送没完成,它返
回END_ERR_BLOCK。
endMCastAddrAdd( )
此函数给设备注册一个物理层的广播地址。他接收指向endLoad()函数返回的END_OBJ
结构的指针以及包含被添加的物理地址的字符串。
此函数应该按照硬件的规定方式从新配置接口,从而让驱动接收来自规定地址的帧。
endMCastAddrAdd( )原形如下:
STATUS endMCastAddrAdd
(
END_OBJ * pEND, /* END object */
char * pAddress /* physical address, or a reference thereto */
)
此函数返回OK或者ERROR。
endMCastAddrDel( )
此函数从一个设备的广播列表中移出一个以前注册的广播地址。它的参数是指向
endLoad()函数返回的END_OBJ结构指针,以及需要被移出的包含物理地址的字符串。
endMCastAddrDel( ) 原形如下:
STATUS endMCastAddrDel
(
END_OBJ * pEND, /* END object */
char * pAddress /* physical address, or a reference thereto */
)
此函数返回OK或者ERROR。
endMCastAddrGet( )
此函数在设备中有效的包含所有广播地址的列表中检索。它的参数是指向endLoad()
函数返回的END_OBJ结构指针,以及指向接收列表的MULTI_TABLE结构。
endMCastAddrGet( ) 原形如下:
STATUS endMCastAddrGet
(END_OBJ * pEND, /* driver's control structure */
MULTI_TABLE * pMultiTable /* container for address list */
)
此函数返回OK或者ERROR。
endPollSend( )
此程序提供查询模式的相当于驱动中断驱动的发送程序。它或者把帧直接传送到下级
设备中,或者立即退出在设备忙或者资源不可用时。
注意:当系统调用endPollSend( )程序时,系统可能处于不能响应核调用的模式下。因
此,程序不必执行任何的核操作,例如取得信号量,或者分配存储器。同样,此程序不必阻
塞或者延迟,由于系统可能暂停。
在endPollSend( )中,要检验设备已经被设定在查询模式下。endPollSend( )应该直接
把输出帧放到网络上,而不把帧排在输出队列中。
它的参数是指向endLoad()函数返回的END_OBJ结构指针,以及包含输出帧的mBlk
或者mBlk链的识别号。
endPollSend( ) 原形如下:
STATUS endPollSend
(
END_OBJ * pEND, /* END object*/
M_BLK_ID pMblk /* mBlk chain: data to be sent */
)
endPollReceive( )
此函数用查询模式而不是中断模式接收帧。此函数必须直接从网络中检索帧并把它拷
贝到提供给函数的mBlk中。如果没有帧可接收,返回ERROR.。
注意:当系统调用endPoll Receive ( )程序时,系统可能处于不能响应核调用的模式下。
因此,程序不必执行任何的核操作,例如取得信号量,或者分配存储器。同样,此程序不必
阻塞或者延迟,由于系统可能暂停。
在endPoll ( ) Receive中,要检验设备已经被设定在查询模式下。然后此函数直接从网
络中检索帧并把它拷贝到提供给函数的mBlk中。它的参数是指向endLoad()函数返回的
END_OBJ结构指针,以及包含输入帧应该被接收到的mBlk或者mBlk链的识别号。
endPoll ( ) Receive原形如下:
STATUS endPollReceive
(
END_OBJ * pEND, /* returned from endLoad() */
M_BLK_ID pPkt /* mBlk chain: data being received */
)
此函数返回OK,或者当接收数据太大而不能放在mBlk中以及没有数据时,返回
EAGAIN的错误值。
endStart( )
endStart( )函数连接设备中断,使接口被激活可用。此函数唯一的参数是由endLoad
()调用返回的唯一的接口标识号。随着endLoad() 被调用,此函数被每一个需要在驱动中被激活的接口执行。
endStart( )函数原形如下:
STATUS endStart
(
END_OBJ * pEND, /* END object */
)
此函数应该返回OK或者ERROR。
endStop( )
endStop( ) )函数暂停一个网络设备,一般是通过断开相应的中断。它不是通过释放分配的
数据结构来移出设备。此函数唯一的参数是由endLoad()调用返回的唯一的接口标识号。
endStop( ) )函数原形如下:
STATUS endStop
(
END_OBJ * pEND, /* END object */
)
此函数应该返回OK或者ERROR。
endAddressForm( )
endAddressForm( )程序产生一个和帧相关的头,用来预先挂起包含输出数据的mBlk
链。在把地址段添加到mBlk之后,程序相应的应该调整mBlk.mBlkHdr.mLen 和
mBlk.mBlkHdr.mData 数据成员。
如果接收的mBlk不能容下增加的地址信息,那么另一个mBlk/cBlk簇必须被创建用来接
收地址信息,并把它插在mBlk链的开始。
网络协议的类型可以在pDst.mBlkHdr.reserved区中找到。
endAddressForm( )将返回mBlk链的识别号。
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 */
)
endAddrGet( )
此函数在mBlk链提供的输入帧中检索地址值。如果额外的mBlk参数不是NULL,它会
设定mBlk.mBlkHdr.mData 和 mBlk.mBlkHdr.mLen来表示相应的数据链路层地址的位置和
大小。额外的mBlk的参数是:
pSrc
帧的本地源地址。
pDst
帧的本地目标地址。
pESrc
初始的链路级源地址或者如果没有是pSrc设定。
pEDst
最后的链路级源地址或者如果没有是pDst设定。
注意: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。
endPacketDataGet( )
此函数分析在mBlk链中提供的输入帧。它把地址信息,包括地址信息的大小和偏移量,
帧负载的偏移量,帧的类型,放在作为参数传给它的LL_HDR_INFO结构中。
注意:endLib库包含从以太网帧中检索地址、数据偏移量、大小和类型信息的程序。
endPacketDataGet( ) 函数原形如下:
STATUS endPacketDataGet
(
M_BLK_ID pData, /* mBlk chain containing packet */
LL_HDR_INFO * pHeader /* structure to hold header info */
)
此函数应该返回OK或者ERROR。
endIoctl( )
END可能需要支持ioctl命令,尤其是如果它用在已经存在的IP网络服务子层中。
警告:如果从BSD4.3模型中移植驱动,你可能尝试用已经存在的xxIoctl()程序作为
endIoctl()程序,略过支持广播地址列表的单独函数的创建。千万别这样做!你的驱动必须要
实现广播地址列表支持程序。
endIoctl( )函数有三个参数:由muxDevLoad()返回的唯一的接口识别号、需要执行的
ioctl命令、以及在命令中为存储额外的数据的缓冲或者是为存储命令执行之后返回的数据。
下表是Ioctl命令和数据类型。注意:在0-128之间的命令常数(例如EIOCGFBUF)被Wind River所保留。如果想用自
定义的Ioctl命令,那么应该定以它们的命令常数在以上范围之外。
endIoctl( )原形如下:
int endIoctl
(
END_OBJ * pEND, /* END Object */
int command, /* ioctl command */
caddr_t buffer /* holds response from command */
)
如果成功,函数返回0,否则返回相应的错误值或者如果命令不支持返回EINVAL。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条