求教各位,本人使用USB D12 philips执行读操作碰到一个奇怪的问题?

taixinltd 2009-08-11 05:45:03
求教各位,本人使用USB D12 执行读操作碰到一个奇怪的问题?
我在使用ReadFile(hDev,pData,256,0)时,当待接收的数据大小<64或>64时,调用可以返回;
但是当待接收数据等于64时,调用不返回,一直阻塞在那里;不知道什么原因?
...全文
130 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2010-03-05
  • 打赏
  • 举报
回复
是固件的问题吧,当数据长度是端点容量的时候,应该再发一个空包,否则usb协议栈就死等这个空包了。

俺认为当长度是128, 192时,也有可能出现这个问题。
taixinltd 2009-08-13
  • 打赏
  • 举报
回复
NTSTATUS ntStatus = STATUS_SUCCESS;
PD12_PIPE pipeHandle = NULL;
PFILE_OBJECT fileObject;
PIO_STACK_LOCATION irpStack, nextStack;
PDEVICE_EXTENSION deviceExtension;
PURB urb;
PD12_RW_CONTEXT context = NULL;

D12_KdPrint (("D12TEST.SYS: enter D12_Read\n"));

D12_IncrementIoCount(DeviceObject);

deviceExtension = DeviceObject->DeviceExtension;

if (deviceExtension->AcceptingRequests == FALSE) {
ntStatus = STATUS_DELETE_PENDING;
Irp->IoStatus.Status = ntStatus;
Irp->IoStatus.Information = 0;

IoCompleteRequest (Irp,
IO_NO_INCREMENT
);

D12_DecrementIoCount(DeviceObject);
return ntStatus;
}

irpStack = IoGetCurrentIrpStackLocation (Irp);
fileObject = irpStack->FileObject;

pipeHandle = fileObject->FsContext;

if (!pipeHandle) {
ntStatus = STATUS_INVALID_HANDLE;
goto D12_Read_Reject;
}

//
// submit the write request to USB
//

switch (pipeHandle->PipeInfo->PipeType) {
case UsbdPipeTypeIsochronous:
D12_ResetPipe(DeviceObject, pipeHandle, FALSE);

urb = D12_BuildIsoRequest(DeviceObject,
Irp,
pipeHandle,
TRUE);
if (urb) {

nextStack = IoGetNextIrpStackLocation(Irp);
ASSERT(nextStack != NULL);
ASSERT(DeviceObject->StackSize>1);

nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
nextStack->Parameters.Others.Argument1 = urb;
nextStack->Parameters.DeviceIoControl.IoControlCode =
IOCTL_INTERNAL_USB_SUBMIT_URB;

IoSetCompletionRoutine(Irp,
D12_IsoReadWrite_Complete,
urb,
TRUE,
TRUE,
TRUE);

D12_KdPrint (("D12TEST.SYS: IRP = 0x%x current = 0x%x next = 0x%x\n",
Irp, irpStack, nextStack));

ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
Irp);
goto D12_Read_Done;
} else {
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
}
break;
case UsbdPipeTypeInterrupt:
case UsbdPipeTypeBulk:
urb = D12_BuildAsyncRequest(DeviceObject,
Irp,
pipeHandle,
TRUE);
if (urb) {
context = ExAllocatePool(NonPagedPool, sizeof(D12_RW_CONTEXT));
}

if (urb && context) {
context->Urb = urb;
context->DeviceObject = DeviceObject;

nextStack = IoGetNextIrpStackLocation(Irp);
ASSERT(nextStack != NULL);
ASSERT(DeviceObject->StackSize>1);

nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
nextStack->Parameters.Others.Argument1 = urb;
nextStack->Parameters.DeviceIoControl.IoControlCode =
IOCTL_INTERNAL_USB_SUBMIT_URB;

IoSetCompletionRoutine(Irp,
D12_AsyncReadWrite_Complete,
context,
TRUE,
TRUE,
TRUE);

D12_KdPrint (("D12TEST.SYS: IRP = 0x%x current = 0x%x next = 0x%x\n",
Irp, irpStack, nextStack));

D12_AddPendingIrp(DeviceObject, Irp);
ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
Irp);
goto D12_Read_Done;
} else {
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
}

break;
default:
ntStatus = STATUS_INVALID_PARAMETER;
TRAP();
}

D12_Read_Reject:

Irp->IoStatus.Status = ntStatus;
Irp->IoStatus.Information = 0;

IoCompleteRequest (Irp,
IO_NO_INCREMENT
);

D12_Read_Done:

return ntStatus;
taixinltd 2009-08-13
  • 打赏
  • 举报
回复
socoola 2009-08-11
  • 打赏
  • 举报
回复
是否是读的数据长度本来就不够64?
MoXiaoRab 2009-08-11
  • 打赏
  • 举报
回复
驱动里面IRP_MJ_READ的派发函数贴出来看看
taixinltd 2009-08-11
  • 打赏
  • 举报
回复
256
bohut 2009-08-11
  • 打赏
  • 举报
回复
CreateFile时设定的缓存区大小是多少?

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