вторник, 12 ноября 2013 г.

Lenovo a600e. Запускаем adb под linux с использованием usb_modeswitch



Все-таки надоело мне, что android устройство - и не видится нормально adb под линуксом. Чтобы подключиться - приходится использовать Win7 под virtualbox. Стыдно как-то, да и неудобно очень!

Основная проблема в том, что при подключении к linux видится только сторадж, а вот отладчик (adb) - в упор не видит телефон. В общем-то причина на самом деле проста: как во многих устройствах (например 3G  модемах) железка сначала пытается подсунуть виртуальный CD, а только потом драйвер (виндовый) переводит железку в нормальный режим. Для модемов это в принципе обходится отключением виртуального CD через AT команды. А вот для андроида все несколько сложнее. Приходится использовать альтернативный путь - usb_modeswitch

Собственно, в утилите нет ничего военного и она входит в комплект множества линукс-дистрибутивов. При запуске и правильной конфигурации данная утилита отключает usb-storage от устройства и переключает устройство в нужный режим. Проблема только одна: определить ту "волшебную" последовательность, которая и произведет данное действо.
К сожалению. в просторах инета этой информации найти не удалось. Не только для a600e, но и вообще для телефонов lenovo :(

В общем, путем снифа USB порта и потери нескольких часов личного времени удалось добиться нужного результата :)

Итак,алгоритм действий:

- включаем на телефоне режим отладки по USB
- подключаем телефон к компьютеру, убеждаемся. что он виден:
# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 046d:c018 Logitech, Inc. Optical Wheel Mouse
Bus 001 Device 058: ID 17ef:74b9 Lenovo


Устройство есть. vendor 0x17ef, product 74b9. А вот в режиме, когда adb видит телефон, product id дожен быть 0x74b5 или 0x74b4.

Настраиваем usb_modeswitch. Для этого создаем конфиг-файл lenovo-a600e.conf с содержимым

DefaultVendor=0x17ef
DefaultProduct=0x74b9

TargetVendor=0x17ef
TargetProduct=0x74b5

MessageContent="5553424360AC80008000000080000606F50402527000000000000000000000"



MessageContent и есть та "волшебная" строка.

Далее даем команду:
# usb_modeswitch -c lenovo-a600e.conf

И получаем ответ:

Looking for target devices ...
 No devices in target mode or class found
Looking for default devices ...
   found matching product ID
   adding device
 Found device in default mode, class or configuration (1)
Accessing device 058 on bus 001 ...
Getting the current device configuration ...
 OK, got current device configuration (1)
Using first interface: 0x00
Using endpoints 0x01 (out) and 0x81 (in)
Inquiring device details; driver will be detached ...
Looking for active driver ...
 OK, driver found ("usb-storage")
 OK, driver "usb-storage" detached

SCSI inquiry data (for identification)
-------------------------
  Vendor String: Lenovo 
   Model String: A600e MS       
Revision String: 2.31
-------------------------

USB description data (for identification)
-------------------------
Manufacturer: Lenovo
     Product: A600e
  Serial No.: A600e
-------------------------
Setting up communication with interface 0
Using endpoint 0x01 for message sending ...
Trying to send message 1 to endpoint 0x01 ...
 OK, message successfully sent
Resetting response endpoint 0x81
Resetting message endpoint 0x01
 Device is gone, skipping any further commands
-> Run lsusb to note any changes. Bye.

Все готово!
Проверяем:
# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 046d:c018 Logitech, Inc. Optical Wheel Mouse
Bus 001 Device 059: ID 17ef:74b4 Lenovo


$ adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
A600e    device


Заработало! :)

Любители автоматизации могут прикрутить это все к udev. Процедура описана во многих местах, в том числе в документации и на сайте авторов usb-modeswitchб поэтому описывать ее здесь смысла не вижу.

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

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