Class driver что это

Обновлено: 07.07.2024

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

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

В частности, драйверы класса хранения данных выполняют описанные ниже операции.

Драйверы класса взаимодействуют с драйверами порта на следующем нижнем уровне стека хранения данных. Интерфейс между драйверами классов и драйверами порта формируется посредством частного интерфейса управления вводом-выводом, а также обмена блоками запросов SCSI. Некоторые элементы блоков запроса SCSI используются только для интерфейса класса или интерфейса порта, а некоторые предназначены для использования драйвером порта.

К драйверам класса устройств хранения в Windows NT относятся, например, драйверы дисков, приводов компакт-дисков и накопителей на магнитной ленте; они могут работать с различными устройствами, в том числе подключенными к шинам SCSI, IDE, USB и 1394.

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

Драйверы класса устройства хранения обычно работают аналогично драйверам шины, перечисляя дочерние устройства. Хорошим примером может служить драйвер класса диска (disk.sys), который считывает таблицу разделов диска и создает объекты устройств для каждого найденного дискового раздела.

Интересно отметить, что Microsoft добавила в Windows 2000 новую библиотеку, которая называется ClassPnP. Эта библиотека реализует функциональные возможности РпР, общие для всех драйверов класса. При этом некоторые функции полностью реализуются драйвером класса. Для других функ ций драйвер, который использует библиотеку класса, должен предоставить процедуры обратного вызова, используемые драйвером класса при необходимости. Все драйверы класса, предоставляемые Microsoft (драйверы дисков, накопителей на магнитной ленте и драйверы приводов компакт-дисков), пользуются услугами библиотеки ClassPnP (она реализована в виде файла classpnp. sys). Та же ситуация сохранилась и в Windows XP/Windows Server 2003.

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

Сперва нам нужно определится в чем мы же будем создавать наш первый драйвер. Поскольку материал ориентирован на новичков, то язык программирования был выбран один из простых, и это не Си или ассемблер, а бейсик. Будем использовать один из диалектов бейсика — PureBasic. Из коробки он не обучен создавать драйверы, но у него удачный набор файлов, используемых для компиляции и небольшое шаманство позволяет добавить эту возможность. Процесс компиляции состоит из нескольких этапов. Если кратко, то он происходит следующим образом: Сначала транслятор «перегоняет» basic-код в ассемблер, который отдается FASM'у (компилятор ассемблера), который создает объектный файл. Далее в дело вступает линкер polink, создающий исполняемый файл. Как компилятор ассемблера, так и линкер могут создавать драйверы и если немного изменить опции компиляции, то получим не исполняемый файл, типа EXE или DLL, а драйвер режима ядра (SYS).

Окно IDE с загруженным кодом драйвера показано на скрине.

image

image

Компиляция драйвера выполняется через меню «Компилятор» (это если кто не понял).

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

Может показаться что это куча бессмысленного кода, но это не так.

У каждого драйвера должна быть точка входа, обычно у нее имя DriverEntry() и выполнена она в виде процедуры или функции. Как видите, в этом драйвере есть такая процедура. Если посмотрите на начало кода, то в первых строках увидите как ей передается управление. В этой процедуре происходит инициализация драйвера. Там же назначается процедура завершения работы драйвера, которая в нашем случае имеет имя UnloadDriver(). Процедуры CreateDispatch() и CloseDispatch() назначаются обработчиками соединения и отсоединения проги из юзермода.
Процедура DeviceIoControl() будет обрабатывать запросы WinAPI функции DeviceIoControl(), являющейся в данном драйвере связью с юзермодом. В конце кода расположена так называемая ДатаСекция (DataSection), в которой находятся имена драйвера, сохраненные в формате юникода (для этого использована одна из фишек ассемблера FASM).

Видите сколько понадобилось кода для выполнения простейшей математической операции — сложения двух чисел?

А теперь рассмотрим программу, работающую с этим драйвером. Она написана на том же PureBasic.

Процедура Plus() осуществляет связь с драйвером. Ей передаются хэндл, доступа к драйверу и слагаемые числа, которые помещаются в структуру и указатель на указатель которой, передается драйверу. Результат сложения чисел будет в переменной «Result».

Далее следует код простейшего GUI калькулятора, скопированного из википедии.

Когда закроют окно, то перед завершением работы программы, закрывается связь с драйвером и производится его деинсталляция из системы.

Результат сложения чисел 8 и 2 на скриншоте.

image

