Чтобы установить comedi, нужно установить пакеты comedi и libcomedi или собрать программы с вышеуказанными названиями из исходников:
(для написания собственных драйверов устройств, используя comedi, вам также придётся установить пакет libcomedi-devel)
Замечу, что и для популярного ныне языка python также присутствуют comedi-расширения. (см. пакеты python-comedi, python-libcomedi)
Для настройки comedi используется команда comedi_config.
Чтобы добавить нужное устройство, следует использовать вышеуказанную команду от лица супер пользователя(root) следующим образом
Где 0 <= N <= 15,
module – заданный модуль нужного устройства comedi. набор модулей находится в разделе libcomedi/drivers. Перед запуском модуль следует явно загрузить командой
options – различные параметры, передаваемые модулю. Представляют собой набор параметров, разделённых запятыми. Здесь могут быть указаны, например, базовый адрес устройства и назначаемый ему номер прерывания.
Для корректного отключения заданного модуля от устройства /dev/comediN следует использовать команду comedi_config с ключом -r.
Для получения более подробной информации обратитесь к руководству (man) по comedi_config.
В строке 3 мы создаём comedi-устройство, приаттачивая к нему модуль unioxx5 (загруженный в строке 2) и передаём ему базовый адрес – 0x110.
В строке 4 мы удаляем comedi-устройство.
Прежде всего в программу нужно вставить заголовочный файл <comedilib.h>.
1. comedi_t * comedi_open(const char * filename);
2. int comedi_close(comedi_t * device);
3. void comedi_perror(const char * s);
4. char * comedi_strerror(int errnum);
5. int comedi_errno(void);
6. int comedi_dio_config(comedi_t * device, unsigned int subdevice, unsigned int channel, unsigned int direction);
7. int comedi_dio_read(comedi_t * device, unsigned int subdevice, unsigned int channel, unsigned int * bit);
8. int comedi_dio_write(comedi_t * device, unsigned int subdevice, unsigned int channel, unsigned int bit);
9. int comedi_data_read(comedi_t * device, unsigned int subdevice, unsigned int channel, unsigned int range, unsigned int aref, lsampl_t * data);
10. int comedi_data_write(comedi_t * device, unsigned int subdevice, unsigned int channel, unsigned int range, unsigned int aref, lsampl_t data);
имя модуля: unioxx5.ko
Comedi драйвер для UNIOxx-5 предоставляет следующие операции:
– аналоговые/цифровые чтение и запись
– возможность изменения состояния одного из 24х каналов(т.е. настройка на вход или выход)
Во время аттача драйвера к comedi устройству(реализуется с помощью вызова comedi_config), в dmesg выводятся идентификаторы всех аналоговых модулей, установленных на плате, и их позиции(от 0 для 11). Цифровые модули, как таковые, не обнаруживаются, поэтому драйвер считает, что на всех позициях, где не установлены аналоговые модули, присутствуют модули цифровые.
Также модуль автоматически определяет кл-во подустройств(к слову, он умеет работать только с подустройствами тирпа g01).
Операции над дискретными и аналоговыми модулями происходят, используя общий диапазон доступных каналов(0 .. 24), поэтому их паралельное выполнение невозможно. Это условие контролируется непосредственно драйвером.
Также при каждой операцией над тем или иным модулем проверяется тип модуля: аналоговый он или цифровой и способен ли он читать/записывать.
Перед тем, как читать или записывать в определённый канал нужного подустройства, требуется явно сконфигурировать соответсвующий канал на вход или выход. Реализуется это с помощью ф-ии comedi_dio_config, которая, как видно из названия, применима только к цифровым модулям.
comedi_dio_read() – ф-я цифрового чтения
comedi_dio_write() – ф-я цифровой записи
В отличие от соответствующих операций над цифровыми модулями, для аналогового чтения/заиси не требуется явно конфигурировать нужные каналы, т.к. это делается автоматически при вызове ф-ий чтения/записи.
comedi_data_read() – ф-я аналогового чтения
comedi_data_write() – ф-я аналоговой записи
При указании номера канала нужно иметь в виду, что аналоговые операции применимы только к 12 модулям, каждый из которых имеет два канала – A и B.
Номер модуля = номер канала / 2.
Причём чётные номера каналов являются каналом A соответсвующего модуля, а нечётные – каналом B.
Например, канал с номером 8 будет являться каналом A 4го модуля, а канал 13 – канаом B 6го модуля.