понедельник, 9 мая 2011 г.

13.2. USB и Sysfs


13.2. USB и Sysfs

Из-за сложности одного физического устройства USB представление такого устройства в sysfs также достаточно сложное. Как физическое устройство USB (представленное struct usb_device), так и индивидуальные интерфейсы USB (представленные struct usb_interface) показаны в sysfs как отдельные устройства. (Так происходит потому, что обе эти структуры содержат структуру struct device.) Например, для простой USB мыши, которая содержит только один USB интерфейс, для этого устройства было бы следующее дерево каталогов sysfs:

/sys/devices/pci0000:00/0000:00:09.0/usb2/2-1
|-- 2-1:1.0
| |-- bAlternateSetting
| |-- bInterfaceClass
| |-- bInterfaceNumber
| |-- bInterfaceProtocol
| |-- bInterfaceSubClass
| |-- bNumEndpoints
| |-- detach_state
| |-- iInterface
| `-- power
|     `-- state
|-- bConfigurationValue
|-- bDeviceClass
|-- bDeviceProtocol
|-- bDeviceSubClass
|-- bMaxPower
|-- bNumConfigurations
|-- bNumInterfaces
|-- bcdDevice
|-- bmAttributes
|-- detach_state
|-- devnum
|-- idProduct
|-- idVendor
|-- maxchild
|-- power
|   `-- state
|-- speed
`-- version

struct usb_device представлена в дереве по адресу:

/sys/devices/pci0000:00/0000:00:09.0/usb2/2-1

хотя USB интерфейс для мыши, интерфейс, который содержится в драйвере USB мыши, находится в каталоге:

/sys/devices/pci0000:00/0000:00:09.0/usb2/2-1/2-1:1.0

Чтобы понять, что означает этот длинный путь устройства, мы расскажем, как ядро маркирует USB устройства.

Первое USB устройство представляет собой корневой концентратор (хаб, узел). Это контроллер USB, как правило, содержится в PCI устройстве. Контроллер назван так, поскольку он контролирует всю связанную с ним USB шину. Контроллер является мостом между шиной PCI и шиной USB, а также первым устройством USB на этой шине.

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

Каждое устройство, которое подключено к шине USB, получает номер корневого концентратора в качестве первого номера в его названии. Затем за ним следует символ -, а затем номер порта, к которому подключено устройство. Так как устройство в нашем примере подключено к первому порту, к названию добавлена 1. Таким образом, именем устройства для основного устройства USB мыши является 2-1. Так как это USB устройство содержит один интерфейс, это вызывает добавление другого устройства в дерево к sysfs пути. До этого момента схема именования для USB интерфейсов аналогична: в нашем примере это 2-1, затем двоеточие и номер USB конфигурации, затем точка и номер интерфейса. Так что для этого примера, имя устройства 2-1:1.0, потому что это первая конфигурация и имеет интерфейс номер ноль.

Так что в итоге USB устройства в sysfs имеют схему обозначения:

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

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

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

Как можно видеть в предыдущей распечатке каталога USB устройства и интерфейса, вся специальная USB информация доступна непосредственно через sysfs (например, информация idVendor, idProduct и bMaxPower). Один из этих файлов, bConfigurationValue, может быть перезаписан в целях изменения используемой активной конфигурации USB. Это полезно для устройств, которые имеют несколько конфигураций, когда ядро не в состоянии определить, какую конфигурацию выбрать, чтобы должным образом управлять устройством. Ряду USB модемов необходимо иметь правильное значение конфигурации, записанное в этот файл, чтобы для связи с устройством использовать подходящий USB драйвер.

Sysfs не раскрывает всех различных частей устройства USB, так как она останавливается на уровне интерфейс. Любые дополнительные конфигурации, которые может содержать устройство, не показываются, так же как и сведения об оконечных точках, связанных с интерфейсами. Эту информацию можно найти в файловой системе usbfs, которая монтируется в каталог системы /proc/bus/usb/. Файл /proc/bus/usb/devices показывает всю ту же информацию, представленную в sysfs, а также дополнительную конфигурацию и информацию об оконечных точках для всех USB устройств, которые присутствуют в системе. usbfs также позволяет программам пользовательского пространства непосредственно общаться с USB устройствами, что позволило многим драйверам ядра переехать в пользовательское пространство, где их легче поддерживать и отлаживать. Драйвер USB сканера является хорошим примером этого, так как его уже давно нет в ядре, поскольку его функциональность теперь содержится в библиотечных программах SANE пользовательского пространства.

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.