# 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 уже стандартными средствами.