USB_ModeSwitch ≈ управление бистабильными USB устройствами под Linux
Предисловие
Поначалу никакой документации на этот счет не существовало и говорить о какой-либо поддержке Linux не приходилось.
Но, с другой стороны, большинство известных гаджетов нормально работают в обоих режимах с обычными Linux драйверами типа «usb-storage» и «option» (улучшенный драйвер последовательного порта, стандарт Linux для скоростных 3G модемов).
Остается только проблема переключения режима гаджета из накопителя в модем, или в какой-либо иной прибор.
К счастью, на свете есть здравый смысл, программы прослушивания шины USB и «libusb». Возможно отследить сообщения MS Windows драйвера, выделить команду или действие, переключающие режим, а потом воспроизвести подобный сценарий по правилам Linux или BSD.
USB_ModeSwitch позволяет легко управлять этим процессом, получая важные параметры из конфигурационного файла и проводя всю работу по связи и инициализации, все при мощной помощи «libusb».
Обычно все происходит автоматически ≈ через события udev и его правила ≈ и не требует вмешательства пользователя. Но можно применять его и как инструмент командной строки, обычно когда нужно запустить незнакомый прибор.
USB_ModeSwitch входит в состав основных дистрибутивов, поэтому нет нужды устанавливать его из исходников, за исключением случая, когда что-то не ладится и потребуется последняя версия программы.
Пожалуйста, прочтите эту статью внимательно, прежде чем начнете постить вопросы! Если у вас незнакомый гаджет, она поможет вам понять суть происходящего, каковое понимание, в свою очередь, поможет найти нужную переключающую команду и добавить ее в конфигурационный файл.
О том как проводить собственные исследования смотрите раздел Сотрудничество.
Загрузки
Важно: кроме исходника вам понадобится также пакет данных data package!!
Изменения и обновления пакета данных data package происходят чаще чем выходят новые релизы программы, так как в этих файлах содержатся ценные сведения о новых гаджетах. Вот почему они поставляются отдельно.
- Загрузите usb-modeswitch-1.2.6.tar.bz2 датированный 2013-06-02; Debian пакет скоро появится в репозиториии Debian . Поддерживаются многие архитектуры (как amd64 или ia64).
Имейте ввиду, что Deb-пакет не на 100% совместим с последними версиями Ubuntu.
Загрузите usb-modeswitch-data (пакет датирован 2013-06-10). Он содержит базу данных устройств и файл с правилами, включая полные пути (path). Этот пакет может работать с релизами от 1.0.3 и выше, но самые «свежие» гаджеты и их характеристики могут потребовать и более новый релиз программы.
Опционально device_reference.txt от 2013-06-10; это собрание сетапов большинства устройств и их производителей (contributors); используется как отправная точка при запуске нового гаджета.
Новость: Если у вас есть андроидный планшет с USB хост-портом и Андроид по крайней мере 2.2, то можете попробовать новый «PPP Widget» (тестовая версия 0.8). Он состоит из USB_ModeSwitch и PPPD и может установить выход в Интернет при помощи USB модема или телефона.
Сверх того, я предлагаю статический бинарник для ARM: usb_modeswitch-1.1.9-arm-static.bz2.
Скомпилировано при помощи gcc (arm-none-linux-gnueabi 3.4.4) без специальных настроек. Libusb 0.1.12 вкомпилирован.
Если вы мантейнер пакетов, то следующий XML файл поможет вам сверять новые релизы:
usb-modeswitch-versions.xml
Установка
Распакуйте архив с исходником. В свежесозданной директории выполните от имени суперпользователя программу:
Команда установит небольшой shell-скрипт для udev, большой скрипт оболочки, конфигурационный файл, страницу мана и скомпилированный бинарник.
Важно: при установке программы данным способом, потребуется пакет «tcl» для работы большого управляющего скрипта. Есть другие способы установки, которые не требуют этого пакета. Для ознакомления с другими возможностями установки читайте файл README.
Такая же точно процедура с пакетом data package. Он установит конфигурационные файлы в директории «/usr/share/usb_modeswitch» и файл правил udev в директории «/lib/udev/rules.d». Прежняя директория «/etc/usb_modeswitch.d» зарезервирована для пользовательских конфигурационных файлов (новых или отредактированных).
Теперь все готово для работы; если ваш гаджет есть в базе данных, вы сможете использовать его сразу после подключения. Если он не работает как следует, то мы выясним отчего.
Для работы в ручном режиме просто нужно установить программу. Работать можно из командной строки, либо редактировать конфигурационный файл. В файле «device_reference» (см. «Загрузки») вы найдете отправные данные для создания собственной конфигурации. Этот файл обильно комментирован и подскажет вам что делать.
Ваш пользовательский конфигурационный файл может располагаться где угодно и называться как вам угодно; просто нужно указать его имя и местоположение в командной строке при помощи параметра -c.
Ручной режим предназначен для тестирования и исследования. Смотрите следующий раздел.
Использование
Если вы полагаете, что ваш прибор поддерживается, но почему-то не работает, первым делом подключите функцию ведения лога, как описано в разделе Диагностика.
Для тестирования, диагностики и приручения нового гаджета, можно использовать функционал программы в ручном режиме.
Это можно делать из командной строки, либо при помощи конфигурационного файла.
Чтобы получить список параметров команды запустите «usb-modeswitch -h».
Конфигурационный файл задается параметром -c.
Следует иметь ввиду, что если не подключены опции -W, -D, -I и -q, то конфигурационный файл, заданный параметром -c игнорируется, и все необходимые параметры нужно явно указывать в командной строке.
Для работы с конфигурационным файлом используйте один из файлов в директории «/usr/share/usb_modeswitch» или создайте его сами. Задайте имя и местоположения конфигурационного файла при помощи опции -c . В файле device_reference.txt смотрите подсказки по различным семействам модемов и объяснение параметров.
Важно: USB_ModeSwitch, как и все программы, использующие libusb, запускается в командной строке от имени суперпользователя (или через «sudo»). В противном случае появляются непонятные предупреждения, и работа не идет. Так как придется постоянно пробовать новые варианты команды, то имеет смысл работать с ней в оболочке root shell («sudo bash» or «su -«).
При работе в автоматическом режиме действуют следующие компоненты, перечисленные в порядке своей работы:
- /lib/udev/rules.d/40-usb_modeswitch.rules ≈ правила udev, запускающие оболочку при подключении прибора с указанным ID (vendor/product).
Если прибор после переключения режима создает последовательные порты, второе правило снова запускает оболочку и создает символическую ссылку на правильный порт (см. ниже).
/lib/udev/usb_modeswitch ≈ шелл-скрипт, инициируемый реальным скриптом оболочки. Начиная с версии 1.1.6 этот скрипт полностью совместим с шеллом «dash», применяемым в Ubuntu, так же как и с более старыми «bash» вариантами.
/usr/sbin/usb_modeswitch_dispatcher ≈ проводит дополнительную проверку устройства и производит переключение режима, руководствуясь конфигурационным файлом для данного устройства.
Если, после переключения режима, никакие драйвера не обеспечивают функционирование устройства, то диспетчер попытается загрузить и запустить драйвер «option» чтобы прибор мог работать.
/etc/usb_modeswitch.conf ≈ общий конфигурационный файл для включения функции ведения логов при диагностике, или для запрета переключения режимов (обычно для того, чтобы получить доступ к виртуальному флеш-накопителю).
/usr/share/usb_modeswitch ≈ директория, содержащая индивидуальные файлы для каждого прибора, именованными в соответствии с их ID (или другими идентификаторами в случае совпадения ID). Если имеется файл с именем ID вашего гаджета, все шансы за то, что ваш прибор поддерживается, даже если его модель и не совпадает.
Напоминаю еще раз, что директория «/usr/share/usb_modeswitch» как и файл правил udev устанавливаются пакетом usb_modeswitch data package.
После того, как режим переключен и драйвер последовательного порта запущен, наступает очередь операционной системы обнаружить новое устройство.
При работе с беспроводными устройствами, возможны проблемы с NetworkManager (или его компонентом ModemManager), который до сих пор часто ошибается при определении правильного порта.
Хорошо зарекомендовали себя программы wvdial, UMTSmon и несколько других, обеспечивающих графический интерфейс для запуска PPP, например kppp; правда, эти программы требуют некоторых знаний.
Также появилась новая ≈ необычная и интригующая ≈ концепция, которая сокращает утомительный путь настройки различных компонентов для подключения беспроводной связи. Sakis3G ≈ это самодостаточная программа (включающая в себя, среди прочего, и новейший USB_ModeSwitch бинарник). Программа уже поддерживает большое число провайдеров и стремительно развивается. В противоположность NetworkManager она действительно работает. Ищите ее на блоге ToDo Forever . Там же и инструкции по установке, в идеале она запускает ваш модем как только он подключен.
Главное препятствие полностью автоматического запуска вновь подключенного модема программой NetworkManager и иже с ним ≈ это определение правильного порта. Зачастую, после переключения режима, создается более одного порта (в некоторых случаях до 5 штук). Вообще-то не все они являются действительно последовательными портами (драйвер не может понять какие), хотя некоторые весьма похожи и даже отвечают на AT-команды, но только правильный порт является точкой передачи данных. К сожалению, NetworkManager руководствуется иными критериями проверки и иногда ошибается. Стоит заметить, что упомянутый выше Sakis3G находит истинный порт играючи.
Начиная с версии 1.1.2, usb_modeswitch добавляет символическую ссылку на правильный порт, обеспечивающий передачу данных, если устройство создает последовательные порты. Эта ссылка носит имя /dev/gsmmodem (с соответствующим номером, в случае подключения нескольких устройств).
Можно использовать эту ссылку при настройке программ дозвона типа wvdial. В большинстве случаев их конфигурация правится вручную.
Когда удалось вручную запустить переключение режима нового или плохо поддерживаемого гаджета, можно прописать соответствующее правило udev и конфигурационный файл. Но не поленитесь сообщить об этом, чтобы и другие могли последовать по вашему пути!
См. Сотрудничество
Поддерживаемые гаджеты
Существует три способа осуществить переключение режима:
- Отключить накопительное устройство (в том числе SCSI) какой-либо редкой командой, например «eject» (немного непонятно написано; оказалось, что автор имеет ввиду управляющую команду (она же последовательность) 5553424312345678000000000000061b000000020000000000000000000000. Джошуа пишет на форуме : ≈ «Я всегда пытаюсь использовать Команду «извлечь» («eject»), если ничего не помогает).
- Послать на устройство одну из вендор-специфичных управляющих команд.
- Насильно отключить от устройства драйвер накопителя (только для некоторых ранних гаджетов).
Еще раз скажу: даже если вы не нашли ваш гаджет в списке, он может все равно поддерживаться.
Важно чтобы ваш USB ID был в числе имен файлов в директории конфигурационных файлов /usr/share/usb_modeswitch. Загляните в новейший пакет usb-modeswitch-data (см. Загрузки).
Вот этот список поддерживаемых гаджетов вместе с их производителями:
device_reference.txt
Диагностика
- Только ядра начиная с 2.6.27 и выше назначают 3G-оптимизированный драйвер последовательного порта. Если у вас более старое ядро и ваш модем после переключения режима не опознан ни одним драйвером, тогда используется универсальный драйвер «usbserial».
Для диагностики первым делом следует подключить функцию ведения логов. Как суперпользователь отредактируйте файл /etc/usb_modeswitch.conf в текстовом редакторе и замените строку
Программа начнет записывать отчет о своей деятельности в директории /var/log/usb_modeswitch_ .
Если вы выставили правильные параметры вашего устройства и проделали все фокусы из раздела Поддерживаемые гаджеты, USB_ModeSwitch что-то раз за разом делает, а толку нет, то скорее всего виноваты какие-то проблемы с системой.
Первое подозрение падает на системные правила для модемов, которые могут быть прописаны не вполне корректно.
Если ваш прибор до переключения режима имеет ID 05c6:1000, то в старых системах он может получать неверную переключающую команду. Существует четыре различных бистабильных прибора с этим ID, в больших дистрибутивах они все указываются как устройства от производителя «Option», что неверно в четырех случаях из пяти. Есть даже мобильные телефоны с этим ID, которые также неверно интерпретируются при подключении по USB.
Чтобы решить проблему, можно попытаться удалить файлы правил из директории «/lib/udev/rules.d», содержащие обращения к «modem-modeswitch». После удаления, USB_ModeSwitch произведет дополнительное расследование вне USB ID и обработает подозрительные устройства должным образом. Например, не будет рассматривать неизвестные устройства с ID 05c6:1000.
Другой печально известный «подозреваемый» ≈ снова 19d2:2000. Он может нормально подключаться по существующим правилам udev, но, если модель у вас новая и ее ID еще не прописан в модуле «option», драйвер к нему не загружается.
Нужно дать команду «eject» и тогда usb_modeswitch «подхватит» устройство с этим ID.
Проблемы связанные с ядром
Некоторые новейшие ядра обрабатывают определенные устройства таким образом, что переключения режимов не требуется. Для этих устройств больше не нужна USB_ModeSwitch; но, с другой стороны, уже не получится заглянуть в «CD-ROM» такого гаджета. Больше того, бывали случаи, когда подобного рада обработка не удавалась сама и препятствовала программе USB_ModeSwitch правильно сработать (случалось с гаджетами ZTE, error «-2»).
Если у вас происходит подобное, загляните в «unusual_devs.h» в папке «drivers/usb/storage» исходника вашего ядра. Если там есть ваш ID (вендора и продукта в режиме накопителя) и USB_ModeSwitch генерирует ошибки, первым делом попробуйте занести «usb-storage» в черный список (blacklist).
Если это помогло, остается перекомпилировать ядро с дезактивированным пунктом «unusual_devs.h». После этого накопитель usb-storage будет работать в обычном режиме (а не в особом как до того). В Russian Gentoo wiki я нашел совет проделывать именно такие манипуляции с ZTE MF626.
Между прочим, разработчиками USB была достигнута договоренность не включать кода переключающего режимы в ядро, если возможно проделать это в пользовательском пространстве «user space».
Другим параметром, влияющим на поведение ядра является»delay_use» из «usb-storage», который устанавливает отрезок времени (в секундах после подсоединения) в течении которого устройство будет использоваться (и, возможно, автомонтироваться). По умолчанию задано 5 секунд; при определенных условиях это может влиять на результат переключения режимов.
Для изменения параметра добавьте в /etc/modprobe.conf:
options usb-storage delay_use=1 (или 10, или сколько хотите)
Старые системы (например CentOS 5 или Xandros 6)
Если вы пользуетесь не самой свежей системой (с ядром ниже 2.6.27), то можете натолкнуться на несовместимость между версиями «udev» (менеджера устройств). Если у вас не видно деятельности никаких компонентов usb_modeswitch (совсем нет его логов), то проделайте следующие шаги:
- Проверьте, нет ли в директории «/lib/udev/rules.d» других файлов кроме «40-usb_modeswitch.rules». Если нет, то переместите этот файл в директорию «/etc/udev/rules.d».
Если не помогло, то проверьте другие файлы в директории «/etc/udev/rules.d» на предмет наличия строки»ATTRS». Если таковой нет, то отредактируйте файл «40-usb_modeswitch.rules», заменив все «ATTR» и «ATTRS» на «SYSFS». Сохраните изменения и проверьте как стало работать после переподключения.
Сотрудничество
Стоит попытаться использовать для новых гаджетов широко применяемые методы переключения режимов от уже известных устройств, как скажем, последовательность «eject» из файла «12d1:1446» устройства BandLuxe. Если же есть намеки, что ваш девайс сработан Huawei, то попробуйте последовательность из файла «12d1:1446». Не бойтесь повредить устройство, применение неправильной последовательности не может сломать девайс. Не забудьте только переподключать прибор после каждой попытки!
Коли ничто не помогает, попробуйте такой подход: Заметьте Vendor и Product ID прибора из /proc/bus/usb/devices (или из вывода команды «lsusb»); обычно соответствующий драйвер ≈ «usb-storage». Затем прошпионьте USB-коммуникации устройства с данным ID под M$ Windoze, после инсталляции им своих драйверов. Там ведь тоже произойдет переключение режима и вы можете поймать этот момент в логах. Рекомендую следующую программу: «SniffUSB»( http://www.pcausa.com/Utilities/UsbSnoop/default.htm).
Я кратко объяснил. Очень хороший пример Mark A. Ziesemer опубликовал в Alltel UM175AL USB EVDO under Ubuntu Hardy Heron
Все ваши наработки и открытия, информацию по новым гаджетам и отчеты об ошибках прошу постить на форуме ModeSwitchForum !
Если вам не нужна огласка, можете прислать мне старомодное и конфиденциальное (при желании) e-mail. Адрес найдете на сайте оригинала данной статьи в конце /прим. переводчика/.
Источник