Previous Entry Поделиться Next Entry
Линукс не работает с андроидом
dil wrote in ru_linux
У меня, как всегда, загадочные грабли..

Имеется китайский смартфон (Huawei Honor 8) с 6 андроидом. Пытаюсь его зарутить, работаю, как обычно, из линукса (Debian 8.7) с ноутбука. И пару дней назад этот линукс внезапно перестал нормально общаться с этим андроидом. То есть, при втыкании смартфона в USB-порт линукс в целом его видит, но:

1) внутренний диск [показывается с именем самого смартфона - FRD AL10] иногда успешно открывается по MTP, а иногда только показывается в гномовском Наутилусе, причём без Mount/Unmount в локальном меню, а при попытке в него зайти: Unable to access "FRD AL10"-Unable to open MTP device '[usb:002,003]'
2) виртуальный CD [на котором лежит некий 华为手机助手安装向导.exe (кажется, это родное хуавейское приложение под винду - HiSuite), и pdf с копирайтами на opensource'ный софт] иногда успешно монтируется (не по MTP, а как обычный CD - /dev/sr0), иногда вообще не видится
3) и главное - adb этого смартфона вообще не видит, в самом смартфоне запросов на разрешение USB debugging не вылезает
4) если смартфон воткнуть в режиме bootloader'а, то fastboot devices его показывает, но при вводе ЛЮБОЙ команды, даже fastboot reboot, выдаёт < waiting for any device >, и ждёт до бесконечности.

Сначала я подумал, что это что-то в смартфоне попортилось, но попробовал воткнуть его в винду на том же самом ноутбуке, а там всё успешно работает.
А сегодня воткнул его в десктоп (с тем же самым Дебианом 8.7), всё работает. Запустил adb (та же версия, что на нотбуке - 1.0.36 Revision 302830efc153-android) - тоже работает. Попробовал обратно на ноутбуке - не работает, точно как описано выше.

Есть у кого идеи, отчего такое может быть, и как его вылечить?

Upd: Мой линукс живёт на внешнем USB-диске. Я попробовал запустить его на другом ноутбуке, и там всё так же не работает. А из точно такого же Debian'а, установленного на самом этом ноутбуке, всё работает.

С другими смартфонами (HTC Desire S, Desire X, HTC One) и с моего внешнего диска всё успешно работает с обоих ноутбуков. А вот с Honor8 почему-то нет..

Выходит, что дело не в железе, не в ядре, не в драйверах и вообще не в самом линуксе, а в одном конкретном экземпляре его. Но ЧТО там может быть не так???

Upd2: Если смартфон подключить ДО загрузки линукса, то он успешно видится и по MTP, и через adb. А вот если его подключить к уже загруженному линуксу, тогда он стабильно не видится, как описано выше..
Метки: ,

  • 1
udev правила раньше для него делали?

Нет, никаких правил руками не делал.

Была схожая проблема. Ноутбук с портами как USB 3.0, так и USB 2.0, фирменный 50см USB 2.0-кабель от SONY и два аппарата: SONY и Lenovo. SONY стабильно себя вел на любых портах под Linux и под Win. Lenovo под Win стабильно обнаруживался и работал на любых портах, но под Linux при подключении к порту USB 3.0 не обнаруживался ни в режиме MTP, ни в режиме mass storage, а на портах USB 2.0 обнаруживался нестабильно и так же нестабильно держал подключение. Прошло после замены USB-кабеля на более короткий.

У меня было подозрение, что проблема в версии usb, но перепробовал все порты, везде одинаково. И ведь раньше-то работало. Кабель родной от этого телефона, а поменять его не на что, там USB type-C, у меня других таких нету.

Может. Я периодически запускаю apt-get dist-upgrade, но и на десктопе тоже, так что ядра там сейчас одинаковые: 3.16.0-4-amd64 #1 SMP Debian 3.16.39-1 (2016-12-30) x86_64/

Контроллеры USB отличаются на ноуте и десктопе?

