阅读:1782回复:4
关于USB的控制传输的一点疑问
在USB的驱动设计中,我在对device进行了初始化后,为了让usb设备
reset,需要发送一个控制传输指令,我的代码如下: transferBuffer[0]=(BYTE)0x03; transferBuffer[1]=(BYTE)0x0c; transferBuffer[2]=(BYTE)0x00; dataLengthOut=(UINT)3; siz = sizeof(struct _URB_CONTROL_TRANSFER ); urb=MemAlloc(siz); if(urb==0) DEBUGMSG(DBG_OUT,(\" Have Occured Faults\\n\" )); urb->UrbControlTransfer.Hdr.Function = URB_FUNCTION_CONTROL_TRANSFER ; urb->UrbControlTransfer.Hdr.Length = (USHORT)siz; urb->UrbControlTransfer.PipeHandle= device->ControlPipeHandle; urb->UrbControlTransfer.TransferFlags=USBD_TRANSFER_DIRECTION_OUT ; urb->UrbControlTransfer.TransferBufferLength=dataLengthOut; urb->UrbControlTransfer.TransferBuffer=transferBuffer; urb->UrbControlTransfer.TransferBufferMDL=NULL; urb->UrbControlTransfer.UrbLink=NULL; for(i=0;i<8;i++) { if(i==0) { urb->UrbControlTransfer.SetupPacket=0x20; } else if(i==6) { urb->UrbControlTransfer.SetupPacket=0x03; } else urb->UrbControlTransfer.SetupPacket=0; } sts=CallUSBD(DeviceExt, urb); 但是在softice中发现,callusbd没有正确返回,而是出现了错误 我的callusbd没有经过改动,并且在device的初始化中,多次调用 这个函数,没有出现错误,并且返回了正确的结果。 我想是不是我在构建urb的时候出现了错误?具体错误在哪里? 希望各位大侠指点一二。 另外,普通的控制传输,就像上面这样,仅仅需要传输几个控制字节 可不可以用UsbBuildVendorRequest()来构建urb,然后callusbd进行传输。 [编辑 - 8/29/03 by cuttinger] |
|
沙发#
发布于:2003-08-29 11:43
哦,发现问题了,原来是controlPipeHandle错了。
那么,现在的问题是: 做usb的驱动,使用control transfer的时候,需要使用控制端点 可是我在interface里面只发现了pipes[0],bulk in ,pipes1],bulk out,pipes[2] ,interrupt in,没有control 请教各位大侠:这个control端点在哪里?怎么获取? |
|
板凳#
发布于:2003-08-29 12:23
如果你想使用控制端点,built一个vendor request就可以了,控制端点的地址在配置描述符里是没有的,你也可以用standard request,但是不要跟已有的冲突就行了。
|
|
地板#
发布于:2003-08-29 14:00
哦,是这样啊。这个问题困扰了我好几天了,谢谢你帮了大忙。
感激涕零中。。。。 |
|
地下室#
发布于:2003-08-29 22:58
控制传输相对来说还是比较容易一些的,DriverStudio对USB有很好的支持,其中的有些源代码堪称经典,建议如果有时间可以阅读一下DS的源代码。
|
|