Виктор Костромин, http://vikos.lrn.ru, email: kos @ rus-linux dot ru
1. Общие сведения о шине USB.
У любого компьютера, выпущенного в последнее время, вы обязательно
обнаружите либо на лицевой панели, либо на задней стенке разъем USB.
Шина USB (Universal Serial Bus) первоначально была разработана для
обеспечения легкого подключения компьютера к телефонным линиям и
расширения числа портов. Первая версия стандарта (версия 1.0) была
выпущена в январе 1996 года. Сейчас в основном используется версия
1.1. Устройства этой версии обычно помечены значком, изображенным на
рис.1. Стандарт USB 1.1 вполне удовлетворяет всем требованиям при
работе с низкоскоростными устройствами, вроде мышей и клавиатур, и
даже с устройствами, работающими на средних скоростях, вроде
Ethernet-адаптеров (10 Mbit/sec) или устройств бытовой электроники
(таких, как цифровые камеры и MP3-плейеры), которые пересылают только
несколько мегабайт данных. Но если на периферийное устройство или в
обратном направлении необходимо пересылать большие объемы информации
(примеры - жесткие диски, видеокамеры высокого разрешения, или
одновременное использование нескольких сетевых адаптеров стандарта
100BaseT), то скорости, обеспечиваемые USB 1.1, уже недостаточны.
Поэтому в 1999 году была разработана версия 2.0 стандарта USB,
обеспечивающая более высокие скорости обмена данными. Значок, которым
помечаются USB-устройства версии 2.0, изображен на рис. 2.
Современные компьютеры обычно имеют контроллер USB-шины, установленный
на материнской плате. Для USB версии 1.1 было разработано два типа
таких контроллеров, отличающихся интерфейсом взаимодействия с
USB-устройствами: OHCI (Open Host Controller Interface) фирмы Compaq и
UHCI (Universal Host Controller Interface) фирмы Intel. Оба типа имеют
примерно одинаковые возможности и USB-устройства работают с обоими
типами контроллеров. Аппаратная часть UHCI-контроллеров проще, а
значит, они дешевле, но зато требуют более сложных драйверов, что
увеличивает нагрузку на процессор. Версия 2.0 стандарта USB использует
улучшенный вариант интерфейса - EHCI (Enhanced Host Controller
Interface).
Стандарт USB предусматривает строгую иерархию устройств, управляемых
основным хостом, и использование протокола master/slave для управления
подключаемыми устройствами. На один USB-разъем могут быть
последовательно подключены до 127 устройств. Но непосредственно
подключать одно устройство к другому нельзя, поскольку питание таких
устройств осуществляется по той же шине. Поэтому для подключения
дополнительных устройств используются специальные хабы, обеспечивающие
снабжение этих устройств необходимой энергией. В результате
USB-устройства образуют как бы дерево, каждая не конечная вершина
которого является хабом. Поскольку любой обмен данными инициируется
только хостом, и периферийные устройства не могут начать
взаимодействие, исключена возможность коллизий, вследствие чего
снижается стоимость устройств. Правда, такое решение приводит к
некоторому снижению производительности. В результате USB-устройства
версии 1.1 могут работать в двух режимах: так называемом low speed,
обеспечивающем скорость передачи данных до 1.5 Mбит/сек, и full speed,
в котором скорость передачи данных может составляьть 12 Мбит/сек. Это
только теоретический предел, а реально производительность шины даже в
идеальных условиях не превышает 8,5 Мбит/сек., а в среднем составляет
около 2 Мбит/сек.
Интерфейс EHCI, используемый в устройствах версии 2, обеспечивает
режим работы high speed, для которого скорость передачи данных может
достигать 480 Мбит/сек. Для того чтобы USB-устройства могли
обмениваться данными с такой скоростью, и хост-контроллер и само
устройство должны соответствовать стандарту USB 2.0 и обеспечивать
работу с интерфейсом EHCI. Однако хост-контроллеры 2.0 успешно
работают с устройствами версии 1.1. И наоборот, вы вполне можете
подключать устройства USB 2.0 к хосту (и к хабам) версии USB 1.1 и они
будут прекрасно работать, но ... со скоростью не более 12, а не 480
Мбит/сек.
В настоящее время разработан широкий спектр устройств, подключаемых по
шине USB. Это клавиатуры, мыши, джойстики, игровые приставки, сканеры,
модемы, принтеры, цифровые камеры, устройства хранения информации -
дисководы гибких и жестких дисков, дисководы Zip, LS120 и CD-ROM.
Очень перспективный и интересный класс таких устройств образуют
накопители на основе Flash-памяти. Объем статьи не позволяет
рассказать о каждом из этих типов устройств, так что ограничимся
рассмотрением USB-накопителей (в частности Flash-дисков и цифровых
фотокамер). Но вначале рассмотрим общие вопросы, что, надеюсь,
позволит вам справиться и с другими типами устройств.
----------------------------------
2. Поддержка USB-устройств в Linux
Для того чтобы работать с USB-устройствами под Linux, должны
выполняться несколько условий. Во-первых, USB-устройства должны
поддерживаться на аппаратном уровне, то есть на материнской плате
должен быть установлен USB-контроллер. Определить его наличие можно по
характерным разъемам, обычно расположенным на задней стенке системного
блока. Тип интерфейса этого контроллера вы можете определить с помощью
команды
[user]$ /sbin/lspci -v
Направьте вывод этой команды в файл и просмотрите результат. Для
каждого из установленных у вас контроллеров вы найдете примерно такие
строки:
00:1f.2 USB Controller: Intel Corp. 82801BA/BAM USB (Hub (rev 05) (prog-if 00 [UHCI])
Subsystem: Intel Corp. 82801BA/BAM USB (Hub
Flags: bus master, medium devsel, latency 0, IRQ 11
I/O ports at d000 [size=32]
Как видите, в моем компьютере стоит USB-контроллер с интерфейсом UHCI,
а следовательно, версии 1.1.
Теперь перейдем к программной части. Как и для любой другой апаратуры,
у вас должна быть реализована поддержка USB в ядре. Если вы
используете ядро, скомпилированное разработчиком, то такая поддержка,
скорее всего, обеспечена. Полноценная поддержка USB версии 1.1
включается в ядро, начиная с версии 2.2.18. Если хост-контроллер
вашего компьютера соответствует версии 2.0 стандарта USB, вы должны
иметь ядро, версия которого не ниже 2.4.19, и использовать драйвер
EHCI.
Если же вы сами компилируете ядро для своей системы, вы должны
включить поддержку USB либо непосредственно в ядро, либо в
подключаемые модули ядра. Для этого при компиляции надо задать
следующие опции в секции поддержки USB (либо подключить
соответствующие модули):
Поддержка USB (CONFIG_USB, usbcore.o)
Подключение USB-драйверов (выберите нужный драйвер из следующего
списка):
Поддержка USB-накопителей (CONFIG_USB_STORAGE, usb-storage.o).
Во-вторых, поскольку взаимодействие с USB осуществляется путем
эмуляции SCSI, должны быть включена и поддержка SCSI-устройств, для
чего должны быть включены следующие опции в секции поддержки SCSI
(либо подключены указанные модули):
Поддержка SCSI (CONFIG_SCSI, scsi_mod.o)
Поддержка SCSI-дисков (CONFIG_BLK_DEV_SD, sd_mod.o)
SCSI generic support (CONFIG_CHR_DEV_SG, sg.o)
Включен опрос всех LUN на каждом SCSI-устройстве (CONFIG_SCSI_MULTI_LUN).
В третьих, в секции файловых систем должна быть включена поддержка
файловых систем, используемых USB-устройствами:
DOS FAT (CONFIG_FAT_FS, fat.o)
MSDOS (CONFIG_MSDOS_FS, msdos.o)
VFAT (CONFIG_VFAT_FS, vfat.o)
Ну, и наконец, для конкретных типов устройств должна быть включена
поддержка соответствующих устройств. Например, для клавиатуры, мыши,
джойстика необходимо включить поддержку USB Human Interface Device
(HID), для сканера включить опцию USB Scanner support, для модема -
USB Modem (CDC ACM) support, для принтера - USB Printer support, и так
далее.
Для работы с USB-устройствами динамически генерируется виртуальная
файловая система, являющаяся частью файловой системы /proc, и
располагающаяся в каталоге /proc/bus/usb. Генерация такой системы
выполняется из инициализационных скриптов при загрузке системы. В
дистрибутиве Red Hat версии 9, например, такая генерация происходит
при выполнении скрипта /etc/rc.d/rc.sysinit, в котором имеется
следующая команда:
mount -t usbdevfs none /proc/bus/usb
Одновременно загружаются модули usbcore, usb-uhci, hid и производится
инициализация usb-контроллеров.
В некоторых случаях монтирование может осуществляться путем
прописывания в файле /etc/fstab строки вида:
none /proc/bus/usb usbdevfs defaults 0 0
или же путем выполнения от имени root-а команды:
[root]# mount -t usbdevfs none /proc/bus/usb
и запуска необходимых модулей командой modprobe.
Теперь давайте посмотрим, как в работающей системе проверить,
обеспечена ли поддержка USB. Существует несколько точек, в которых
отображаются такие сведения (я не могу гарантировать, что сумею
перечислить все такие точки, но упомянутых достаточно для того, чтобы
убедиться, что USB работает).
Начнем с файла /var/log/dmesg, содержащего протокол начальной
загрузки. Проведите в нем поиск по шаблону "usb". Я, например, увидел
там строки, говорящие, что загружены драйверы usbdevfs и usb-uhci,
поддерживаются два порта и драйвер hid (хотя у меня и мышь и
клавиатура обычные, не-USB).
Запустив далее команду /sbin/lsmod, я увидел, что загружены модули
usb-storage, usbcore, usb-uhci и hid.
Теперь давайте заглянем в каталог /proc/bus/usb. Его содержимое должно
выглядеть примерно так:
dr-xr-xr-x 1 root root 0 Jan 26 10:40 001
-r--r--r-- 1 root root 0 Jan 26 10:40 devices
-r--r--r-- 1 root root 0 Jan 26 10:40 drivers
Если у вас более одного USB-контроллера, вы увидите соответствующее
число подкаталогов с цифровыми именами 002, 003 и так далее. Если
каталог /proc/bus/usb пуст, это означает, что виртуальная файловая
система поддержки USB не смонтирована или смонтирована не в тот
каталог. В каждом из каталогов 001, 002 и так далее у вас пока (до
подключения к шине каких-то устройств) должно быть всего по одному
файлу, имя которого тоже представлено трехзначным числом. Эти числа
являются уникальными номерами USB-устройств, и пока что задают только
номера контроллеров. Содержимое этих файлов нас пока не интересует.
Файл /proc/bus/usb/drivers содержит список зарегистрированных на
данный момент драйверов (даже если драйвер не используется никаким
устройством). Я у себя увидел в этом файле три строки:
usbdevfs
hub
usb-storage
Прежде чем рассматривать содержимое файла /proc/bus/usb/devices,
давайте посмотрим, что происходит при подключении к USB-шине какого-то
устройства. В Linux имеется программа /sbin/hotplug, основное
назначение которой состоит в том, чтобы уведомлять приложения о
существенных изменениях в системе, в первую очередь - об изменениях в
составе аппаратных средств. Программа эта запускается из
инициализационных скриптов (конкретно, в скрипте /etc/rc.sysinit).
Когда вы подключаете USB-устройство к какому-либо порту, ядро
обнаруживает это событие и изменяет файл /proc/bus/usb/devices.
Соответствено, и при удалении устройства этот файл тоже изменяется.
Следовательно, в нем в каждый момент времени содержится информация о
каждом устройстве, подключенном в текущий момент времени к USB-шине.
Каждому конкретному устройству соответствует группа строк в файле
/proc/bus/usb/devices, начинающаяся со строки, обозначенной буквой T:.
Отдельные строки содержат следующую информацию:
Строка, начинающаяся с буквы T:, задает топологию. Bus указывает, к
какой шине подключено устройство. Lev указывает уровень устройства,
начиная с уровня 00 для корневого хаба (root hub). Уровень 01
соответствует любому устройству, подключенному к корневому хабу,
уровень 02 соответсвует устройствам, подключенным к хабу уровня 01, и
так далее. Prnt указывает на устройство, являющееся родительским по
отношению к данному (всегда 00 для корневого хаба и 01 для устройств,
подключенных к корневому хабу). Port - порт на родительском
устройстве, начиная с 00 для первого порта каждого устройства.
Значения Prnt и Port уникальны в пределах одной шины. Cnt показывает,
какой номер имеет данное устройство на своем уровне в соответствии с
порядком перечисления устройств данного уровня, начиная с номера 01
для первого устройства. Dev# указывает номер устройства
безотносительно к уровню. Этот номер уникален в пределах одной шины.
Spd указывает, с какой скоростью работает устройство в Мбит/сек.
(возможные значения для версии 1.1 USB - 1.5 или 12). MxCh показывает,
сколько устройств может быть подключено к данному устройству; это
число равно 00 для всех устройств, кроме хабов. Driver показывает,
какой драйвер используется для этого устройства - если указано none,
значит никакого драйвера не используется.
Строки, начинающиеся с букв D: и P:, содержат информацию из
спецификации устройства и сведения о производителе.
Самые интересные для нас строки (таких строк может быть несколько)
начинаются с буквы S:. Эти строки содержат наименование известных
системе устройств и имена их производителей.
Другие строки мы здесь подробно разбирать не будем, при желании вы
можете найти такое описание в USB Guide [П12.] либо в файле
linux/Documentation/usb/proc_usb_info.txt.
Для примера приведу вид файла /proc/bus/usb/devices на одном из
компьютеров, у которого имелся один USB-порт, и никаких USB-устройств
подключено не было:
Как видите, содержимое файла /proc/bus/usb/devices позволяет
достаточно точно определить, о каких USB-устройствах известно вашей
системе. Однако, понять записи в этом файле без дополнительных
разъяснений довольно сложно. Помочь в их расшифровке вам может
программа usbview (разработчик - Greg Froah-Hartman, сайт программы -
http://usbview.sourceforge.net). На рисунке 3 приведен вид окна этой
программы. Как видите, прочитать информацию о подключенном к системе
flash-диске с ее помощью несколько проще. Причем, устройство
обнаруживается этой программой сразу после его подключения.
На этом изложение общих вопросов закончено, и можно перейти к рассказу
о конкретном опыте работы с некоторыми из USB-устройств. Я расскажу
здесь о своем опыте работы в Linux с тремя типами устройств: мышью,
цифровым фотоаппаратом и накопителем на основе flash-памяти.
-------------------
3. USB-мышь в Linux
После подключения USB-мыши к разъему в файле /proc/bus/usb/devices
появились строки
Курсор сразу же начал реагировать как на перемещения основной мыши,
так и дополнительной, подключенной через USB. Никаких дополнительных
усилий для обеспечения работоспособности USB-мыши не потребовалось.
Причем в OpenOffice даже работало колесико, прокручивая страничку. На
случай, если у вас все же возникнут какие-либо сложности, приведу
некоторые дополнительные сведения о настройке USB-мышей,
заимствованные мной из литературных источников.
Во-первых, проверьте, что ссылка с именем /dev/mouse указывает на
правильный порт. Если у вас USB-мышь, то /dev/mouse должна указывать
на /dev/input/mice.
Далее убедитесь, что существует файл /etc/sysconfig/mouse, и что в нем
записано что-то вроде:
Первые две строки определяют, какой протокол будет использоваться,
соответственно, в текстовом и графическом режимах. Третья строка нужна
в случае, когда у вас двухкнопочная мышь и третья кнопка эмулируется
одновременным нажатием двух имеющихся кнопок.
Протокол -- это чисто программная характеристика мыши. У мышей,
подключаемых через последовательный порт, обычно работает протокол
"Microsoft" а мыши типа PS/2 используют протокол ''PS/2''. Для
USB-мыши в качестве протокола можно тоже указать ''PS/2''.
В последнее время появились мыши с колесиком, которые обеспечивают
скроллинг (прокрутку) при вращении колесика и в силу этого очень
удобны при работе с некоторыми программами (например, с текстовым
редактором из пакета OpenOffice или браузером Mozilla). Колесико мыши
заменяет одновремено 3-ю, 4-ую и 5-ую кнопки мыши (нажатие на колесико
равносильно нажатию 3-ей кнопки, вращение в одном направлении - 4-ая
кнопка, в другом - 5-ая). Использоваться скроллинг может только в
графическом режиме, причем пакет XFree86 должен быть версии не ниже
3.3.2, и то скроллинг будет работать не в каждом приложении. Для
USB-мышей с колесиком надо выбирать протокол "IMPS/2".
Чтобы мышь корректно работала в графическом режиме, необходимо
правильно задать секцию InputDevice в файле XF86Config-4. Вот пример
соответствующей секции для мыши с колесиком, подключаемой через
USB-порт:
Отмечу, что для мыши с колесиком последняя строка ("Emulate3Buttons"
"no") является обязательной.
После этого в графических средах KDE и GNOME скроллинг будет работать
по умолчанию в большинстве приложений, например, в браузере Mozilla и
офисном пакете OpenOffice.org. В отдельных приложениях (например, в
текстовом редакторе Nedit) для использования скроллинга требуется
произвести некоторые изменения в конфигурационных файлах приложения.
Подробнее о том, какие дополнения и куда необходимо вписать, вы можете
узнать на страничке Colas Nahaboo - http://koala.ilog.fr/colas/mouse-wheel-scroll/
--------------
4. Flash-диски
Вторым устройством, которое я попытался подключить через USB-разъем,
был накопитель на основе энергонезависимой flash-памяти. Такие
устройства часто называют flash-дисками, что, конечно, не верно, но
думаю, что такое название приживется. Как оказалось, работа с такими
устройствами в Linux осуществляется достаточно просто. После
подключения flash-диска к разъему USB светодиод на нем начинает
периодически мигать. После этого (если поддержка USB ядром имеется)
можно просто смонтировать flash-диск командой:
то монтировать USB-диск смогут все пользователи простой командой
[user]$ mount /mnt/usb
Когда происходит обращение к этому диску, частота мерцания светодиода
на нем повышается.
Внимание! Имейте в виду, что вынимать смонтированный flash-диск из
разъема нельзя - после этого он может сразу перестать читаться.
Необходимо предварительно размонтировать устройство, дождаться, пока
мерцание снова станет более редким, и только после этого flash-диск
можно отключать от разъема. Если вы все же умудрились <<испортить>>
ваш flash-диск некорректным отключением, то имейте в виду, что его
работоспособность можно восстановить с помощью специальных утилит,
поставляемых разработчиком flash-диска (только обычно такие утилиты
предназначены для использования под ОС Windows).
------------------------
5. Цифровые фотоаппараты
Третьим типом USB-устройств, с которыми мне довелось поработать, был
цифровой фотоаппарат Olympus C120. Я полагаю, что на сегодняшний день
цифровые фотоаппараты вообще являются одним из самых распространенных
типов устройств, подключаемых к компьютеру по шине USB. Существует три
типа подключения таких устройств к компьютеру. Некоторые аппараты
имеют кабель, подключаемый к USB-порту компьютера. Второй конец такого
кабеля подключается непосредственно к фотоаппарату посредством
специального разъема. Второй тип фотоаппаратов не имеет на корпусе
разъема для подключения кабеля, зато снабжаются специальным адаптером,
в который вставляется извлеченная из фотоаппарата карта памяти.
Адаптер уже подключается к компьютеру и производится перенос файлов
изображений на жесткий диск (или их отправка по электронной почте и
так далее). И, наконец, третий тип подключения - это PCMCIA-адаптеры,
которые тоже служат для переноса изображений с извлеченной из
фотоаппарата карты памяти. Такие адаптеры обычно применяются только
для работы с лэптопами. Поскольку мне приходилось иметь дело только с
аппаратом, имеющим USB-разъем, то я буду рассматривать только случай
камеры первого типа.
После того, как вы убедитесь, что ваше ядро поддерживает стандарт USB,
подключите камеру к компьютеру через USB-порт (питание аппарата должно
быть включено!) и убедитесь в том, ядро <<видит>> камеру. Судить об
этом можно по тому, что в файле /proc/bus/usb/devices появятся строки,
аналогичные тем, которые вы видите ниже:
Если камера не обнаружилась, необходимо проверить настройки
"/proc/bus/usb" и "usbdevfs" (смотри раздел 2 выше). Если же ядро
обнаружило камеру, то ее можно смонтировать точно так же, как
монтировался flash-диск.
Некоторые дополнительные сложности могут возникнуть в том случае, если
вы работаете поперемено с flash-диском и с цифровым фотоаппаратом.
Если вначале была подключена камера, то даже после вполне корректного
ее отключения подключить flash-диск у меня вначале не получалось. Как
ни старался, команда mount выдавала такую ответную реакцию:
mount: /dev/sda1 is not a valid block device
Проблема разрешилась, когда я стал монтировать первое устройство как
/dev/sda1, а второе - как /dev/sdb1. Найти такое решение мне помог
файл /etc/sysconfig/hwconf. Этот файл формируется утилитой kudzu на
этапе загрузки системы и содержит информацию об имеющемся в системе
оборудовании. После одной из очередных перезагрузок я заметил, что
устройство определилось как sdb, после чего мне удалось его
смонтировать (в режиме суперпользователя). Ну а дальше уже нашлись и
способы облегчения процедур монтирования.
В заключение раздела приведу два коротких замечания.
Первое: в состав некоторых дистрибутивов (например, ASPLinux версии
7.3) входит программа gPhoto, которая позволяет организовать работу с
цифровыми фотоаппаратами и теми коллекциями фотографий, которые у вас
накопятся вскоре после приобретения такого аппарата. Но осваивать
работу с этой программой вам придется самостоятельно.
Второе: учитывая, что в имевшемся у меня цифровом фотоаппарате
использовалась съемная карта flash-памяти, я полагаю, что с
подключением к Linux-компьютеру выпускаемых для работы с такими
картами специальных устройств, - картоводов, проблем тоже не
возникнет, ибо подключение таких устройств к компьютеру производится
обычно тоже по шине USB.
1492 Прочтений • [Поддержка USB-устройств в Linux (linux usb hardware)] [08.05.2012] [Комментариев: 0]