Windows. Вирусы. Ноутбуки. Интернет. Office. Утилиты. Драйверы

Хорошая книга, многое объясняет. Пригодится тем, кто хочет понять как происходит передача данных по шине USB.

Введение 1
Для кого эта книга: 2
Что вы найдете в книге 2
Программные требования 3
Аппаратные требования 4
О программном коде 4
Краткое описание глав 4
Обозначения 6
Благодарности 7
ЧАСТЬ I. ВВЕДЕНИЕ В USB 9
Глава 1. Что такое USB 11
1.1. История USB 11
1.2. Сравнение USB с другими интерфейсами 14
1.3. Основные понятия USB 16
1.3.1. Общая архитектура шины 16
1.3.2. Физическая и логическая архитектура шины 16
1.3.3. Составляющие USB 18
1.3.4. Свойства USB-устройств 18
1.3.5. Свойства хабов 19
1.3.6. Свойства хоста 20
1.4. Примеры USB-устройств 20
1.4.1. Мышь и клавиатура., 21
1.4.2. Мониторы 21
1.4.3. Переходники USB-to-COM и USB-to-LPT 22
1.4.4. Сканеры 23
1.4.5. Модемы 23
1.4.6. Звуковые колонки 24
1.4.7. Флеш-диски 25
1.4.8. Хабы 28
1.4.9. Измерительная техника 28
1.4.10. Экзотические устройства 29
1.5. Сетевое соединение через USB 30
1.5.1. Конвертер USB-Ethernet 31
1.5.2. Прямое соединение через USB-порт 31
1.6. Передача данных 31
1.6.1. Принципы передачи данных 32
1.6.2. Механизм прерываний 32
1.6.3. Интерфейсы хост-адаптера 32
1.6.4. Возможность прямого доступа к памяти 34
1.6.5. Режимы передачи данных 34
1.7. Установка и конфигурирование USB-устройств 35
1.7.1. Настройки BIOS для USB 38
1.7.2. Устранение проблем 41
1.8. Ограничения USB 45
1.9. Если вы покупаете компьютер 46
1.9.1. HS и USB 2.0 - не одно и то же! 46
1.9.2. Системная плата 47
1.9.3. Корпус 48
1.9.4. USB для “старых” моделей компьютеров 48
1.10. Интернет-ресурсы к этой главе 49
Глава 2. Аппаратное обеспечение USB 51
2.1. Кабели и разъемы 51
2.1.1. Типы кабелей 52
2.1.2. Длина кабеля 53
2.1.3. Разъемы 53
2.2. Физический интерфейс 55
2.2.1. Кодирование данных 57
2.2.2. Идентификация устройств 58
2.3. Питание 59
2.3.1. Типы питания USB-устройств 59
2.3.2. Управление энергопотреблением 60
2.3.3. Вход в режим низкого энергопотребления 61
2.4. Интернет-ресурсы к этой главе 61
ЧАСТЬ II. ВНУТРЕННЯЯ ОРГАНИЗАЦИЯ USB 63
Глава 3. Внутренняя организация шины 65
3.1. Логические уровни обмена данными 65
3.1.1. Уровень клиентского ПО 66
3.1.2. Уровень системного драйвера USB 67
3.1.3. Уровень хост-контроллера интерфейса 68
3.1.4. Уровень шины периферийного устройства 68
3.1.5. Уровень логического USB-устройства 69
3.1.6. Функциональный уровень USB-устройства 69
3.2. Передача данных по уровням 69
3.3. Типы передач данных 71
3.4. Синхронизация при изохронной передаче 73
3.5. Кадры 77
3.6. Конечные точки 78
3.7. Каналы 79
3.8. Пакеты 81
3.8.1. Формат пакетов-маркеров IN, OUT, SETUP и PING 83
3.8.2. Формат пакета SOF 83
3.8.3. Формат пакета данных 84
3.8.4. Формат пакета подтверждения < 84
3.8.5. Формат пакета SPLIT * 84
3.9. Контрольная сумма 85
3.9.1. Алгоритм вычисления CRC 86
3.9.2. Программное вычисление CRC 87
3.10. Транзакции 90
3.10.1. Типы транзакций 91
3.10.2. Подтверждение транзакций и управление потоком 92
3.10.3. Протоколы транзакций 93
Глава 4. Внутренняя организация устройства 96
4.1. Запросы к USB-устройствам 96
4.1.1. Конфигурационный пакет 96
4.1.2. Стандартные запросы к устройствам 99
4.1.3. Дескрипторы устройства 105
Глава 5. Внутренняя организация хоста и хабов 123
5.1. Хабы 123
5.1.1. Взаимодействие хост-контроллера с хабом 126
5.1.2. Дескриптор хаба 127
5.1.3. Запросы хабов 129
5.1.4. Запрос CLEAR_HUB_FEATURE 130
5.1.5. Запрос CLEAR PORT_FEATURE 130
5.1.6. Запрос GET_BUS_STA ТЕ 131
5.1.7. Запрос GET_HUB_DESCRfPTOR 131
5.1.8. Запрос GET_HUB_STATUS 131
5.1.9. Запрос GET_PORT_STA TUS 132
5.1.10. Запрос SET_HUB_DESCRIPTOR 134
5.1.11. Запрос SET_HUB_FEATURE 134
5.1.12. Запрос SET PORT FEATURE. 134
5.2. Совместная работа устройств с разными скоростями 135
Глава 6. USB без ПК 137
6.1. Разъемы OTG 138
6.2. Типы OTG-устройств 138
6.3. Дескриптор OTG-устройства 139
6.4. Интернет-ресурсы к этой главе 140
ЧАСТЬ III. ПРАКТИКА ПРОГРАММИРОВАНИЯ 141
Глава 7. Поддержка USB в Windows 143
7.1. Модель WDM 144
7.2. Взаимодействие с USB-драйвером 146
Глава 8. HID-устройства * 149
8.1. Свойства HID-устройства 149
8.2. Порядок обмена данными с HID-устройством 151
8.3. Установка HID-устройства 152
8.4. Идентификация HID-устройства 152
8.4.1. Идентификация загрузочных устройств 153
8.4.2. Дескриптор конфигурации HID-устройства 153
8.4.3. HID-дескриптор 154
8.4.4. Дескриптор репорта 156
8.5. Структура дескриптора репорта 156
8.5.1. Структура элементов репорта 156
8.5.2. Типы элементов репорта 157
8.5.3. Примеры дескрипторов 165
8.6. Запросы к HID-устройству 168
8.6.1. Запрос GET_REPORT. 169
8.6.2. Запрос SET_REPORT 169
8.6.3. Запрос GETJDLE. 170
8.6.4. Запрос SETJDLE 170
8.6.5. Запрос GET_PROTOCOL 171
8.6.6. Запрос SET_PROTOCOL 171
8.7. Инструментальные средства 171
8.8. Взаимодействие с HID-драйвером 172
Глава 9. Введение в WDM 181
9.1. Драйверные слои 183
9.2. Символьные имена устройств 184
9.3. Основные процедуры драйвера WDM 189
9.3.1. Процедура DriverEntry 190
9.3.2. Процедура AddDevice 192
9.3.3. Процедура Unload 194
9.3.4. Рабочие процедуры драйвера 196
9.3.5. Обслуживание запросов IOCTL 203
9.4. Загрузка драйвера и обращение к процедурам драйвера 209
9.4.1. Процедура работы с драйвером 209
9.4.2. Регистрация драйвера 210
9.4.3. Обращение к рабочим процедурам 217
9.4.4. Хранение драйвера внутри исполняемого файла 218
9.5. Инструменты создания драйверов 220
9.5.1. NuMega Driver Studio 220
9.5.2. Jungo WinDriver 220
9.5.3. Jungo KernelDriver 220
Глава 10. Спецификация PnP для USB 221
10.1. Общие сведения о системе Plug and Play 221
10.1.1. Задачи и функции Plug and Play 221
10.1.2. Запуск процедуры PnP 222
10.1.3. Программные компоненты PnP 224
10.2. Plug and Play для USB 225
10.2.1. Конфигурирование устройств USB 226
10.2.2. Нумерация устройств USB 226
10.2.3. PnP-идентификаторы устройств USB 228
10.3. Получение списка USB-устройств 229
10.4. INF-файл 234
10.4.1. Структура INF-файла 234
10.4.2. Секция Version 235
10.4.3. Секция Manufacturer 237
10.4.4. Секция DestinationDirs 239
10.4.5. Секция описания модели 241
10.4.6. Секция xxx.AddReg и xxx.DelReg. 242
10.4.7. Секция ххх.LogConfig 244
10.4.8. Секция xxx.CopyFiles 244
10.4.9. Секция Strings 245
10.4.10. Связи секций 246
10.4.11. Создание и тестирование INF-файлов 247
10.4.12. Установка устройств с помощью INF-файла 248
10.5. Ветки реестра для USB 249
Глава 11. Функции BIOS 251
11.1. Сервис BIOS 1АН 251
11.1.1. Функция В101Н - определение наличия PCI BIOS 252
11.1.2. Функция В102Н - поиск PCI-устройства по идентификаторам
устройства и производителя 253
11.1.3. Функция В103Н - поиск PCI-устройства по коду класса 254
11.1.4. Функция В108Н - чтение регистра конфигурации (Byte) 255
11.1.5. Функция ВЮ9Н - чтение регистра конфигурации (Word) 256
11.1.6. Функция В10АН - чтение регистра конфигурации (DWord) 256
11.1.7. Функция В10ВН - запись регистра конфигурации (Byte) 257
11.1.8. Функция В10СН - запись регистра конфигурации (Word) 257
11.1.9. Функция B10DH - запись регистра конфигурации (DWord) 258
11.2. Пример использования 259
ЧАСТЬ IV. СОЗДАНИЕ USB-УСТРОЙСТВ 283
Глава 12. USB-периферия 285
12.1. Микросхемы Atmel 286
12.1.1. Микроконтроллеры с архитектурой MSC-51 286
12.1.2. Контроллеры хабов 289
12.1.3. Микропроцессоры-хабы с ядром AVR 289
12.1.4. Другие микросхемы Atmel 290
12.2. Микросхемы Cygnal 291
12.2.1. Микропроцессоры C8051F320 и C8051F321 291
12.2.2. Другие микросхемы Cygnal 293
12.3. Микросхемы FTDI 296
12.3.1. Микросхемы FT232AM и FT232BM 297
12.3.2. Микросхемы FT245AM и FT245BM 298
12.3.3. Микросхема FT2232BM 299
12.3.4. Микросхема FT8U100AX 300
12.3.5. Отладочные комплекты и модули 301
12.3.6. Драйверы 302
12.3.7. Дополнительные утилиты 303
12.3.8. Другие модули 304
12.4. Микросхемы Intel 304
12.5. Микросхемы Microchip 308
12.6. Микросхемы Motorola 308
12.7. Микросхемы Philips 309
12.7.1. Микросхемы USB 310
12.7.2. Хабы 311
12.7.3. Другие микросхемы Philips 313
12.8. Микросхемы Texas Instruments 314
12.9. Микросхемы Trans Dimension 317
12.10. Микросхемы защиты питания 318
12.11. Интернет-ресурсы к этой главе 319
Глава 13. HID-устройство на основе Atmel АТ89С5131 322
13.1. Структурная схема АТ89С5131 322
13.2. USB-регистры АТ89С5131 324
13.2.1. Регистр USBCON 324
13.2.2. Регистр USBADDR 326
13.2.3. Регистр USBINT 327
13.2.4. Регистр USBIEN 328
13.2.5. Регистр UEPNUM. 329
13.2.6. Регистр UEPCONX 330
13.2.7. Регистр UEPSTAX. 331
13.2.8. Регистр UEPRST. 334
13.2.9. Регистр UEPINT. 335
13.2.10. Регистр UEPIEN 336
13.2.11. Регистр UEPDATX 337
13.2.12. Регистр UBYCTLX 337
13.2.13. Регистр UFNUML 338
13.2.14. Регистр UFNUMH. 338
13.3. Схемотехника АТ89С5131 338
13.4. Инструменты программирования 339
13.4.1. Компилятор 341
13.4.2. Программатор 342
13.5. Программа для микропроцессора 349
13.5.1. Первая версия программы для АТ89С5131 349
13.5.2. Добавляем строковые дескрипторы 369
13.5.3. Добавление конечных точек 374
13.5.4. Создание HID-устройства 377
13.5.5. Обмен данными с HID-устройством 381
13.6. Чтение репортов в Windows 388
13.7. Дополнительные функции Windows ХР 396
13.8. Устройство с несколькими репортами 397
Глава 14. Создание USB-устройства на основе ATMEL АТ89С5131 402
14.1. He-HID-устройство 402
14.2. Создание драйвера с помощью Driver Studio 405
14.2.1. Несколько слов о библиотеке Driver Studio 407
14.2.2. Другие классы Driver Studio 411
14.2.3. Создание шаблона драйвера с помощью Driver Studio 412
14.2.4. Доработка шаблона драйвера 422
14.2.5. Базовые методы класса устройства 423
14.2.6. Реализация чтения данных 426
14.2.7. Установка драйвера 428
14.2.8. Программа чтения данных 429
14.2.9. Чтение данных с конечных точек других типов 438
14.2.10. “Чистый” USB-драйвер 439
Глава 15. Использование микросхем FTDI 457
15.1. Функциональная схема FT232BM 457
15.2. Схемотехника FT232BM 460
15.3. Функции D2XX 460
15.4. Переход от СОМ к USB 465
15.4.1. Описание схемы преобразователя 465
15.4.2. Установка скорости обмена 467
ЧАСТЬ V. СПРАВОЧНИК 469
Глава 16. Базовые функции Windows 471
16.1. Функции CreateFile и CloseHandle: открытие и закрытие объекта.471
16.1.1. Дополнительные сведения 472
16.1.2. Возвращаемое значение 472
16.1.3. Пример вызова 472
16.2. Функция Read File: чтение данных 473
16.2.1. Дополнительные сведения 474
16.2.2. Возвращаемое значение 474
16.2.3. Пример вызова 474
16.3. Функция WriteFile: передача данных 475
16.3.1. Дополнительные сведения 476
16.3.2. Возвращаемое значение 476
16.3.3. Пример вызова 476
16.4. Функция ReadFileEx. АРС-чтение данных 477
16.4.1. Возвращаемое значение 479
16.4.2. Дополнительные сведения 479
16.4.3. Пример вызова 479
16.5. Функция WriteFileEx: АРС-передача данных 480
16.5.1. Возвращаемое значение 481
16.5.2. Пример вызова 481
16.6. Функция WaitForSingleObject ожидание сигнального
состояния объекта 482
16.6.1. Возвращаемое значение 482
16.7. Функция WaitForMultipleObjects: ожидание сигнального
состояния объектов 483
16.7.1. Возвращаемое значение 484
16.8. Функция GetOverlappedResult результат асинхронной операции 484
16.8.1. Возвращаемое значение 485
16.9. Функция DeviceIoControl: прямое управление драйвером 485
16.9.1. Возвращаемое значение 487
16.10. Функция QueryDosDevice: получение имени устройства
по его DOS-имени 487
16.10.1. Возвращаемое значение 488
16.10.2. Пример вызова 488
16.11: Функция Define Dos Device: операции с DOS-именем устройства 489
16.11.1. Возвращаемое значение 490
16.11.2. Пример вызова 490
Глава 17. Функции HID API. 492
17.1. Функция HidD_Hello: проверка библиотеки 492
17.2. Функция HidD_GetHidGuid: получение GUID 492
17.3. Функция HidD_GetPreparsedData: создание описателя устройства 493
17.4. Функция HidD_FreePreparsedData: освобождение описателя устройства 493
17.5. Функция HidD_GetFeature: получение FEATURE-репорта 494
17.6. Функция HidD_SetFeature: передача FEATURE-репорта 494
17.7. Функция HidD_GetNumInputBuffers: получение числа буферов 495
17.8. Функция HidD_SetNumInputBuffers: установка числа буферов 495
17.9. Функция HidD_GetAttribntes: получение атрибутов устройства 495
17.10. Функция HidD_GetMamifactnrerStnng. получение строки производителя 496
17.11. Функция HidD_GetProductString. получение строки продукта 497
17.12. Функция HidD_ Get Serial MumberString. получение строки
серийного номера 497
17.13. Функция HidD_GetIndexedString. получение строки по индексу 498
17.14. Функция HidDjGetlnputReporr. получение INPUT-репорта 498
17.15. Функция HidD_SetOutputReport. передача OUTPUT-репорта 499
17.16. Функция HidP_GetCaps: получение свойств устройства 499
17.17. Функция HidP_MaxDataListLength: получение размеров репортов 500
Глава 18. Хост-контроллер UCH 502
18.1. Регистры управления хост-контроллером 502
18.1.1. Регистр команды USB (USBCMD) ..504
18.1.2. Регистр состояния USB (USBSTS) 506
18.1.3. Регистр управления прерываниями (USBINTR) 506
18.1.4. Регистр номера кадра (FRNUM) 507
18.1.5. Регистр базового адреса кадра (FLBASEADD) 508
18.1.6. Регистр модификатора начала кадра (SOFMOD) 508
18.1.7. Регистр состояния и управления порта (PORTSC) 509
18.2. Структуры данных хост-контроллера UCH 510
18.2.1. Список кадров 510
18.2.2. Дескриптор передачи i 511
18.2.3. Заголовок очереди 514
18.3. Обработка списка дескрипторов UCH 516
Глава 19. Инструменты 518
19.1. Средства Microsoft Visual Studio 518
19.1.1. Depends 518
19.1.2. Error Lookup 518
19.1.3. GuidGen 518
19.2. Средства Microsoft DDK 520
19.2.1. DeviceTree 520
19.2.2. DevCon .- 521
19.2.3. Chklnf и Genlnf. 526
19.3. Средства CompuWare Corporation 527
19.3.1. Monitor 527
19.3.2. SymLink 527
19.3.3. EzDriverlnstaller 527
19.3.4. WdmSniff 527
19.4. Средства Syslntemals 528
19.4.1. WinObj 528
19.5. Средства USB Forum 531
19.5.1. HID Descriptor Tool 531
19.6. Средства HDD Software 533
19.7. Средства Sourceforge 533
ПРИЛОЖЕНИЯ 535
Приложение 1. Дополнительные функции 537
Приложение 2. Таблица идентификаторов языков (LangID) 539
Приложение 3. Таблица кодов производителей (Vendor ID, Device ID) 543
Приложение 4. Описание компакт-диска 546
Литература 548
Предметный указатель 549

