Практика программирования USB — В книге собрана информация, необходимая для создания USB-устройств и драйверов для операционной системы Microsoft Windows 2000/XP. Рассмотрен процесс создания USB-устройства: от написания программы микроконтроллера (примеры реализованы для микропроцессора AT89C5131) до разработки собственного WDM-драйвера. Содержится описание специальных классов устройств: HID-класс, позволяющий обойтись без разработки драйвера, и класс CDC, позволяющий работать с USB как с обычным COM-портом. Рассмотрено использование функций Raw Input, Direct Input и Setup API, содержится большое количество практических советов и примеров программ на языках Delphi, C и C#.
Название: Практика программирования USB (+ CD) Автор: Агуров П. В. Издательство: БХВ-Петербург Год: 2006 Страниц: 622 Формат: PDF, DJVU Размер: 19,43 Мб ISBN: 5-94157-851-2 Качество: Отличное
Введение Для кого эта книга Что вы найдете в книге Программные требования Аппаратные требования О программном коде Краткое описание глав Обозначения Благодарности Обратная связь Часть 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. Описание компакт-диска Литература Предметный указатель