51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2390|回复: 0
打印 上一主题 下一主题

[讨论] vxWorks 函数库

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-4-28 16:16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. usbdTransfer()------初始化一个USB管道上的数据传输

STATUS usbdTransfer( USBD_CLIENT_HANDLE clientHandle, USBD_PIPE_HANDLE pipeHandle, pUSB_IRP pIr
p //指向I/O请求包的指针)
一个client使用这个函数来初始化一个pipeHandle指定的管道的数据传输,这个传输由IRP或者说是I/O请求包
来描述。必须要在调用usbdTransfer()之前初始化这个请求包。USB_IRP结构在vxWorks中的定义如下:

typedef struct usb_bfr_list{ UINT16 pid; pUINT8 pBfr; UINT16 bfrLen; UINT16 actLen; }USB_BFR_LIST;
typedef struct usb_irp{ LINK usbdLink; //used by USBD pVOID usbdPtr; //used by USBD LINK hcdLink; //use
d by HCD pVOID hcdPtr; //used by HCD pVOID userPtr; UINT16 irpLen; int result; // returned by USBD/HC
D IRP_CALLBACK usbdCallback; // used by USBD IRP_CALLBACK userCallback; UINT16 dataToggle; // filled
in by USBD UINT16 flags; UINT32 timeout; // defaults to 5 seconds if zero UINT16 startFrame; UINT16 tran
sferLen; UINT16 dataBlockSize; UINT16 bfrCount; USB_BFR_LIST bfrList [1]; }USB_IRP, *pUSB_IRP;
USB_IRP结构体的长度必须要存储在irpLen这个变量当中,并且这个长度不是固定的,长度的值依赖于这个
结构体底部的bfrList元素的个数。默认的这个结构体包含的bftList的元素个数是一个。但是client可以配置一
个结构来适应更多的bfrList元素。

flags定义一个附加的传输选项,目前flags的定义如下:

USB_FLAG_SHORT_OK:将正在接收(IN)的数据视为正常(Treats receive(IN) data underrun as OK)
USB_FLAG_SHORT_FAIL: 将正在接收(IN)的数据视为错误(Treats receive(IN) data underrun as error)
USB_FLAG_ISO_ASAP: 立即开始同步传输(Start an ioschronous transfer immediately.)
当USB正在从一个设备传输数据到主机时这个数据可能是出于”underrun“的状态。也就是说,这个设备可能
传输比主机预期的更少的数据,这种情况可以算是或者不算是一个错误,这依赖于device的设计。对于大多
数的device来说,underrun是完全正常的并且预示着从device过来的数据流的结束。而对于其他的设备而言
,underrrun预示着传输的失败。默认的情况下USBD和下层的USB HCD将underrun视为数据传输的结束,并
不将其宣告为一个错误。如果设立USB_FLAG_SHORT_FAIL标识,那么USBD/USB HCD将underrun视为一个
错误发生的情况。

对于ioschronous传输,USB_FLAG_ISO_ASAP指明应该立即开始一个同步传输,若没有指明USB_FLAG_ISO
_ASAP,那么在startFrame参数中必须要指明传输开始的帧号(the starting frame number for the transfer)。
在usbdCurrentFrameGet()函数中允许一个client为底层的USB host controller获取当前的帧号和一个被称作是
帧调度窗口(frame scheduling window)的数值。这个帧窗口的数值表明了最大帧数。只有是isochronous传输
时才需要指定startFrame。

dataBlockSize也可以用来指定isochronous传输,若该值非零,这个参数定义了isochronous数据传输的粒度(
granularity)。当底层的Host Controller Driver(HCD)将传输分解为单个帧时,这个参数用来保证每一帧中传输
的数据量是这个值的倍数。

timeout 以毫秒为单位指明IRP超时。若调用者传递这个值为0,那么USBD会自动的将其设置为USB_TIMEOUT
_DEFAULT。若不希望有超时选项,那么超时应该被设置为USB_TIMEOUT_NONE。超时设置只适用于control
和bulk传输。isochronous和interrupt传输没有超时,应将其设为USB_TIMEOUT_NONE。

bfrList 是一组缓冲描述符,用于描述与此IRP关联的数据缓冲区。如果需要超过一个bfrList元素,则调用者必
须通过计算大小来分配IRP。
irpLen = sizeof (USB_IRP) + (sizeof (USB_BFR_DESCR) * (bfrCount - 1))

transferLen必须是所传输的数据的的总的长度。换句话说,tranferLen是bfrList中所有bfrLen条目的和。

pid指明缓冲区中数据包的类型,并被定义为USB_PID_xxxx格式。

IRP usrCallback例程必须指向一个client提供的IRP_CALLBACK类型的函数。usbdTransfer()函数在IRP成功加入队
列之后就立即返回,若在IRP被传递给HCD的时候失败,那么usbdTransfer()就会返回一个错误。在调用userCallb
ack()例程之后应该检查IRP真正的返回结果。

若能够进行传输usbdTransfer()会返回OK,若不能进行传输,则返回ERROR。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-23 17:57 , Processed in 0.060072 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表