Тогда возможно, что дрова под контроллер ноута изменились, а по десктопный нет.

Кстати, а если на смартфоне в настройках для разработчиков очистить список авторизованных для отладки устройств?

Ну может дрова как-то и изменились, но при втыкании смартфона USB-девайсы обнаруживаются, диск по MTP иногда читается, fastboot успешно видит серийный номер смартфона, а вот при отправке команд почему-то перестаёт его видеть.

Список устройств очистить пробовал, при запуске adb на десктопе смартфон опять спросил разрешение и успешно его принял, а на ноутбуке как не спрашивал, так и не спрашивает.

Попробовать старое ядро. Если поможет, то хотя бы в багтрекер инфу закинуть разработчикам.

Гм.. Мой линукс живёт на внешнем USB-диске. Так я попробовал его запустить на другом ноутбуке, и там та же фигня. А из точно такого же Debian'а, установленного на самом этом ноутбуке, всё нормально работает.

С другими смартфонами (HTC Desire S, Desire X, HTC One) и с моего внешнего диска всё успешно работает с обоих ноутбуков. А вот с Honor 8 - не хотят.

Так что получается, что дело не в железе, не в ядре, не в драйверах и вообще не в самом линуксе, а в одном конкретном экземпляре его. Но ЧТО там может быть не так, я решительно не понимаю...

Если раньше работало, то дело в сочетании железа и версии/настроек софта. Надо смотреть отличия в параметрах загрузки ядра, модулях и драйверах нерабочей инсталляции от рабочей. Может какой поверменеджмент на USB задействован или какие-то другие настройки USB отличаются. На всякий случай сравнить вывод lsusb -v, что бы исключить негативное влияние моста USB-SATA внешнего диска.

Так-с, случайно обнаружилось, что если этот телефон воткнуть в USB-порт ДО загрузки моего линукса, то после загрузки и adb его нормально видит, и по MTP он доступен. А вот если его воткнуть в уже загруженный линукс (или перевоткнуть изначально воткнутый) то он уже недоступен, как описано в посте.

При этом lsusb (и lsusb -v) различаются только в одном месте - в номере подключённого устройства, всё остальное одинаково:
Работающее: Bus 002 Device 002: ID 12d1:107e Huawei Technologies Co., Ltd.
Неработающее: Bus 002 Device 004: ID 12d1:107e Huawei Technologies Co., Ltd.

Ну это вполне понятно, этот номер постоянно увеличивается при втыкании новых устройств в USB.

При втыкании (или перевтыкании) в загруженный линукс запускаются три новых модуля: option, usb_wwan, usbserial. В syslog'е при этом виднеется несколько ttyUSB, но и MTP там тоже вроде как видится, а подключиться к нему не удаётся:
org.gtk.vfs.Daemon[1541]: ** (gvfsd:1580): WARNING **: dbus_mount_reply: Error from org.gtk.vfs.Mountable.mount(): Unable to open MTP device '[usb:002,004]'

Удаление этих модулей ничего не меняет.

А дайте, пожалуйста, полный вывод lspci -v с успешно подключенным телефоном. У меня есть гипотеза, что Ваш телефон заявляет поддержку режима SuperSpeed.

Вот: http://dil.pp.ru/tmp/lspci.html абсолютно одинаковое с работающим и неработающим телефоном, хотя lspci его вообще не видит.

Так что вот ещё lsusb: http://dil.pp.ru/tmp/lsusb-working.html и http://dil.pp.ru/tmp/lsusb-non-working.html
У телефона там разницы никакой, а вот у видеокамеры почему-то bmVideoStandards появились.

Тьфу, блин, с телефона ночью писал и пропустил, что сработала автозамена lsusb на lspci. Конечно же интересовал вывод lsusb -v при подключенном телефоне.

