Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #107, НОЯБРЬ 2007 г.

Сказка о горячем пингвине

Юрий «bober» Раззоренов

Хакер, номер #107, стр. 107-092-1

(zloy.bobr@gmail.com)

Подключаем устройства с интерфейсами USB и FireWire к компьютеру с ОС Linux

Каких сейчас только USB- и FireWire-устройств ни выпускают! Это принтеры и сканеры, внешние накопители и мобильные телефоны, цифровые фото- и видеокамеры, мышки и клавиатуры. В комплект поставки, как правило, входят драйверы только для Windows, пользователям других систем, вроде Linux, об их работе следует побеспокоиться самостоятельно.

Зачем нужен FireWire

Несмотря на то что на корпусе большинства цифровых видеокамер можно найти надпись вроде «USB 2.0 compatible», для захвата компьютером видеопотока традиционно используется высокоскоростной интерфейс IEEE 1394 (другие названия - FireWire и i.Link), поддерживающий горячее подключение и позволяющий соединить до 63 устройств. Кстати, обозначение IEEE 1394 не несет какого-то особого смысла, да и сам он не содержит ничего сакрального. Просто это 1394-й по счету стандарт, выпущенный комитетом IEEE. В настоящее время существует две версии IEEE 1394:

  • IEEE 1394a – первый вариант, поддерживает обмен данными со скоростью до 400 Мб/c;
  • IEEE 1394b (FireWire800 и FireWire1600) - более новый, поддерживает скорость вплоть до 1600 Мб/c (и даже до 3200 Мб/c).

Стандарт USB 2.0 позволяет передавать информацию со скоростью 480 Мб/c, то есть теоретически даже больше, чем у IEEE 1394a, но на практике скорость у FireWire получается выше. И так как FireWire первоначально разрабатывался в том числе и для передачи видеопотоков, он может передавать данные в изохронном режиме с гарантированной скоростью. В этом случае вся полоса отдается нуждающемуся устройству и подключенные девайсы не конкурируют между собой за полосу пропускания, как это происходит в USB (особенно при каскадной установке). Поэтому на форумах очень часто можно встретить информацию, что качество видео, перегнанного через FireWire, получается выше, чем полученное через USB (только мы не беремся утверждать или опровергать этот факт). Даже если тебе больше нравится USB 2.0, приведу еще один аргумент в пользу FireWire - все программы для захвата видео в Linux работают только с ним. Также устройства IEEE 1394 достаточно независимы. То есть фактически ничто не мешает напрямую, без использования ПК, подсоединить видеокамеру к внешнему жесткому диску, использующему FireWire, и перегнать на него отснятый материал.

Но для того чтобы переписать свежеснятые мувики на компьютер, тебе, естественно, понадобится наличие FireWire. Если на материнской плате такого разъема нет, то необходимо докупить внешнюю PCI-карту. Стоит она порядка $15. Кроме того, понадобится шнур, причем со стороны, подключающейся к компьютеру, он имеет разъем с шестью контактами, а со стороны, подсоединяемой к видеокамере, - с четырьмя (без контактов питания).

Поддержка IEEE 1394 в Linux

Работа по поддержке IEEE 1394 в Linux ведется довольно давно, и сейчас можно с уверенностью сказать, что основные проблемы далеко позади. Хотя, как и для других компьютерных устройств, драйверы и спецификации производители тщательно скрывают, поэтому, будет ли работать конкретное устройство, зависит от используемого в нем чипа. Сегодня не должно быть проблем со всеми OHCI-совместимыми чипами и с устройствами, использующими Texas Instruments PCILynx/PCILynx2. Не поддерживаются чипы Sony, используемые в ноутбуках серии Vaio (некоторые ноуты этой серии оснащены OHCI-совместимым CXD3222), и Adaptec AIC-5800. Хотя ситуация быстро меняется, поэтому для проверки совместимости своего устройства рекомендую посетить веб-сайт поддержки IEEE 1394 в Linux (www.linux1394.org).

Поддержка IEEE 1394 включена в основное ядро, начиная с версии 2.3.40, и сейчас реализована для всех версий ядер от 2.2 до 2.6 (для 2.2 и ранних версий 2.4 - в виде патча). Поэтому в современных дистрибутивах нет необходимости в пересборке ядра. Если проблемы все же возникнут, часто их можно решить установкой более свежей версии библиотек libraw1394 (в Ubuntu пакет libraw1394-8) и libiec61883 (пакет libiec61883-0). Первая предоставляет прямой доступ к устройству. Вторая базируется на libraw1394 и обеспечивает стандартный интерфейс для доступа к потоковым данным.