Исходные коды драйвера и программы, можно найти в папке «Examples», PureBasic на файлопомойке, ссылку на который давал в начале статьи. Там так же найдете примеры драйвера прямого доступа к порам компа и пример работы с памятью ядра.

PS.
Помните, работа в ядре чревата мелкими неожиданностями аля, BSOD (синий экран смерти), поэтому экспериментируйте осторожно и обязательно всё сохраняйте перед запуском драйвера.

Как работает драйвер и для чего он нужен?

Основное назначение драйвера – это упрощение процесса программирования работы с устройством.

Он служит «переводчиком» между хардовым (железным) интерфейсом и приложениями или операционными системами, которые их используют. Разработчики могут писать, с помощью драйверов, высокоуровневые приложения и программы не вдаваясь в подробности низкоуровневого функционала каждого из необходимых устройств в отдельности.

Как уже упоминалось, драйвер специфичен для каждого устройства. Он «понимает» все операции, которые устройство может выполнять, а также протокол, с помощью которого происходит взаимодействие между софтовой и железной частью. И, естественно, управляется операционной системой, в которой выполняет конкретной приложение либо отдельная функция самой ОС («печать с помощью принтера»).

Если вы хотите отформатировать жесткий диск, то, упрощенно, этот процесс выглядит следующим образом и имеет определенную последовательность: (1) сначала ОС отправляет команду в драйвер устройства используя команду, которую понимает и драйвер, и операционная система. (2) После этого драйвер конкретного устройства переводит команду в формат, который понимает уже только устройство. (3) Жесткий диск форматирует себя, возвращает результат драйверу, который уже впоследствии переводит эту команду на «язык» операционной системы и выдает результат её пользователю (4).

О сервере печати

В Windows печать через протокол IPP появилась, начиная с Windows 2000. На клиентах с Windows 7 и новее, поддержка протокола IPP, как правило, уже установлена. Также есть Internet Printing – windows реализация сервера печати Internet через IPP. Для его установки необходимо сначала установить службу веб сервера MS IIS

class driver

Driver Verifier — A component of Microsoft Windows Driver Verifier in Windows 7. Driver Verifier is a tool included in Microsoft Windows that replaces the default operating system subroutines with ones that are specifically developed to catch de … Wikipedia

Class A — may refer to: Class A airfield, a standardised design for military airfields built throughout Britain from 1942 Class A airspace, an airspace class defined by the ICAO class A amplifier, a category of electronic amplifier Class A baseball, one of … Wikipedia

Driver's license — Driving permit redirects here. In some countries, this term could also mean Learner s permit. The front side of an Austrian issue European driving licence with all the languages of the EU … Wikipedia

Class 1 World Powerboat Championship — Category Catamaran Twin engined Country or region Worldwide Inaugural season 1964 Drivers 22 (two per boat/driver throttleman) … Wikipedia

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

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

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

Драйвер устройства и с чем его едят



Как уважаемый хабрапользователь наверняка знает, «драйвер устройства» — это компьютерная программа управляющая строго определенным типом устройства, подключенным к или входящим в состав любого настольного или переносного компьютера.

Основная задача любого драйвера – это предоставление софтового интерфейса для управления устройством, с помощью которого операционная система и другие компьютерные программы получают доступ к функциям данного устройства, «не зная» как конкретно оно используется и работает.

Обычно драйвер общается с устройством через шину или коммуникационную подсистему, к которой подключено непосредственное устройство. Когда программа вызывает процедуру (очередность операций) драйвера – он направляет команды на само устройство. Как только устройство выполнило процедуру («рутину»), данные посылаются обратно в драйвер и уже оттуда в ОС.

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

Любая операционная система обладает «картой устройств» (которую мы видим в диспетчере устройств), для каждого из которых необходим специфический драйвер. Исключения составляют лишь центральный процессор и оперативная память, которой управляет непосредственно ОС. Для всего остального нужен драйвер, который переводит команды операционной системы в последовательность прерываний – пресловутый «двоичный код».

О языках принтеров

Что такое задание на печать? Это программа, написанная на специальном языке программирования – Page Description Language (PDL).

Печатаемые страницы кодируются в PDL и занимают меньший размер, а значит, передаются быстрее необработанных изображений. PDL не зависят ни от самих устройств, ни от разрешающей способности. Принтеры преобразуют задания на специализированном языке в понятный для устройства формат. Это значит, что принтеры содержат языковые интерпретаторы. Также как у языков программирования «а ля Java», у этих языков не одна версия и каждая работает немного по-своему.

