LiuPeng
驱动牛犊
驱动牛犊
  • 注册日期2002-05-24
  • 最后登录2003-03-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3822回复:7

USB超时的问题

楼主#
更多 发布于:2002-05-26 21:33
请问各位大虾,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)

最新喜欢:

brightfengbright...
shlei20
驱动牛犊
驱动牛犊
  • 注册日期2002-02-01
  • 最后登录2003-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-06 21:29
driverworks 对应哪一段啊?
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-30 12:23
去把driverworks里面对应的代码,拿过来不就行了!
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
LiuPeng
驱动牛犊
驱动牛犊
  • 注册日期2002-05-24
  • 最后登录2003-03-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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)会崩溃。我个人怀疑是否有某些善后处理工作没做有关,请各位大虾多多指教,谢谢!

sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-27 20:17
同样的问题,据说还有一大堆善后处理没有做,怎么做?关注
cqzhl
驱动牛犊
驱动牛犊
  • 注册日期2002-01-29
  • 最后登录2007-03-21
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-05-27 20:15
urb从那里来?
flay
驱动牛犊
驱动牛犊
  • 注册日期2002-04-25
  • 最后登录2003-07-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-05-27 18:59
if (status=    pending)
{
init your timeout;

status = KeWaitForSingleObject(
&event,
Suspended,
KernelMode,

FALSE, &timeout);
...............

}


halley
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2002-10-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-05-27 08:31
你怎么加入的时间参数,也写出来!
最好贴出使你的机器crash的代码!
游客

返回顶部