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。