Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Аппаратное обеспечение -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 138

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — БВХ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interfeysusbpraktikaispolzovaniya2004.djvu
Предыдущая << 1 .. 132 133 134 135 136 137 < 138 > 139 140 141 142 143 144 .. 168 >> Следующая

ИНГ 14.17. Диспетчер РпР-запросов OnDispatchPnp
NTSTATUS OnDispatchPnp(
IN PDEVICEJOBJECT fdo,
IN PIRP Irp
)
{
PIO_STACK_LOCATION irpStack;
PDEVICE_EXTENSION pdx = fdo->DeviceExtension;
ULONG fen;
NTSTATUS ntstatus;
/* Получаем текущую позицию в стеке драйверов */ irpStack =
IoGetCurrentlrpStackLocation (Irp);
/* Номер функции */
fen = irpStack->MinorFunction;
446
Часть IV. Создание USB-устройств
switch (fen)
{
/* Обработка старта устройства */ case IRP_MN_START_DEVICE:
{
ntStatus = OnStartDevice(fdo); if (ntStatus == STATUS_SUCCESS)
{
pdx->Started = TRUE;
}
break;
}
/* Обработка останова устройства */ case IRP_MN_STOP_DEVICE:
{
// Сначала передаем запрос драйверу ниже по стеку
IoSkipCurrentlrpStackLocation(Irp);
IoCallDriver(pdx->StackDeviceObject, Irp);
// Отрабатываем останов нашего устройства
ntStatus = OnStopDevice(fdo) ;
break;
}
/* Удаление устройства из системы */ case IRP_MN_REMOVE_DEVICE:
{
ntStatus = OnRemoveDevice(fdo,Irp); break;
}
// Все остальные запросы передаем драйверу дальше по стеку default:
(
IoSkipCurrentlrpStackLocation(Irp);
ntStatus = IoCallDriver(pdx->StackDeviceObject, Irp);
}
}
return ntStatus;
}
Гпава 14. Создание USB-устройства на основе ATMEL АТ89С5131
447
Для непосредственного выполнения запросов к устройству необходимо
выполнить следующие действия:
1. Выделить блок нестраничной памяти (non paged memory) с помощью вызова
ExAllocatePool.
2. Сформировать запрос с помощью одной из функций формирования запросов
(например, LJsbBuildGetDescriptorRequest, usbBuildSelectCon-
figurationRequest, LJsbBuildlnterruptOrBulkTransferRequest И Т. П.).
3. Передать запрос USBD-драйверу с помощью функции DoCaiiusBD (листинг
14.18).
4. Обработать результат запроса.
5. Освободить память.
В случае асинхронного вызова два последних действия переносятся в
функцию, вызываемую при завершении выполнения операции.
NTSTATUS DoCallUSBD(
IN PDEVICE_OBJECT fdo,
IN PURB Urb )
{
NTSTATUS ntStatus, status = STATUS_SUCCESS;
PDEVICE_EXTENSION pdx;
PIRP irp;
KEVENT event;
IO_STATUS_BLOCK iostatus;
PIO_STACK_LOCATION nextStack;
pdx = fdo->DeviceExtension;
// объект синхронизации
KelnitializeEvent(&event, NotificationEvent, FALSE);
irp = IoBuildDeviceloControlRequest(
IOCTL_INTERNAL_USB_SUBMIT_URB,
pdx->StackDeviceObject,
NULL,
0,
448
Часть IV. Создание USB-устройств
NULL,
О,
TRUE, /* INTERNAL */
sevent,
sioStatus
) ;
// получение следующей позиции в стеке драйверов nextStack =
IoGetNextlrpStackLocation(irp);
// Формирование параметров для вызова nextStack-
>Parameters.Others.Argumentl = Urb;
// Вызов
ntstatus = IoCallDriver(pdx->StackDeviceObject, irp);
// Если запрос еще выполняется... if (ntstatus = STATUS_PENDING)
{
status = KeWaitForSingleObject( sevent,
Suspended,
KerneIMode,
FALSE,
NULL);
} else {
ioStatus.Status = ntstatus;
}
// Обработка результата запроса ntstatus = ioStatus.Status;
if (NT_SUCCESS(ntstatus))
{
if (!(USBD_SUCCESS(Urb->UrbHeader.Status))) ntstatus =
STATUSJJNSUCCESSFUL;
}
return ntstatus;
}
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131
449
Обработчик onstartDevice может содержать код, работающий с нулевой
конечной точкой, код получения дескрипторов и код конфигурирования
устройства (листинг 14.19).
NTSTATUS OnstartDevice(
IN PDEVICEJOBJECT fdo
)
{
PDEVICE_EXTENSION pdx;
NTSTATUS ntstatus;
PUSB_DEVICE_DESCRIPTOR deviceDescriptor = NULL;
PURB urb;
ULONG size;
pdx = fdo->DeviceExtension;
urb = ExAllocatePool( NonPagedPool,
sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
size = sizeof(USB_DEVICE_DESCRIPTOR); deviceDescriptor =
ExAllocatePool(NonPagedPool, size);
UsbBuildGetDescriptorRequest( urb,
(USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
USB_DEVICE_DESCRIPTOR_TYPE,
0,
0,
deviceDescriptor,
NULL,
size,
NULL
) ;
// Передача запроса на выполнение ntstatus = DoCallUSBD(fdo, urb);
о
Часть IV. оздание В-устроиств
// Отображение дескриптора
if (NT_SUCCESS(ntStatus)) {
DbgPrint("Device Descriptor:");
DbgPrint("bLength DbgPrint("bDescriptorType DbgPrint("bcdUSB
DbgPrint("bDeviceClass DbgPrint("bDeviceSubClass
DbgPrint("bDeviceProtocol DbgPrint("bMaxPacketSizeO DbgPrint("idVendor
DbgPrint("idProduct DbgPrint("bcdDevice DbgPrint("iManufacturer
DbgPrint("iProduct DbgPrint("iSerialNumber
}
// Освободить занятую память
ExFreePool(deviceDescriptor);
ExFreePool(urb);
if (NT_SUCCESS(ntStatus)) {
// Конфигурируем устройство ntStatus = OnConfigureDevice(fdo);
}
return ntStatus;
}
Конфигурирование устройства (процедура OnConfigureDevice) состоит из
следующих действий (листинг 14.20): ? передача запроса get_configuration
с минимальным размером буфера (для получения нужного размера буфера);
? получение полного дескриптора;
? создание конечных точек;
? конфигурирование конечных точек.
%d ", deviceDescriptor->bLength);
Ох%х", deviceDescriptor->bDescriptorType); Ох%х", deviceDescriptor-
>bcdUSB);
Ох%х", deviceDescriptor->bDeviceClass); Ох%х", deviceDescriptor-
Предыдущая << 1 .. 132 133 134 135 136 137 < 138 > 139 140 141 142 143 144 .. 168 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.