Преобразование PDL в растровые изображения выполняется программой-обработчиком: процессором растровых изображений, Raster Image Processor или просто RIP.

Самые известные PDL языки: Postscript, PCL5, PCL6

PostScript – самый распространённый из всех. Первоначально разработан компанией Adobe. Требует наличия лицензии для использования, поэтому на сегодняшний день используется преимущественно в высокопроизводительных устройствах верхнего ценового сегмента. Почти все программы, компонующие страницы, могут генерировать задания на PostScript. Это полнофункциональный язык программирования. Написанные программы можно просматривать с помощью текстового редактора. В них много круглых скобок, а также символов / %!

P.S. Эти символы ищутся интерпретаторами для распознавания заданий на печать.

Также PostScript является стандартом для MAC и профессиональным стандартом.

PCL – или Printer Common Language – альтернатива PostScript от Hewlett Packard (далее HP). Язык понятен принтерам других производителей, некоторые умеют работать только с ним. PCL – не язык программирования, он просто сообщает на принтер как ему следует напечатать страницы. Задания на PCL бинарные и непонятны для человека, зато короче по размеру, чем PostScript.

Существуют фильтры, преобразующие Postscript в PCL. Версии PCL разнятся не так сильно как PostScript, но достаточно, чтобы вызывать раздражение. Задания печатаются немного не так на разных моделях принтеров. Причина в диалектах со специальными командами. В отличие от PostScript, PCL изначально заточен именно на управление принтером, а не на переносимость страницы, поэтому для достижения наилучшего результата печати необходимо использовать команды под соответствующий принтер. Именно поэтому в операционной системе (ОС) указывается модель принтера, в противном случае генерируются иные PCL команды, интерпретируемые неправильно или вовсе игнорируемые.

На самом деле, вопрос не только в железе: существует так называемая эмуляция.

Эмуляция PCL – это значит, что разработчик стандарта (т.е. HP) не лицензировал или не тестировал принтер производителя на совместимость с PCL.

Эмуляция PostScript – Adobe не получал отчисления за свой интерпретатор PostScript, вместо этого некоторые вендоры написали собственный код. Политика лицензирования породила диалекты языков – схожие, но не повторяющие оригинал в точности. На практике оба могут выполняться с ошибками, но случается такое редко.

Чтобы вас окончательно запутать, HP определила два семейства языков PLC5 (5e – черно-белый, и 5c – цветной) и PCL6 (PCL/XL). Новые HP принтеры поддерживают оба. Ранее существовал и PCL4, но сейчас он слишком архаичный. Начиная с PCL5 5e, также были введены такие новшества, как: поддержка разрешения 600 dpi, двунаправленный обмен данными между принтером и компьютером и новые шрифты для Microsoft Windows.

PDF – еще одна разработка Adobe – Portable Document Format. Это формат документов, использующий часть возможностей PostScript, основа издательского дела и программ Office. PDF-документы не зависят от ОС и платформы. Очень часто формат используется для обмена документами с возможностью просмотра и печати. PDF – язык описания документов, а не страниц. Позволяет описывать не только страницы, но и всю структуру документа, главы, взаимосвязь текстовых столбцов друг с другом, правки и так далее. Плюс, куча возможностей мультимедиа.

Есть принтеры, которые интерпретируют PDF напрямую. Есть масса программ-трансляторов и визуальных редакторов с возможностью преобразования PDF, например, в PostScript. Это преобразование даже может быть скрыто от пользователя.

XHTML – появился относительно недавно. Принтер получает поток данных на языке, описывающем XHTML-print веб-страницу, генерирует представление задания (разные принтеры формируют разные задания, также как разные браузеры отражают страницу иначе).

HP-GL/2 – Hewlett-Packard Graphics Language – Служат для печати векторной графики в составе документа.

HPGL – язык поддержки плоттеров. Поддерживается почти всеми HP-принтерами.

PJL – Printer Job Language. Язык заданий для принтера, метаязык от HP, описывает какой PDL должен использоваться для задания, каким будет формат бумаги, сколько копий нужно напечатать, симплексное задание или дуплексное и так далее.

Как создается драйвер устройства



Для каждого устройства существует свой строгий порядок выполнения команд, называемой «инструкцией». Не зная инструкцию к устройству, невозможно написать для него драйвер, так как низкоуровневые машинные команды являются двоичным кодом (прерываниями) которые на выходе отправляют в драйвер результат, полученный в ходе выполнения этой самой инструкции.

