Разработка драйвера для USB HID-устройств. Начало.

Здравствуйте, уважаемые посетители! Вашему вниманию хочу освятить проблему разработки драйверов для USB HID-устройств под управлением системы линейки Windows NT на примере игрового манипулятора (геймпада Saitek P2500 Rumble Force Pad, рис. 1) . Здесь хочу описать общие сведения разработки драйвера, что нужно знать перед тем, чтобы начать разрабатывать драйвер. Для начала посмотрим архитектуру Windows NT.

Описание: http://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Saitek_Gamepad.jpg/800px-Saitek_Gamepad.jpg

                                                     Рис. 1.    Общий вид геймпада Sitek P2500 Rumble Force Pad

 

Обзор архитектуры Windows NT

Архитектура семейств операционных систем Windows на ядре NT имеет модульную структуру и состоит из двух основных уровней: компоненты, работающие в режиме пользователя, и компоненты режима ядра (рис. 2).

                                                                    Рис. 2.    Обобщённая архитектура Windows NT

Программы и подсистемы, работающие в режиме пользователя (user-mode), имеют ограничения на доступ к системным ресурсам. Часть функций операционной системы вынесены в режим пользователя. Для выполнения этих функций запускается часть процессов, например, сервер, реализующий технологию удалённого вызова процедур (Service Control Manager, SCM). Системы предлагают набор сервисов – приложения Win32. В режиме пользователя работают подсистема защиты, подсистема Win32-архитектуры (обеспечивает стандартные API вызовы (Application Programming Interface, интерфейс прикладного программирования) Windows), подсистема POSIX (Portable Operating System Interface for Unix, переносимый интерфейс операционных систем Unix), которая обеспечивает совместимость операционных систем и переносимость прикладных программ на уровне исходного кода.

Любой системный вызов связан с вызовом функции из библиотеки Ntdll.dll, которой соответствует библиотека kernelNtdll.dll, включающая функции, переводящие в режим ядра.

Режим ядра (kernel-mode) имеет другой уровень привилегий – неограниченный доступ к системной памяти и внешним устройствам. Архитектура включает в себя само ядро, уровень аппаратных абстракций (Hardware Abstraction Layer, HAL), драйверы и ряд служб.

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

 

Шина USB

В общем случае, USB-устройство имеет одну или более конфигураций, управляющих его поведением (рис. 3). Как правило, устройства, имеющие несколько конфигураций, являются составными. Драйверы Microsoft по умолчанию всегда работают только с первой конфигурацией. Каждая конфигурация содержит один или несколько интерфейсов, которые определяют, как программы должны работать с оборудованием. Интерфейс устройства экспортирует одну или более конечных, или концевых, точек (endpoint).

                                                           Рис. 3.    Конфигурации, интерфейсы и концевые точки

Пересылка пакетов данных осуществляется при помощи логических соединений, называемых каналами (pipe). Каналы образуются между буфером в компьютере и удалённым устройством с конкретным адресом. Каждый канал оканчивается в определённой конечной точке, являющейся частью USB-устройства. С точки зрения микроконтроллера, конечная точка является буфером, в которой накапливаются данные для передачи, и прерыванием, которое указывает процессору на поступление нового пакета данных.

В спецификации USB определены четыре типа каналов:

·         управляющие каналы (control);

·         каналы передачи массивов данных (массовые каналы, bulk);

·         каналы передачи по прерываниям (прерывающие каналы, interrupt);

·         каналы изохронной передачи (изохронные каналы, isochronous).

Они различающиеся по объёму данных, перемещаемых за одну транзакцию, по возможности предоставления гарантий периодичности и задержки, а также по возможности автоматического исправления ошибок. Транзакция – это последовательность обмена пакетами между хостом и устройством, в ходе которой может быть принят или передан один пакет данных. В реализации протокола USB хостом понимается USB контроллер, который занимается управлением и координацией каждой группы клиентских устройств.

Интерфейс USB HID общается с хостом, используя управляющий и прерывающий тип передач данных. В данном случае он выступает в качестве хоста протокола USB. Массовый и изохронный типы передач не используются в классе устройств HID.

Прерывающий тип используется для отправки и приёма блоков неструктурированных данных с максимальной задержкой. Оба типа передают данные без потери.

 

Драйверная модель WDF

Для разработки драйвера можно взять модель Windows Driver Foundation (WDF). Драйверы WDF используются для таких же целей, как и драйверы Windows Driver Model (WDM): они осуществляют взаимодействие между Windows и устройством. Хотя WDF представляет совершенно новую драйверную модель, она не является отдельной от WDM.

Модель WDF включает средства, позволяющие создавать драйверы и уменьшающие количество действий, необходимых для обеспечения совместимости с разными версиями Windows, в том числе совместимость драйверов для версий Windows XP и Windows 7.

Инфраструктура предлагает набор объектов, которые представляют различные, связанные с Windows и драйверами, базовые структурные компоненты, такие как устройство, драйвер, запрос ввода-вывода, очередь и так далее. Каждый объект представляет программный интерфейс, который драйвер использует для доступа к свойствам объекта или чтобы дать объекту указания выполнять задачи. Каждый объект также поддерживает одно или более событий.

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

Существуют два вида инфраструктур в драйверной модели WDF: инфраструктура драйверов режима ядра (Kernel-Mode Driver Framework, KMDF) и инфраструктура драйверов пользовательского режима (User-Mode Driver Framework, UMDF). Поскольку цель курсовой работы – научиться разрабатывать драйверы в режиме ядра, то для создания драйвера использовалась инфраструктура KMDF.

