|
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。
|
|