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

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

Чтобы было возможным оценить ситуацию разберем, как реализована поддержка USB и где искать информацию о подключенных стройствах, хотя все сказано о FireWire частично касается и USB. Реализацией поддержки USB в Linux занимается Linux USB Project (www.linux-usb.org), куда и следует идти за информацией. В сегодняшних компьютерах можно найти три типа контролеров, отличающихся интерфейсом взаимодействия с устройствами. Это 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”. Не буду тебя нагружать всеми опциями, все параметры которые доступны в ядре можно промотреть набрав “cat /usr/src/linux/.config | grep -i usb”.

Также следует помнить, что работа с 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 к /proc/bus/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

T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh=10
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0000 ProdID=0000 Rev= 2.06
S: Manufacturer=Linux 2.6.20-15-generic ohci_hcd
S: Product=OHCI Host Controller
S: SerialNumber=0000:00:02.0
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= 2 Ivl=255ms

T: Bus=01 Lev=01 Prnt=01 Port=07 Cnt=01 Dev#= 2 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1307 ProdID=0163 Rev= 1.00
S: Manufacturer=????????y
S: Product=USB Mass Storage Device
S: SerialNumber=9fe1ad57805553
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr= 80mA
I: If#= 0 Alt= 0 #EPs= 3 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=125us
E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=83(I) Atr=03(Int.) MxPS= 64 Ivl=16ms

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

утилита lsusb

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

утилита usbview

free-templates.ru