вторник, 16 июля 2013 г.

Разбираемся с usb_modeswitch в Android

Большинство USB 3G-модемов являются составными USB-устройствами. Помимо функции модема выполняют функцию устройства для чтения карт памяти. Кроме того испольуется технология ZeroCD, суть которой заключается в том, что при первом подключении к компьютеру новое USB-устройство подключает виртуальный CD-ROM (флэш-память), на котором находятся необходимые драйверы для Windows, но редко для других ОС. После установки драйвер переключает USB-устройство в режим модема.

Раньше UNIX-системы не могли работать с такими устройствами. Но, спасибо Josua Dietze и программе usb_modeswitch, это больше не является проблемой.

1) Чтобы проверить имеется ли эта программа в системе Android вашего устройства, наберите в эмуляторе терминала команду: usb_modeswitch. Если появилась краткая справка к этой программе - всё отлично. Если нет, можете установить usb_modeswitch по рекомендациям на сайте программы.

2) Проследить работу usb_modeswitch, переключение режимов модема, можно с помощью программы /system/bin/u3gmonitor. В терминале введите команду: u3gmonitor. И после этого подключите модем к устройству. В случае успешного переключения режима модема, появляются подобные строки:
app_52@android:/ $ export PATH=/data/local/bin:$PATH
app_52@android:/ $ u3gmonitor

Reading config file: /system/etc/usb_modeswitch.d/19d2_2000

 * usb_modeswitch: handle USB devices with multiple modes
 * Version 1.2.0 (C) Josua Dietze 2011
 * Based on libusb0 (0.1.12 and above)

 ! PLEASE REPORT NEW CONFIGURATIONS !

DefaultVendor=  0x19d2
DefaultProduct= 0x2000
TargetVendor=   0x19d2
TargetProduct=  not set
TargetClass=    not set
TargetProductList="0001,0002,0015,0016,0017,0031,0037,0052,0055,0063,0064,0066,0091,0108,0117,0128,2002"

DetachStorageOnly=0
HuaweiMode=0
SierraMode=0
SonyMode=0
QisdaMode=0
GCTMode=0
KobilMode=0
SequansMode=0
MobileActionMode=0
CiscoMode=0
MessageEndpoint=  not set
MessageContent="5553424312345678000000000000061e000000000000000000000000000000"
MessageContent2="5553424312345679000000000000061b000000020000000000000000000000"
MessageContent3="55534243123456702000000080000c85010101180101010101000000000000"
NeedResponse=1
ResponseEndpoint= not set

InquireDevice disabled
Success check enabled, max. wait time 20 seconds
System integration mode disabled


usb_set_debug: Setting debugging level to 15 (on)
usb_os_find_busses: Found 005
usb_os_find_busses: Found 004
usb_os_find_busses: Found 003
usb_os_find_busses: Found 002
usb_os_find_busses: Found 001
usb_os_find_devices: Couldn't open /dev/bus/usb/005/001
usb_os_find_devices: Couldn't open /dev/bus/usb/004/002
usb_os_find_devices: Couldn't open /dev/bus/usb/004/001
usb_os_find_devices: Couldn't open /dev/bus/usb/003/001
usb_os_find_devices: Couldn't open /dev/bus/usb/002/002
usb_os_find_devices: Couldn't open /dev/bus/usb/002/001
usb_os_find_devices: Couldn't open /dev/bus/usb/001/001
Looking for target devices ...
 No devices in target mode or class found
Looking for default devices ...
 No devices in default mode found. Nothing to do. Bye.

/system/etc/usb_modeswitch.d/19d2_0031 does not exist.
В этом примере видно, что при переключении режима модем изменил свои идентификаторы VID_PID с 19d2_2000 на 19d2_0031.

Но так как при проверке ранее не отобразились строки с "GSM modem", вероятнее всего необходимый для переключения файл конфигурации отсутствует. И у вас отобразится всего одна строка. Например:
app_52@android:/ $ export PATH=/data/local/bin:$PATH
app_52@android:/ $ u3gmonitor
/system/etc/usb_modeswitch.d/19d2_2000 does not exist.
19d2_2000 - это идентификаторы производителя VID = 19d2 и продукта PID = 2000 модема в режиме виртуального CD-ROM или флэш-памяти.

