Мой драйвер находится в ЮСБ стеке над usbhub/usbd. Щбщение производится с помощью нехитрой ф-ции от Walter Oney -SendAwaitUrb();
Суть которой за вычетом некоторых проверок и деталей
NTSTATUS SendAwaitUrb(PDEVICE_OBJECT fdo, PURB urb)
{
PAGED_CODE();
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
KEVENT event;
KeInitializeEvent(&event, NotificationEvent, FALSE);
IO_STATUS_BLOCK iostatus;
PIRP IntIrp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
pdx->LowerDeviceObject, NULL, 0, NULL, 0, TRUE, &event, &iostatus);
PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(IntIrp);
stack->Parameters.Others.Argument1 = (PVOID) urb;
NTSTATUS status = IoCallDriver(pdx->LowerDeviceObject, IntIrp);
if (status == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
KdPrint(("Bus driver completes URB\n"));
status = iostatus.Status;
}
return status;
}
Собственно проблема: во время запрашивания данных с помощью URB_BULK_OR_INTERRUPT_TRANSFER в произвольном месте (данные читаются/пишутся постоянно а глюкнуть может как на 100й транзакции так и на 4000й а может и не глюкнуть) как правило когда размер данных максимален в моем случае 4к KeWaitforSingleObject() не возвращается т.е драйвер шины Урб не комплитит. Кто знает как помочь горю.
Здравствуйте, XorNeT, Вы писали:
XNT>Мой драйвер находится в ЮСБ стеке над usbhub/usbd. Щбщение производится с помощью нехитрой ф-ции от Walter Oney -SendAwaitUrb();
XNT>Собственно проблема: во время запрашивания данных с помощью URB_BULK_OR_INTERRUPT_TRANSFER в произвольном месте (данные читаются/пишутся постоянно а глюкнуть может как на 100й транзакции так и на 4000й а может и не глюкнуть) как правило когда размер данных максимален в моем случае 4к KeWaitforSingleObject() не возвращается т.е драйвер шины Урб не комплитит. Кто знает как помочь горю.
Два возможные причины —
1 данные посылаются слишком быстро, USB устройство не успевает принять следующий пакет Также устройство может посылает данные в тот момент, когда PC драивер не имеет ожидающего запроса на чтение
2 если посылается блок длиной кратой 64 байта (полный пакет) и он не завершается пакетом нулевой длины, тоже могут быть проблемы