Но ведь мало только физически подсоединить устройство к компьютеру, нужно еще и наладить обмен данными между ними. Как же выбрать порт и организовать подключение? Несколько лет назад стандартным решением было использование COM-порта. Кстати, до сих пор различные специалисты доустанавливают на промышленные компьютеры по 8, по 16, а то и по 32 COM-порта (есть целая категория различных PCI-плат расширения последовательных портов, контроллеров и т. д.). Таким образом, если нужно подключить несколько внешних устройств с интерфейсом RS-232, могут потребоваться дорогие адаптеры и экзотические платы расширения, которые по старой традиции неделями плывут в Россию на пароходах. Кстати, название обычного переходника «адаптер DB9m/DB25f» у менеджера компьютерного магазина может вызвать разве что раздражение.

Что такое HID-устройство

Сейчас практически все устройства подключаются к компьютеру через USB-интерфейс. Поэтому во многих новых ПК COM-порт отсутствует вообще.

USB-интерфейс - типовое решение по сопряжению нового внешнего устройства с компьютером, точнее, это HID-интерфейс, базирующийся на протоколе USB 1.1.

Хотя многие и считают, что HID-интерфейс (Human Interface Device) предназначен исключительно для клавиатуры, мыши и джойстика, он годится для множества решений, связанных с сопряжением внешних устройств и компьютера.

