enum-devices

Менеджер-перечислитель устройств

Синтаксис:

enum-devices опции

Опции:

-c путь
Указать один или несколько конфигурационных файлов. В качестве значения переменной путь можно указать отдельный файл или каталог. Для определения нескольких конфигурационных файлов и каталогов эту опцию можно указать повторно. Кроме того, для добавления других файлов и каталогов (см. ниже) можно использовать выражение config в конфигурационном файле. Перед началом обработки утилита enum-devices выполняет конкатенацию содержимого всех конфигурационных файлов, указанных для считывания.
-D
Выгрузить таблицу поиска устройств.
-E перечислитель
Запустить программу-перечислитель второго прохода.
-e перечислитель
Выполнить данную команду программы перечислитель:
-i префикс
Игнорировать любые конфигурационные файлы в каталогах, в начале имени которых находится префикс.
-I суффикс
Игнорировать любые конфигурационные файлы в каталогах, в конце имени которых находится суффикс.
-n
Записать команды для запуска драйверов в стандартный поток вывода вместо их выполнения.
-v[v...]
Вывести расширенную информацию. Большее количество символов v обеспечивает вывод более подробной информации.

Платформы:

ЗОСРВ «Нейтрино»

Целевые архитектуры:

arm, armv7, e2k, mips, ppc, x86

Описание:


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

Разделы описания enum-devices:

Обзор
Правила сопоставления
Конфигурационные файлы
Старшинство конфигурационных файлов
Содержимое конфигурационных файлов
Ключевое слово "start"
Ключевое слово "requires"
Ключевое слово "driver"
Ключевое слово "mount"
Ключевое слово "enumerator"
Ключевое слово "set"
Ключевое слово "append"
Ключевое слово "uniq"
Ключевое слово "waitfor"
Ключевое слово "echo"
Ключевое слово "tag"
Ключевое слово "config"
Ключевое слово "use"
Макросы
Протокол перечислителя шины

Обзор

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

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


Note: Фактическое выполнение программ, указанных в любых выражениях start и requires, начинается после завершения обработки, т.е. после выполнения всех строк встроенных команд. При необходимости выполнения действия вне зависимости от наличия тех или иных устройств следует использовать идентификатор устройства all.

Правила сопоставления

Поведение сопоставления, реализуемое при использовании утилиты enum-devices, основано на "количестве совпадений" в операторе устройств конфигурационного файла утилиты enum-devices. Для создания вторичного оператора устройств можно указать точку (.) перед полем сопоставления.

Использование этого метода сопоставления устройств с записями в конфигурационном файле enum-devices иногда может приводить к возникновению "неоднозначности": если указанное устройство соответствует нескольким записям в конфигурационном файле утилиты enum-devices, выбор перечислителем предпочтительного драйвера для устройства становится невозможным.

Например, если устройство определено следующим образом:

ven=1922,dev=1234,busno=0,devno=1, rev=100,msven=fe,mscomp=MTP,mssubcomp=0

и в конфигурационном файле утилиты enum-devices содержится следующее:

device(usb, ven=1922,dev=1234) device(usb, class=08,proto=00)

то указанное устройство соответствует обеим записям в конфигурационном файле.

Возникновение неоднозначности можно предотвратить путем расширения критериев совпадения для предпочтительного драйвера:

device(usb, ven=1922,dev=1234,class=08)

или путем конфигурирования одного из совпадающих полей в качестве вторичного, т.е. путем назначения ему более низкого приоритета по отношению к другим полям:

device(usb, .class=08,proto=00)

Для поиска любых совпадений ("catch all") (поиска совпадений с любым устройством) следует просто указать тип шины устройства. Пример.

device(usb) echo("No match found for device ven=$(ven), dev=$(dev), class=$(class), busno=$(busno), devno=$(devno), cfg=$(cfg), iface=$(iface), msven=$(msven), mscomp=$(mscomp), mssubcomp=$(mssubcomp)" )

Конфигурационные файлы

В каталоге etc/system/enum/ находятся следующие конфигурационные файлы:

etc/system/enum/devices/
В конфигурационных файлах, находящихся в каталоге etc/system/enum/devices/, содержатся определения устройств. В число этих файлов входят:
audio
block
bridge
определения для мостов PCI
char
graphics
input
media
определения для мультимедийных устройств
printer
serial
net
etc/system/enum/devices/usb/
В каталоге etc/system/enum/devices/usb/ находятся следующие конфигурационные файлы:
default
определения для устройств USB, для которых не обнаружено совпадений
net
настройки сетевых устройств USB
char
преобразователи интерфейсов USB/последовательный порт
ipod
определения для устройств USB iPod
mass
определения для устройств USB массовой памяти
etc/system/enum/include/
В конфигурационных файлах, находящихся в каталоге etc/system/enum/include/, содержатся определения макросов. В число этих файлов входят:
audio
block
isa-types
par-class
pccard-types
pccard-vendors
pci-class
pci-vendors
pnpbios-types
net
graphics
usb-class

