阅读:3822回复:7
USB超时的问题
请问各位大虾,USB采用控制传输时,如何添加读取数据的超时,
我的程序如下: NTSTATUS ntStatus, status = STATUS_SUCCESS; PDEVICE_EXTENSION pdx; PIRP irp; KEVENT event; IO_STATUS_BLOCK ioStatus; PIO_STACK_LOCATION nextStack; pdx = fdo->DeviceExtension; KeInitializeEvent(&event, NotificationEvent, FALSE); irp = IoBuildDeviceIoControlRequest( IOCTL_INTERNAL_USB_SUBMIT_URB, pdx->StackDeviceObject, NULL, 0, NULL, 0, TRUE, /* INTERNAL */ &event, &ioStatus); nextStack = IoGetNextIrpStackLocation(irp); ASSERT(nextStack != NULL); nextStack->Parameters.Others.Argument1 = Urb; ntStatus = IoCallDriver(pdx->StackDeviceObject, irp); if (ntStatus == STATUS_PENDING) { status = KeWaitForSingleObject( &event, Suspended, KernelMode, FALSE, NULL ); } else { ioStatus.Status = ntStatus; } ntStatus = ioStatus.Status; if (!(USBD_SUCCESS(Urb->UrbHeader.Status))) pdx->LastFailedUrbStatus = Urb->UrbHeader.Status; if (NT_SUCCESS(ntStatus)) { if (!(USBD_SUCCESS(Urb->UrbHeader.Status))) ntStatus = STATUS_UNSUCCESSFUL; } return ntStatus; 我曾经试图在WaitForSingleObject时,增加时间参数,但每次系统执行到这里都会崩溃,这是为什么?正确做法是怎样的? (硬件为CY7C63000A) |
|
最新喜欢:![]() |
沙发#
发布于:2002-06-06 21:29
driverworks 对应哪一段啊?
|
|
板凳#
发布于:2002-05-30 12:23
去把driverworks里面对应的代码,拿过来不就行了!
|
|
|
地板#
发布于:2002-05-27 22:44
非常感谢大家的回答
我的读取数据程序如下: NTSTATUS Status; LONGLONG FilePointer; PUCHAR TransferBuffer; PUCHAR TransferBuffer1; ULONG TransferLength; PURB urb = NULL; ULONG urbSize = 0; ULONG i; PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION )fdo->DeviceExtension; PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); if (pdx->Stopped) { return CompleteRequest(Irp, STATUS_DELETE_PENDING, 0); } if (!LockDevice(fdo)) { return CompleteRequest(Irp, STATUS_DELETE_PENDING, 0); } Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; FilePointer = IrpStack->Parameters.Read.ByteOffset.QuadPart; if (FilePointer<0) return CompleteRequest(Irp, STATUS_INVALID_PARAMETER, 0); TransferBuffer = (PUCHAR)Irp->AssociatedIrp.SystemBuffer; TransferLength = IrpStack->Parameters.Read.Length; if (TransferLength>0x28) return STATUS_BUFFER_OVERFLOW; urbSize = sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST); urb = ExAllocatePool(NonPagedPool,urbSize); if (!urb) { return STATUS_NO_MEMORY; } UsbBuildVendorRequest(urb,URB_FUNCTION_VENDOR_ENDPOINT,(USHORT) urbSize,1,0,0xe2,0,0,TransferBuffer,NULL,TransferBufferMDL,TransferLength, NULL) Status = CallUSBD(fdo, urb); if (NT_SUCCESS(Status)) { Irp->IoStatus.Information = urb->UrbControlVendorClassRequest.TransferBufferLength; } ExFreePool(urb); UnlockDevice(fdo); IoCompleteRequest (Irp,IO_NO_INCREMENT); return Status; 其中CallUSBD的程序如下,增加了超时: NTSTATUS ntStatus, status = STATUS_SUCCESS; PDEVICE_EXTENSION pdx; PIRP irp; KEVENT event; LARGE_INTEGER FiveSecondTimeOut; FiveSecondTimeOut.QuadPart=-5i64*1000000i64*10; IO_STATUS_BLOCK ioStatus; PIO_STACK_LOCATION nextStack; pdx = fdo->DeviceExtension; KeInitializeEvent(&event, NotificationEvent, FALSE); irp = IoBuildDeviceIoControlRequest( IOCTL_INTERNAL_USB_SUBMIT_URB, pdx->StackDeviceObject, NULL, 0, NULL, 0, TRUE, /* INTERNAL */ &event, &ioStatus); nextStack = IoGetNextIrpStackLocation(irp); ASSERT(nextStack != NULL); nextStack->Parameters.Others.Argument1 = Urb; ntStatus = IoCallDriver(pdx->StackDeviceObject, irp); if (ntStatus == STATUS_PENDING) { status = KeWaitForSingleObject( &event, Suspended, KernelMode, FALSE, &FiveSecondTimeOut ); } else { ioStatus.Status = ntStatus; } ntStatus = ioStatus.Status; if (!(USBD_SUCCESS(Urb->UrbHeader.Status))) pdx->LastFailedUrbStatus = Urb->UrbHeader.Status; if (NT_SUCCESS(ntStatus)) { if (!(USBD_SUCCESS(Urb->UrbHeader.Status))) ntStatus = STATUS_UNSUCCESSFUL; } return ntStatus; 原程序没有超时时,KeWaitForSingleObject的最后一个参数为NULL,并且硬件设备无返回时,系统会一直等待,但增加超时后,超时本身会起作用,而当返回到读程序,并调用IoCompleteRequest (Irp,IO_NO_INCREMENT)会崩溃。我个人怀疑是否有某些善后处理工作没做有关,请各位大虾多多指教,谢谢! |
|
地下室#
发布于:2002-05-27 20:17
同样的问题,据说还有一大堆善后处理没有做,怎么做?关注
|
|
5楼#
发布于:2002-05-27 20:15
urb从那里来?
|
|
6楼#
发布于:2002-05-27 18:59
if (status= pending)
{ init your timeout; status = KeWaitForSingleObject( &event, Suspended, KernelMode, FALSE, &timeout); ............... } |
|
7楼#
发布于:2002-05-27 08:31
你怎么加入的时间参数,也写出来!
最好贴出使你的机器crash的代码! |
|