Если пользователю необходимо производить низкоскоростной обмен данными (до 64 кбит/c) и при этом желательно сократить время на утомительной разработке собственных драйверов, то ему вполне подойдет HID. На выходе же получится простое и вполне современное решение на базе стандартного программного USB-интерфейса с гарантированной поддержкой на всех распространенных программных платформах.

Свойства HID-устройства

С точки зрения организации программной поддержки HID-устройства, все выглядит достаточно привлекательно: для работы под управлением Windows можно быстро создавать понятный компактный код на базе готовых проверенных алгоритмов. При этом у разработчика останется масса времени на реализацию собственного протокола обмена данными верхнего уровня, поскольку необходимый уровень абстрагирования уже организован за счет HID-протокола (см. таблицу). Кроме того, программисту легко проводить отладку написанного протокола обмена (разумеется, при наличии работающего HID-устройства) - благодаря относительной жесткости самого протокола достаточно просто разработать программу поддержки устройства компьютером. Еще бы! Массу работы уже взял на себя создатель HID-устройства.

Организация обмена данными между HID-устройством и компьютером

Чтобы описать взаимодействие HID-устройства с компьютером, употребим термин «хост». В данном случае под ним понимается управляющее устройство в общей физической архитектуре взаимодействия по USB-протоколу. Так, все порты в компьютере - хосты. К ним можно подключать различные USB-устройства (флэшки, мыши, веб-камеры, фотоаппараты и проч.), которые хоста не имеют. Хост обеспечивает обнаружение, подключение, отключение, конфигурирование устройств, а также сбор статистики и управление энергопотреблением.

HID-устройство может само установить частоту опроса, во время которого выясняется наличие в нем каких-либо новых данных. Значит, даже на таком низком уровне программист может довериться системе, поскольку частота опроса и другие параметры обмена данными должны быть заранее заданы в программе контроллера HID-устройства. Этим протокол HID отличается от общего описания USB 1.1 или USB 2.0, в котором нет жестких требований к организации протокола. Однако при специфических задачах, требующих повышенного уровня безопасности, может оказаться довольно сложно избавиться от циклических опросов, когда постоянно передаются почти одни и те же блоки данных.

Особенности программирования HID-устройств

HID-устройства имеют специальные дескрипторы. Когда хост определит, что устройство принадлежит к классу HID, он передает управление им соответствующему драйверу. Предполагается, что дальнейший обмен данными ведется под его руководством.

В Windows за доступ к HID-устройствам отвечает системная служба HidServ. Подробнее о функциях запросов к HID-устройствам и других особенностях работы с HID-драйвером рассказывается в работе П. В. Агурова «Интерфейс USB. Практика использования и программирования» (СПб.: БХВ-Петербург, 2005).

Программирование HID-устройств на «верхнем уровне»

Нелегкую жизнь «прикладных» программистов, работающих на Паскале, облегчает проверенный модуль HID. PAS, программная оболочка для hid. dll (Hid User Library - как указано в свойствах файла). В комментариях к файлу сообщается, что в основе его лежат модули hidsdi.h и hidpi.h корпорации Microsoft. А сам файл HID. PAS - часть пакета JEDI ().

Для работы с HID-устройством в среде Delphi for win32 применяется компонент TJvHidDeviceController, представляющий собой удобный глобальный менеджер для доступа к HID-устройствам. А уже на его базе можно получить объектный экземпляр для работы с конкретным устройством.

Основные свойства и события компонента TJvHidDeviceController

Рассмотрим компонент TJvHidDeviceController более подробно. Событие OnArrival срабатывает на поступление (подключение) в систему HID-устройства, доступ к устройству предоставляется в обработчике этого события через экземпляр класса TJvHidDevice. Простое событие OnDeviceChange реагирует на изменение состояния устройства, оно только сигнализирует об изменениях в системе. Событие OnDeviceData срабатывает при поступлении данных от одного из HID-устройств и передает обработчику следующее: HidDev: TJvHidDevice; - устрой-ство, от которого были получены данные;

Событие OnDeviceDataError уведомляет об ошибке передачи данных, передавая в процедуру обработки параметры HidDev: TJvHidDevice; - HID-устройство и Error: DWORD; - код ошибки. Событие OnDeviceUnplug уведомляет об извлечении устройства из списка установленных в системе. Типы обработчиков событий на Plug и Unplug одинаковы (в исходном тексте: TJvHidUnplugEvent = TJvHidPlugEvent). В обработчик передается объект класса TJvHidDevice, соответствующий HID-устройству.

Для последовательного перечисления имеющихся в системе HID-устройств по вызову метода Enumerate предназначено событие OnEnumerate, т. е. в обработчике события найденные устройства последовательно передаются в виде объектов. Это событие принудительно инициируется методом Enumerate, использующимся для «проведения» имеющихся HID-устройств через обработчик, например при ревизии состояния HID-устройств по инициативе хоста (компьютера).

Событие OnRemoval срабатывает на физическое извлечение устройства из системы и имеет тот же тип обработчика TJvHidUnplugEvent, что и для OnDeviceUnplug. Функция CountByProductName выдает количество устройств, удовлетворяющих указанному в аргументе имени продукта, а CountByVendorName - указанному в аргументе имени производителя.

Основные свойства и события класса TJvHidDevice

Класс TJvHidDevice - виртуальное представление отдельно взятого HID-устройства. Новый объект этого класса можно получить, как было уже сказано, из события OnArrival или OnEnumerate. Функционал классов TJvHidDeviceController и TJvHidDevice частично дублируется, поскольку в первом из них интегрированы общий инструментарий для работы с набором имеющихся в системе HID-устройств и механизм доступа к одному из них. Устройство можно однозначно идентифицировать по свойствам SerialNumber, ProductName и VendorName. Чтобы получить сведения о поступлении данных с применением такого объекта, можно воспользоваться событием OnData. Отсылка данных ведется через метод WriteFile (в строгом смысле - через функцию). WriteFile - это оболочка системной функции WriteFile (kernel32).

Чтобы проконтролировать факт извлечения устройства, следует присвоить свой обработчик событию OnUnplug. Перед началом обмена данными с HID-устройством нужно удостовериться в самой возможности такого обмена с помощью HasReadWriteAccess. В этом классе на возникновение ошибки обмена данными даже есть отдельное событие OnDataError.

А теперь рассмотрим фрагменты кода из «живого» проекта, реализующего тестовое клиентское приложение для организации обмена данными с нестандартным устройством - пластиковыми чип-картами на базе HID. В борьбе за реализм автор взял на себя смелость не выкидывать из листингов «лишние» технологические обвязки кода.

Метод ScanDevices (листинг 1) предназначен для инициирования процесса поиска в системе необходимого HID-устройства. Большая часть кода, за исключением вызова метода Enumerate, необязательна и обеспечивает гибкость приложения, например, для того, чтобы в эту же тестовую программу можно было добавить возможность работы по интерфейсу, отличному от HID. Метод AddError выводит в окно отладочную информацию в процессе работы программы.

В листинге 2 приведен обработчик события OnEnumerate для поиска необходимого внешнего устройства. Для простоты будем считать, что программа может работать только с одним устройством нужного ей типа.

Прежде чем рассматривать дальнейшую реализацию проекта, следует немного рассказать о принятом формате обмена данными верхнего уровня, т. е. о структуре, призванной быть посредником между методами приема-передачи данных и конкретной решаемой прикладной задачей. Дело в том, что здесь разработчику предоставляется возможность реализовать свои творческие способности. Вернее, разработчикам, потому что процесс создания нового протокола очень часто бывает двусторонним, и при этом первую скрипку играет тот, кому труднее реализовывать алгоритм обмена. В общем, каким бы ни был протокол обмена, всегда приятно делать каждую программную сущность максимально наглядной и самодостаточной, пусть даже в ущерб некоторым общепринятым традициям. Ибо лучшее решение - то, которое будет реализовано в сжатые сроки с минимальной привязкой к программной среде и с большими возможностями дальнейшего развития. На основе этих принципов был создан протокол обмена верхнего уровня, где главное понятие - «команда». Из листинга 3 видно, насколько автор любит строковые данные, не раз спасавшие его при отладке программных модулей. Как же замечательно, что у нас вообще есть тип String! Все команды протокола делятся на категории (классы), внутри которых существует код команды, однозначно характеризующий ее назначение. Параметр edParam служит для отсылки данных в устройство, а параметр edAnswerData содержит в себе полученные от устройства данные. Строковый тип описанных членов записи позволяет свободно и наглядно манипулировать данными в формате HEX-строки. И что самое приятное, формат описанной записи идеологически стоит где-то посередине между ее непосредственным назначением и различными формами ее представления (INI, HEX, XML и т. д.)

