Как получить доступ к UART телефонов Galaxy S7

Так уж вышло, что мне потребовалось получить доступ к UART на Galaxy S7. И, естественно, я обратился к гуглу с  этим вопросом. На XDA было несколько топиков, посвященных этому вопросу, но все они были старыми (2012-2013 год), с информацией о старом загрузчике. Кроме того, информацией о использовании UART с загрузчиком все и ограничивалось. А мне же нужно было получить доступ к Android. Здесь я постараюсь структурировать всю полученную мной информацию.

Начать стоит с того, что между USB-коннектором и USB-контроллером стоит мультиплексор (MUIC), который определяем сопротивление между ножкой ID и землей (GND), и в зависимости от этого сопротивления выставляет режим работы USB-контроллера. Это не новость: так, например, работает USB OTG. Но есть и другие режимы работы, которые являются скрытыми. Этими режимами работы пользуется специальное устройство, используемое инженерами Samsung. Такое устройство можно заказать на eBay, но я не вижу смысла. Исходные коды ядра, используемого в телефоне, доступны для скачивания, и там есть драйвер этого мультиплексора.

Этот MUIC на S7 оказался MAX77854, документацию на который найти не удалось, но у нас есть драйвер. Драйвер этого MUIC-устройства можно посмотреть здесь: drivers/muic/max77854-muic.c Полазив по исходникам, я нашел актуальную таблицу сопротивлений и режимов работы для этого устройства:

  • OTG = GND
  • MHL = 1K
  • VZW_ACC = 28.7K
  • VZW_INCOMPATIBLE = 34K
  • RDU_TA = 40.2K
  • HMT = 49.9K
  • AUDIODOCK = 64.9K
  • USB_LANHUB = 80.07K
  • CHARGING_CABLE = 102K
  • GAMEPAD = 121K
  • TYPE1_CHG = 200K
  • JIG_USB_OFF = 255K
  • JIG_USB_ON = 301K
  • DESKDOCK = 365K
  • TYPE2_CHG = 442K
  • JIG_UART_OFF = 523K
  • JIG_UART_ON = 619K
  • TA = OPEN
  • USB = OPEN
  • CDP = OPEN
  • UNDEFINED_CHARGING = UNDEFINED
  • ATTACHED_DEV_NUM = NUM

Я понятия не имею, что значит большинство этих режимов, но есть очень интересный режим JIG_UART_ON, который был уже немного изучен и который позволял через переходник USB-UART подключиться к устройству и видеть лог загрузки SBOOT. Мне очень помогла вот эта статья про SBOOT, в которой человек изучал возможность взлома загрузчика и сумел понять, как получить возможность менять параметры загрузчика, в том числе и параметры загрузки ядра.

В первую очередь необходимо собрать переходник JIG(UART)-переходник. Для этого нам потребуется любой USB-UART переходник (я использовал вот такой на FT232)  и резистор на 619КОм (в близжайшек к моему дому магазине я купил на 620K) и собрать это все в вот такую схемку:

Собранный переходник подключаем к компьютеру, в моей системе он появился как /dev/ttyUSB0, подключаемся к нему терминалом (я использовал minicom):

sudo minicom -D /dev/ttyUSB0

Я не знаю, какие будут у вас настройки по умолчанию для вашей программы, потому настоятельно рекомендую зайти в настройки порта и выключить аппаратное управление потоком. Дальше необходимо подключить к этому переходнику сам телефон и включить его комбинацией клавиш: Vol-(Volume Down) + Power

Как только на экран начнут появляться символы, нужно начать спамить клавишу Enter (если кого интересует более точное значение, то нужно нажать минимум 3 раза) до момента появления приглашения к вводу. Мы оказались в консоли SBOOT. В консоли выполняем команду:

setenv CMDLINE console=ttySAC4,115200 loglevel=4
saveenv

После этого зажимаем Vol-(Volume Down) (если эта клавиша не нажата, то SBOOT не будет ничего печатать в консоль) и вводим в консоль SBOOT команду:

reset

Устройство перезагрузится, и мы увидим лог загрузки SBOOT и часть лога загрузки ядра. Почему только часть? Потому что в исходниках ядра я нашел одну маленькую нелогичность, патч исправляющий эту нелогичность ниже:

 

diff --git a/drivers/muic/universal/muic_apis.c b/drivers/muic/universal/muic_apis.c
index 342bc51..5af193c 100755
--- a/drivers/muic/universal/muic_apis.c
+++ b/drivers/muic/universal/muic_apis.c
@@ -796,7 +796,7 @@ int detach_jig_uart_boot_off(muic_data_t *pmuic)
*/
int attach_jig_uart_boot_on(muic_data_t *pmuic, muic_attached_dev_t new_dev)
{
- int com_index = COM_OPEN;
+ int com_index = COM_UART_AP;
int ret = 0;

pr_info("%s:%s JIG UART BOOT-ON(0x%x)\n",

 

После его применения можно будет увидеть весь лог загрузки ядра, правда мы сломаем GSM-часть телефона. Этот UART-порт используется системой для общения с GSM-модемом (получается, что нелогичность все таки имела логику). В принципе на данном этапе уже можно использовать все это для отладки ядра, но мы  добивались не этого, попробуем получить консоль системы, не через adb, а через UART, используя полученные ранее данные.

Для этого потребуется установить на свой телефон TWRP, и, используя его, рутануть телефон. Потом поставить вот этот пакет с busybox, который отличается от стандартного тем, что там есть getty. Теперь загружаемся, устанавливаем эмулятор терминала и переводим телефон в авиарежим. Открываем эмулятор и вводим следующие команды:

su
echo 1 > /sys/devices/virtual/sec/switch/uart_en
echo AP > /sys/devices/virtual/sec/switch/uart_sel #на этом этапе должен появиться лог ядра 
su root -c "getty -n -L -l /system/bin/sh 115200 ttySAC4 vt102"

Полезные материалы:

dreamway89

dreamway89 wrote 29 posts

Post navigation


Comments

  • Alexey Min

    Samsung Galaxy S5 EUR/International (klte) — есть упоминания той же самой магической константы, в комментарии, но драйвер MUIC похоже маленько в другом месте лежит:

    drivers/misc/max77804k-muic.c:103: ADC_JIG_UART_ON = 0x1d, /* 0x11101 619K ohm */
    drivers/misc/max77804k-muic.c:104: ADC_CARDOCK = 0x1d, /* 0x11101 619K ohm */

    ( https://github.com/LineageOS/android_kernel_samsung_msm8974/blob/lineage-16.0/drivers/misc/max77804k-muic.c#L103 )

    интересно что 0x1d всего лишь 29, а не 619 никак..)

    • dreamway89

      Это может мыть просто параметр(битовая маска) на основе которого конфигурируется система.

Добавить комментарий

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>