Глава 2:Редактирование драйверов

В этой главе:

Редактор ресурсов драйверов

Назначение

Редактор ресурсов драйверов drvedit предназначен для :

Запуск на выполнение

Для запуска редактора драйверов из редактора схем выберите пункт Driver Editor меню Edit .

Для запуска редактора драйверов в командной строке наберите в окне терминала команду :

drvedit [ -p project -d path ] &

Где :

project - имя проекта
path - директория , в которой находится проект (по умолчанию /usr/rtw/apps )

Чтобы получить полный список опций дайте команду

use drvedit

Общий вид окна редактора драйверов показан на рисунке .

Основное меню

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

Выбор проекта

При выборе пункта Open открывается окно с перечнем проектов , находящихся в директории , которая указана в поле Project Path . Этот путь указывается при запуске drvedit и его можно изменять в окне . Проект выбираются из списка либо двойным нажатием кнопки "мышки", либо кнопкой Select.

Выбор, добавление и удаление драйверов

Выбор драйверов для проекта

После открытия проекта в основном окне появляется список доступных драйверов в виде узлов основного ствола дерева , а выбранные для данного проекта копии драйверов отображаются в виде ветвей дерева . В нашем примере это 818L_1 . Если в данном проекте драйвер не используется , то узел ображается в виде пересечения линий , иначе узел отображается в виде кнопки с '+' - в свернутом виде или '-' - в развернутом .

Добавление драйверов

  Для добавления новой копии какого - либо драйвера надо выбрать нужный тип драйвера и нажать кнопку Insert, после чего появится дополнительное окно для определения имени копии драйвера .

Это имя является уникальным для данного проекта и используется для идентификации драйвера . Вид этого окна приведен на рисунке .

Удаление драйверов

Для удаления копии какого - либо драйвера надо выбрать нужную копию драйвера и нажать кнопку Delete , после чего копия драйвера будет исключена из проекта.

Изменение текущего состояния драйверов

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

Вид окна показан на рисунке.

Редактирование ресурсов драйвера

  Выделив курсором нужный драйвер и нажав кнопку Edit можно войти в режим редактирования ресурсов конкретного драйвера УСО .

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

Секции [Main] , [Base], [IRQ & DMA] и [Channels] являются обязательными и при их отсутствии - драйвера не смогут корректно работать .

Редактирования основных параметров драйверов

Эти параметры расположены в нескольких секциях и включают в себя :

Редактирование ресурсов каналов УСО

В этом окне конфигурируются ресурсы каналов УСО . Это касается УСО , которые имеют каналы аналогового ввода / выхода и счетно - импульсные входы .
Для аналоговых каналов определяются значения следующих шкал :

Кроме того указывается тип функции приведения к физической величине :

Все эти шкалы необходимо определить для того , чтобы драйвер мог привести значения преобразованные АЦП к физической величине . Для выходных каналов производится обратный пересчет от аналоговой величины к значению регистров УСО . Вид окна показан на рисунке .

Для аналоговых выходов определяется только шкала выходного диапазона платы и данные посылаются драйверу в виде значения электрического сигнала .

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

 

Редактирование уникальных ресурсов

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

Настройки для каждой копии драйвера в проекте хранятся в одноименной поддиректории в файле :

/usr/rtw/apps/<имя проекта >/drv/<тип драйвера>/<имя копии >/driver.inf .

Информация для запуска драйверов проекта в файле:

/usr/rtw/apps/<имя проекта >/drv/drvstart.cfg .

Завершение редактирования

  Выход из редактора ресурсов драйверов осуществляется через кнопку Done .

Редактор- построитель драйверов

Назначение

Редактор-построитель драйверов drvbuilder предназначен для:

Запуск на выполнение

Для запуска редактора-построителя драйверов из редактора схем необходимо выбрать пункт Driver Builder меню Edit .

Для запуска редактора в командной строке необходимо набрать в окне терминала команду:

drvbuilder &

Для редактора - построителя драйверов имеется отдельная рабочая директория /usr/drvbuilder, которая имеет следующую структуру :

Основная концепция

В основу концепции drvbuilder положена предпосылка , что типичный драйвер УСО представляет собой совокупность стандартных по функциональности процедур . При этом все процедуры разделяются на две категории :

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

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

Так , если УСО не имеет входов/выходов какого-либо типа , то и процедуры ввода-вывода для данного типа будут недоступны для редактирования . Любая процедура может остаться неотредактированной . Разработка процедур ведется на языке С для компилятора Watcom C 10.6 , имеется встроенная поддержка компиляции и сборки готовых программ драйверов .

Создание нового драйвера

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