Выполнение команды, т. е. отсылка данных в устройство, реализовано с применением отсылки пакетов данных длиной 8 байт (листинг 4). Эта длина - не единственное решение, такой выбор продиктован требованиями протокола верхнего уровня и в каждом конкретном случае может быть другим. Это, что называется, дело вкуса. Странный флаг IsUSBMode в методе ExecuteCommand (листинг 5 на «Мир ПК-диске») оставлен как напоминание о том, что вместо работы с USB нам может потребоваться использовать COM-порт или какой-то другой интерфейс. В начале отсылаемой группы данных в устройство передается синхросерия произвольно выбранного формата (например, 3E3E3E2B), сообщающая устройству, что у него на входе вполне легальные данные. Напомню, что в данном случае речь идет не столько о HID, сколько о специфическом протоколе верхнего уровня, идеологически оторванном от «железа» и предназначенном для решения особых прикладных задач.

В обработчике GetDataExecutor полученных от устройства данных (пакет по 8 байт) использовано специально созданное событие OnNewInputData для передачи первично обработанных данных на дальнейшую обработку, причем с указанием их старого и нового значений (листинг 6 на «Мир ПК-диске»). Таким образом, события поступления необработанных данных и указание на дальнейшую обработку развязываются, позволяя добавлять какой-то специфический алгоритм предупреждения на раннем этапе ошибочной, повторной или ненужной входной информации.

Представленные здесь примеры работы с HID-устройством иллюстрируют общую идею статьи - относительную простоту программирования нестандартных HID-устройств средствами Delphi.

