Информационный сайт

 

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

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

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

PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor = NULL; UCHAR alternateSetting, MylnterfaceNumber; PUSBD_INTERFACE_INFORMATION interfaceObject; USBD_INTERFACE_LIST_ENTRY interfaceList;
pdx = fdo->DeviceExtension;
// Память для URB urb = ExAllocatePool(NonPagedPool,
sizeof(struct _URB_CONTROL_DESCRIPT0R_REQUEST));
// Получить только дескриптор конфигурации size = sizeof(USB_CONFIGURATION_DESCRIPTOR) + 16; configurationDescriptor = ExAllocatePool(NonPagedPool, size);
UsbBuildGetDescriptorRequest(urb,
(USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
USB_CONFIGURATION_DESCRIPTOR_TYPE,
0,
0,
configurationDescriptor, NULL,
sizeof (USB_CONFIGURATION_DESCRIPTOR), NULL
ntStatus = DoCaIIUSBD(fdo, urb);
);
452
Часть IV. Создание USB-устройств
Il Определение нужного размера буфера size = configurationDescriptor->wTotalLength + 16;
Il Освободить старый буфер и отвести новый, нужного размера ExFreePool(configurationDescriptor); configurationDescriptor = NULL;
configurationDescriptor = ExAllocatePool(NonPagedPool, size);
11 Получение полного дескриптора конфигурации UsbBuildGetDescriptorRequest(urb, (USHORT) sizeof (struct _URB_C0NTR0L_DESCRIPT0R_REQUEST), USB__C0NFIGURATI0N_DESCRIPT0R_TYPE, 0, 0,
configurationDescriptor,
NULL,
size,
NULL
);
ntStatus = DoCaIlUSBD(fdo, urb);
Il Получение конфигурации interfaceList.InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx( ConfigurationDescriptor, ConfigurationDescriptor, -1, -1, -1, -1, -1
>;
Il Создание запроса для получения конфигурации urb = USBD_CreateConfigurationRequestEx(
ConfigurationDescriptor, SinterfaceList
>;
11 Получение указателя на буфер описания интерфейса interfaceObject = (PUSBD__INTERFACE_INF0RMATI0N)
(S(urb->UrbSelectConfiguration.Interface));
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131
453
Il Конфигурирование конечных точек интерфейса for (j=0; j<interfaceList[0].InterfaceDescriptor->bNumEndpoints; з++)
PUSBD_pipe_information pipe;
pipe = &interfaceObject->Pipes[j];
pipe->MaximumTransferSize = 1024; Il установить при необходимости
DbgPrint("PipeType 0x%x\n", ріре->РіреТуре);
DbgPrint("EndpointAddress 0x%x\n", pipe ->EndpointAddress);
DbgPrint("MaxPacketSize 0x%x\n", pipe ->MaximumPacketSize);
DbgPrint("Interval 0x%x\n", pipe ->Interval);
DbgPrint("Handle 0x%x\n", pipe ->PipeHandle);
DbgPrint("MaximumTransferSize 0x%x\n", pipe ->MaximumTransferSize);
)
ntStatus = DoCaIlUSBD(fdo, urb) ; ExFreePool(urb);
ExFreePool(configurationDescriptor); return ntStatus;
)
В обработчике onstopDevice производится передача запроса set_configuration с нулевым номером конфигурации, т. е. сброс конфигурации (листинг 14.21).
¦ЇЗДІ ' ИСТИНГ 14.21. Обработчик OnstopDevice ¦*.?ї?"г__1_____________.......IW..*..'.. • ¦ ¦¦ ..... • • ¦•¦M ----«*.._•----- •.......«.t ........•..........................•
ntstatus OnstopDevice(
in PDEVIcejobJECT fdo )
{
pdevice_extension pdx;
ntstatus ntStatus = statusJ3UCCESS;
purb urb;
ULONG size;
pdx = fdo->DeviceExtension;
454
Часть IV. Создание USB-устройств
size= sizeof(struct _URB_SELECT_CONFIGURATION);
urb = ExAllocatePool(NonPagedPool, size); '
if (urb) {
NTSTATUS status;
UsbBuildSelectConfigurationRequest(urb, (USHORT) size, NULL); status = DoCaIlUSBD(fdo, urb); ExFreePool(urb); } else (
ntStatus = STATUS_N0_MEM0RY;
}
return ntStatus;
}
ОбрабоТЧИК OnRemoveDevice СОДерЖИТ КОД, "обратный" КОДУ OnAddDevice.
В этом обработчике удаляется символьное имя устройства и освобождается объект устройства (листинг 14.22).
ДДЇнг 14.22. Обработчик OnRemovBDevj-caA. ¦ ^ ¦
NTSTATUS OnRemoveDevice( IN PDEVICE_OBJECT fdo, IN PIRP Irp )
{
NTSTATUS ntStatus;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension; ULONG i;
WCHAR NameBuffer[] = L"\\Device\\" DEVICE_NAME_STRING;
WCHAR DOSNameBuffer[] = L"\\DosDevices\\" DEVICE_NAME_STRING;
UNICODE_STRING uniNameString, uniDOSString;
Il Создание буферов для имен
RtllnitUnicodeString(iuniNameString, NameBuffer);
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131
455
RtlInitUmcodeString(&uniDOSString , DOSNameBuffer) ; // Удаление символьного имени драйвера JntStatus = ioDeleteSymbolicLink(SuniNameString);
JoDetachDevice(pdx->StackDeviceObject); IoDeleteDevice(fdo);
IoSkipCurrentlrpStackLocation(Irp);
ntStatus = IoCallDriver(pdx->StackDeviceObject, Irp);
return ntStatus;
}
Чтение данных производится в обработчике onDeviceRead (листинг 14.23).
И'стинг 14.23. Чтение данных с устройства
("у . . .і ш...............
NTSTATUS OnDeviceRead(
IN PDEVICE_OBJECT DeviceObject, IN PIRP plrp
)
{
NTSTATUS
PUSBD_PIPE_INFORMATION
USBD_PIPE_HANDLE
PURB
ULONG
"!1If
ntStatus pipelnfо pipeHandle urb
urbSize
STATUS_SUCCESS;
NULL;
NULL;
NULL;
0;
BIfSi
шш;.
pipelnfо = ... ; Il одна из конечных точек pipeHandle = pipelnfo->PipeHandle;
urbSize = sizeof(struct URB BULK OR INTERRUPT TRANSFER);
Предыдущая << 1 .. 132 133 134 135 136 137 < 138 > 139 140 141 142 143 144 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100