wiki/ru/help-uboot.md

153 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# OpenIPC Wiki
[Оглавление](../README.md)
Помощь: U-boot
------------
### Переменные окружения
Если при попытке сохранения переменной вы получаете ошибку `Too many args`,
попробуйте повторить операцию из среды линукс, заменив `setenv` на `fw_setenv`.
__U-boot console:__
```
hisilicon # setenv uk 'mw.b 0x82000000 ff 1000000; tftp 0x82000000 uImage.${soc}; sf probe 0; sf erase 0x50000 0x200000; sf write 0x82000000 0x50000 ${filesize}'
** Too many args (max. 16) **
```
__OpenIPC Linux:__
```
root@openipc-hi3518ev100:~# fw_setenv uk 'mw.b 0x82000000 ff 1000000; tftp 0x82000000 uImage.${soc}; sf probe 0; sf erase 0x50000 0x200000; sf write 0x82000000 0x50000 ${filesize}'
root@openipc-hi3518ev100:~#
```
### Сохранение заводской прошивки без tftp.
В программе-терминале, используемой для подключения к порту UART, установите
сохранение лога сессии. В качестве примера мы используем программу-терминал
`screen`. В этом случае команда подключения к UART-адаптеру с сохранением лога
сессии в файл _fulldump.log_ будет выглядеть примерно так:
```
$ screen -L -Logfile fulldump.log /dev/ttyUSB0 115200
```
После чего в консоли загрузчика запустите серию команд для чтения полного объема
содержимого флэш памяти сначала в оперативную память камеры, а затем вывод
шестнадцатеричного представления этих данных из оперативной памяти на экран.
Используйте шестнадцатеричную запись для адресов памяти.
Так 0 в шестнадцатеричном представлении выглядит как 0x0,
8 мегабайтов (8 * 1024 * 1024 = 8,388,608 байтов) -- как 0x800000,
16 мегабайтов (16 * 1024 * 1024 = или 16,777,216 байтов) -- как 0x1000000.
Чтение 8МБ флэш-памяти:
```
mw.b 0x82000000 ff 0x800000
sf probe 0
sf read 0x82000000 0x0 0x800000
md.b 0x82000000 0x800000
```
Чтение 16МБ флэш-памяти:
```
mw.b 0x82000000 ff 0x1000000
sf probe 0
sf read 0x82000000 0x0 0x1000000
md.b 0x82000000 0x1000000
```
После запуска команды чтения содержимого памяти вы можете отсоединить сессию,
чтобы случайное нажатие клавиш не замусорило лог. В `screen` это делается
последовательным нажатием комбинации клавиш `Ctrl-a` и клавиши `d` (detach).
Для последующего присоединения к запущенной сессии используйте команду
`screen -r`.
Будьте готовы к тому, что процесс передачи данных через серийное подключение
займет несколько часов. Зато в результате у вас будет полная копия оригинальной
прошивки, которую можно конвертировать в бинарный файл и использовать для дальнейшего
изучения или для восстановления камеры в её оригинальный вид.
```
cat fulldump.log | sed -E "s/^[0-9a-f]{8}\b: //i" | sed -E "s/ {4}.{16}\r?$//" > fulldump.hex
xxd -revert -plain fulldump.hex fulldump.bin
```
Используйте [binwalk](https://github.com/ReFirmLabs/binwalk) для доступа к содержимому
бинарного файла.
#### Сохранение прошивки через SD карту.
Бывает, что у камеры есть только беспроводной доступ, который не работает
напрямую из загрузчика. Очень часто такие камеры имеют разъём для внешней карты
памяти формата microSD. В таком случае можно попробовать получить копию
оригинальной прошивки используя карту как носитель-посредник. Объем данных,
которые вам потребуется сохранить -- не более 16 МБ, поэтому подойдет любая
доступная карта, даже самого маленького объема.
Вставьте карту в соответствующий разъем на камере, подключите серийный адаптер
к порту UART, подайте питание на камеру и остановите процесс загрузки так,
чтобы оказаться в консоли загрузчика.
Инициализируйте доступ к карте, и очистите место для сохранения копии прошивки.
Запись на карту производится блоками по 512 байтов. Для очистки 8 МБ вам
потребуется стереть 16384 таких блоков, а для 16 МБ - 32768, что в
шестнадцатеричном представлении будет 0x4000 и 0x8000, соответственно.
Обратите внимание, что мы используем прямой доступ к регистрам карты, минуя
таблицу разделов. Чтобы избежать конфликтов при обращении к данным карты, мы
будем записывать данные пропустив 8 килобайтов от начала (8 * 1024 = 8192 байтов
или 16 блоков по 512 байтов, или 0x10 блоков в шестнадцатеричном представлении)
```
mmc dev 0
mmc erase 0x10 0x8000
```
Теперь вам надо скопировать содержимое прошивки из микросхемы флэш-памяти в
оперативную память камеры. Для этого очистите участок оперативной памяти
(0x800000 байтов для микросхем объемом 8 МБ или 0x1000000 байтов для микросхем
объемом 16 МБ), получите доступ к микросхеме флэш-памяти и скопируйте весь объем
флэш-памяти в очищенное пространство оперативной памяти. После чего сохраните
скопированные данные из оперативной памяти на карту.
NB! В примере мы используем стартовый адрес 0x2000000, но этот параметр может
отличаться у разных моделей камер.
```
mw.b 0x2000000 ff 0x1000000
sf probe 0
sf read 0x2000000 0x0 0x1000000
mmc write 0x2000000 0x10 0x8000
```
Выньте карту из камеры и вставьте в компьютер с операционной системой Linux.
Используя команду `dd` скопируйте данные с карты в бинарный файл на диске
компьютера.
```
dd bs=512 skip=16 count=32768 if=/dev/sdc of=./fulldump.bin
```
### Обход запароленного загрузчика.
Смена загрузчика -- рискованная операция. Уж слишком высоки шансы превратить
камеру в пресс-папье, если что-то пойдёт не так. Поэтому прежде чем прошивать
новый загрузчик надо взвесить все риски и бенефиты.
В большинстве случаев оригинальный загрузчик плюс новое ядро и новая
операционная система -- вполне рабочий вариант. Но бывают исключения.
Последнее время всё чаще встречаются камеры, на которых доступ в консоль
загрузчика закрыт паролем. То есть даже если вы подключитесь к камере через
порт UART, всё, что вам будет доступно после прерывания стандартного цикла
загрузки -- это приглашение ввести пароль. В таком случае относительно
безопасным решением будет даунгрейд родной прошивки до версии, где ещё не
требовался пароль. Например, у камер Xiongmai пароль в загрузчике появился
где-то в районе июля 2021 года, следовательно, вам понадобится файл с фирменной
прошивкой от вашей камеры с более ранней датой. После успешного даунгрейда на
беспарольный загрузчик вы сможете установить прошивку OpenIPC уже стандартными
средствами.