mirror of https://github.com/OpenIPC/wiki.git
153 lines
9.5 KiB
Markdown
153 lines
9.5 KiB
Markdown
# 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 уже стандартными
|
||
средствами.
|