ПРЕСС-ЦЕНТР

О пакете WinDriver, или как можно написать драйвер устройства сразу для нескольких ОС

МКА 6/2004

С.В. Золотарёв, А.Ю. Калядин, ЗАО "РТСофт"

А что, если планируется поддерживать не одну, а несколько операционных систем (ОС)? Срок разработки затянется на многие месяцы, и конкуренты смогут выйти на рынок раньше. Понимая это, разработчики всё чаще стараются использовать инструментальные средства, которые имеются на рынке программного обеспечения (ПО).

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

  1. Универсальные пакеты разработки драйверов устройств (Driver Development Kit DDK) для конкретной ОС. С одной стороны, эти пакеты узкоспециализированны, но, с другой, позволяют написать драйвер практически любого устройства (аудио, графического, сетевого, печатающего, USB, PCI и так далее). Как правило, такие DDK включают исходные тексты некоторых драйверов, документацию и шаблоны драйверов типовых устройств. К этой группе относятся Windows DDK (http://www.microsoft.com/whdc/ devtools/ddk/default.mspx) или QNX Neutrino DDK (http://www.qnx.com/products/development/ddk.html), Mac OS USB DDK (http://developer.apple.com/ hardware/usb/download.htm) и Mac OS PCI DDK (http://www.macupdate.com/info.php/id/7710), Solaris DDI/DKI (http://http://developers.sun.com/solaris/developer/ support/driver/docs/Solaris_driver_models/P003.html). Чтобы пользоваться подобными DDK, разработчик должен обладать очень высокой квалификацией и досконально знать особенности используемой ОС. Заметим, что для QNX Neutrino разработать драйвер гораздо легче, чем для Windows XP или 2000, поскольку драйвер в QNX Neutrino по своей сути обычный процесс, его можно отлаживать стандартным отладчиком.
  2. Средства разработки драйверов конкретной группы устройств. Примерами служат средства DNE, ESP фирмы Deterministic Networks для разработки сетевых драйверов для Windows, Solaris, Linux, WinCE, пакет CUPS DDK для разработки драйверов принтеров в среде UNIX-подобных ОС, пакет SciTechSNAP SDK фирмы SciTech Software Inc. для разработки драйверов графических устройств (поддерживаются QNX,SMX, Linux X11, Win32, DOS и др.), CardWare SDK фирмы APSoft для работы с PC Card (PCMCIA).
  3. Средства разработки драйверов устройств от конкретного производителя аппаратных средств. Примерами являются средства NI Measurement Hardware DDK фирмы National Instruments для разработки драйверов к платам ввода/вывода в среде различных ОС, TI DSP/BIOS DDK фирмы Texas Instruments для разработки драйверов к сигнальным процессорам TMS320.
  4. Средства разработки драйверов для конкретного пакета высокого уровня (например, SCADA-пакета или СУБД). Примерами таких пакетов являются DDK для системы управления сетями MaxView фирмы ILC (http://www.ilc.com/maxviewddk.html), OpenAccess SDK фирмы Automation Technology Inc. для разработки ODBC-, JDBC-драйверов, DDK для разработки драйверов в SCADA-пакете фирмы Citect (http://www.citect.com).
  5. Интерактивные средства разработки драйверов. Наиболее известными в этой группе средств являются пакеты DriverX фирмы Tetradyne Software Inc., DriverStudio фирмы Compuware. Оба пакета ориентированы на создание драйверов для ОС семейства Windows.

Решения фирмы Jungo

Фирма Jungo Ltd. (www.jungo.com) предлагает кросс-платформенные инструментальные средства WinDriver, которые позволяют элегантно и просто разрабатывать драйверы PCI- и USB-устройств. Средства WinDriver объединяют графическую среду разработки, API-интерфейсы, утилиты диагностики и отладки, а также примеры, которые позволяют быстро разработать производительный драйвер, не требуя от разработчика высокой квалификации. Текущая версия WinDriver 6.22. Особенностью пакета фирмы Jungo по сравнению с решениями других фирм является возможность использования разработанного драйвера без каких либо изменений в исходном коде для ОС различных семейств: Windows, Linux, Solaris, VxWorks. С коммерческой точки зрения к достоинствам WinDriver можно отнести сокращение цикла разработки, простоту освоения и малое время вывода на рынок, а также сокращение затрат на разработку за счёт использования исходного текста драйвера устройства сразу для нескольких ОС. С технической точки зрения использование WinDriver позволяет отделить ошибки в аппаратуре от процесса разработки драйвера, не требует программирования в режиме ядра, но при этом позволяет драйверу достигать производительности работы в режиме ядра с помощью Kernel PlugIn. При работе с WinDriver не требуются знания по средствам разработки конкретной ОС (например, Microsoft DDK или Solaris DDI). Написание и сопровождение одного драйвера осуществляется сразу для всех поддерживаемых ОС. В составе дистрибутива WinDriver фирма Jungo обеспечивает дополнительную поддержку для многих поставщиков USB/PCI (Actel, Altera, Atmel, Cypress, National Semicondactor, PLDA, PLX, QuickLogic, STMicroelectronics, Texas Instruments, Xilinx), которая включает библиотеки, файлы диагностики и примеры быстрого начала разработки. Пакет WinDriver имеет бесплатную полнофункциональную 30-дневную оценочную версию. Код, созданный с помощью оценочной версии, применим для коммерческого распространения после покупки зарегистрированной версии.

Основные возможности WinDriver:

  • немедленный доступ к аппаратным средствам: доступ драйвера к аппаратным средствам в режиме пользователя. Все этапы разработки проводятся в графическом режиме;
  • генерация аппаратно-зависимого кода: программный "мастер" WinDriver DriverWizard генерирует скелет кода драйвера для конкретных аппаратных средств;
  • оптимизация производительности: подключаемый модуль Kernel PlugIn позволяет передавать на уровень ядра обращения к ядру из драйвера, выполняемого в режиме пользователя, тем самым обеспечивая высокую производительность;
  • графические средства: "мастер" DriverWizard обеспечивает работу в графическом режиме (рис. 1);
  • отладка: Graphical Debug Monitor позволяет отслеживать различные уровни работы ядра;
  • поддержка различных ОС: Windows NT4.0/2000/XP/Server 2003/Windows 98/Me, Windows CE 2.0 4.x (x86/MIPS/ARM CPU), Linux и Embedded Linux 2.2 2.6, Solaris 8.0, 9.0 (SPARC 64 bit), Solaris 2.6, 7.0, 8.0 (SPARC 32 bit and x86), VxWorks 5.4 (x86 CPU с любым BSP, PPC 821/860 с MBX821/860, PPC 750 (IBM PPC 604) с MCP750);
  • совместимость кода драйвера для различных ОС: разработанный драйвер совместим на уровне исходного текста для всех поддерживаемых ОС без каких-либо изменений в коде драйвера;
  • генерация кода для распространённых сред разработки: любой 32-битный C-, Pascal- или VB-компилятор (MSDev Visual C/C++, Visual Basic 6.0, Borland, Delphi, gcc и т.д.). Для Kernel PlugIn использовать MSDev Visual C;
  • аппаратная независимость: поддерживает любые аппаратные средства на базе PCI/CompactPCI/CardBus/ISA/EISA;
  • поддерживаемые стандарты для WinDriver PCI: PCI Local Bus Revision 2.2, PCI-X, PCI-Express, PICMG 2.0 R3.0 (Спецификация CompactPCI);
  • поддерживаемые стандарты для WinDriver USB: Universal Serial Bus specification 1.1, Universal Serial Bus specification 2.0;
  • поддержка 64-битной передачи данных на x86-компьютерах, выполняющих 32-битные приложения Windows с 64-битной PCI-шиной;
  • доступ к FPGA: доступ, управление и программирование FPGA-микросхем через шину PCI. Расширенная поддержка для поставщиков FPGA, включая Altera (в составе PCI Development Kit) и Xilinx (в составе Xilinx PCI Design Kit).

Рис. 1. Пример работы графических средств WinDriver:
настройка на применяемые аппаратные средства с помощью DriverWizard

Фактически WinDriver состоит из двух программных пакетов: WinDriver PCI и WinDriver USB. Пакет WinDriver PCI позволяет разрабатывать драйверы PCI-устройств и обеспечивает такие возможности, как:

  • определение устройств Plug-and-Play, установленных на инструментальном компьютере;
  • указание данных по каждому найденному устройству: расположение, Vendor ID и Device ID, ресурсы (включая прерывания, использование портов и памяти);
  • проверка и отладка аппаратных средств с помощью интуитивно понятного интерфейса:
  • Чтение/Запись в область PCI-конфигурации, буферов памяти, портов ввода/вывода (рис. 2);
  • "подслушка" прерываний;
  • определение и доступ к новым регистрам;
  • генерация и установка файлов типа .inf/.kdf;
  • пропускная способность до 100000 прерываний в секунду (с использованием Kernel PlugIn);
  • динамическая загрузка драйвера;
  • поддержка нескольких шин PCI.


Рис. 2. Пример работы c аппаратными ресурсами
с помощью пакета WinDriver PCI: чтение/запись

Драйвер устройства, разработанный с помощью WinDriver (yourapp.exe/.dll), работает с аппаратурой через модуль WinDriver Kernel (windrvr.sys), используя стандартные функции WinDriver API. Выполнение критических секций (по времени или передаче данных) осуществляется в Kernel PlugIn в режиме ядра, тем самым уменьшая накладные расходы (рис. 3).


Рис. 3. Взаимодействие разработанного
с помощью WinDriver драйвера с устройством

На рис. 4 показана типичная последовательность вызовов WinDriver API при написании драйверов устройств PCI/PCMCIA/ISA.


Рис. 4 Типичная последовательность вызовов WinDriver API
при написании драйверов устройств PCI/PCMCIA/ISA

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

2. Вместо функций InterruptEnable/InterruptDisable могут использоваться WD_IntEnable, WD_IntDisable, WD_IntWait, WD_IntCount.

Драйвер PCI-устройства может быть написан различными способами на основе API WinDriver. Один из способов использование функций обработки прерываний, как это показано на рис. 5.


Рис. 5. Использование функций обработки прерываний
при создании драйвера PCI-устройства

Команда WD_IntEnable() регистрирует процедуру обработки прерывания, вызываемую при его возникновении. Команда WD_IntWait() ждёт, пока не возникнет прерывание или оно будет запрещено. Команда WD_IntCount() возвращает число прерываний с момента вызова WD_IntEnable. Команда WD_IntDisable() запрещает обработку прерывания.

Пакет WinDriver USB позволяет разрабатывать драйверы USB-устройств и обеспечивает такие возможности, как:

  • определение USB-устройств, установленных на инструментальном компьютере;
  • указание данных по каждому найденному устройству: расположение, Vendor ID и Device ID, конфигурация, интерфейс, альтернативные установки;
  • проверка и отладка аппаратных средств с помощью интуитивно понятного интерфейса:
  • передача пакетов данных через USB-шины (Чтение/Запись) рис. 6;
  • непрерывное чтение из шины ("подслушка");
  • генерация и установка файлов типа .inf;
  • поддержка низко- и высокоскоростных устройств;
  • поддержка устройств с несколькими интерфейсами;
  • динамическая загрузка драйвера;
  • поддержка многих поставщиков USB-микросхем (Cypress, STMicroelectronics, Texas Instruments, National Semiconductors).

Рис. 6. Пример работы c аппаратными ресурсами
с помощью пакета WinDriver USB: чтение/запись

Существуют два слоя, ответственных за доступ приложения к USB-устройству: на верхнем уровне слой USBD (драйвер USB-устройства), на нижнем HCD (драйвер хост-контроллера). На рис. 7 представлена архитектура WinDriver USB. Программное обеспечение слоя HCD обеспечивает абстракцию аппаратных средств хост-контроллера, а USBD абстракцию USB-устройства и передачи данных между ПО хост-контроллера и функциями USB-устройства.


Рис. 7. Архитектура WinDriver USB

Прикладной интерфейс USB API, поставляемый как часть WinDriver, спроектирован для поддержки передачи данных между USB-приложением пользователя и USB-устройством и управляется по событиям. Для этого могут использоваться три функции: WDU_ATTACH_CALLBACK, WDU_DETACH_CALLBACK и WDU_POWER_CHANGE_CALLBACK. Эти функции используются для оповещения приложения о возникновении соответствующего системного события, которое возникло на присоединённом USB-устройстве. Кроме того, вызовы WDU_Init обеспечивают систему критериями идентификации устройства. Именно функция WDU_Init должна передавать указатели на callback-функции пользователя.

Для того чтобы обеспечить комплексный подход к разработке драйверов, фирма Jungo предлагает в дополнение к пакету WinDriver набор аппаратных средств фирмы Ellisys для отладки разрабатываемых USB-устройств анализаторы USB-протокола USB-Tracker и USB-Explorer (рис. 8а, 8б). Анализатор USB-Tracker удобен для большинства разработчиков. Анализатор USB-Explorer имеет дополнительные по сравнению с USB-Tracker возможности и позволяет анализировать интерфейсы USB 2.0 со скоростью передачи данных до 480 Mбит/с.


Рис. 8а. Анализатор USB-Explorer компании

Рис. 8б. Анализатор USB-Tracker компании Ellisys Драйверы
для различных ОС, поддерживаемые WinDriver

С помощью WinDriver можно реализовать драйверы различных типов:

  • WDM (Windows Driver Model): драйверы ядра внутри семейств операционных систем Windows NT и Windows 98. К семейству Windows NT относятся Windows NT/2000/XP/Server 2003, а к семейству Windows 98 ОС Windows 98 и Windows Me;
  • VxD (Virtual Device Drivers ): драйверы для Windows 95/98/Me;
  • драйверы устройств Unix одного из трёх типов: для символьных (char), блочных и сетевых устройств. Код драйвера компонуется с ядром, которое выполняется в привилегированном режиме. Доступ к драйверу из программы пользователя выполняется через потоковые файловые функции;
  • драйверы устройств Linux основываются на модели драйверов Unix. Дополнительно в Linux реализована концепция динамически загружаемых драйверов;
  • драйверы устройств Solaris основываются на модели драйверов Unix. Подобно драйверам Linux, они могут быть либо статически прикомпонованные к ядру, либо динамически загружаемые.

Примеры использования пакета WinDriver

Пакет WinDriver PCI использован в компании WDV GmbH (Германия) при разработке драйвера в среде Windows CE.NET для PCI-платы в составе трёхмерного плоттера WDV ARTIST 8800-x (рис. 9).


Рис. 9. Пример рабочей конфигурации при разработке драйвера для PCI-платы
в составе трёхмерного плоттера WDV ARTIST 8800-x с использованием
пакета WinDriver PCI в среде Windows CE.NET

С помощью пакета WinDriver USB в компании Satec Ltd. разработан USB-драйвер контроллера, предназначенного для ввода данных и управления (рис. 10).


Рис. 10. Контроллер для ввода данных и управления компании SATEC

Заключение

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