Один из вариантов иерархии драйверов на моем компьютере выглядит так: физическое устройство – ohci1394 – ieee1394 – raw1394 – libraw1394 – приложение. При этом ieee1394 является высокоуровневым драйвером, обеспечивающим единый интерфейс доступа. Возможны три низкоуровневых модуля, работающих непосредственно с устройством. Это ohci1394 для чипов 1394 Open Host Controller Interface, драйвер aic5800 для Adaptec AIC-5800 и драйвер pcilynx для чипов Texas Instruments PCILynx.

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

  • raw1394 – обеспечивает прямой RAW-доступ с возможностью управления камеры, но в то же время его не рекомендуется использовать по причине возможных проблем с безопасностью. Доступ в пространстве пользователя, как показано выше, осуществляется через libraw1394.
  • video1394 – основной асинхронный OHCI-драйвер, обеспечивает более производительный DMA-доступ, поэтому и используется для работы с цифровыми камерами.
  • dv1394 – осуществляет прием и передачу сигналов с цифровых видеокамер (Digital Video) в виде обычных файлов, полностью инкапсулирует обработку DV поверх 1394. Ранее для работы с DV-камерами использовался video1394, но работа с ним могла вызвать конфликт устройств, поэтому его переписали, хотя, судя по последней информации (смотри вывод dmesg ниже по тексту), от него также отказываются.
  • eth1394 – позволяет связать компьютеры в единую сеть IEEE 1394. Первоначально обеспечивал инкапсуляцию Ethernet, затем была добавлена поддержка IPv4-over-1394 (RFC-2734).
  • sbp2 - Serial Bus Protocol обеспечивает доступ к устройствам хранения информации.
  • amdtp - реализует поддержку протокола Audio & Music Data Transmission Protocol (в настоящее время IEEE 1394 используется в профессиональном звуковом оборудовании).

Итак, для работы с цифровыми DV-видеокамерами нам потребуются модули raw1394 и dv1394, с которыми, собственно, и работают программы, подобные нелинейному видеоредактору Kino.

Смотрим, что в KUbuntu

В KUbuntu, начиная с Daper Drake (более ранние, каюсь, не пробовал), с распознаванием дополнительной платы расширения и видеокамеры у меня проблем не было. Но они могут возникнуть в других дистрибутивах (особенно старых) или с другими устройствами. Поэтому давай подробно разберем, как определить причину в том случае, если что-то пойдет не так. Проверяем, что говорят сообщения ядра по поводу инициализации нашего PCI-устройства:

$ dmesg | egrep 'ohci1394|ieee1394'

[ 5.920000] ohci1394: fw-host0: OHCI-1394 1.0 (PCI): IRQ=[10] MMIO=[fdefe000-fdefe7ff] Max Packet=[2048] IR/IT contexts=[8/8]

[ 7.208000] ieee1394: Host added: ID:BUS[0-00:1023] GUID[00601d0000000b77]

[ 4801.104000] ieee1394: Node added: ID:BUS[0-00:1023] GUID[00804580b12d823d]

[ 4801.104000] ieee1394: Node changed: 0-00:1023 -> 0-01:1023

[ 4801.508000] ieee1394: raw1394: /dev/raw1394 device initialized

Подробную информацию смотрим командой:

$ lspci -v

01:08.0 FireWire (IEEE 1394): Agere Systems FW323 (rev 61) (prog-if 10 [OHCI])

Subsystem: Agere Systems FW323

Flags: bus master, medium devsel, latency 64, IRQ 10

Memory at fdefe000 (32-bit, non-prefetchable) [size=4K]

Capabilities: <available only to root>

Как видно, у меня установлен OHCI-совместимый адаптер, поэтому проблем в работе быть не должно. Единственное, обрати внимание на строку Capabilities, так как вместо <available only to root> может быть что-то вроде <access denied>. А значит, придется разбираться с правами доступа. Теперь проверяем, какие модули загружены:

$ lsmod | grep 1394

raw1394 30328 0

dv1394 20696 0

ohci1394 36528 1 dv1394

ieee1394 299448 4 raw1394,dv1394,sbp2,ohci1394

В этом списке обязательно должны присутствовать raw1394 и dv1394. В современных дистрибутивах, использующих технологии udev и hal, устройства обычно подхватываются на лету. KUbuntu это тоже касается. Но если в списке этих модулей не оказалось, рекомендуется загружать их вручную:

