ER-Tronic имеет понятный интерфейс и удобный редактор кода, однако совсем не имеет справки.
Другая сторона разработки устройства с точки зрения программиста – это разработка драйвера устройства.
Процесс создания драйверов достаточно сложен и трудоемок, и, конечно, на рынке программного обеспечения появились программы, облегчающие написание и тестирование драйверов.
Наиболее популярные из них – это NuMegaDriverStudio, JungoWinDriver и JungoKernelDriver.
NuMegaDriverStudio – это программный комплекс, входящий в состав среды разработки MicrosoftVisualStudio. NuMegaDriverStudio представляет собой программу-помощника, отвечая на вопросы которого, можно получить вполне работоспособный шаблон драйвера. Для компиляции полученного кода потребуются классы и библиотеки NuMega и MicrosoftDDK.
JungoWinDriver – это программный пакет, предназначенный для разработки драйверов устройств, использующих стандарты PCI, CompactPCI, USB, ISA, ISAPnP, EISA и работающих под управлением операционных систем Windows9X/Me/NT/2000/XP. Позволяет обращаться к физической памяти, портам, устанавливать собственные обработчики аппаратных прерываний. Не требует наличия WindowsDDK и программирования на уровне ядра. Используется графическая оболочка для диагностики оборудования и автоматической генерации кода на языка C/C++ или Pascal (Delphi).
JungoKernelDriverимеет те же характеристики, что и JungoWinDriver. Единственное отличие в том, что этот программный пакет обеспечивает более высокую производительность и требует наличия Windows DDK. Также используется графическая оболочка для диагностики оборудования и автоматической генерации кода.
5.2 Разработка блок-схемы алгоритма управляющей программы
Управляющий микроконтроллер AT91SAM7SEимеет встроенную программу-загрузчик, которая определяет дальнейший характер его работы. Во-первых, инициализируются DBGU-порт и USB-порт микроконтроллера, затем управление передается программе-загрузчику SAM-BA.
Загрузочная последовательность представлена на рис. 13.
Рис. 13. Загрузочная последовательность AT91SAM7SE
Инициализация управляющего микроконтроллера состоит из следующих этапов:
инициализация FIQ (линии быстрого прерывания);
установка стека в режим supervisor;
инициализация встроенного Flash контроллера;
обнаружение внешнего резонатора;
если не обнаружен внешний резонатор, то настройка внутреннего резонатора микроконтроллера;
переключение основной частоты устройства на главный внутренний резонатор;
копирование кода в SRAM-память;
инициализация переменных C;
инициализация PLL;
выключение сторожевого таймера, активация возможности сброса;
инициализация USB-порта;
передача управления загрузчику SAM-BA.
Перед началом работы устройства, необходимо инициализировать управляющий контроллер и определить дальнейший характер его работы.
Если есть соединение по USB, то в зависимости от установок, хранящихся в энергонезависимой памяти устройства, необходимо сконфигурировать микроконтроллер для работы в качестве звуковой USB-карты или флеш-памяти.
В режиме звуковой карты управляющий микроконтроллер должен выполнять следующие действия:
получать данные от USB-порта компьютера;
передавать их дальше цифро-аналоговому преобразователю в составе модуля F2M03MLA.
В режиме флеш-памяти AT91SAM7SE должен обеспечить работу со встроенной памятью устройства.
Если нет соединения по USB, то устройство должно выполнять функции MP3-плеера, а именно:
управление при помощи управляющих клавиш;
выдача информации на LCD-дисплей;
считывание информации со встроенной памяти устройства и передача стерео кодеку в составе модуля F2M03MLA;
обеспечение возможности передачи звука на беспроводные наушники.
Таким образом, получили следующую блок-схему алгоритма управляющей программы (рис. 14).
Рис. 14. Блок-схема алгоритма управляющей программы
Работа в качестве звуковой карты, съемного диска или MP3-плеера представляет собой отдельные блоки в прошивке управляющего микроконтроллера.
5.3 Разработка шаблона драйвера устройства
Фирмы-разработчики аппаратного обеспечения постоянно совершенствуют внешние устройства и другие узлы персонального компьютера. Постоянно появляются новая периферийная аппаратура и новые модификации уже существующих устройств. Старые устройства наделяются новыми возможностями, новые делают такое, о чем раньше не приходилось и мечтать.
Интуитивно ясно, что должна существовать какая-то программная прослойка между аппаратным и программным обеспечением, выполняющая “согласующие” и “унифицирующие” действия. Эта прослойка работает напрямую с аппаратурой, а прикладное и системное программное обеспечение имеет дело только с этой интерфейсной прослойкой. Этой программной прослойкой являются драйвера устройств.
Рассмотрим внутреннюю организацию шины USB.
Система USB подразделяется на три логических уровня с определенными правилами взаимодействия. Устройство содержит интерфейсную, логическую и функциональную части. Все передачи инициируются хостом, а периферийные устройства могут лишь реагировать на его запросы. Хост также делится на три части – интерфейсную, системную и программное обеспечение.
Связь между логическим уровнем устройства и системной частью хоста осуществляется при помощи логического потока на уровне устройств. Связь между функциональной частью устройства и программным обеспечением хоста осуществляется логическим потоком на уровне функций.
Уровень клиентского программного обеспечения в хосте обычно представляется драйвером устройства.
Логическое устройство USB представляет собой набор независимых конечных точек, с которыми клиентское программное обеспечение обменивается информацией. Каждому логическому устройству USB назначается свой адрес, уникальный на данной шине USB. Каждая конечная точка характеризуется своим номером и направлением передачи.
Транзакция на шине USB – это последовательность обмена пакетами между хостом и периферийным устройством, в ходе которой может быть передан или принят один пакет данных. Когда клиентское программное обеспечение передает запрос уровню системного драйвера, USB-драйвер преобразует его в одну или несколько транзакций шины и затем передает получившийся перечень транзакций контроллеру хоста.
Хост контроллер передает данные периферийному устройству в виде кадров. Каждая передача состоит из одной или нескольких транзакций. Каждая транзакция состоит из пакетов. Каждый пакет состоит из идентификатора пакета, данных и контрольной суммы.
Существует четыре различных типа передачи:
управляющие передачи – для конфигурирования устройства во время подключения, для управления устройство и получения статусной информации в процессе работы;
передачи массивов данных – для обеспечения гарантированной доставки данных, однако время доставки неограниченно;
передачи по прерываниям – передача одиночных пакетов данных небольшого размера за ограниченное время;
изохронные передачи – для обмена данными в реальном времени, имеют наивысший приоритет.
Конечная точка представляет собой буфер и имеет следующие основные параметры: частота доступа к шине, допустимая величина задержки обслуживания, требуемая ширина полосы пропускания канала, номер конечной точки, способ обработки ошибок, максимальный размер пакета, используемый тип посылок и направление передачи данных.
Запрос к устройству и его параметры передаются в виде конфигурационного пакета. Стандартные запросы к устройству – это:
получение состояния (GET_STATUS) – позволяет определить состояние устройства, интерфейса или конечной точки;
сброс свойства (CLEAR_FEATURE) – для запрета свойства или состояния;
разрешение свойства (SET_FEATURE);
задание адреса на шине (SET_ADDRESS) – для присвоения устройству адреса;
получение дескриптора (GET_DESCRIPTOR) – для получения дескриптора устройства, конфигурации или точки;
передача дескриптора (SET_DESCRIPTOR) – позволяет дополнить существующий дескриптор или добавить новый дескриптор устройства, конфигурации или строки;
получение кода конфигурации (GET_CONFIGURATION) - устройство выдает код своей текущей конфигурации;
задание кода конфигурации (SET_CONFIGURATION) – позволяет задать устройству новую конфигурацию.
Дескриптор устройства – это структура данных или форматированный блок информации, который позволяет хосту получить описание устройства.
Стандартный дескриптор устройства содержит основную информацию об USB-устройстве и его конфигурациях. Устройство должно иметь только один такой дескриптор, однако если устройство может работать в нескольких режимах (на разных скоростях), то оно должно иметь еще и уточняющий дескриптор.
Дескриптор конфигурации содержит информацию об одной из возможных конфигураций устройства.
Дескриптор интерфейса содержит информацию об одном из интерфейсов, доступных при определенной конфигурации устройства.
Дескриптор конечной точки содержит информацию об одной из конечных точек, доступных при использовании определенного интерфейса.
Дескриптор строки (необязателен) содержит текст в формате UNICODE.
Также могут быть использованы специфические дескрипторы.
В Windows 2000/XP драйверная поддержка реализуется на основе WDM. С точки зрения WDM существует три типа драйверов:
драйвер шины – для обслуживания шины;
функциональный драйвер – основной драйвер устройства;
драйвер фильтра – для поддержания дополнительной функциональности устройства.