rapec
驱动牛犊
驱动牛犊
  • 注册日期2001-05-22
  • 最后登录2005-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1403回复:2

usb的中断管道的问题,版主帮帮忙啊!!!

楼主#
更多 发布于:2001-12-13 01:25
usb驱动里interrupt pipe 的read如何做,有例子吗?
Waltoney-ch.chm书中提到的usbint例子似乎不成!


[编辑 -  12/29/01 作者: zhf]
acx
acx
驱动小牛
驱动小牛
  • 注册日期2001-04-28
  • 最后登录2012-05-07
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望57点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-12-13 13:08
Chiris Cant 的书里有,不过我没试过
NTSTATUS UsbDoInterruptTransfer( IN PUSBKBD_DEVICE_EXTENSION dx, IN PVOID UserBuffer, ULONG& UserBufferSize)
{
// Check we\'re selected
if( dx->UsbPipeHandle==NULL)
return STATUS_INVALID_HANDLE;

// Check input parameters
ULONG InputBufferSize = UserBufferSize;
UserBufferSize = 0;
if( UserBuffer==NULL || InputBufferSize<8)
return STATUS_INVALID_PARAMETER;

// Keyboard input reports are always 8 bytes long
NTSTATUS status = STATUS_SUCCESS;
ULONG OutputBufferSize = 8;

// Allocate memory for URB
USHORT UrbSize = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
PURB urb = (PURB)ExAllocatePool(NonPagedPool, UrbSize);
if( urb==NULL)
{
DebugPrintMsg(\"No URB memory\");
return STATUS_INSUFFICIENT_RESOURCES;
}

// Remember when we started
// Get start tick count and length of tick in 100ns units
LARGE_INTEGER StartTickCount;
KeQueryTickCount( &StartTickCount);
ULONG UnitsOf100ns = KeQueryTimeIncrement();
// DebugPrint(\"Time increment %d\", UnitsOf100ns);

// Loop until non-zero report read, error, bad length, or timed out
// DebugPrintMsg(\"Reading Interrupt data\");
while( true)
{
// Build Do Bulk or Interrupt transfer request
UsbBuildInterruptOrBulkTransferRequest(
urb, UrbSize,
dx->UsbPipeHandle,
UserBuffer, NULL, OutputBufferSize,
USBD_TRANSFER_DIRECTION_IN,
NULL);

// Call the USB driver
status = CallUSBDI( dx, urb);
// Check statuses
if( !NT_SUCCESS(status) || !USBD_SUCCESS( urb->UrbHeader.Status))
{
DebugPrint(\"status %x URB status %x\", status, urb->UrbHeader.Status);
status = STATUS_UNSUCCESSFUL;
break;
}

// Give up if count of bytes transferred was not 8
if( urb->UrbBulkOrInterruptTransfer.TransferBufferLength!=OutputBufferSize)
break;

// If data non-zero then exit as we have a keypress
__int64* pData = (__int64 *)UserBuffer;
if( *pData!=0i64)
{
// DebugPrint(\"Got some data\");
break;
}

// Check for timeout
LARGE_INTEGER TickCountNow;
KeQueryTickCount( &TickCountNow);
ULONG ticks = (ULONG)(TickCountNow.QuadPart - StartTickCount.QuadPart);
if( ticks*UnitsOf100ns/10000000 >= dx->UsbTimeout)
{
DebugPrint(\"Timeout %d 100ns\", ticks*UnitsOf100ns);
status = STATUS_NO_MEDIA_IN_DEVICE;
break;
}
}
UserBufferSize = urb->UrbBulkOrInterruptTransfer.TransferBufferLength;

// DebugPrint(\"Transfer length %d\", urb->UrbBulkOrInterruptTransfer.TransferBufferLength);
if( NT_SUCCESS(status))
{
PUCHAR bd = (PUCHAR)UserBuffer;
DebugPrint(\"Transfer data %2x %2x %2x %2x %2x %2x %2x %2x\",
bd[0], bd[1], bd[2], bd[3], bd[4], bd[5], bd[6], bd[7]);
}

ExFreePool(urb);
return status;
}

NTSTATUS CallUSBDI( IN PUSBKBD_DEVICE_EXTENSION dx, IN PVOID UrbEtc,
IN ULONG IoControlCode/*=IOCTL_INTERNAL_USB_SUBMIT_URB*/,
   IN ULONG Arg2/*=0*/)
{
IO_STATUS_BLOCK IoStatus;
KEVENT event;

// Initialise IRP completion event
KeInitializeEvent(&event, NotificationEvent, FALSE);

// Build Internal IOCTL IRP
PIRP Irp = IoBuildDeviceIoControlRequest(
IoControlCode, dx->NextStackDevice,
NULL, 0, // Input buffer
NULL, 0, // Output buffer
TRUE, &event, &IoStatus);

// Get IRP stack location for next driver down (already set up)
PIO_STACK_LOCATION NextIrpStack = IoGetNextIrpStackLocation(Irp);
// Store pointer to the URB etc
NextIrpStack->Parameters.Others.Argument1 = UrbEtc;
NextIrpStack->Parameters.Others.Argument2 = (PVOID)Arg2;

// Call the driver and wait for completion if necessary
NTSTATUS status = IoCallDriver( dx->NextStackDevice, Irp);
if (status == STATUS_PENDING)
{
// DebugPrintMsg(\"CallUSBDI: waiting for URB completion\");
status = KeWaitForSingleObject( &event, Suspended, KernelMode, FALSE, NULL);
status = IoStatus.Status;
}

// return IRP completion status
// DebugPrint(\"CallUSBDI returned %x\",status);
return status;
}
很想你,身不由己……
rapec
驱动牛犊
驱动牛犊
  • 注册日期2001-05-22
  • 最后登录2005-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-12-28 12:17
driverstudio2.5 and driverstudio2.01都有EzUsb例子
.....\\DriverStudio\\DriverWorks\\Examples\\wdm\\EzUsb
我想请教该中断读如何成功的被上层应用调用??
中断管道我用它作握手, 但是它的握手数据并没有往上传请问这是怎么回事?

[编辑 -  12/28/01 作者: zhf]
游客

返回顶部