$ sudo modprobe dv1394

$ sudo modprobe raw1394

Или автоматически, прописав raw1394 и dv1394 в /etc/modules.

В KUbuntu модуль sbp2 загружается по умолчанию. Если ты не собираешься подключать FireWire-диски, то стоит отключить его загрузку, удалив либо закомментировав строку с sbp2 в /etc/modules.

И, наконец, проверяем наличие нужных файлов устройств:

$ sudo find /dev /proc -name "*1394"

/dev/raw1394

/dev/dv1394

/dev/.static/dev/raw1394

/dev/.udev/names/raw1394

/dev/.udev/names/raw1394/%2fclass%2fieee1394_protocol%2fraw1394

/dev/.udev/db/%2fclass%2fieee1394_protocol%2fraw1394

/proc/irq/10/ohci1394

Подключаем шнурком камеру и врубаем питание. Для проверки работы запускаем видеоредактор Kino, заходим в «Edit -> Preferences» и выбираем IEEE 1394. В AV/C Device набираем /dev/dv1394 или /dev/raw1394. В моем случае с определением первого устройства проблем не возникло, а при попытке выбрать raw1394 было выдано сообщение о том, что невозможно открыть файл устройства и необходимо проверить наличие read/write permission у текущего пользователя. Проверяем:

$ ls -al /dev/raw1394 /dev/dv1394-0

crw-rw---- 1 root video 171, 32 2006-09-16 17:50 /dev/dv1394-0

crw-rw---- 1 root disk 171, 0 2006-09-16 17:50 /dev/raw1394

Как видишь, чтобы работать с этими устройствами, необходимо запускать Kino от имени root, вроде gksudo kino, что не есть хорошо. Другой вариант - пользователь должен принадлежать к группе video. Смотрим, к каким группам принадлежит текущий пользователь:

$ groups

bober adm dialout cdrom floppy audio dip video plugdev lpadmin scanner admin

Группа video в списке присутствует, поэтому внесем себя любимого в группу disk. Как обычно, сделать это можно несколькими способами. Самый простой - открыть файл /etc/groups и внести пользователя в строку, описывающую группу disk:

disk:x:6:bober

Все. Теперь необходимо выйти из системы и зарегистрироваться снова.

Настройки в старых дистрибутивах

В более ранних дистрибутивах файлы устройств, возможно, придется создавать вручную. Напомню, что в Linux каждое устройство имеет имя и два номера: основной major и дополнительный minor. Например, для всех IEEE основной номер имеет цифру 171, а дополнительный определяется назначением и характеристиками устройства. Так, для dv1394 он имеет значение от 32 до 47, для raw отсчет начинается от нуля. Например, чтобы создать псевдоустройство raw, выполняем такую команду:

$ sudo mknod -m 666 /dev/raw1394 c 171 0

Для создания псевдоустройства dv1394, предназначенного для записи информации с первого устройства в PAL, вводим команду:

$ sudo mknod -m 666 /dev/dv1394/0 c 171 34

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

$ sudo mcedit /etc/init.d/firewire

#! /bin/sh

test -e /dev/raw1394 || mknod -m 666 /dev/raw1394 c 171 0

test -e /dev/dv1394 || mknod -m 666 /dev/dv1394 c 171 34

Теперь сделаем его исполняемым:

$ sudo chmod +x /etc/init.d/firewire

И, чтобы он выполнялся автоматически, создаем символическую ссылку:

$ sudo ln -s /etc/init.d/firewire /etc/rcS.d/S50firewire

Для проверки работы устройств IEEE 1394 рекомендую использовать утилиту gscanbus (gscanbus.berlios.de), ее можно загрузить и с пакетного репозитария Ubuntu:

$ sudo apt-get install gscanbus

Запускаем программу, набрав в терминалке gscanbus. В появившемся окне будут отображены все найденные устройства с сохранением их топологии подключения. Щелчок мышкой по любому из них покажет подробную информацию. Если выбранное устройство - видеокамера, то ей можно управлять прямо из окна gscanbus.

Команда sudo apt-cache search ieee1394 покажет еще ряд интересных утилит. Например, с помощью coriander (damien.douxchamps.net/ieee1394/coriander) можно управлять видеокамерой, Kino/dvgrab копирует цифровое видео на жесткий диск или другой носитель, а dvbackup, наоборот, позволяет сохранить файлы на DV-камеру. Утилита testlibraw, которую можно получить, установив пакет libraw1394-dev, расскажет все о подключенных устройствах и хостах.