По прибытию запроса ввода-вывода инфраструктура определяет, должна ли она обработать запрос сама или предоставить это драйверу WDF, активировав обратный вызов. Если обрабатывать запрос будет драйвер WDF, инфраструктура упаковывает данные в объект запроса и передает его драйверу.

 

Особенности HID-устройств

Наконец, наиболее существенная часть данной статьи. Характерная особенность HID-устройств заключается в том, что они работают со специализированными управляющими операциями ввода-вывода, поэтому такого вида драйверы называются минидрайверы, которые работают с драйверами класса. Драйвер класса – это драйвер-фильтр верхнего уровня, который предоставляет независимую от аппаратных средств поддержку для класса физических устройств. Драйвер класса обмениваться информацией с минидрайвером, расположенным ниже по стеку, используя специализированные запросы управления ввода-вывода и функции обратного вызова. Каждое устройство обслуживается цепочкой драйверов, обычно называемой стеком драйверов. Каждый драйвер в стеке изолирует некоторые аппаратно-зависимые особенности устройства от драйверов верхнего уровня. Microsoft поставляет драйвер hidusb.sys для любого устройства USB, построенного в соответствии со спецификацией HID.

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

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

Инфраструктура KMDF не поддерживает работу с минидрайверами HID-устройств, так как архитектура HID-устройств требует, чтобы драйверу класса HID-устройств (hidclass.sys) принадлежали указатели на диспетчерские функции (таблица управления MajorFunction) драйверов HID-устройств. Это требование противоречит требованию инфраструктуры KMDF, которой должны принадлежать указатели на диспетчерские функции драйверов, чтобы была возможность корректно обрабатывать запросы менеджера Plug and Play, управлять энергопотреблением, запросами ввода-вывода.

Данный конфликт монопольного использования разрешается использованием стека драйверов, который состоит из минимального драйвера WDM в качестве минидрайвера и драйвера KMDF как драйвера-фильтра нижнего уровня. WDM драйвер регистрируется драйвером класса (таким образом, драйверу класса hidclass.sys принадлежат указатели на диспетчерские функции) и перенаправляет все запросы ниже на драйвер-фильтр KMDF, который обрабатывает все поступающие запросы.

Всю логику взаимодействия с устройством выполняет драйвер-фильтр нижнего уровня. Минидрайвер только перенаправляет запросы.

Данную особенность следует учесть только в Windows XP. В Windows 7 роль минидрайвера играет предустановленный драйвер mshidkmdf.sys. Поэтому для функционирования устройства необходим только один драйвер-фильтр.

 

Стек драйверов

Исходя из особенностей работы архитектуры HID-устройств и инфраструктуры KMDF, можно определить следующий стек драйверов для работы устройства (рис. 4). Выделенные блоки являются теми драйверами, которые необходимо реализовать.

 

                                                                  Рис. 4.    Стек драйверов игрового манипулятора

Нижний уровень стека драйверов занимает драйвер хост-контроллера, состоящий из драйвера порта и одного или более минидрайверов порта (в зависимости от типа устройства), которые могут работать одновременно. Здесь изображен драйвер HID-устройства, которое имеет версию спецификации USB 1.1, соответственно это будет минидрайвер usbohci.sys (Open Host Controller Interface).

Выше по стеку расположен драйвер шины. Этот драйвер загружается для каждого корневого USB-концентратора, который позволяет подключить USB-устройства к одной шине.

Далее следует драйвер-фильтр, который является драйвером-фильтром верхнего уровня относительно драйвера шины, но драйвером-фильтром нижнего уровня относительно минидрайвера класса HID-устройств. Для Windows XP минидрайвер необходимо реализовать, а в Windows 7 он уже поставляется вместе с системой. Драйвер класса предоставляет интерфейс взаимодействия для HID-устройств.

Затем выше по стеку располагаются динамические библиотеки пользовательского режима (Win32 API) для работы с HID-устройствами, например, hid.dll, предоставляющая интерфейс взаимодействия с HID-устройствами, и пользовательские приложения.

 

Резюме

При разработке драйвера для USB HID-устройств следует учитывать особенности и USB- и HID-устройств. Новая драйверная модель WDF позволяет упростить действия, связанные с работой USB устройств.

В статье приведены общие сведения, что нужно знать, чтобы начать разрабатывать драйвер для HID-устройства. Для разработки нам понадобится WDK (http://www.microsoft.com/whdc/devtools/WDK/default.mspx), программа для отладки Dbgview (http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx), текстовый редактор с подсветкой синтаксиса (лучше всего Microsoft Visual Studio, но также подойдёт и NotePad++) и, конечно же, само устройство, ради которого происходит весь этот процесс.

 

Список литературы

1)        Они У. Использование Microsoft Windows Driver Model. 2-е издание. Для профессионалов. – СПб.: Питер, 2007 – 764 с.: ил.;

2)        Орвик П., Смит Г. Windows Driver Foundation. Разработка драйверов. – СПб.: БХВ-Петербург, М.: Русская редакция, 2008 – 880 с.;

3)        Библиотека MSDN: http://msdn.microsoft.com/ru-ru/library/default.aspx;

4)        Агуров П. В. Практика программирования USB. – СПб.: БХВ-Петербург, 2006. – 624 с.: ил.;

 

 

Федотов Андрей, 05.11.2011

 

Hosted by uCoz