Отключить USB-зарядку

По некоторым причинам, не связанным с временем автономной работы, мне нужно отключить зарядку аккумулятора, когда USB-хост подключен к моему телефону (рутированному Nexus 4). Оглядевшись в Интернете ( ссылка1 , ссылка2 ), похоже, я должен изменить системный файл. Я нашел ряд интересных файлов, расположенных в /sys/class/power_supply/batteryи /sys/class/power_supply/usb, которые могут быть правильными для изменения, чтобы добиться отключения зарядки через usb (например, /sys/class/power_supply/usb/present 0/1).

Кто-нибудь пробовал что-то подобное (управлять usb зарядкой через софт и модифицировать такие системные файлы)? Каков наилучший способ изменить эти системные файлы? Должен ли я использовать оболочку adb или другой инструмент?

Я попробовал приложение «root explore», чтобы изменить эти файлы, однако, когда я изменил файл (после изменения его разрешений), он автоматически вернулся к исходному значению.

Хотя это может или не может способствовать возникновению вопроса, мне любопытно, почему вы хотите отключить зарядку через USB.
Здесь у меня нечто более похожее на встраиваемую систему: телефон (USB ACCESSORY) и железка (USB HOST), подключенные через USB. Аккумулятор телефона питает подключенное оборудование через определенное соединение (Vdd). Однако предполагается, что USB HOST питает (или заряжает) телефон через линию VBUS USB. Чего я хочу избежать, так это петли заряда между телефоном и подключенным оборудованием. Несмотря на то, что подключенное оборудование является HOST, это телефон Android, который обеспечивает всю систему. Надеюсь, мое объяснение было вам понятно.
/sys — это виртуальная файловая система, в которой ядро ​​предоставляет ручки и переключатели для изменения и просмотра конфигурации ядра. Вы не можете изменить права доступа к файлу. Я предполагаю, что ваш телефон Nexus разблокирован и рутирован. Схема зарядки, вероятно, основана на микросхеме Maxim, которую можно настроить. Доступны измененные ядра, которые позволяют переопределить обнаружение зарядки. Обратное тоже должно быть возможно. Однако вам может потребоваться исправить и перекомпилировать ядро.
Franco Kernel для nexus 4 поддерживает быструю зарядку, источники доступны. возможно, вы можете взглянуть на него и выяснить, как его отключить: github.com/franciscofranco

Ответы (10)

Я только что попробовал и обнаружил, что вам нужно изменить файл:
sys/class/power_supply/usb/device/charge

его содержимое по умолчанию — «1», что означает «включить зарядку», вам нужно установить его на «0», чтобы «отключить зарядку».

$ su

$ echo 0 > /sys/class/power_supply/usb/device/charge

Я тестировал на Nexus 4, и он успешно работает.

Я могу подтвердить, что echo 0 > /sys/class/power_supply/battery/charging_enabledу меня это работает на Sony Z1 Compact с CM11. Большое спасибо! :)
Обратите внимание, что интерфейс /sys является виртуальным и не сохраняется после перезагрузки.
adb shell dumpsys battery set ac 0; dumpsys battery set usb 0;
Команды эти интересные, но на зарядку особо не влияют! Вы также можете сделать это, dumpsys battery set level 42и Android будет думать, что он заряжен на 42%, независимо от реального состояния батареи. Сделайте dumpsys battery reset, чтобы вернуться к нормальной жизни.
Кроме того, эти фальшивые изменения замораживают заявленное состояние батареи и записываются в статистику батареи, что может испортить их и привести к неправильным прогнозам «оставшегося времени».

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

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

Вероятно, есть более простой способ сделать это, но я не знаю об этом.

В USB обычно 4 контакта - 2 для питания 5 В и 2 для данных.
Если вы отключите Vbus и Ground, это также остановит работу линий данных. Подключение USB-кабеля определяется по питанию (см. A-разъем, контакты питания немного длиннее, поэтому они будут подключаться первыми).