Настройка USB-устройств

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

В современных компьютерах можно найти три типа контроллеров, отличающихся интерфейсом взаимодействия с устройствами. Это OHCI (Open Host Controller Interface), UHCI (Universal Host Controller Interface) и EHCI (Enhanced Host Controller Interface). Первые два реализуют поддержку USB версии 1.1, последний - 2.0, обеспечивая скорость обмена до 480 Мбит/с. UHCI-контроллеры несколько проще и дешевле, но требуют сложных драйверов и больше нагружают процессор. Узнать свой тип контроллера очень просто:

$ lspci -v

00:02.0 USB Controller: nVidia Corporation MCP55 USB Controller (rev a1) (prog-if 10 [OHCI])

Subsystem: Biostar Microtech Int'l Corp Unknown device 3405

Flags: bus master, 66MHz, fast devsel, latency 0, IRQ 11

Memory at fe02f000 (32-bit, non-prefetchable) [size=4K]

Capabilities: <access denied>

00:02.1 USB Controller: nVidia Corporation MCP55 USB Controller (rev a2) (prog-if 20 [EHCI])

Subsystem: Biostar Microtech Int'l Corp Unknown device 3405

Flags: bus master, 66MHz, fast devsel, latency 0, IRQ 5

Memory at fe02e000 (32-bit, non-prefetchable) [size=256]

Capabilities: <access denied>

Как видишь, у меня имеются оба типа контроллеров: OHCI и EHCI. Если ты используешь самосборное ядро, включи нужный драйвер в пункте USB Host Controller Drivers. Не буду обременять тебя описаниями всех опций, просто скажу, что их можно посмотреть по команде grep -i usb /usr/src/linux/.config. Также надо помнить, что работа с USB осуществляется путем эмуляции SCSI, поэтому следует активировать и параметры, относящиеся к поддержке SCSI.

Для непосредственной работы с USB-устройствами создается каталог /proc/bus/usb в виртуальной файловой системе /proc, который монтируется через /etc/fstab:

none /proc/bus/usb usbfs noauto 0 0

Если такой строчки в твоем файле нет, это может означать, что разработчики избавили тебя от лишних забот и usbfs монтируется в стартовых скриптах. В каком конкретно скрипте это делается, ты узнаешь, набрав «sudo grep -iR "usbfs" /etc/*». Например, в KUbuntu за монтирование USB отвечает скрипт /etc/init.d/mountdevsubfs.sh. Вручную смонтировать файловую систему для USB можно так:

$ sudo mount -t usbdevfs none /proc/bus/usb

После этого команда «mount | grep usbfs» должна показать наличие строки:

procbususb on /proc/bus/usb type usbfs (rw)

А вывод lsmod - загруженные модули usbcore, ohci_hcd, ehci_hcd, uhci_hcs, а также модуль, соответствующий драйверу подключенного устройства вроде scanner.o, printer.o, usb_storage.

Информацию о подключенном USB-устройстве можно получить из /var/log/dmesg и непосредственно из /proc. Если каталог /proc/bus/usb пуст, это значит, что виртуальная файловая система USB не смонтирована. Внутри каталога должно быть несколько файлов с именами вида 001, 002 (по количеству контроллеров) и файл devices, который «знает» обо всех устройствах:

$ cat /proc/bus/usb/devices

T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh=10

B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0

D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=01 MxPS=64 #Cfgs= 1

P: Vendor=0000 ProdID=0000 Rev= 2.06

S: Manufacturer=Linux 2.6.20-15-generic ehci_hcd

S: Product=EHCI Host Controller

S: SerialNumber=0000:00:02.1

C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA

I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub

E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=256ms

Расшифровать вывод легко, подробности ищи в документации (/usr/src/Documentation/usb/proc_usb_info.txt). Скажу только, что буква T определяет топологию; Bus и Lev показывают, к какой шине подключено устройство, а также уровень в топологии; Spd выдает скорость; MxCh – сколько еще устройств к нему можно подключить; Driver – тип используемого драйвера (например, Driver=hub означает, что это разветвитель, а Driver=usb-storage – USB-устройство для хранения информации).

В репозитарии KUbuntu можно найти несколько программ, которые помогут тебе разобраться с USB. Так, использовав утилиты lsusb и usbview, ты получишь еще больше информации о своих USB-девайсах.

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

Содержание
ttfb: 6.0360431671143 ms