Введение
Для кого эта книга
Что вы найдете в книге
Программные требования
Аппаратные требования
О программном коде
Краткое описание глав
Обозначения
Благодарности
Обратная связь
Часть I. Общие сведения о USB
Глава 1. Спецификация USB
1.1. Что такое USB и зачем это надо
1.1.1. Общая архитектура USB
1.1.2. Физическая и логическая архитектура USB
1.1.3. Составляющие USB
1.1.4. Свойства USB-устройств
1.1.5. Принципы передачи данных
1.1.6. Механизм прерываний
1.1.7. Режимы передачи данных
1.1.8. Логические уровни обмена данными
1.1.8.1. Уровень клиентского ПО
1.1.8.2. Уровень системного драйвера USB
1.1.8.3. Уровень хост-контроллера интерфейса
1.1.8.4. Уровень шины периферийного USB-устройства
1.1.8.5. Уровень логического USB-устройства
1.1.8.6. Функциональный уровень USB-устройства
1.1.9. Передача данных по уровням
1.1.10. Типы передач данных
1.1.11. Кадры
1.1.12. Конечные точки
1.1.13. Каналы
1.1.14. Пакеты
1.1.14.1. Формат маркер-пакетов IN, OUT, SETUP и PING
1.1.14.2. Формат пакета SOF
1.1.14.3. Формат пакета данных
1.1.14.4. Формат пакета подтверждения
1.1.14.5. Формат пакета SPLIT
1.1.15. Контрольная сумма
1.1.15.1. Алгоритм вычисления CRC
1.1.15.2. Программное вычисление CRC
1.1.16. Транзакции
1.1.16.1. Типы транзакций
1.1.16.2. Подтверждение транзакций и управление потоком
1.1.16.3. Протоколы транзакций
1.2. Запросы к USB-устройствам
1.2.1. Конфигурационный пакет
1.2.2. Стандартные запросы к USB-устройствам
1.2.2.1. Получение состояния GET_STATUS
1.2.2.2. Сброс свойства CLEAR_FEATURE
1.2.2.3. Разрешение свойства SET_FEATURE
1.2.2.4. Задание адреса на шине SET_ADDRESS
1.2.2.5. Получение дескриптора GET_DESCRIPTOR
1.2.2.6. Передача дескриптора SET_DESCRIPTOR
1.2.2.7. Получение кода конфигурации GET_CONFIGURATION
1.2.2.8. Задание кода конфигурации SET_CONFIGURATION
1.2.2.9. Получение кода настройки интерфейса GET_INTERFACE
1.2.2.10. Задание кода настройки интерфейса SET_INTERFACE
1.2.2.11. Задание номера кадра синхронизации SYNC_FRAME
1.2.2.12. Обработка стандартных запросов
1.2.3. Дескриптор устройства
1.2.3.1. Дескриптор устройства
1.2.3.2. Уточняющий дескриптор устройства
1.2.3.3. Дескриптор конфигурации
1.2.3.4. Дескриптор интерфейса
1.2.3.5. Дескриптор конечной точки
1.2.3.6. Дескриптор строки
1.2.3.7. Специфические дескрипторы
1.2.3.8. Порядок получения дескрипторов
1.3. Система Plug and Play (PnP)
1.3.1. Конфигурирование USB-устройств
1.3.2. Нумерация USB-устройств
1.3.3. PnP-идентификаторы USB-устройств
1.3.4. Символьные имена устройств
1.4. Модель WDM
Глава 2. Программирование на языке C для микроконтроллера
2.1. Общие сведения о языке С для микроконтроллеров
2.2. Использование стандартных библиотек
2.3. Программирование для АТ89С5131
2.3.1. Файл инициализации
2.3.2. Структуры дескрипторов
2.3.3. Структура проекта
Глава 3. Инструменты
3.1. Программаторы
3.1.1. Программатор Flip
3.1.2. Программатор ER-Tronik
3.2. Инструменты создания драйверов
3.2.1. NuMega Driver Studio
3.2.2. Jungo WinDriver
3.2.3. Jungo KernelDriver
3.3. Средства Microsoft Visual Studio
3.3.1. Depends (Dependency Walker)
3.3.2. Error Lookup
3.3.3. GuidGen
3.4. Средства Microsoft DDK
3.4.1. DeviceTree
3.4.2. DevCon
3.4.2.1. Ключ classes
3.4.2.2. Ключ driverfiles
3.4.2.3. Ключ hwids
3.4.2.4. Ключ rescan
3.4.2.5. Ключ stack
3.4.2.6. Ключ status
3.4.3. Chklnf и Genlnf
3.5. Средства CompuWare Corporation
3.5.1. Monitor
3.5.2. SymLink
3.5.3. EzDriverlnstaller
3.5.4. WdmSniff
3.6. Средства Syslnternals
3.6.1. WinObj
3.7. Средства USB Forum
3.7.1. HID Descriptor Tool
3.8. USB Command Verifier
3.9. Средства HDD Software
3.10. Средства Sourceforge
3.11. Программа мониторинга Bus Hound
Глава 4. Принципы использования функций Win32 в.NET
4.1. Общие сведения
4.2. Импорт функций Win32
4.3. Структуры
4.3.1. Атрибут StructLayout
4.3.2. Атрибут MarshalAs
4.4. Прямой доступ к данным
4.5. Обработка сообщений Windows
4.6. Общие сведения о WMI
4.7. Интернет-ресурсы к этой главе
Часть II. Классы USB
Глава 5. Класс CDC
5.1. Методы преобразования интерфейсов USB/RS-232
5.2. Общие сведения об интерфейсе RS-232
5.2.1. Линии обмена
5.2.1.1. Передаваемые данные (BA/TxD/TD)
5.2.1.2. Принимаемые данные (BB/RxD/RD)
5.2.1.3. Запрос передачи (CA/RTS)
5.2.1.4. Готовность к передаче (CB/CTS)
5.2.1.5. Готовность DCE (CC/DSR)
5.2.1.6. Готовность DTE (CD/DTR)
5.2.1.7. Индикатор вызова (CE/RI)
5.2.1.8. Обнаружение несущей (CF/DCD)
5.2.1.9. Готовность к приему (CJ)
5.3. Спецификация CDC
5.3.1. Стандартные дескрипторы
5.3.2. Функциональные дескрипторы
5.3.2.1. Заголовочный функциональный дескриптор
5.3.2.2. Дескриптор режима команд
5.3.2.3. Дескриптор абстрактного устройства
5.3.2.4. Дескриптор группирования
5.3.3. Специальные запросы
5.3.3.1. Запрос SET_LINE_CODING
5.3.3.2. Запрос GET_LINE_CODING
5.3.3.3. Запрос SET_CONTROL_LINE_STATE
5.3.3.4. Запрос SEND_BREAK
5.3.4. Нотификации
5.3.4.1. Нотификация RING^DETECT
5.3.4.2. Нотификация SERIAL_STATE
5.4. Поддержка CDC в Windows
5.4.1. Обзор функций Windows для работы с последовательными портами
5.4.1.1. Основные операции с портом
5.4.1.2. Функции настройки порта
5.4.1.3. Специальная настройка порта
5.4.1.4. Получение состояния линий модема
5.4.1.5. Работа с CDC на платформе. NET
5.4.2. Соответствие функций Windows и USB-запросов
Глава 6. Класс HID
6.1. Спецификация HID-устройств
6.2. Порядок обмена данными с HID-устройством
6.3. Установка драйвера HID-устройства
6.4. Идентификация HID-устройства
6.4.1. Идентификация загрузочных устройств
6.4.2. Дескриптор конфигурации HID-устройства
6.4.3. HID-дескриптор
6.4.4. Дескриптор репорта
6.5. Структура дескриптора репорта
6.5.1. Элементы репорта
6.5.1.1. Элементы короткого типа
6.5.1.2. Элементы длинного типа
6.5.2. Типы элементов репорта
6.5.2.1. Основные элементы
6.5.2.2. Глобальные элементы
6.5.2.3. Локальные элементы
6.5.3. Примеры дескрипторов
6.6. Запросы к НID-устройству
6.6.1. Запрос GET_REPORT
6.6.2. Запрос SET_REPORT
6.6.3. Запрос GET_IDLE
6.6.4. Запрос SET_IDLE
6.6.5. Запрос GET_PROTOCOL
6.6.6. Запрос SET_PROTOCOL
6.7. Инструменты
6.8. Драйверы для HID-устройств в Windows
Глава 7. Другие классы USB
Часть III. Практика программирования USB
Глава 8. Создание USB-устройства на основе АТ89С5131
8.1. Общая информация об АТ89С5131
8.2. Структурная схема АТ89С5131
8.3. USB-регистры AT89C5131
8.3.1. Регистр USBCON
8.3.2. Регистр USBADDR
8.3.3. Регистр USBINT
8.3.4. Регистр USBIEN
8.3.5. Регистр UEPNUM
8.3.6. Регистр UEPCONX
8.3.7. Регистр UEPSTAX
8.3.8. Регистр UEPRST
8.3.9. Регистр UEPINT
8.3.10. Регистр UEPIEN
8.3.11. Регистр UEPDATX
8.3.12. Регистр UBYCTLX
8.3.13. Регистр UFNUML
8.3.14. Регистр UFNUMH
8.4. Схемотехника АТ89С5131
8.5. Базовый проект для АТ89С5131
8.5.1. Первая версия программы для АТ89С5131
8.5.2. Добавляем строковые дескрипторы
8.5.3. Добавление конечных точек
8.6. Загрузка программы
Глава 9. Реализация класса CDC
9.1. Реализация CDC
9.2. Дескрипторы устройства
9.2.1. Инициализация конечных точек
9.2.2. Обработка CDC-запросов
9.2.3. Конфигурирование RS-порта и CDC-линии
9.2.4. Прием и передача данных
9.3. Установка драйвера
9.4. Программирование обмена данными с CDC-устройством на языке Delphi
9.5. Программирование обмена с CDC-устройством на языке С#
9.5.1. Использование компонента MSCOMM
9.5.2. Использование функций Win32
9.6. Проблемы CDC
Глава 10. Реализация класса HID
10.1. Реализация HID на АТ89С5131
10.2. Передача нескольких байтов
10.3. Feature-репорты
10.4. Передача данных от хоста (SET_REPORT)
10.5. Установка HID-устройства
10.6. Обмен данными с HID-устройством
10.6.1. Получение имени HID-устройства
10.6.2. Получение атрибутов устройства и чтение репортов
10.6.3. Передача данных от хоста к HID-устройству
10.7. Примеры HID-устройств
10.7.1. Реализация устройства "мышь"
10.7.2. Реализация устройства "клавиатура"
10.8. Использование HID-протокола
10.8.1. Интерпретация данных
10.8.2. Коллекции
10.8.3. Массивы и кнопки
10.9. HID-устройство с несколькими репортами
Глава 11. Специальные функции Windows
11.1. Функции Setup API
11.1.1. Перечисление USB-устройств
11.1.2. Получение состояния USB-устройства
11.2. Перечисление USB-устройств с помощью WMI
11.3. Специальные функции Windows XP
11.3.1. HidD_GetInputReport - чтение HID-репортов
11.3.2. Получение данных Raw Input
11.4. Функции DirectX
11.5. Диалог добавления нового оборудования
11.6. Работа с символьными именами устройств
11.7. Безопасное извлечение флэш-дисков
11.8. Обнаружение добавления и удаления устройств
11.9. Интернет-ресурсы
Глава 12. Разработка драйвера
12.1. Основные процедуры драйвера WDM
12.1.1. Процедура DriverEntry
12.1.2. Процедура AddDevice
12.1.3. Процедура Unload
12.1.4. Рабочие процедуры драйвера
12.1.4.1. Заголовок пакета
12.1.4.2. Ячейки стека ввода/вывода
12.4.1.3. Рабочие процедуры драйвера
12.1.5. Обслуживание запросов IOCTL
12.2. Загрузка драйвера и обращение к процедурам драйвера
12.2.1. Процедура работы с драйвером
12.2.2. Регистрация драйвера
12.2.2.1. Регистрация с помощью SCM-менеджера
12.2.2.2. Параметры драйвера в реестре
12.2.3. Обращение к рабочим процедурам
12.2.4. Хранение драйвера внутри исполняемого файла
12.3. Создание драйвера с помощью Driver Studio
12.3.1. Несколько слов о библиотеке Driver Studio
12.3.1.1. Класс KDriver
12.3.1.2. Класс KDevice
12.3.1.3. Класс Klrp
12.3.1.4. Класс KRegistryKey
12.3.1.5. Класс KLowerDevice
12.3.1.6. Классы USB
12.3.2. Другие классы Driver Studio
12.3.3. Создание шаблона драйвера с помощью Driver Studio
12.3.3.1. Шаг 1. Задание имени и пути проекта
12.3.3.2. Шаг 2. Выбор архитектуры драйвера
12.3.3.3. Шаг 3. Выбор шины
12.3.3.4. Шаг 4. Задание набора конечных точек
12.3.3.5. Шаг 5. Задание имени класса и файла
12.3.3.6. Шаг 6. Выбор функций драйвера
12.3.3.7. Шаг 7. Выбор способа обработки запросов
12.3.3.8. Шаг 8. Создание сохраняемых параметров драйвера
12.3.3.9. Шаг 9. Свойства драйвера
12.3.3.10. Шаг 10. Задание кодов IOCTL
12.3.3.11. Шаг 11. Дополнительные настройки
12.3.4. Доработка шаблона драйвера
12.3.5. Базовые методы класса устройства
12.3.6. Реализация чтения данных
12.3.7. Установка драйвера
12.3.8. Программа чтения данных
12.3.9. Чтение данных с конечных точек других типов
12.3.10. "Чистый" драйвер USB-устройства
Часть IV. Справочник
Глава 13. Формат INF-файла
13.1. Структура INF-файла
13.1.1. Секция Version
13.1.2. Секция Manufacturer
13.1.3. Секция DestinationDirs
13.1.3.1. Ключ DefaultDescDir
13.1.3.2. Ключи file-list-section
13.1.3.3. Ключ dirid
13.1.3.4. Ключ subdir
13.1.4. Секция описания модели
13.1.5. Секция xxx. AddRegw xxx. DelReg
13.1.6. Секция xxx. LogConfig
13.1.7. Секция xxx. CopyFiles
13.1.8. Секция Strings
13.1.9. Связи секций
13.2. Создание и тестирование INF-файлов
13.3. Установка устройств с помощью INF-файла
13.4. Ветки реестра для USB
Глава 14. Базовые функции Windows
14.1. Функции CreateFile и CloseHandle: открытие и закрытие объекта
14.1.1. Дополнительные сведения
14.1.2. Возвращаемое значение
14.1.3. Пример вызова
14.2. Функция ReadFile: чтение данных
14.2.1. Дополнительные сведения
14.2.2. Возвращаемое значение
14.2.3. Пример вызова
14.3. Функция Write File: передача данных
14.3.1. Дополнительные сведения
14.3.2. Возвращаемое значение
14.3.3. Пример вызова
14.4. Функция ReadFileEx. АРС-чтение данных
14.4.1. Возвращаемое значение
14.4.2. Дополнительные сведения
14.4.3. Пример вызова
14.5. Функция WriteFiieEx: АРС-передача данных
14.5.1. Возвращаемое значение
14.5.2. Пример вызова
14.6. Функция WaitForSingieObject ожидание сигнального состояния объекта
14.6.1. Возвращаемое значение
14.7. Функция WaitForMultipleObjects: ожидание сигнального состояния объектов
14.7.1. Возвращаемое значение
14.8. Функция GetOverlapped Result: результат асинхронной операции
14.8.1. Возвращаемое значение
14.9. Функция DeviceloControl: прямое управление драйвером
14.9.1. Возвращаемое значение
14.10. Функция Cancel/o: прерывание операции
14.10.1. Возвращаемое значение
14.11. Функция Query Dos Device, получение имени устройства по его DOS-имени
14.11.1. Возвращаемое значение
14.11.2. Пример вызова
14.12. Функция Define Dos Device: операции с DOS-именем устройства
14.12.1. Возвращаемое значение
14.12.2. Пример вызова
Глава 15. Структуры и функции Windows для последовательных портов
15.1. Структура настроек порта COMMCONFIG
15.2. Структура свойств порта COMMPROP
15.3. Структура тайм-аутов COMMTIMEOUTS
15.4. Структура статуса порта COMSTAT
15.5. Структура DCB
15.6. Функция BuildCommDCB: создание структуры DCB из строки
15.6.1. Дополнительные сведения
15.6.2. Возвращаемое значение
15.6.3. Пример вызова
15.7. Функция BuildCommDCBAndTimeouts: создание структуры DCB и тайм-аутов из строки
15.8. Функции SetCommBreak и ClearCommBreak: управление выводом данных
15.8.1. Возвращаемое значение
15.9. Функция ClearCommError: получение и сброс ошибок порта
15.9.1. Возвращаемое значение
15.10. Функция EscapeCommFunction: управление портом
15.10.1. Возвращаемое значение
15.11. Функции GetCommMask и SetCommMask: маска вызова событий
15.11.1. Возвращаемое значение
15.12. Функция WaitCommEvent ожидание события СОМ-порта
15.12.1. Возвращаемое значение
15.12.2. Дополнительные сведения
15.12.3. Пример вызова
15.13. Функции GetCommConfig и SetCommConfig: конфигурирование параметров порта
15.13.1. Возвращаемое значение
15.13.2. Пример вызова
15.14. Функция CommConfigDialog: диалог конфигурирования порта
15.14.1. Возвращаемое значение
15.14.2. Дополнительные сведения
15.14.3. Пример вызова
15.15. Функция GetCommProperties: прочитать свойства порта
15.15.1. Возвращаемое значение
15.15.2. Пример вызова
15.16. Функции GetCommState и SetCommState: состояние порта
15.16.1. Возвращаемое значение
15.16.2. Пример вызова
15.17. Функции GetCommTimeouts и SetComniTimeouts: тайм-ауты порта
15.17.1. Возвращаемое значение
15.17.2. Пример вызова
15.18. Функция PurgeComm: сброс буферов порта
15.18.1. Возвращаемое значение
15.18.2. Пример вызова
15.19. Функция SetupComm: конфигурирование размеров буферов
15.19.1. Возвращаемое значение
15.20. Функции GetDefaultCommConfig и SetDefaitltCommConfig: настройки порта по умолчанию
15.20.1. Возвращаемое значение
15.21. Функция TransmitCommChar. передача специальных символов
15.21.1. Возвращаемое значение
15.22. Функция GetCommModemStatus: статус модема
15.22.1. Возвращаемое значение
15.22.2. Пример вызова
15.23. Функция EnumPorts: перечисление портов
15.23.1. Дополнительные сведения
15.23.2. Возвращаемое значение
15.23.3. Пример вызова
Глава 16. Структуры и функции Windows Setup API
16.1. Функция Setup DiGetCiassDevs: перечисление устройств
16.1.1. Возвращаемое значение
16.2. Функция SetupDiDestroyDevicelnfoList освобождение блока описания устройства
16.2.1. Возвращаемое значение
16.3. Функция SetupDiEnumDevicelnterfaces: информация об устройстве
16.3.1. Возвращаемое значение
16.4. Функция SetupDiGetDevicelnterfaceDetaii: детальная информация об устройстве
16.5. Функция SetupDiEnumDevicelnfo: информация об устройстве
16.6. Функция SetupDiGetDeviceRegistryProperty: получение Plug and Play свойств устройства
16.7. Функция CM_Get_DevNode_Status: статус устройства
16.8. Функция CM_Request_Device_Eject безопасное извлечение устройства
Глава 17. Структуры и функции Windows HID API
17.1. Функция HidD_Hello: проверка библиотеки
17.2. Функция HidD_JetHidGuid: получение GUID
17.3. Функция HidD_GetPreparsedData: создание описателя устройства
17.4. Функция HidD_EreePreparsedData: освобождение описателя устройства
17.5. Функция HidD_Get Feature: получение Feature-репорта
17.6. Функция HidD_SetFeature: передача Feature-репорта
17.7. Функция HidD_GetNumlnputBuffers: получение числа буферов
17.8. Функция HidD_SetNumlnputBuffers: установка числа буферов
17.9. Функция HidD_GetAttributes: получение атрибутов устройства
17.10. Функция HidD_GetManufacturerString. получение строки производителя
17.11. Функция HidD_GetProductString получение строки продукта
17.12. Функция HidD_GetSerialNumberString. получение строки серийного номера
17.13. Функция HidD_GetIndexedString. получение строки по индексу
17.14. Функция HidD_Jetlnput Report получение Input-репорта
17.15. Функция HidD_SetOutputReport. передача Output-репорта
17.16. Функция HidP_GetCaps: получение свойств устройства
17.17. Функция HidP_MaxDataListLength: получение размеров репортов
17.18. Функция HidD_FIushQueue: сброс буферов
17.19. Функция HidP_GetLinkColiectionNodes: дерево коллекций
17.20. Функции HidP_GetScaledUsageValue u HidP_SetScaledUsage Value: получение и задание преобразованных значений
17.21. Функция HidF_MaxUsageListLength: размер буфера для кодов клавиш
17.22. Функция HidP_UsageListDifference: различие между массивами
Приложения
Приложение 1. Дополнительные функции
Приложение 2. Компиляция примеров в других версиях Delphi
Приложение 3. Таблица идентификаторов языков (LangID)
Приложение 4. Таблица кодов производителей (Vendor ID, Device ID)
Приложение 5. Как создать ярлык Device Manager
Приложение 6. Часто задаваемые вопросы
Приложение 7. Описание компакт-диска
Литература
Предметный указатель

