cuttinger
驱动牛犊
驱动牛犊
  • 注册日期2003-08-21
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1783回复:4

关于USB的控制传输的一点疑问

楼主#
更多 发布于:2003-08-29 09:30
在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]
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-08-29 22:58
控制传输相对来说还是比较容易一些的,DriverStudio对USB有很好的支持,其中的有些源代码堪称经典,建议如果有时间可以阅读一下DS的源代码。
cuttinger
驱动牛犊
驱动牛犊
  • 注册日期2003-08-21
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-29 14:00
哦,是这样啊。这个问题困扰了我好几天了,谢谢你帮了大忙。
感激涕零中。。。。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-29 12:23
如果你想使用控制端点,built一个vendor request就可以了,控制端点的地址在配置描述符里是没有的,你也可以用standard request,但是不要跟已有的冲突就行了。
cuttinger
驱动牛犊
驱动牛犊
  • 注册日期2003-08-21
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-29 11:43
哦,发现问题了,原来是controlPipeHandle错了。
那么,现在的问题是:
做usb的驱动,使用control transfer的时候,需要使用控制端点
可是我在interface里面只发现了pipes[0],bulk in ,pipes1],bulk out,pipes[2] ,interrupt in,没有control

请教各位大侠:这个control端点在哪里?怎么获取?
游客

返回顶部