Вы можете использовать батарею dumpsys adb shell set usb 0; // для отключения USB-зарядки и

набор батарей для adb shell dumpsys usb 1; // для включения зарядки через USB

Это легко, но, к сожалению, не отключает зарядку. Это только делает вид, что он отключен.

Я почти уверен, что это не то, что вы можете изменить в программном обеспечении, поскольку телефон будет заряжаться при подключении к USB-порту компьютера. Вам, вероятно, придется запачкать руки и закоротить одно или два соединения на самом телефоне.

Да, это также можно сделать с помощью программного обеспечения. Взгляните на это приложение для Nexus 4 с root-правами stopCharge

Вы всегда можете использовать диод Шоттки между контактом 1 блокирующей стороной к аксессуару. Таким образом, контактный разъем получает сигнал 5 В, поэтому связь работает, но ток от аксессуара к вашему телефону НЕ будет. или, если вы хотите по-другому, просто поместите диод в другом направлении.

Вы можете решить проблему аппаратно, изменив контакты на стороне разъема micro-USB. Один очевидный способ — не подключать контакт № 1 (VBUS), а другой способ — заземлить контакт № 4 (ID), чтобы представить, что ваш хост (ПК) является устройством OTG. Если вы это сделаете, вам придется отключить контакт № 1 (VBUS), иначе одно, если не оба, ваших устройства будут сожжены.

Что касается решения с командной строкой, вам просто нужно найти нужные (зависящие от устройства) /sys/...файлы для игры. Но, как уже упоминалось, вам нужны права на запись и права root, чтобы изменить их, и что бы вы ни делали, это будет длиться только до следующей перезагрузки или замены периферийного USB-устройства.

Предлагаемое аппаратное решение неверно. Почти в каждом Android-телефоне есть USB-устройство, которое получает питание от USB-хостов (например, ноутбуков), поэтому работает в режиме аксессуаров. Если вы перережете линию VBUS, передача данных USB перестанет работать. Я проверил это на себе. Я бы сказал то же самое для другого способа (идентификационный контакт), хотя я его не проверял. Вы правы насчет программного решения, однако не на всех телефонах Android есть /sys/...необходимые для этого файлы (Nexus 4 — да, Nexus 5 — нет). Другим решением должно быть изменение поведения драйвера зарядки в ядре.

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

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

Цепь зарядки необходимо изменить, чтобы избежать зарядки от USB и петли напряжения батареи.

Я подтвердил, что на Galaxy S3 для включения данных требуется шина 5 В (d + d-), это часть стандарта USB.

OTG может решить проблему электрически, но тогда правила хост-клиента неверны. Также этот телефон поддерживает OTG и зарядку (я использую Y-кабель + геймпад).

Ссылка на редактирование: https://forum.xda-developers.com/showthread.php?t=1863303

Обновлю, как только разберусь с изменениями схемы зарядки

Я спросил своего коллегу, который является экспертом по драйверам аккумуляторов. На нашем Nut Pro 2 с версией ядра 4.4.21 узел включения/выключения зарядки аккумулятора: /sys/class/power_supply/battery/input_suspend.

То же самое здесь, на моем Xiaomi Redmi K20 Pro с 4.14.

Нет, это невозможно на устройствах, которые еще не рутированы. Он использует Settings.System с ADB_ENABLED, но ADB_ENABLED является параметром безопасной системы, который не может быть изменен приложением.

Да, это можно сделать на рутированном телефоне.

Необходимо добавить разрешение android.permission.WRITE_SECURE_SETTINGS. Я знаю, вы спросите, как мне это сделать: вот ссылка на похожее приложение: https://play.google.com/store/apps/details?id=com.jim2&hl=en

При чем ADB_ENABLEDтут USB зарядка? Приложение, на которое вы ссылаетесь, позволяет отключить зарядку через USB?
Приложение позволяет отключить зарядку через USB после изменения настроек безопасности записи.
"Своего рода"? Какие шаги нужно предпринять?