Рисунок 1

Интерфейс USB приобретает все большую популярность как интерфейс связи периферийных устройств с ПК и современные компьютеры зачастую не имеют привычного интерфейса RS-232. Популярность USB обусловлена многими причинами, вот основные из них:

  • высокая скорость обмена, высокая помехозащищенность
  • управление потоком данных, контроль целостности и исправление ошибок
  • возможность разветвления через хабы и подключения большого количества устройств.
  • возможность получения питания от шины
  • универсальность шины - возможность подключения разноплановых устройств (клавиатура, принтер, модем)
  • автоматическая идентификация и конфигурирование системы, Plug and Play

Однако существуют (зачастую необоснованные) факторы, сдерживающие массовое использование USB разработчиками микроконтроллерных приборов:

  • необходимость программирования драйверов для Windows
  • сравнительно малая распространенность микроконтроллеров со встроенным интерфейсом USB
  • Урок 2. Создание USB 2.0 совместимого HID-устройства типа джойстик.

Этот цикл статей призван показать, что преодолеть эти трудности довольно легко и каждый может провести "апгрейд" своего устройства с привычного RS-232 на USB или создать новое устройство с USB интерфейсом.

В качестве микроконтроллера в примерах будет рассматриваться микроконтроллер производства компании Microchip PIC18F4550 с интерфейсом USB 2.0 (поддерживает Low Speed и Full Speed).

Урок 1. USB без программирования Windows, виртуальный COM порт

Одна из задач, возникающих при разработке USB устройств, это переход с интерфейса RS-232 на USB, при этом, если производится модификация "старого" прибора или устройство должно быть совместимо с существующими протоколами и программным обеспечением ПК, то желательно избавиться от любой модификации программного обеспечения на компьютере. Одним из решений данной задачи является использование интерфейса USB в качестве виртуального COM-порта. Применение данного метода исключает необходимость модификации ПО компьютера, т.к. USB соединение видится персональным компьютером как дополнительный COM-порт. Другое важное преимущество заключается в том, что используются стандартные драйвера Windows и не требуется создание какого-либо своего драйвера.

Спецификация USB описывает класс коммуникационных устройств (Communication Device Class - CDC), который определяет множество режимов соединений для телекоммуникационных (модемы, терминалы, телефоны) и сетевых устройств (Ethernet адаптеры и хабы, ADSL модемы), включая эмуляцию последовательного порта.

Возьмем в качестве примера устройство, которое через RS-232 передает данные о напряжении с потенциометра и температуре с цифрового датчика TC77, а так же принимает команды для включения/выключения двух светодиодов (данный пример для простоты реализуем на плате PICDEM™ FS USB DEMONSTRATION BOARD, но можно собрать и более простую схему - см.ниже).

Отладочная плата PICDEM FS-USB предназначена для разработок и демонстрации устройств на микроконтроллере PIC18F4550 с шиной USB2.0. На плате установлен контроллер PIC18F4550 в корпусе TQFP44, имеющий следующие особенности:

  • Максимальная частота работы - 48 МГц (12 MIPS);
  • 32 Кб Flash памяти программ (технология Enhanced Flash);
  • 2 Кб памяти данных (из них 1 Кб двухпортового ОЗУ);
  • 256 байт памяти данных EEPROM;
  • Интерфейс FS USB2.0 с поддержкой скорости работы 12 Мбит/с, со встроенным приемопередатчиком и стабилизатором напряжения.

На плате установлены:

  • Кварц 20 МГц;
  • Интерфейс RS-232 для демонстрации возможности перехода с USART на USB;
  • Разъем для внутрисхемного программирования и отладки
  • Стабилизатор питающего напряжения с возможностью переключения на питание от шины USB;
  • Разъем расширения PICtail™;
  • Температурный датчик TC77, подключенный по I2C;
  • Переменный резистор, подключенный ко входу АЦП;
  • Светодиоды, кнопки.

Для данного устройства есть программа для ПК для управления устройством и индикации значений напряжения и температуры. Итак, мы можем подключить устройство к RS-232, выбрать доступный в системе COM-порт и установить скорость обмена с нашим устройством, число бит данных, количество стоповых бит, а так же параметры битов четности и управления потоком в соответствии с программой микроконтроллера (для этого мы должны знать параметры инициализации нашего контроллера)


Рис. 2

Приступим к подключению нашего устройства к USB.

Компания Microchip Technology Inc. Предлагает готовый пример применения AN956, в котором реализована поддержка USB CDC для микроконтроллера PIC18F2550, PIC18F2455, PIC18F4455, PIC18F4550. Программа построена по модульному принципу, что позволяет легкую модернизацию и интегрированию в готовые проекты.

После начальной инициализации контроллера программа может общаться с ПК через интерфейс USB посредством нескольких готовых функций:

Модифицируем нашу программу для передачи и приема данных через USB.

Фрагмент программы подготовки и передачи данных:

Прием данных:

if(getsUSBUSART(input_buffer,1)) { switch (input_buffer) { case "1" : mLED_3_On(); break; case "2" : mLED_3_Off(); break; case "3" : mLED_4_On(); break; case "4" : mLED_4_Off(); break; default: break; } }

После подключения устройства к USB система опознает новое устройство


Рис. 3

И устанавливает новое оборудование


Рис. 4

Выбираем установку с указанного места и указываем путь расположения файла mcpusb.inf из комплекта исходных кодов программы к AN956. После этого производится установка нового устройства в систему.


Рис. 5

Итак, новое устройство готово к работе. В системе появился новый виртуальный COM порт.


Рис. 6

