Так уж вышло, что мне потребовалось получить доступ к 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"
Полезные материалы: