4163|6

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

百分求救:wdm USB驱动,两个device总是会互相影响 [复制链接]

我的电脑上连了两个USB serial class的device,现在一个拔线之后,另一个的write urb传输也会fail掉,请问各位高手是什么原因?
我看到在OnWriteInterrupt里面两个device object都返回fail,但是我只拔出了一个USB device啊。

NTSTATUS
StartWriteUrb(
        PDEVICE_EXTENSION Extension
        )
{                                                       

        // If the interrupt polling IRP is currently running, don't try to start
        // it again.
    USBD_PIPE_HANDLE PipeHandle;
        BOOLEAN startirp;
        KIRQL oldirql;
        PIRP Irp;
        PURB urb;
        PIO_STACK_LOCATION stack;

        TRACE("Enter StartWriteUrb() size=%d pipehandle=%X\n",Extension->WriteSize,Extension->UsbInterface->Pipes[Extension->DataOutPipe].PipeHandle);

//        KeAcquireSpinLock(&Extension->polllock, &oldirql);
        if (Extension->writepending)
                startirp = FALSE;
        else
                startirp = TRUE, Extension->writepending = TRUE;
//        KeReleaseSpinLock(&Extension->polllock, oldirql);

        if (!startirp)
                return STATUS_DEVICE_BUSY;        // already pending

        Irp = Extension->WritingIrp;
        urb = Extension->WritingUrb;
    PipeHandle = Extension->UsbInterface->Pipes[Extension->DataOutPipe].PipeHandle;

        ASSERT(Irp && urb);

        // Acquire the remove lock so we can't remove the device while the IRP
        // is still active.

        // Initialize the URB we use for reading the interrupt pipe

        UsbBuildInterruptOrBulkTransferRequest(
                urb,
                sizeof (struct _URB_BULK_OR_INTERRUPT_TRANSFER),
                PipeHandle,
                Extension->WriteCurrentChar,
                NULL,
                Extension->WriteSize,
                USBD_TRANSFER_DIRECTION_OUT,
                NULL);

        // Install "OnInterrupt" as the completion routine for the polling IRP.
       
        IoSetCompletionRoutine(
                Irp,
                (PIO_COMPLETION_ROUTINE) OnWriteInterrupt,
                Extension,
                TRUE,
                TRUE,
                TRUE);

        // Initialize the IRP for an internal control request

        stack = IoGetNextIrpStackLocation(Irp);
        stack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
        stack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
        stack->Parameters.Others.Argument1 = urb;

        // This IRP might have been cancelled the last time it was used, in which case
        // the cancel flag will still be on. Clear it to prevent USBD from thinking that it's
        // been cancelled again! A better way to do this would be to call IoReuseIrp,
        // but that function is not declared in WDM.H.

        Irp->Cancel = FALSE;

        TRACE("Exit StartWriteUrb()\n");

        return IoCallDriver(Extension->TopOfStackDeviceObject, Irp);
}       

最新回复

    我遇到了类似的问题,在一个应用程序里同时烧写两个(或多个)相同的usb设备,当其中一个意外拔出时,会导致别的设备写失败,如果拔出时别的设备的读操作正在进行则没有影响。我用的不是hub,而是pc机上的两个前置usb插口     麻烦你能详细说一下失败的具体原因并且如何避免吗?谢谢了!  详情 回复 发表于 2009-9-27 22:20
点赞 关注

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
另外pipehandle我查下来也没有共用,两个device用的是不同的pipehandle
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
呵呵,驱动inf与固件中的PID、VID等要统一,两个硬件,要使用不同的即可,还有驱动的GUID或硬描述符,当然也不能一致,否则肯定会有问题的。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
谢谢,我发现是因为用了hub,请问ddk编程中需要为hub添加相应的code吗?我不用hub的时候都没问题,hub本身没问题,其他驱动的device运行都没问题
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
应该考虑hub,虽然俺还不怎么明白usb协议,但是我们公司的产品都要经过几层级联hub进行测试.
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
解决了,连在hub上windows会发假的错误消息,只能特殊处理规避了。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
    我遇到了类似的问题,在一个应用程序里同时烧写两个(或多个)相同的usb设备,当其中一个意外拔出时,会导致别的设备写失败,如果拔出时别的设备的读操作正在进行则没有影响。我用的不是hub,而是pc机上的两个前置usb插口
    麻烦你能详细说一下失败的具体原因并且如何避免吗?谢谢了!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表