Теперь в нашей программе мы можем выбрать появившийся виртуальный COM порт для общения с устройством …


Рис. 7

… и посмотреть что устройство действительно стало работать через появившийся в системе COM порт посредством USB соединения.

Следует заметить, что USB обеспечивает контроль и исправление данных, поэтому такие понятия как скорость потока, биты четности и контроля потока становятся абстрактными понятиями, и в нашем случае их можно выбирать любыми, единственный информационный параметр это номер виртуального COM порта.

Окно программы PICDEM CDC


Рис. 8

При использовании микроконтроллеров PIC18Fxx5x со встроенным модулем USB 2.0 виртуальный COM порт может обеспечить скорость передачи данных до 80Кбайт в секунду (640Кбит/сек), что существенно превышает возможную скорость передачи через RS-232, при этом, как мы видим, переделки ПО для компьютера не потребовалось!

Примеры программ, документация и схема, использованные в уроке 1.

  1. Программа PICDEM CDC + исходные коды для Delphi загрузить
  2. Компонент Delphi для работы с COM портом загрузить
  3. AN956 + оригинальные исходные коды
  4. Файл user_uart.c (все изменения оригинальной программы из AN956 производились только в этом файле. Для запуска примера к урок 1, необходимо скопировать этот файл в каталог C:\MCHPFSUSB\fw\Cdc\user\, заменить в проекте файл user.c на user_uart.c, скомпилировать проект и прошить микроконтроллер)
  5. Упрощенная схема USB устройства


Рис. 9

Примечание: в оригинальной схеме платы PICDEM FS USB используется автоматическое определение источника питания платы (внешний источник или USB). Поэтому при использовании упрощенной схемы необходимо закоментарить строку #define USE_USB_BUSSENSE_IO в файле usbcfg.h

Урок 2. Создание USB 2.0 совместимого HID-устройства типа джойстик

Наиболее распространенными USB устройствами являются устройства интерфейса с человеком (HID - Human Interface Devices). Типичными представителями этого класса являются USB- клавиатуры, мыши, джойстики, панели настройки мониторов, считыватели штрих-кодов, карт-ридеры и т.п. Преимуществами HID устройств является:

  • простота реализации;
  • компактный код;
  • поддержка Windows (не нужны дополнительные драйвера).

На сайте компании Microchip есть пример реализации HID манипулятора мышь. Рассмотрим реализацию простейшего игрового манипулятора на основе этого примера. Для этого проекта будем использовать демонстрационную плату PICDEM FS-USB (DM163025). Отладочная плата PICDEM FS-USB имеет один переменный резистор и 2 кнопки, поэтому разрабатываемый джойстик будет иметь минимум элементов управления (2 кнопки и, например, регулятор газа).

В первую очередь нам нужно переписать дескриптор устройства под создаваемый джойстик. Для упрощения задачи можно воспользоваться программой HID Descriptor Tool, которую можно скачать с сайта www.usb.org

В комплекте с программой предоставляются примеры конфигураций некоторых HID-устройств, которые можно корректировать под свою задачу или создавать собственное HID устройство.


Рис. 10

Итак, в нашем случае будут использоваться несколько типов данных - это симуляция органа управления - Simulation Controls, а конкретно это ручка (педаль) газа (Throttle) и кнопки управления (Button). Для того чтобы операционная система "знала" как обращаться с этими типами данных, необходимо описать максимальные и минимальные значения и размер данных. В нашем случае "газ" это одно 8-и битное значение (report_size = 8, report_count = 1), а состояние кнопок определяется как поле однобитных значений. В примере используется только 2 кнопки, но необходимо выровнять поле до байтовой величины (report_size = 1, report_count = 8). Итого микроконтроллер при запросе данных от компьютера должен передать 2 байта - уровень газа и состояние кнопок в соответствии с сформированным дескриптором устройства (подробное описание возможных дескрипторов см. в спецификации на устройства HID www.usb.org). Созданное описание дескриптора устройства можно сохранить в разных форматах, в том числе и как заголовочный файл.h

Дополнительно нужно скорректировать в описании HID Class-Specific Descriptor размер полученного дескриптора устройства и в дескрипторе конечной точки изменить размер данных, передаваемых через конечную точку (в нашем случае передаем 2 байта, поэтому размер HID_INT_IN_EP_SIZE=2).

Перечисленных изменений хватит для того чтобы Windows опознала подключенное устройство как джойстик. Теперь можем скорректировать строковые данные, чтобы устройство имело то название, какое мы хотим (например "PIC18F4550 Joystick"). Для того чтобы присвоить устройству имя на русском языке необходимо прописывать строковый дескриптор в кодировке UNICODE. На этом описание джойстика заканчивается и нужно подготовить данные для передачи в PC.

ReadPOT(); // запуск измерения напряжения потенциометра buffer = ADRESH; // обработка состояний кнопок if(sw2==0) buffer |= 0x01; else buffer &= ~0x01; if(sw3==0) buffer |= 0x02; else buffer &= ~0x02; // передача данных Emulate_Joystick();

После компиляции проекта и программирования микроконтроллера можно подключить устройство к USB-порту. Плата определяется как HID игровое устройство, инсталлируется в систему и готово к работе.


Рис. 11

Через панель управления в Windows мы можем открыть доступные игровые устройства, выбрать наш джойстик, откалибровать его и проверить функциональность.


Рис. 12

При изменении конфигурации устройства - добавлении органов управления или кнопок, необходимо не только изменить описание дескриптора устройства, но и передавать данные строго в соответствии с созданным дескриптором. Так изменив в описании дескриптора устройства USAGE_MAXIMUM (BUTTON 2) максимальное число кнопок с 2 на 8, получим джойстик на 8 кнопок.


Рис. 13

При усложнении дескриптора можем получить и более полную реализацию джойстика, при этом нужно не забыть изменять следующие параметры: размер дескриптора, размер конечной точки и необходимо оправлять столько информационных данных, сколько объявлено в дескрипторе.


Рис. 14

Примеры программ, документация и схема, использованные в уроке 2.

  1. Оригинальные исходные коды реализации HID-мыши.
  2. Исходные коды реализации HID-джойстика.

Урок 3. Составное USB устройство

Любое USB устройство может иметь несколько конфигураций и в каждой конфигурации несколько интерфейсов. Это свойство USB позволяет создаваемому устройству иметь возможность опознаваться компьютером как несколько USB устройств с разными интерфейсами. Мышка, например, может иметь встроенный карт-ридер и взаимодействовать с компьютером как два независимых устройства.

Структура дескриптора устройства:


Рис. 15

На основе стандартного примера мышки и созданного джойстика создадим составное USB устройство, которое будет определяться компьютером как два независимых HID устройства.

1. Создание дескриптора.

Изменим структуру дескриптора (файл usbdsc.h)

Устройство будет иметь 2 интерфейса, в каждом по одной конечной точке.

#define CFG01 rom struct \ { USB_CFG_DSC cd01; \ USB_INTF_DSC i00a00; \ USB_HID_DSC hid_i00a00; \ USB_EP_DSC ep01i_i00a00; \ USB_INTF_DSC i01a00; \ USB_HID_DSC hid_i01a00; \ USB_EP_DSC ep02i_i01a00; \ } cfg01
  1. В соответствии с измененной структурой нужно изменить дескриптор в файле usbdsc.c.
  2. В файле usbcfg.h определить идентификаторы интерфейсов, используемые конечные точки, размеры report дескрипторов.
  3. В файле hid.c нужно инициализировать дополнительные конечные точки (в функции HIDInitEP) и изменить функцию обработки HID-запросов (функция USBCheckHIDRequest).
  4. Каждое из устройств, мышка и джойстик, должны передавать данные каждый в свою конечную точку. Поэтому нам необходимо добавить функции передачи данных в конкретные конечные точки и проверки, что нужная конечная точка свободна (добавить функции аналогичные mHIDTxIsBusy и HIDTxReport в файле hid.c).

Тогда передача данных для мышки будет выглядеть как

После компиляции проекта, прошивки контроллера и подключению устройства к USB, компьютером будут обнаружено новое составное устройство и добавлены мышка и джойстик.


Рис. 16


Рис. 17

Исходные коды составного HID устройства.

Замечание. Не забывайте менять PID при создании нового устройства или удалять из системы предыдущее устройство с тем же самым PID.

Урок 4. Опыты с программатором PICkit2

Компания Microchip Technology Inc. выпускает недорогой программатор разработчика PICkit2, который в первую очередь используется для программирования Flash-контроллеров. Отличительной особенностью этого программатора является доступность полной документации и исходных кодов прошивки для микроконтроллера, и программы оболочки для компьютера. PICkit2 получает питание от USB, формирует регулируемые напряжения программирования и питания, а так же имеет 3 линии входа-выхода для подключения к программируемому устройству. Для возможности обновления прошивки программатора в PICkit2 реализована программа бутлоадер.


Рис. 18

CDC-устройство на основе PICkit2

