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