При создании драйвера для Линукса, вам необходимо знать не только тип шины и ее адрес, но и схематику самого устройства, а также весь набор электрических прерываний, в ходе исполнения которых устройство отдает результат драйверу.

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

И чем драйвер не является

Часто драйвер устройства сравнивается с другими программами, выполняющими роль «посредника» между софтом и/или железом. Для того, чтобы расставить точки над «i», уточняем:

  • Драйвер не является интерпретатором, так как не исполняется напрямую в софтовом слое приложения или операционной системы.
  • Драйвер не является компилятором, так как не переводит команды из одного софтового слоя в другой, такой же.

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

Языки и технологии принтеров

image

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

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

О драйверах

Драйвер принтера и поддержка – ПО, преобразующее файл в понятный для принтера. Задачи и функции драйвера отвечают на вопросы: «Что если принтер не поддерживает все языки?», «Имеется задание postscript, а принтер распознает только PCL 5E. Нужно напечатать PDF, что делать, если принтер его не интерпретирует?».

Система сможет сделать все самостоятельно (выяснить язык PDL файла, выполнить преобразования). Вы также можете преобразовать файл вручную. Браузеры умеют преобразовывать HTML в postscript или в PDF. Open Office может преобразовать .doc в PDF. Из postscript можно преобразовать почти в любой формат, в том числе PCL.

GDI – ещё задание на печать можно просматривать и интерпретировать централизованно, на ПК. Также можно отправлять готовые обработанные растровые изображения на принтер «без интеллекта». Именно так и работают многие Windows GDI-принтеры. Такие принтеры обладают весьма незначительным количеством логических инструкций и совсем не обладают интерпретаторами PDL. Вместо этого растеризацию выполняет обслуживающий компьютер. Часть информации для взаимодействия с GDI скрыта в коде Windows под патентами. Эта секретность затрудняет разработку аналогов в системах Linux, и, по сути, является преимуществом. Аналогично ситуация развивается с поддержкой новейших моделей принтеров. Впрочем, ситуация меняется благодаря существованию демона CUPS с поддержкой многих Win Printers с помощью реверс инжиниринга.


Как уважаемый хабрапользователь наверняка знает, «драйвер устройства» — это компьютерная программа управляющая строго определенным типом устройства, подключенным к или входящим в состав любого настольного или переносного компьютера.

Основная задача любого драйвера – это предоставление софтового интерфейса для управления устройством, с помощью которого операционная система и другие компьютерные программы получают доступ к функциям данного устройства, «не зная» как конкретно оно используется и работает.

Обычно драйвер общается с устройством через шину или коммуникационную подсистему, к которой подключено непосредственное устройство. Когда программа вызывает процедуру (очередность операций) драйвера – он направляет команды на само устройство. Как только устройство выполнило процедуру («рутину»), данные посылаются обратно в драйвер и уже оттуда в ОС.

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

Любая операционная система обладает «картой устройств» (которую мы видим в диспетчере устройств), для каждого из которых необходим специфический драйвер. Исключения составляют лишь центральный процессор и оперативная память, которой управляет непосредственно ОС. Для всего остального нужен драйвер, который переводит команды операционной системы в последовательность прерываний – пресловутый «двоичный код».

Как работает драйвер и для чего он нужен?

Основное назначение драйвера – это упрощение процесса программирования работы с устройством.

Он служит «переводчиком» между хардовым (железным) интерфейсом и приложениями или операционными системами, которые их используют. Разработчики могут писать, с помощью драйверов, высокоуровневые приложения и программы не вдаваясь в подробности низкоуровневого функционала каждого из необходимых устройств в отдельности.

Как уже упоминалось, драйвер специфичен для каждого устройства. Он «понимает» все операции, которые устройство может выполнять, а также протокол, с помощью которого происходит взаимодействие между софтовой и железной частью. И, естественно, управляется операционной системой, в которой выполняет конкретной приложение либо отдельная функция самой ОС («печать с помощью принтера»).

Если вы хотите отформатировать жесткий диск, то, упрощенно, этот процесс выглядит следующим образом и имеет определенную последовательность: (1) сначала ОС отправляет команду в драйвер устройства используя команду, которую понимает и драйвер, и операционная система. (2) После этого драйвер конкретного устройства переводит команду в формат, который понимает уже только устройство. (3) Жесткий диск форматирует себя, возвращает результат драйверу, который уже впоследствии переводит эту команду на «язык» операционной системы и выдает результат её пользователю (4).

Как создается драйвер устройства