Используя все эти особенности, на основе программатора PICkit2 возможно создание и отладка своего USB-устройства с возможностью в любой момент откатиться назад к его функциям программатора. С помощью бутлоадера, который прошит в программатор, в PICkit2 можно прошить другие программы, например, программу поддержки виртуального COM-порта. Для этого берем пример CDC, переименовываем проект и делаем следующее

  1. в файле main.c меняем адрес расположения прошивки (бутлоадер PICkit2 передает управление пользовательской программе на адрес 0х002000.
    #pragma code _RESET_INTERRUPT_VECTOR = 0x002000
  2. в файле io_cfg.h убираем все про порт D (можно задать мигание светодиода на PORTC0).

    Так как PICKIT2 всегда питается от USB, то задаем

    #define usb_bus_sense 1 // device is always plugged in #define self_power 0 // device is powered from USB

  3. в файле usbcfg.h ставим комментарии на 2 строки
    //#define USE_SELF_POWER_SENSE_IO //#define USE_USB_BUS_SENSE_IO
  4. В файле user.c выводим в USB нужные нам данные
  5. подключаем файл линкера pickit2.lkr

После этого можно откомпилировать проект и через оболочку PICkit2 загрузить новую прошивку.

После перепрограммирования PICkit2, компьютер определяет появление нового COM-порта, и через гипертерминал можем увидеть, что PICkit2 отсылает данные через виртуальный COM-порт.

Исходные коды данного примера доступны по ссылке.

На основе данного примера и используя внешние выводы программатора PICkit2 можно получать данные с внешних устройств и передавать в компьютер через USB. Таким образом, используя PICkit2 можно сделать вывод данных на COG ЖК-индикаторы, считыватели I2C, SPI и 1-wire устройств, например датчиков температуры и др. устройств.

Радио HID клавиатура на основе PICkit2


Рис. 19

Рассмотрим еще один пример "нецелевого" использования программатора PICkit2 - эмулятор клавиатуры с радиоинтерфейсом. Такое устройство может использоваться, например, для проведения презентаций - для перелистывания слайдов вдали от компьютера.

Для реализации такого устройства нам понадобятся:

  • PICkit2
  • демо-плата из комплекта PICkit2 (DV164120)
  • радиоприемник (rfRXD0420) и радиопередатчик (rfPIC12F675) из комплекта rfPICkit.

К демо-плате подключаем радиоприемник. Микроконтроллер на плате будет принимать данные с приемника, обрабатывать их и, при определении нажатия одной из двух кнопок на радиобрелке, выставлять уровень лог.1 на одном из 2-х выводов подключенных к PICkit2.

PICkit2 будет выполнять следующие функции:

  • при подключении к компьютеру через USB определяться как HID-клавиатура
  • формировать напряжение питания +5В для демо-платы с приемником
  • опрашивать 2 внешних вывода контроллера приемника и при наличии лог. 1 отсылать в компьютер коды нажатия кнопок PageUp или PageDown.

Два виртуальнык COM-порта (Эмуляция микросхемы FTDI2232) на базе PICKit2

Этот пример предназначен только для изучения работы USB. Изучите требование лицензии на драйвер FTDI перед использованием!

Пример показывает как на базе микроконтроллера с USB портом сделать 2 виртуальных COM-порта.Для начало нужно установить драйвера для микросхемы FTDI2232. Затем для загрузки в PICkit2 нужно в оболочке PICkit2 выбрать пункт обновления прошивки и указать на файл TestVCP2.hex из архива. После перепрограммирования PICkit2 у вас в системе появятся 2 независимых последовательных COM порта.

Пример взят с сайта http://forum.microchip.com/tm.aspx?m=261649

Для обратного восстановления PICkit2 как программатора нужно отключить PICkit2 от USB и при нажатой кнопке снова подключить кабель USB, после чего выбрать загрузку штатной прошивки программатора.

Все приведенные выше примеры основаны на MCHPFSUSB Framework v1.3. С появлением контроллеров PIC24 и PIC32 с USB OTG, компания Microchip выпустила новую версию стека - USB stack v. 2.х.

В новой версии USB stack v. 2.3, помимо стеков USB device, реализующего функциональность USB-клиента, USB Embedded host, реализующего функциональность хоста, также добывлен стек USB dual role, реализующий функции и хоста, и клиента; и USB OTG, поддерживающий протокол согласования роли хоста (HNP), протокол запроса сеанса (SRP), и полностью соответствующий спецификации USB OTG. В примерах применения реализовано:

  • Embedded Host
    • Printer Class host - поддержка ESC/POS, PostScript® и PCL5 принтеров
    • CDC Class host - поддержка устройств ACM (abstract control model)
    • HID Клавиатура
  • Device
    • HID bootloader - добавлена поддержка семейств PIC32MX460F512L и PIC18F14K50
    • HID клавиатура, мышка
    • MSD internal flash demo - использование внутренней flash для хранения файлов
    • MSD + HID composite example - пример составного устройства MSD и HID
    • CDC - эмуляция COM-порта
    • поддержка семейства PIC32MX460F512L для всех демонстрационных проектов ПК
    • примеры HID, MCHPUSB и WinUSB теперь поддерживают функцию Microsoft Plug-and-Play (PnP) для автоопределения.
  • Документация
    • полное описание всех API расположено в папке "\Microchip\Help"

Microchip бесплатно предоставляет драйвера наиболее востребованных USB-классов:

  1. Интерфейс пользователя (HID). Этот режим обмена используется практически во всех клавиатурах, "мышках" и прочих устройствах ввода/вывода
  2. Коммуникационное устройство (CDC). Этот режим наиболее простой для перехода с последовательного интерфейса RS-232 на USB. На компьютерах с WinXP/2K производиться создание и эмуляция виртуального COM-порта при подключении микроконтроллера. Программы, работающие с портами COM1.. 4 будут работать без изменений и с виртуальным портом, но с большей скоростью (порядка 1 Мбит/с)
  3. Устройства массового хранения (MSD). Это устройства, работающие как накопители информации - флешки, SD/MMC-карты, диски и прочее
  4. Устройства класса "принтер" (Printer Class). Этот режим создан для использования USB-принтеров, что позволяет конечному устройству на PIC-микроконтроллере с модулем USB выводить необходимую информацию непосредственно на USB-принтер
  5. Резидентный загрузчик Microchip. Простейший режим, который используется только для обновления по USB программного обеспечения микроконтроллера. Со стороны ПК устанавливается небольшая программа, аналог драйвера
  6. Собственный драйвер (Custom). Наиболее полное использование ресурсов USB2.0 для продвинутых пользователей: возможность выбора режимов работы шины (изохронный, по прерываниям, объемный, управления), высокая скорость передачи. Требует глубоких знаний работы шины и навыки разработки ПО под Windows

Бутлоадер с USB Flash Drive

Обновление прошивки с обычного флэш диска.

Для обновления прошивки микроконтроллера с модулем USB-OTG (PIC24 или PIC32) не обязательно использовать специальное программное обеспечение. Наличие Host-режима позволяет подключать к микроконтроллеру обычные USB-накопители данных (Flash Drive). На сайте Microchip опубликован пример (бета версия), позволяющий обновить программное обеспечение микроконтроллера из подключенного USB-диска.

Для запуска примера вам нужно загрузить прошивку бутлоадера в плату PIC32 USB Board или Explorer 16 (c установленным процессорным модулем PIM PIC32 USB и дочерней платой USB PICtail Plus Daughter Board). Если подать питание на плату при нажатой кнопке, то контроллер перейдет в режим обновления прошивки. Если теперь подключить Flash накопитель с записанным файлом обновления прошивки, то микроконтроллер считает этот файл и перепишет в свою память программ.

Отладочные платы и средства разработки для USB

Программатор-отладчик PICkit2 (номер для заказа PG164120)

Наличие бутлоадера позволяет заливать свое программное обеспечения для освоения навыков работы с USB


Рис. 20

Отладочная плата PICDEM FS-USB (номер для заказа DM163025)

Предназначена для разработок и демонстрации устройств на микроконтроллере PIC18F4550 с шиной USB2.0. На плате установлен контроллер PIC18F4550 в корпусе TQFP44.


Рис. 21

Low Pin Count USB Develpment Kit (номер для заказа DM164127)

Отладочная плата Low Pin Count USB Development Kit предоставляет легкий путь для оценки возможностей микроконтроллеров 20-и выводных USB микроконтроллеров Microchip PIC18F14K50 и PIC18F13K50. Комплект включает все необходимое для начала работы с USB контроллерами (программное обеспечение, исходные файлы примеров, документацию).


Рис. 22

PIC18F87J50 Full Speed USB PIC18F87J50 FS USB Demo Board (номер для заказа MA180021)

Плата PIC18F87J50 FS USB Demo Board служит для отладки Full Speed USB 2.0 микроконтроллеров семейства PIC18F87J50. Помимо автономной работы плата так же может использоваться как процессорный модуль для платы PIC18 Explorer Board.


Рис. 23

PIC24 Starter Kit (номер для заказа DM240011)

Комплект разработчика PIC24F Starter Kit содержит все необходимое для начала работы с высокопроизводительными контроллерами семейства PIC24F. Этот недорогой комплект содержит интегрированный внутрисхемный отладчик и программатор, контроллер PIC24F с интерфейсом USB (на плате могут быть реализованы функции Host и Device), трехцветный светодиод, емкостная сенсорная панель и графический OLED дисплей. Демонстрационная программа через графическое меню позволяет осуществлять запись данных на внешний USB Flash Drive, осуществлять настройку сенсорной панели и запускать графические задачи.


Рис. 24

PIC32 USB Board (номер для заказа DM320003)

Позволяет освоить модуль USB-OTG в контроллерах PIC32


Рис. 25

Отладочная плата "Explorer 16 Development Board" (номер для заказа DM240001)

Это дешевое средство отладки для ознакомления и начала работы с высокопроизводительными семействами 16-и разрядных микроконтроллеров PIC24 и контроллерами цифровой обработки сигналов dsPIC33F.


Рис. 26

Дочерняя плата "USB PICtali Plus " (номер для заказа AC164131)

Совместно с USB процессорными Plug-In модулями позволяет разрабатывать и отлаживать USB устройства Host, Device, USB-OTG.


Рис. 27

Илья Афанасьев ,
Компания

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter
ПОДЕЛИТЬСЯ: