阅读:1404回复:2
usb的中断管道的问题,版主帮帮忙啊!!!
usb驱动里interrupt pipe 的read如何做,有例子吗?
Waltoney-ch.chm书中提到的usbint例子似乎不成! [编辑 - 12/29/01 作者: zhf] |
|
沙发#
发布于: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; } |
|
|
板凳#
发布于:2001-12-28 12:17
driverstudio2.5 and driverstudio2.01都有EzUsb例子
.....\\DriverStudio\\DriverWorks\\Examples\\wdm\\EzUsb 我想请教该中断读如何成功的被上层应用调用?? 中断管道我用它作握手, 但是它的握手数据并没有往上传请问这是怎么回事? [编辑 - 12/28/01 作者: zhf] |
|