Для каждого устройства существует свой строгий порядок выполнения команд, называемой «инструкцией». Не зная инструкцию к устройству, невозможно написать для него драйвер, так как низкоуровневые машинные команды являются двоичным кодом (прерываниями) которые на выходе отправляют в драйвер результат, полученный в ходе выполнения этой самой инструкции.

При создании драйвера для Линукса, вам необходимо знать не только тип шины и ее адрес, но и схематику самого устройства, а также весь набор электрических прерываний, в ходе исполнения которых устройство отдает результат драйверу.

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

И чем драйвер не является

Часто драйвер устройства сравнивается с другими программами, выполняющими роль «посредника» между софтом и/или железом. Для того, чтобы расставить точки над «i», уточняем:

  • Драйвер не является интерпретатором, так как не исполняется напрямую в софтовом слое приложения или операционной системы.
  • Драйвер не является компилятором, так как не переводит команды из одного софтового слоя в другой, такой же.

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

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

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

Ниже перечислены доступные драйверы класса и их режимы.

Использование драйверов класса

Для простого интегрирования драйверов класса в приложение пользователя, все используют стандартизованный дизайн с простыми для именования/использования функциями, перечислениями (enum), определениями (define) и типами. Два разных режима реализованы несколько по-разному, и поэтому должны быть разъяснены по отдельности. Для информации по специфическому драйверу класса, читайте документацию к модулю этого драйвера класса.

Драйвера класса режима устройства USB (Device Mode Class Drivers)

Реализация драйвера USB режима устройства (Device Mode Class Driver) в приложении пользователя требует выполнения некоторого количества шагов. Во-первых, в исходники проекта дожны быть добавлены конфигурация модуля и структура состояния. Эти структуры для разных классов называются в одинаковом стиле, как USB_ClassInfo_ _Device_t, и они используются для удержания полного состояния и конфигурации для каждого экземпляра класса. Несколько экземпляров одного и того же класса - в этом заключается сила драйверов класса; реализация нескольких интерфейсов того же самого класса просто требует нескольких экземпляров структур ClassInfo (информация драйвера класса).

Внутри структуры ClassInfo расположены две секции - секция Config и секция State. Секция Config содержит экземпляр параметров конфигурации, и должна иметь все поля установленными в приложении пользователя перед тем, как драйвер класса может быть использован. Каждый драйвер класса режима устройства USB обычно состоит их набора параметров конфигурации для размера/количества конечных точек (endpoint) привязанного логического интерфейса USB, плюс любые специфические для класса параметры конфигурации.

Секция State (состояние) структуры ClassInfo разработана для того, чтобы быть управляемой только драйверами класса, для поддержки состояния экземпляра драйвера класса, и обычно не должна быть установлена приложением пользователя.

В следующем примере показан правильно инициализированный экземпляр структуры Audio Class Driver:

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

Для инициализации интерфейса драйвера класса должны быть вызваны функции драйвера _Device_ConfigureEndpoints() в ответ на событие EVENT_USB_Device_ConfigurationChanged(). Эти функции вернут двоичное true, если экземпляр драйвера успешно инициализирован. Как и все функции драйвера, эта функция получает адрес конкретного экземпляра, который нужно инициализировать - в этом случае можно инициализировать несколько отдельных экземпляров того же самого класса, например:

Как только класс инициализирован, важно поддерживать его состояние постоянными повторяющимися вызовами функций класса драйвера _Device_USBTask() из главного цикла программы. Точная реализация этой функции различается для каждого класса драйвера, и может быть использована для любых внутренних нужд экземпляра класса драйвера. И как в прошлый раз, эта функция использует для работы адрес экземпляра, и поэтому должна вызваться для каждого отдельного экземпляра, как и главная процедура поддержки USB USB_USBTask():

Последней стандартизованной функцией для драйвера класса устройства (Device Class Driver) является функция обработчика управляющего запроса (Control Request handler) _Device_ProcessControlRequest(), которая должна быть вызвана, когда срабатывает событие EVENT_USB_Device_ControlRequest(). Эта функция также должна быть вызвана для каждого экземпляра драйвера класса, используя адрес экземпляра как параметр функции. Обработчик прерывания будет прерывать работу, если он определил, что текущий запрос не предназначен для указанного экземпляра класса, следовательно эти методы можно безопасно вызывать без проверки ошибок друг за другом в обработчике события:

