Leonsoft
驱动小牛
驱动小牛
  • 注册日期2003-05-08
  • 最后登录2012-08-11
  • 粉丝1
  • 关注0
  • 积分21分
  • 威望281点
  • 贡献值1点
  • 好评度103点
  • 原创分0分
  • 专家分0分
阅读:1404回复:2

关于威盛南桥VT8237A芯片组在USB方面存在的问题,有高手遇到过吗?

楼主#
更多 发布于:2007-08-20 16:45
       最近发现有一个问题,我们公司的USB 产品在威盛南桥芯片组VT8237A的主板机器上,Windows XP平台下,发了Bulk request后,再发Veder Request后,就没有response了,一直都是Pending,不清楚USB bus上发生了什么事情,或者USB host出了什么错???这个时候用BusHound,发Control的Reset Pipe后,就可以Work了。
   但是,在同样VT8273A主板的Vista系统下,可以正常工作(可能是因为Vista下微软的USB host 驱动作了改进)。
   另外,我们的产品在Intel芯片组的主板,Windows xp, Vista下,也是可以正常工作的。
   我用别的公司的同类型产品,用BusHound发现,它在Buik传送起来前,做了SET INTERFACE, SELECT INTERFACE, RESET PIPE,RESET PIPE动作。但我在我的drivre里面,没有做类似的动作。
  所以现在有2个问题,请教各位。
 1.在Windows XP平台下,发了Bulk request后,再发Veder Request后,就没有response了,一直都是Pending,不清楚USB bus上发生了什么事情,或者USB host出了什么错???
 2. USB的client端驱动看不到端点0,拿不到Control pipe的handle,所以有什么办法做Reset control pipe?曾经有高人说用Control transfer 发 CLEAR FEATURE,我试过,貌似不行。
  
I will do the best with what the God gave me.
Leonsoft
驱动小牛
驱动小牛
  • 注册日期2003-05-08
  • 最后登录2012-08-11
  • 粉丝1
  • 关注0
  • 积分21分
  • 威望281点
  • 贡献值1点
  • 好评度103点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-08-20 17:00
一下是我的Build Bulk request 代码
PURB
UsbPipe_BuildBulkRequest(
         PVOID pBuffer,
         ULONG nBufferLength,
         BOOLEAN bIn,
         BOOLEAN bShortOk,
         PURB pUrb
)
{
    PURB Urb=NULL;
    USHORT UrbSize;
    ULONG Flags;
    UrbSize= sizeof(_URB_BULK_OR_INTERRUPT_TRANSFER);
    if (pUrb == NULL)
    {
        Urb=(PURB) new (NON_PAGED_POOL) _URB_BULK_OR_INTERRUPT_TRANSFER;
    }
    else
    {
        Urb = pUrb;
    }
    if(Urb==NULL)
        return Urb;
    if (bIn)
    {
        Flags = USBD_TRANSFER_DIRECTION_IN;
        if (bShortOk)
            Flags |= USBD_SHORT_TRANSFER_OK;
    }
    else
    {
        Flags = 0;
    }//build our urb for USBD
    UsbBuildInterruptOrBulkTransferRequest(Urb,
        UrbSize,
        m_pUsbInterface->Pipes[0].PipeHandle,//pipeHandle->PipeHandle,
        pBuffer,
        NULL,
        nBufferLength,
        Flags,
        NULL);
    Urb->UrbHeader.Status = 0;
    //
    return Urb;
}


NTSTATUS
USBD_SubmitIrpWithRoutine(
          PIRP Irp,
          PIO_COMPLETION_ROUTINE CompletionRoutine,
          PVOID pContext
)
{
    IoSetCompletionRoutine(Irp,
        CompletionRoutine,
        pContext,
        TRUE,
        TRUE,
        TRUE);
    // Pass the IRP/URB to USBD
    return(IoCallDriver(m_pTopDeviceObject,Irp));
}


NTSTATUS
UsbPipe_DispatchBulkInIrp(
        PVOID pBuffer,
        ULONG nBufferLength,
        PIO_COMPLETION_ROUTINE CompletionRoutine,
        PUSB_STREAM_OBJECT pStreamObject
)
{
    NTSTATUS ntStatus=STATUS_SUCCESS;
    if(m_bIsDeviceRemoved)
    {
        //
        return STATUS_DEVICE_NOT_CONNECTED;
    }
    PIRP_PENDING_CONTEXT pContext=new (NON_PAGED_POOL) IRP_PENDING_CONTEXT;
    if(!pContext)
    {
        DbgMsg(("@@@Warning:failed to alloc mem for pending Irp!\n"));
        return STATUS_INSUFFICIENT_RESOURCES;    
    }
    RtlZeroMemory(pContext,sizeof(IRP_PENDING_CONTEXT));
    //allocate Urb
    PURB pUrb=UsbPipe_BuildBulkRequest(
        pBuffer,
        nBufferLength,
        TRUE,
        TRUE,
        NULL
        );
    if(!pUrb)
    {
        DbgMsg(("@@@Warning:failed to alloc mem for Urb!\n"));
        delete pContext;
        return STATUS_INSUFFICIENT_RESOURCES;    
    }
    //
    PIRP pIrp= IoAllocateIrp(m_pTopDeviceObject->StackSize, FALSE);
    if(pIrp == NULL)
    {
        DbgMsg(("@@@Warning:failed to alloc mem for irp!\n"));
        delete pContext;
        delete pUrb;
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    pContext->pIrp=pIrp;
    pContext->pUrb=pUrb;
    pContext->pStreamObject=pStreamObject;
    pContext->pBuffer=(PUCHAR)pBuffer;
    pContext->dwActualCount=0;
    pContext->dwBufSize=nBufferLength;
    pContext->pStreamObject->pPendingIrpArray[pStreamObject->dwPendingIrps]=pIrp;
    pContext->nIrpIndex=pStreamObject->dwPendingIrps;
    pContext->bIsPending=TRUE;
    //
    
    InterlockedIncrement(&pStreamObject->dwPendingIrps);
    //
    PIO_STACK_LOCATION pNextStack;
    pNextStack = IoGetNextIrpStackLocation(pIrp);
    //
    // pass the URB to the USB driver stack
    //
    // Setup Irp
    pNextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
    pNextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
    pNextStack->Parameters.Others.Argument1 = pUrb;
    ntStatus=USBD_SubmitIrpWithRoutine(pIrp,CompletionRoutine,pContext);
    return ntStatus;
}
I will do the best with what the God gave me.
oushengfen
驱动牛犊
驱动牛犊
  • 注册日期2007-06-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分747分
  • 威望124点
  • 贡献值1点
  • 好评度82点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-08-22 09:50
好贴,这个是DriverStudio做的吧.
游客

返回顶部