На следующем рисунке показано окно, в котором создается проект нового драйвера 812PG , при открытом текущем проекте драйвера 818L.

Задание функциональных особенностей драйвера осуществляется в интерактивном режиме в два этапа :

- через прерывание , при этом предлагается связать механизм прерываний (IRQ) с одним из типов каналов ;
- через механизм ПДП , что возможно только при выбранном механизме IRQ ;
- по таймеру .

Условный переключатель имеет два положения , левое соответствует - ВЫКЛ , а правое - ВКЛ . Выбор осуществляется манипулятором "мышь" .

При включении механизма IRQ - программа предлагает (курсор становится в в виде руки ) указать тип канала с которым связан этот механизм .

Каждому типу соответствует своя процедура - обработчик .

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

Редактирование и компиляция исходных модулей

Редактирование исходных модулей можно вести как в основном окне Source Editor , так и в редакторе VEDIT - для этого надо нажать на кнопку Vedit в нижней части окна . Если часть информации была набрана в основном окне редактора , а затем появилась потребность продолжить работу в VEDIT , то все наработки будут перенесены в окно VEDIT . Работа в редакторе VEDIT - стандартная .

После того как исходный текст набран - надо вернутся в окно Source Edit и нажать кнопку Make для компиляции процедуры и дальнейшей прилинковки ее к основному телу драйвера . Вид этого окна показан на рисунке . Результаты компиляции отображаются в окне .

 Основные соглашения по именам переменных и процедур

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

Глобальные переменные :

Сервисные процедуры

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

С целью упростить и унифицировать доступ к таким ресурсам в процедуре init , для разработчика предоставлена библиотечная процедура GetItemData. Синтаксис ее следующий:

Void * СfgGetValue( char *section , char * item ) ,

Где :

section - имя секции в конфигурационном файле ;
item - имя ресурса .

Возвращает :

адрес области данных item .

Кроме того можно использовать две процедуры для приведения входных аналоговых данных к электрической и физической величинам .

void electric_scale ( int idx , short value, float r_min , float r_max, const short MAX_AD),

где :

idx - номер канала ;
value - значение результата преобразования по каналу ;
r_min, r_max - минимальное и максимальное значение шкалы платы по каналу ;
MAX_AD - максимально возможное значение результата преобразования по каналу .

void phisical_scale ( int idx ) ,

где :

idx - номер канала ;

 Чтобы иметь доступ в объекте RTWin к буферу с данными , полученными через механизм DMA , необходимо используя библиотечную функцию shmemmove() , перенести данные из буфера DMA в область памяти, доступную для блок-функции RTWin GetDMABuffer.

Рекомендуется в процедуре interrupt_handler вставить вызов этой функции.

Пример :

void interrupt_handler()
{
. . . . . . . . . . .
if ( DMA ) {
. . . . .
shmemmove();
. . . . . .
}
}

Для доступа к внутренним массивам данных по всем типам входных каналов предназначены макроопределения :

AVI(I) - значение по I -му каналу аналоговых входов;
DVI(I) - значение по I -му каналу дискретных входов;
CVI(I) - значение по I -му каналу счетно-импульсных входов.

Завершение разработки драйвера и интеграция в CACSD RTWin

 По завершению разработки загрузочный модуль драйвера находится в директории /usr/drvbuilder/bin , а заготовка конфигурационного файла driver.inf в директории с исходными текстами драйвера . Если драйверу необходимо использование нестандартных ресурсов для конфигурирования , то необходимо внести новую секцию и соответствующие поля в заготовку конфигурационного файла , в соответствии с его синтаксисом .

Для интеграции драйвера в CACSD RTWin надо перенести драйвер и конфигурационный файл в директорию /usr/rtw/drv/<имя драйвера>, после этого драйвер готов к использованию в составе CACSD RTWin совместно с пакетом Driver Toolkit .

Приложение A:Синтаксис конфигурационного файла driver.inf

Конфигурационный файл выполнен в текстовом формате и представляет собой последовательность секций, содержащих описания параметров драйвера.

Заголовок секции

  • [имя секции]
  • Описание параметров секции

  • Имя параметра = <тип> <значение параметра> [<тип области определения> <область определения>] тип := int | float | bool | string;
  • int := параметр целого типа, знаковое ;
    float := - // - вещественного типа ;
    bool := булевый параметр ;
    string := параметр строкового типа ;
  • значение параметра := установленное значение параметра (строковые параметры задаются в ковычках " ");
  • тип области определения := range | list ;
  • range := для диапазона допустимых значений( только для чисел);
    list := для перечня допустимых значений .
  • область определения := границы диапазона (для range) | список возможных значений ( для list ).
  •  Пример файла конфигурации

    [main]