Хотел на 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.
Как варианты:
- Так как изменения строго в конце - можно просто записать на N байт меньше.
- Если изменения в середине и переписать пробелами (0x20) не получится - наш друг
cp.b src dst count
. В общем, почувствуй себя текстовым редактором! - Если файл огромный (не лезет в память), можно прочитать его частично: у команд
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