Каждый драйвер класса может также определить набор функций обратного вызова (имеющие префикс "CALLBACK_" в имени функции), которые должны быть также добавлены в приложение пользователя - обратитесь к индивидуальной документации драйвера класса для обязательных callback. В дополнение каждый драйвер класса может также определить набор событий (идентифицируемые по префиксу "EVENT_" в имени функции), которые приложение пользователя может обработать или игнорировать, если событие не интересно.

Индивидуальная документация по Device Mode Class Driver содержит более подробную информацию по не стандартизованным, class-specific функциям, которые приложение пользователя может использовать в экземпляре драйвера, такие как подпрограммы чтения и записи данных. Для подробностей по class-specific функциям см. индивидуальную документацию по каждому драйверу.

Драйверы класса режима хоста (Host Mode Class Drivers)

Реализация драйвера класса режима хоста в приложении пользователя требует выполнения нескольких шагов. Во-первых, в исходники проекта дожны быть добавлены конфигурация модуля и структура состояния. Эти структуры для разных классов называются в одинаковом стиле, как USB_ClassInfo_ _Host_t, и они используются для удержания полного состояния и конфигурации для каждого экземпляра класса. Несколько экземпляров одного и того же класса - в этом заключается сила драйверов класса; реализация нескольких интерфейсов того же самого класса просто требует нескольких экземпляров структур ClassInfo (информация драйвера класса).

Внутри структуры ClassInfo расположены две секции - секция Config и секция State. Секция Config содержит экземпляр параметров конфигурации, и должна иметь все поля установленными в приложении пользователя перед тем, как драйвер класса может быть использован. Каждый драйвер класса режима устройства USB обычно состоит их набора параметров конфигурации для размера/количества конечных точек (endpoint) привязанного логического интерфейса USB, плюс любые специфические для класса параметры конфигурации.

Секция State (состояние) структуры ClassInfo разработана для того, чтобы быть управляемой только драйверами класса, для поддержки состояния экземпляра драйвера класса, и обычно не должна быть установлена приложением пользователя.

В следующем примере показан правильно инициализированный экземпляр структуры MIDI Class Driver:

Для инициализации экземпляра драйвера класса должна быть вызвана функция драйвера _Host_ConfigurePipes() в ответ на вход машины состояния хоста в состояние HOST_STATE_Addressed. Эта функция возвратит код ошибки из перечисления драйвера класса _EnumerationFailure_ErrorCodes_t чтобы показать, что драйвер успешно инициализировал свой экземпляр и сделал его привязку к интерфейсу в подключенном устройстве. Как и все функции драйвера класса, эта функция принимает адрес отдельного экземпляра, который нужно инициализировать - в этом случае можно инициализировать несколько отдельных экземпляров одного и того же типа класса. Фрагмент драйвера класса, бизирующегося на приложении режима хоста может выглядеть так:

Обратите внимание, что функция также требует дескриптор конфигурации устройства, чтобы можно было определить, какой интерфейс в устройстве связать с драйвером - это можно получить, как показано в вышеупомянутом фрагменте с использованием функции USB_Host_GetDeviceConfigDescriptor(). Если устройство не реализует интерфейс, который ищет драйвер класса, если все подходящие интерфейсы уже привязаны к экземплярам драйвера класса или если произошла ошибка при привязке к интерфейсу устройства (например, используемый банк конечной точки больше, чем максимально поддерживаемый размер банка), то конфигурация перестанет работать.

Как только класс инициализирован, важно поддерживать его состояние постоянными повторяющимися вызовами функций класса драйвера _Host_USBTask() из главного цикла программы. Точная реализация этой функции различается для каждого класса драйвера, и может быть использована для любых внутренних нужд экземпляра класса драйвера. И как в прошлый раз, эта функция использует для работы адрес экземпляра, и поэтому должна вызваться для каждого отдельного экземпляра, как и главная процедура поддержки USB USB_USBTask():

Каждый драйвер класса может также определить набор функций обратного вызова (имеющие префикс "CALLBACK_" в имени функции), которые должны быть также добавлены в приложение пользователя - обратитесь к индивидуальной документации драйвера класса для обязательных callback. В дополнение каждый драйвер класса может также определить набор событий (идентифицируемые по префиксу "EVENT_" в имени функции), которые приложение пользователя может обработать или игнорировать, если событие не интересно.

Индивидуальная документация по Device Mode Class Driver содержит более подробную информацию по не стандартизованным, class-specific функциям, которые приложение пользователя может использовать в экземпляре драйвера, такие как подпрограммы чтения и записи данных. Для подробностей по class-specific функциям см. индивидуальную документацию по каждому драйверу.

Читайте также: