Hatred's Log Place

DON'T PANIC!

May 15, 2024 - 4 minute read - Linux

Восстановление через U-Boot

Хотел на Khadas VIM3 выключить DWC3 (USB Host controller), сделал оверлей, поместил в /boot/dtb/overlays/kvim3, добавил запись в /boot/env.txt и… получил кирпич.

Оверлей простой и, вроде, правильный (в конце приведу), но система отказалась загружаться. Возможно на его клоки или ещё что что-то завязано, что не даёт ядру загружаться дальше. Но возникает резонный вопрос: “Шо делать!?”

Дальше посмотрим один из вариантов, как это можно решить. Возможно пригодится и на других платформах.

Вариант номер раз и самый просто: перейти в загрузчик и заново прошить систему. Сработает 100%, но всё, что установлено и настроено будет потеряно. Не подходит. Думаем дальше.

При загрузке система выводит логи на UART. Подключаем (пины 17(GND), 18 (RX), 19 (TX), TTL - 3v3, адаптер лучше на такое напряжение, а то вместо восстановления может выйти горевшая плата). Видим логи от U-Boot. Потом загрузку ядра и ступор. А меж тем, выше начала загрузки ядра можно заметить строчку, говорящую, что можно прервать нормальную загрузку ядра нажатием Enter. Зажимаем Enter и перегружаем плату и мы попадаем в U-Boot.

Далее логика простая: нужно отредактировать файл /boot/env.txt и убрать от туда упоминание нашего overlay.

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

Далее последовательность действий.

Загружаем наш файл в память:

ext4load mmc 1:5 0x80000000 /boot/env.txt

Адрес 0x80000000 выбран произвольно, главное, что бы он присутствовал и был достаточно большим, что бы не переписать структуры U-Boot.

Результат:

kvim3#ext4load mmc 1:5 0x80000000 /boot/env.txt    
4575 bytes read in 6 ms (744.1 KiB/s)

Запоминаем размер в байтах и сразу переводим его в HEX: 0x11DF. Все команды воспринимают именно в HEX значения.

Сохраняем резервную копию:

ext4write mmc 1:5 0x80000000 /boot/env.txt.old 0x11DF 0

Смотрим:

md.b 0x80000000 0x11DF

Весь вывод приводить не буду, покажу начало и конец:

kvim3#md.b 0x80000000 0x11DF  
80000000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ################  
80000010: 23 23 23 23 23 23 23 23 23 23 23 23 23 44 4f 20    #############DO    
80000020: 4e 4f 54 20 54 4f 55 43 48 20 54 48 49 53 20 4f    NOT TOUCH THIS O  
80000030: 50 54 49 4f 4e 23 23 23 23 23 23 23 23 23 23 23    PTION###########
...
80001190: 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65    eed to be remove  
800011a0: 64 0a 6f 76 65 72 6c 61 79 73 3d 75 61 72 74 33    d.overlays=uart3  
800011b0: 20 70 77 6d 5f 66 20 69 32 63 33 20 69 32 73 20     pwm_f i2c3 i2s    
800011c0: 70 68 69 6c 6c 69 6e 20 77 61 74 63 68 64 6f 67    phillin watchdog  
800011d0: 20 64 69 73 61 62 6c 65 2d 64 77 63 33 0a 0a        disable-dwc3..

Пишем пробелы вместо disable-dwc3 (12 символов), все значения - HEX. Судя по дампу, начало записи - 0x800011d0 + 1 = 0x800011d1

mw.b 0x800011d1 0x20 12

Снова смотрим. И как только результат устраивает - пишем:

ext4write mmc 1:5 0x80000000 /boot/env.txt 0x11DF 0

После чего проверяем процедуру чтения в память и отображения и:

cfgload

что загружает систему в случае Khadas.

Как варианты:

  1. Так как изменения строго в конце - можно просто записать на N байт меньше.
  2. Если изменения в середине и переписать пробелами (0x20) не получится - наш друг cp.b src dst count. В общем, почувствуй себя текстовым редактором!
  3. Если файл огромный (не лезет в память), можно прочитать его частично: у команд ext4load/ext4write можно указать размер и смещение. У ext4write мы пользовались размером, указывая смещение 0.

Полезные команды.

Список MMC:

mmc list

А вообще, я перебором нашёл, тут команда ls в помощь:

ls mmc 1:5 /boot

Команда usb может использоваться для работы с USB накопителем. Для sd карт тоже есть функционал. Главное, что бы он был доступен в U-Boot.

DTS overlay

А вот и виновник:

/dts-v1/;  
/plugin/;  
/ {  
       fragment@0 {  
               target = <&dwc3>;  
               __overlay__ {  
                       status = "disabled";  
               };  
       };  
};

Компилировать:

dtc -I dts -O dtb disable-dwc3.dts -o disable-dwc3.dtbo

Tags: Linux u-boot repair

KDE 6 и HiDPI Thinkpad P15Gen2: Linux Vendor Firmware Service (LVFS)

comments powered by Disqus