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

 

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

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

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

Il Чтение данных
procedure TForml.ButtonlClick(Sender: TObject); begin
EOutput.Text:= Driver.Read; end;
end.
438
Часть IV. Создание USB-устройств
I - DrbugVicw pn \i.HOME (local) №EI|
Pile Edit Capture Optier* Computer Help
ісзузм ч I e •* I * і & & <
0
1
2 3 4 5 6 7 8 9
10
12 13 14 15 16 1? 18 19 20 21 22 23 24 25
19 19 19 19 19 19 19 19 19 19 19
Загрузить j
Выгрузить lRT
Открыть
~U Закрыть j
FUNC [800H)
Read
ze=4096
|37 25 52 54 55 56 57 58
19
19:_
19:46:57 19:46:57 19:46:57 19 : 46 : 57 19:46:57 19:46:57 19:46:57 19:46:57 19:46:57 19:46:57 19:46:57 19:46:57
)
ATDriverDevice: : Read START
READ: Requested=8 MaxSize=4096 Read SUCCESS 8 bytes
55
37
82
84
85
86
87
88
ATDriverDevice::Read EHD
Рис. 14.24. Результат чтения данных с USB-устройства
14.2.9. Чтение данных
с конечных точек других типов
В предыдущем разделе мы пользовались конечной точкой типа interrupt. При необходимости можно легко заменить тип конечной точки. Листинг 14.10 показывает константы для дескриптора конфигурации конечной точки типа bulk, а листинг 14.11 — изменения в коде драйвера.
'«Листинг 14.10. Константы для конечной точки типа bulk /* первая конечная точка */
•define EP_l_CONFIG (BULK|EP_CONFIG_IN) /* конфигурация */
¦define EP_1_ADDRESS (1|EP_DIRECT_IN). /* адрес */
¦define EP 1 ATTRIBUTES BULK /* атрибуты */
Глава 14. Создание USB-устроиства на основе ATMEL АТ89С5131_439
NTSTATUS ATDriverDevice::Read(KIrp I) {
PURB pUrb - m_EndpointlIN.BuildBulkTransfer( pBuffer, Il Буфер
dwTotalSize, Il Сколько байт читать TRUE, Il Направление (TRUE - IN)
NULL,
FALSE, Il Разрешить короткие чтения
NULL
);
purb->UrbBulkOrInterruptTransfer.TransferFlags -
(USBD TRANSFER DIRECTION IN I USBD SHQRT_TRANSFER_OK);
dwBytesRead = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;
}
Для использования конечных точек типа control достаточно изменить метод формирования пакета запроса:
PURB pUrb = m_Endpoint1IN.BuіldControlTransfer( pBuffer, Il Буфер
dwTotalSize, II Сколько данных читать? TRUE Il Направление (TRUE - IN)
);
14.2.10. "Чистый" USB-драйвер
Использование Driver Studio избавило нас от множества рутинной работы, однако не стоит забывать, что эта программа стоит довольно существенных денег, в то время как использование Windows DDK доступно всем разработчикам.
Основную структуру WDM-драйвера мы уже описали в главе 9. В этом разделе мы приведем схему разработки такого драйвера для шины USB.
Общий "план" драйвера показан на рис. 14.25.
инг 14.11. Изменение в коде драйвера для чтения конечной точки
440
Часть IV. Создание USB-устройств
DriverEntry
DriverObject->MajorFunction[IRP_MJ_PNP] = OnDlepatchPnp DriverObiect->MajorFunctionllRP_MJ_CREATE] = OnCreate DriverObject->MajorFunction(IRP_MJ_CLOSE] = OnCloee DriverObject->MajorFunction[IRP_MJ_READ] = OnDevlceRead DriverOb|ect->Driverunload = Onunload DriverObject*>DriverExtension->AddDevice = OnAddDevice DnvecObiacl->MajocFunclion(IRP_MJ_POWERl = OnDispatehPower
MinorFunction
IRP_MN_START_DEVICE: OnStartDevice IRP_MN_STOP_DEVICE: OnSlopDevice IRP_MN_REMOVE_DEVICE: OnRemoveDevice
MinorFunction
IRP_MN_SET_POWER IRP_MN_QUERY_POWER
Рис. 14.25. Общий "план" USB-драйвера
Основными обработчиками драйвера являются:
? DriverEntry — точка входа в драйвер;
? OnAddDevice — вызывается при добавлении нового устройства;
? OnCreate — вызывается при создании устройства;
? onciose — вызывается при закрытии устройства;
? onunload — вызывается при выгрузке драйвера;
? OnDispatehPower — диспетчер управления энергопотреблением;
? onDispatchPnp — диспетчер для обработки командами PnP:
• OnStartDevice — старт устройства;
• OnStopDevice — останов устройства;
• OnRemoveDevice — удаление устройства;
? OnDeviceRead — вызывается При обработке функции ReadFile. Регистрация ОСНОВНЫХ Обработчиков ПРОИЗВОДИТСЯ В Процедуре DriverEntry
(листинг 14.12).
NTSTATUS
DriverEntry(
IN PDRIVER-OBJECT DriverObject, IN PUNICODE_STRING RegiatryPath
. )
{
NTSTATUS ntStatus - STATUS SUCCESS;
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131
441
Il Основные обработчики драйвера
DriverObject->Maj orFunction[IRP_MJ_CREATE]= OnCreate; DriverObject->MajorFunction[IRP_MJ_CLOSE ]= OnClose; DriverObject->MajorFunction[IRP_MJ_READ ]= OnDeviceRead; DriverObject->MajorFunction[IRP_MJ_PNP ]= OnDispatchPnp; DriverObject->MajorFunction[IRP_MJ_POWER ]= OnDispatchPower; DriverObject->DriverUnload = OnUnload;
DriverObject->DriverExtension->AddDevice = OnAddDevice;
return ntStatus;
}
В отличие от NT-драйвера, в WDM-драйвере создание объекта устройства и регистрация символьных имен должна выполняться внутри процедуры
OnAddDevice (ЛИСТИНГ 14.13).
к.......і.. .."....і......../..."ї........."...і.!.«-.....і.........-¦-.......:.i.....•...¦...¦....¦..¦.¦¦_..»„.........і....... .....................чч
NTSTATUS OnAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
Предыдущая << 1 .. 129 130 131 132 133 134 < 135 > 136 137 138 139 140 141 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100