3) Если в системе отсутствует программа u3gmonitor, определяем идентификаторы VID и PID в терминале командой lsusb (или busybox lsusb). Выполнив её до подключения модема и после.
app_52@android:/ $ export PATH=/data/local/bin:$PATH
app_52@android:/ $ busybox lsusb
Bus 001 Device 001: ID 1d6b:0001
Bus 002 Device 001: ID 1d6b:0002
Bus 003 Device 001: ID 1d6b:0001
Bus 004 Device 001: ID 1d6b:0002
Bus 005 Device 001: ID 1d6b:0001
Bus 004 Device 002: ID 0bda:8176
app_52@android:/ $ busybox lsusb
Bus 001 Device 001: ID 1d6b:0001
Bus 002 Device 001: ID 1d6b:0002
Bus 003 Device 001: ID 1d6b:0001
Bus 004 Device 001: ID 1d6b:0002
Bus 005 Device 001: ID 1d6b:0001
Bus 004 Device 002: ID 0bda:8176
Bus 002 Device 003: ID 19d2:2000
app_52@android:/ $
Появилось устройство "Bus 002 Device 003: ID 19d2:2000". Это и есть модем в данном случае находящийся в режиме виртуального CD-ROM. 19d2:2000 - соответственно VID и PID модема.

Примечание: При отсутствии в системе программы u3gmonitor, проследить работу usb_modeswitch можно посмотрев журнал. Введите с правами Root в эмуляторе терминала команду logcat .

4) Теперь необходимо узнать идентификаторы модема после переключения из режима "Виртуальный CD-ROM" в режим "Модем". Это можно сделать на "большом" компьютере (ноутбуке) с установленными драйверами необходимыми для работы данного модема.

В ОС Windows. Нажимаем на клавиатуре кнопки "Windows" + "Pause/Break" или другим способом открываем Панель управления, раздел "Система". Запускаем Диспетчер устройств. В разделе "Модемы" через контекстное меню или двойной клик мышкой открываем окно свойств вашего модема. На вкладке "Сведения" в выпадающем списке выбираем свойство "ИД оборудования". И смотрим необходимые идентификаторы VID и PID.


5) Далее необходимо создать файл конфигурации с именем 19d2_2000 (у вас имя будет другое, соответствует идентификатору модема в режиме виртуального CD-ROM или флэш-памяти). Но, лучше скопировать похожий файл из /system/etc/usb_modeswitch.d (или /etc/usb_modeswitch.d), переименовать и изменить содержимое "правильным" текстовым редактором, способным использовать символ перевода строки LF (0Ah). Например, AkelPad или Notepad++. Блокнот не подходит.
Примечание: В некоторых устройствах данный файл находится в каталоге /etc/ppp/setup/ и имеет имя подобное E3131.setup. Где "E3131" - название вашего модема (Huawei E3131). Или же может использоваться файл конфигурации /etc/usb_modeswitch.conf.

Файл конфигурации имеет такое содержание (возможны варианты, подробности о параметрах здесь):
########################################################
# ZTE MF100 (Beeline RU)

DefaultVendor= 0x19d2
DefaultProduct=0x2000

TargetVendor=  0x19d2
TargetProduct= 0x0031

MessageContent="5553424312345678000000000000061e000000000000000000000000000000"
MessageContent2="5553424312345679000000000000061b000000020000000000000000000000"

NeedResponse=1

CheckSuccess=20
Значения DefaultVendor и DefaultProduct изменяем в соответствии с VID и PID модема в режиме виртуального CD-ROM полученными в пунктах 2) или 3). Значения TargetVendor и TargetProduct изменяем в соответствии с VID и PID модема полученными в пункте 4). Определить MessageContent - шестнадцатеричный код команды, которой переключается режим модема (обычно это команда "извлечь диск") достаточно сложно. Поэтому ищем в этом файле или других источниках конфигурацию с такими же значениями Default/Target Vendor/Product. Или подбираем от аналогичных модемов.

6) Помещаем созданный файл в директорию /system/etc/usb_modeswitch.d или /etc/ppp/setup в зависимости от вашего устройства.

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

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