Старшинство конфигурационных файлов

Порядок старшинства конфигурационных файлов утилиты enum-devices определяется одним или обоими следующими критериями:

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

Принимая во внимание сложность, связанную с добавлением и удалением файлов и каталогов во время обработки, при работе в среде ЗОСРВ «Нейтрино» рекомендуется

Содержимое конфигурационных файлов

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

Для конфигурационного файла утилиты enum-devices обычно используется следующий формат:

/enum common /devices default net mass char /include usb-class /overrides mass

Любые данные, указанные после символа решетки (#) до конца строки, рассматриваются как комментарий.

Для всех операторов используется следующий формат:

идентификатор_устройства… выражение_действия ...

Идентификатор_устройства может быть представлен ключевым словом all или любым количеством идентификаторов в следующем формате:

device(тип_шины[, параметры]...)

Типы шин могут быть представлены, по крайней мере, следующими значениями:

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

Ключевое слово "start"

Запустить команду. Для выражения start используется следующий формат:

start[/wait] (системная_команда [, системные_аргументы] )

Это выражение выполняет команду системная_команда с использованием заданных аргументов. Если указана опция /wait, то работа перечислителя приостанавливается до завершения команды.

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

Например, выражение

start(spooler -d$(path), -P$(pnpstr))

запускает spooler -d $(path). При этом для утилиты enum-devices указывается, что если данная команда уже встречалась ранее, то к ней просто следует добавить аргумент -P $(pnpstr). (Формат $(...) используется для макрорасширения; см. приведенное ниже описание выражения set.)

Ключевое слово "requires"

Запустить команду, если она еще не выполняется. Для выражения requires предусмотрена возможность использования одного из двух форматов:

requires[/wait] (системная_команда [, системные_аргументы] )
Этот формат аналогичен формату выражения start, но в данном случае утилита enum-devices проверяет наличие в системе уже выполняемой команды.

Note: Если указаны системные_аргументы, разделителем между системная_команда и системные_аргументы является запятая. Если запятая не указана, утилита enum-devices не выполняет проверку наличия в системе уже выполняемой команды, что может привести к ее многократному выполнению.

Например, в файле перечислителя устройств /etc/system/enum/devices/net содержится следующая строка для сетевых устройств, для которых требуется io-pkt-*:
requires($(IOPKT_CMD),)
requires[/wait] (@строка_тегов)
При использовании этого формата утилита enum-devices осуществляет поиск тегов с именами, указанными в переменной имя_тега, во всех рабочих строках, ожидающих обработки (см. описание выражения tag), и выполняет их. Использование этого метода может быть целесообразным при необходимости упорядочения различных компонентов.

Если в любом из форматов указана опция /wait, то работа перечислителя приостанавливается до завершения команды.

Ключевое слово "driver"

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

driver[/wait] (системная_команда [, системные_аргументы] )

Формат аналогичен формату выражения start. Но в данном случае, если процесс перечислителя шины передает данные о том, что устройство может быть отключено, утилита enum-devices запускает для устройства отдельный процесс драйвера (вместо добавления аргументов системные_аргументы к драйверу, ранее указанному для этого устройства). Если процесс перечислителя шины передает данные о том, что устройство отключено, то в процесс драйвера передается сигнал SIGTERM.

Если указана опция /wait, то работа перечислителя приостанавливается до завершения команды.

Ключевое слово "mount"

Запустить утилиту mount с указанными аргументами. Для выражения mount используется следующий формат:

mount (аргументы_монтирования [, аргументы_демонтирования] )

Это выражение порождает команду mount с аргументами аргументы_монтирования. Если указаны какие-либо аргументы_демонтирования, то они передаются в команду umount в случае отключения устройства.

Ключевое слово "enumerator"

Запустить новый перечислитель шины. Для выражения enumerator используется следующий формат:

enumerator (тип_перечислителя)

Это выражение запускает новый перечислитель, указанный в переменной тип_перечислителя.

Ключевое слово "set"

Установить макрос. Для выражения set используется следующий формат:

set (имя_макроса, макроопределение)

Это выражение определяет значение имя_макроса как макроопределение. Каждый раз, когда утилита enum-devices находит $(имя_макроса) в любом из конфигурационных файлов, подставляется макроопределение. Пример:

set(DEVB_OPTIONS, cam quiet blk auto=partition)

Предусмотрена возможность рекурсивного вложения макросов так же, как при работе с утилитой make.

Ключевое слово "append"

Добавить к макроопределению. Для выражения append используется следующий формат:

append (имя_макроса, макроопределение)

Это выражение добавляет макроопределение к определению имя_макроса.

Ключевое слово "uniq"

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

uniq (имя_макроса, уникальное_имя [, начальное_значение] )

Это выражение инициирует поиск утилитой enum-devices строки уникальное_имя во внутренней базе данных:

Например, выражение uniq можно использовать для отслеживания количества найденных экземпляров устройства и создания для него уникального пути:

uniq(sernum, devc-ser, 1) driver(devc-ser8250 $(SER_OPTIONS), "-u$(sernum) $(ioport),$(irq)")

Ключевое слово "waitfor"

Ждать появления указанного путевого имени. Для выражения waitfor используется следующий формат:

waitfor (путевое_имя [, таймаут] )

Это выражение определяет таймаут, задаваемый в десятых долях секунды, ожидания появления пути путевое_имя. Значение параметра таймаут по-умолчанию - 10 секунд.

Ключевое слово "echo"

Вывести строку в файл. Для выражения echo используется следующий формат:

echo (строка [, выходной_файл] )

строка выводится в указанный выходной_файл. Если это первое вхождение echo для этого вызова конфигурационного менеджера, утилита enum-devices стирает выходной_файл перед выводом данных. В дальнейшем утилита enum-devices дополняет файл данными. Если выходной_файл не указан, выходные данные передаются в стандартный поток вывода.

Ключевое слово "tag"

Присвоить имя блоку выражений действия. Для выражения tag используется следующий формат:

tag (строка_тегов)

Это выражение присваивает имя (строка_тегов) последующему блоку выражений действия. Это выражение следует использовать для определения команд, подлежащих выполнению при использовании второго формата выражения requires.

Ключевое слово "config"

Загрузить дополнительные конфигурационные файлы или каталоги. Для выражения config используется следующий формат:

config (путь)

Это выражение инициирует загрузку дополнительного конфигурационного файла или каталога утилитой enum-devices в соответствии со значением параметра путь. Обработка этого выражения осуществляется аналогично опции командной строки -c, за исключением того, что указанное путевое имя относится к конфигурационному файлу, содержащему выражение.

Ключевое слово "use"

Объединить макроопределения. Для выражения use используется следующий формат:

use (список_устройств)

При обнаружении этого выражения утилита enum-devices выполняет следующие действия:

Макросы

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

Макросы для устройств PCI:

$(ven)
Идентификатор вендора PCI.
$(dev)
Идентификатор устройства PCI.
$(index)
PCI-индекс.
$(busnum)
Номер шины PCI.
$(function)
Номер функции PCI.

Протокол перечислителя шины

Для обработки аспектов распознавания устройств на шине утилита enum-devices порождает отдельные программы-перечислители шины. Стандартный поток вывода этих программ подключается к каналу данных, из которого утилита enum-devices считывает данные. Поскольку перечислитель шины выполняет сканирование соответствующей ему шины, строки с описанием обнаруженных параметров записываются в стандартный поток вывода. Запись каждой строки в канал должна осуществляться атомарно. В начале каждой строки указывается односимвольный код (определенный в файле в формате ENUMER_CODE_*), за которым сразу следует идентификатор процесса перечислителя шины.

Для каждого макроопределения на языке C допускается запись следующих строк:

ENUMER_CODE_DEV_PERM
Эта строка обеспечивает передачу информации о постоянно подключенном устройстве (т.е. устройстве, которое никогда не будет удалено во время работы системы):
Dpid { макрос=значение }
Последовательность имен макросов и значений, следующая за кодом D и идентификатором процесса pid. Если требуется задать несколько макросов, то в качестве разделителя следует использовать пробел. Эти макросы используются для расширения в выражениях действия, вызываемых утилитой enum-devices для устройства.
Для обеспечения возможности идентификации устройств утилитой enum-devices следует определить следующие специальные макросы:

#define ENUMER_SYM_BUSTYPE "bus"
#define ENUMER_SYM_VENDOR "ven"
#define ENUMER_SYM_SUBVENDOR "dev"
#define ENUMER_SYM_CLASS "class"
#define ENUMER_SYM_SUBCLASS "subclass"

ENUMER_CODE_DEV_TEMP
Эта строка аналогична строке ENUMER_CODE_DEV_PERM, за исключением того, что в данном случае можно удалить устройство во время работы системы:
dpid { макрос=определение }
В дополнение к обязательным определениям макросов, приведенным выше, также необходимо определить следующие:

#define ENUMER_SYM_REMOVAL_ID "removal_id"

Значение макроса должно быть простым целым числом.

ENUMER_CODE_DEV_ACTIVE
Эта строка аналогична строке ENUMER_CODE_DEV_PERM, за исключением того, что указанное устройство уже работает в системе:
apid { макрос=определение }
В случае передачи информации о наличии данного устройства со стороны другого перечислителя шины его драйвер не должен быть запущен, поскольку устройство уже работает.
ENUMER_CODE_DEV_REMOVED
Эта строка передается в случае удаления устройства из работающей системы:
gpid { макрос=определение }
Требуется только одно макроопределение: для упомянутого выше макроса ENUMER_SYM_REMOVAL_ID. В качестве значения следует задать целое число равное значению, указанному при передаче информации об устройстве в первый раз. Программа enum-devices использует его для определения процессов драйверов, подлежащих уничтожению, или путевых имен, подлежащих демонтированию.
ENUMER_CODE_BUS
Эта строка используется для передачи информации о дополнительных шинах, для которых требуется запустить программы-перечислители:
Bpid { макрос=определение }
Для этой строки предусмотрен такой же синтаксис и требования, как и для строки ENUMER_CODE_DEV_PERM.
ENUMER_CODE_SCAN_DONE
Эта строка записывается после окончания сканирования соответствующей шины перечислителем шины:
Fpid
После записи этой строки всеми запущенными перечислителями шин утилита enum-devices вызывает требуемые выражения действия (следует отметить, что для строки ENUMER_CODE_BUS вызов действий производится незамедлительно). Если возможность добавления/удаления каких-либо устройств на шине отсутствует, перечислитель шины после записи этой строки должен завершить работу. При наличии временных устройств перечислитель шины должен продолжать работу и записать события ENUMER_CODE_DEV_TEMP и/или ENUMER_CODE_DEV_REMOVED, за которыми записывается еще одна строка ENUMER_CODE_SCAN_DONE при добавлении или удалении устройств.
ENUMER_CODE_ERROR
Эта строка записывается при обнаружении перечислителем шины какой-либо ошибки:
Epid текст_сообщения_об_ошибке
Менеджер enum-devices выводит текст_сообщения_об_ошибке, отображаемый для пользователя.
ENUMER_CODE_COMMENT
Строки данного типа игнорируются менеджером enum-devices. Их можно использовать для получения дополнительной информации в случае, когда перечислитель шины работает в автономном режиме:
#pid текст_комментария

Примеры:

Ниже приведен пример конфигурационного файла:

# prefixing generic commands all # so we can say "pci($(ATI), ....) for readability set( ATI, 0x1234 ) echo( "starting configuration" ) # Start a hard disk driver device(pci,1234,5678) start( devb-ncr8 ncr8 pci=$(index) ) # Start a network driver (currently) device(pci,0x1234,0x5678) start( io-pkt-v4, -d speedo pci=$(index) ) # Start a network driver (with mount support) device(cardbus,1234,5678) requires( io-pkt-v4 ) start( mount, -T none -o pci=$(index) ne2000 /dev/if0 ) # Start a graphics driver (sorta :-) device(pci,1234,5678) echo( $(ven) $(dev) $(bus) $(device) $(function), /etc/devg.$(hostname) ) # postfixing generic commands all echo( "Completed configuration" )


Note:
  • В конфигурационном файле утилиты enum-devices весь текст, указанный после символа решетки (#) до конца строки, представляет собой комментарий.
  • Конфигурационные файлы утилиты enum-devices по умолчанию предназначены для стандартной резидентной реализации на базе x86. При использовании утилиты enum-devices в другой среде может потребоваться внести изменения в эти конфигурационные файлы. Например, при наличии в целевой системе только некоторых перечислителей из указанных выражением по умолчанию enumerator следует удалить из конфигурации выражения перечислителей и связанные операторы устройств, соответствующие отсутствующим перечислителям.

Классификация:

Базовые подсистемы ЗОСРВ «Нейтрино»

Тематические ссылки:

enum-usb




Предыдущий раздел: Сервисы