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

В этой главе:

- Редактор ресурсов драйверов
    Назначение
    Запуск на выполнение
    Основное меню
    Выбор проекта
    Выбор, добавление и удаление драйверов
    Изменение текущего состояния драйвера
    Редактирование ресурсов драйвера
      Редактирования основных параметров драйверов
      Редактирование ресурсов каналов УСО
      Редактирование уникальных ресурсов
    Завершение редактирования
- Редактор - построитель драйверов
    Назначение
    Запуск на выполнение
    Основная концепция
    Создание нового драйвера
    Редактирование и компиляция исходных модулей
    Принятые соглашения по использованию переменных
    Сервисные процедуры
    Завершение разработки драйвера и интеграция в CACSD RTWin
- Приложение A: Синтаксис конфигурационного файла driver.inf

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

### Назначение

Редактор ресурсов драйверов 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 , после чего копия драйвера будет исключена из проекта.

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

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

- драйвер реального УСО - активный [N];
- драйвер реального УСО - неактивный [B];
- эмулятор драйвера [E].

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

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

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

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

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

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

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

- базовый адрес ;
- возможность использования механизма прерываний [ IRQ ] , номер прерывания и тип каналов связанных с этим механизмом ;
- возможность использования механизма DMA и номер канала DMA;
- необходимость использования таймера и значение интервала ;
- количество каналов разных типов ,имеющихся в конкретном УСО .

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

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

- шкала датчика ;
- шкала рабочего диапазона УСО ;
- шкала соответствующей физической величины ;

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

- линейная ;
- квадратичная .

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

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

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

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

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

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

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

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

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

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

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

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

### Назначение

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

- разработки новых драйверов согласно требований пакета Driver Toolkit;
- генерации базового конфигурационного файла драйвера ;

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

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

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

drvbuilder &

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

- /tmp - заготовки для разработки драйверов ;
- /drv - рабочая директория, в которой в одноименных поддиректориях хранятся исходные и объектные модули разрабатываемых драйверов , а также базовый конфигурационный файл driver.inf ( например: /usr/drvbuilder/drv/818L);
- /bin - загрузочные модули готовых драйверов .

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

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

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

Для пользователя 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 для компиляции процедуры и дальнейшей прилинковки ее к основному телу драйвера . Вид этого окна показан на рисунке . Результаты компиляции отображаются в окне .

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

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

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

- BASE - базовый адрес устройства ;
- IRQ - номер прерывания ;
- DMA - булева переменная ( 0 - не используется ;1 - используется );
- DMAch - номер канала DMA ;
- DMA_BUFF_SIZE - размер буфера DMA ;
- COUNT_AI - количество каналов аналогового ввода;
- COUNT_DI - количество каналов дискретного ввода;
- COUNT_CI - количество счетно-импульсных каналов ввода;
- COUNT_DO - количество каналов дискретного вывода;
- COUNT_AO - количество каналов аналогового вывода;

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

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

С целью упростить и унифицировать доступ к таким ресурсам в процедуре 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]