Кажется догадка подтвердилась, виноват режим SuperSpeed (USB 3.x). Порты Вашего ноутбука умеют USB 3.x. Ваш телефон заявляет, что он умеет USB 3.х (в разделе "Binary Object Store Descriptor" есть список "SuperSpeed USB Device Capability" и в нем фигурирует "Device can operate at SuperSpeed (5Gbps)"), а в реальности работает только в режиме USB 2.1 (параметр "bcdUSB" раздела "Device Descriptor" имеет значение типа "2.10").

Почему это происходит? Причин может быть несколько:
1. Плохой кабель или разъем "шнурка" не позволяют использовать режим SuperSpeed.
2. Плохая разводка шины или разъем в телефоне не позволяют использовать режим SuperSpeed.
3. Какая-то несовместимость хост-контроллера USB в компьютере и контроллера в телефоне, которая проявляется только в режиме SuperSpeed.
4. Контроллер в телефоне врет и он вообще не умеет USB 3.х

Но почему телефон работает, если подключен до старта ОС? Вам повезло, фирмварь материнки не умеет переводить хост-контроллер в режим USB 3.х и порт начинает работать в режиме USB 2.10, а драйвер ОС при загрузке не сбрасывает режим контроллера.

Если подключать телефон к ноутбуку не напрямую, а через хаб умеющий только USB 2.1, то соединение будет стабильным.

У меня на одном из телефонов еще смешнее, Lenovo Vibe X3 рапортует, что умеет SuperSpeed, но разъем на нем microUSB, поэтому найти такой кабель невозможно, родной кабель так же не USB 3.x, но тут и мне повезло - случайно выбранный мной кабель каким-то образом переводит порт ноутбука в режим 2.x

Edited at 2017-01-26 14:03 (UTC)

Ну, предположим, что дело в криво работающем USB 3. Возможно, перепрошивка телефона на это как-то повлияла, но сейчас виртуальный CDROM виртуальный CDROM с этого телефона теперь виднеется всегда, а внутренний диск телефона и adb через тот же самый кабель и порт - только при втыкании до загрузки линукса.

Попробовал воткнуть через "058f:9254 Alcor Micro Corp. Hub", модель точно не знаю, но у них вроде только USB 2.0 и 1.1 есть. Ничего не поменялось, CDROM видно, остальное нет.

Ещё попробовал через "05e3:0606 Genesys Logic, Inc. USB 2.0 Hub / D-Link DUB-H4 USB 2.0 Hub", а всё то же самое: в lsusb -v у телефона виднеется "SuperSpeed (5Gbps)", CDROM видно, остальное нет.

А на другом ноутбуке, где также есть USB3, и телефон в нём тоже показывает SuperSpeed (5Gbps), на линуксе с внешнего USB-диска он работает только будучи воткнутым до загрузки линукса, а на линуксе с внутреннего диска ноутбука работает всегда. Причём сам внешний диск тут ни при чём, я пробовал его туда же втыкать и до, и после загрузки, на работоспособность телефона это никак не влияет, он успешно работает.

Текущий режим USB порта показывается SuperSpeed (5Gbps) даже при подключении через хаб с USB 2.0? Как так? Это в параметре bcdUSB надо смотреть, не в "SuperSpeed USB Device Capability".

Не, это я не про текущий режим, а про wSpeedsSupported.
А bcdUSB там всегда 2.10, и когда работает, и когда нет. Это, собственно, видно в обеих вышеприведённых ссылках про lsusb -v.

Список wSpeedsSupported зашит в телефоне и может изменяться только обновлением микропрограммы контроллера в телефоне.

Добрался до ноута и сравнил выводы lsusb по Вашим ссылкам, раз аппарат на шине обнаруживается всегда, то чего-то не так с ОС. Возможно играет роль порядок загрузки.
В UDEV не пробовали правила прописывать (как тут)? Там у кого-то сработало 11-android.rules.

Насколько я понял, те правила в udev предназначены только для доступа к подключаемым телефонам обычного юзера. А я-то adb сразу от рута запускаю, чтоб не натыкаться на отсутствие нужных прав.

  • 1
?

Log in