From 2f0a104fcfea35d6a2a72609966e11e059e1f472 Mon Sep 17 00:00:00 2001 From: Paul Philippov Date: Sun, 23 Jan 2022 20:42:13 -0500 Subject: [PATCH] add more steps into installation.md, add tips for dumping fw with md. --- ru/help-uboot.md | 48 ++++++ ru/installation.md | 404 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 438 insertions(+), 14 deletions(-) create mode 100644 ru/help-uboot.md diff --git a/ru/help-uboot.md b/ru/help-uboot.md new file mode 100644 index 0000000..c3e63ce --- /dev/null +++ b/ru/help-uboot.md @@ -0,0 +1,48 @@ +Помощь: 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, установите +сохранение лога сессии. После чего в консоли загрузчика запустите команду чтения +данных из памяти длиной в объем флэш-памяти начиная с нулевого адреса. + +Используйте шестнадцатеричное представление для адресов памяти. Так 0 в +шестнадцатеричной записи выглядит как 0x0, 8 мегабайтов (8 * 1024 * 1024 = +8,388,608 байтов) выглядят как 0x800000, 16 мегабайтов (16 * 1024 * 1024 = +или 16,777,216 байтов) - как 0x1000000. + +Чтение 8МБ флэш-памяти: + +``` +md.b 0x0 0x800000 +``` + +Чтение 16МБ флэш-памяти: + +``` +md.b 0x0 0x1000000 +``` + +Будьте готовы к тому, что процесс передачи данных через серийное подключение +займет несколько часов. Зато в результате у вас будет полная копия оригинальной +прошивки, которую можно конвертировать в бинарный файл с помощью программы +[binwalk](https://github.com/ReFirmLabs/binwalk) и использовать для дальнейшего +изучения или для восстановления камеры в её оригинальный вид. diff --git a/ru/installation.md b/ru/installation.md index 140703d..71d3a14 100644 --- a/ru/installation.md +++ b/ru/installation.md @@ -25,7 +25,7 @@ TFTP расшифровывается как Trivial File Transfer Protocol. К и компактен, что TFTP клиенты используются в сетевых и встроенных системах для получения загрузочных образов с сетевых серверов. -#### Если на вашем компьютере Linux +#### Если на вашем компьютере Linux. Если на вашем компьютере установлен Linux, то здесь всё просто. Скомпилированный и готовый к использованию пакет сервера TFTP уже лежит в репозитории, и вам @@ -44,7 +44,7 @@ sudo systemctl restart tftpd-hpa.service sudo tar -C /srv/tftp/ -xvf openipc.*.tgz ``` -### Шаг 4. Подключение к порту UART. +### Шаг 4. Подключитесь к порту UART камеры. Для подключения к камере через порт UART вам понадобится [адаптер][ftdi] для создания подключения с серийного порта вашего компьютера. @@ -76,7 +76,7 @@ __Прежде чем подключать адаптер к камере, уб подключать питание камеры через `VCC` порт UART, а использовать для этого штатный разъем питания. -### Шаг 5. Загрузчик. +### Шаг 5. Получите доступ к консоли загрузчика. Перегрузите камеру и постарайтесь получить доступ к консоли загрузчика нажав требуемую комбинацию клавиш между моментом начала загрузки и до старта ядра @@ -91,27 +91,34 @@ __Прежде чем подключать адаптер к камере, уб еще большей надежности создайте текстовый файл на вашем компьютере и заносите в него все выполняемые команды и ответы системы. -После того как вы получили доступ в консоль загрузчика, наберите `help` и -проверьте список доступных вам команд. Убедитесь, что в списке команд -присутствует `tftp`. +### Шаг 6. Сохраните заводскую прошивку. + +После того как вы получили доступ в консоль загрузчика, наберите `help`, чтобы +вывести список доступных вам команд. Убедитесь, что в списке команд присутствует +`tftp`. Если такая команда есть, то сохранение оригинальной прошивки не должно +доставить проблем. Надо только настроить подключение камеры к вашему серверу +TFTP. + +NB! Если в вашем загрузчике нет tftp, вы всё ещё можете получить копию +оригинальной прошивки. [Подробности здесь](help-uboot.md). Проверьте настройки системного окружения командой `printenv`. Вас интересуют -настройки сетевого подключения: `ipaddr`, `netmask` и `serverip`. Первые два -параметра задают IP адрес и сетевую маску вашей камеры для подключения в -локальную сеть. Третий параметр -- IP адрес сервера TFTP, с которого и на -который будут передаваться файлы командой tftp. Установите нужные значения -командой `setenv` (используйте IP адреса и сетевую маску соответствующие вашей -сети). Сохраните установленные значения командой `saveenv`. +настройки сетевого подключения: `ipaddr`, `netmask`, `gatewayip` и `serverip`. +Первые три параметра задают IP адрес и сетевую маску вашей камеры, IP адрес +сетевого шлюза для подключения в локальную сеть. Четвёртый параметр -- IP адрес +сервера TFTP, с которого и на который будут передаваться файлы командой `tftp`. +Установите нужные значения командой `setenv` (используйте IP адреса и сетевую +маску соответствующие вашей сети). Сохраните установленные значения командой +`saveenv`. ``` setenv ipaddr 192.168.1.253 setenv netmask 255.255.255.0 +setenv gatewayip 192.168.1.1 setenv serverip 192.168.1.254 saveenv ``` -### Шаг 6. Сохранение заводской прошивки. - Большинство IP камер сегодня комплектуются чипами Nor или Nand флэш-памяти объемом 8 или 16 мегабайтов. Вы можете увидеть тип и размер установленной на вашей камере микросхемы в выводе лога загрузчика. Там будет что-то вроде этого: @@ -146,6 +153,375 @@ sf read 0x82000000 0x0 0x1000000 tftp 0x82000000 firmware-full.bin 0x1000000 ``` +### Шаг 7. Установите прошивку OpenIPC. + +Разные модели камер имеют разные наборы компонентов. Самые значимые из них -- +процессор и сенсор, -- напрямую влияют на качество изображения и набор функций, +присущих той или иной камере. Но и казалось бы менее значимые детали могут +устанавливать ограничения на возможности камеры и её прошивки. Например, у +разных камер могут отличаться установленные микросхемы флэш-памяти. Одни камеры +могут иметь флэш-память объемом 16 МБ, в то время как другие - 16 МБ, то и +больше. В больший объем флэш-памяти можно поместить большее количество +программного кода, позволить камере запускать дополнительные сервисы, которые +недоступны на камерах с меньшим объёмом флэш-памяти. Поэтому мы решили +собирать два варианта нашей прошивки: базовую версию (_Lite_) для камер с +объемом флэш-памяти 8 МБ и расширенную версию (_Ultimate_) с дополнительными +возможностями для камер с увеличенным объемом флэш-памяти. + +Процедура установка прошивки на разные модели камер отличается используемыми +адресами памяти и разными параметрами, устанавливаемыми в переменные окружения, +поэтому прежде чем продолжить, определите, какой именно тип процессора, какая +модель сенсора, какой объем памяти установлены на вашей камере. + +Дальше мы описываем процедуру установки прошивки OpenIPC Lite на примере камеры +c 8 МБ флэш-памяти. Даже если ваша камера имеет больший объем флэш-памяти, не +перелистывайте это текст. Прочитайте его внимательно, чтобы понять принцип и +последовательность действий. Конкретные команды, подходящие для вашей камеры, +мы дадим во второй части этого раздела. + +##### Часть первая. Пример. + +Для примера мы взяли камеру на процессоре hi3518ev100 с матрицей ov9712 и +64 мегабайтами памяти. Подключитесь к камере через порт UART и получите +доступ к консоли загрузчика. Установите параметры компонентов в соответствующие +переменные окружения: + +``` +setenv soc hi3518ev100 +setenv sensor ov9712 +setenv totalmem 64M +``` + +Установите переменные окружения для загрузки ядра и корневой файловой системы +новой прошивки: + +``` +setenv osmem 32M +setenv bootargs 'mem=${osmem:-32M} console=ttyAMA0,115200 panic=20 root=/dev/mtdblock3 rootfstype=squashfs init=/init mtdparts=hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)' +setenv bootcmd 'setenv setargs setenv bootargs ${bootargs}; run setargs; sf probe 0; sf read 0x42000000 0x50000 0x200000; bootm 0x42000000' +``` + +Установите переменные окружения для доступа камеры в сеть, где `ethaddr` -- +оригинальный MAC адрес вашей камеры, `ipaddr` -- IP адрес камеры в локальной +сети, `netmask` -- сетевая маска локальной сети, `gatewayip` -- IP адрес +маршрутизатора для доступа в сеть, `serverip` -- IP адрес сервера TFTP в +локальной сети. + +``` +setenv ethaddr 00:12:16:00:00:00 +setenv ipaddr 192.168.1.10 +setenv netmask 255.255.255.0 +setenv gatewayip 192.168.1.1 +setenv serverip 192.168.1.254 +``` + +Сохраните сделанные изменения во флэш-память. + +``` +saveenv +``` + +Дальше идет собственно сама процедура установки прошивки. + +Сначала очистите регион памяти с адреса 0x42000000 длиной 1000000 бит, записав +в него шестнадцатеричное значение ff. + +``` +mw.b 0x42000000 ff 1000000 +``` + +Затем получите с сервера TFTP файл с ядром для камеры и поместите его в память +начиная с адреса 0x42000000. + +``` +tftp 0x42000000 uImage.${soc} +``` + +Значение `$soc` в имени запрашиваемого файла подставляется из переменных +окружения, созданных выше по тексту. В нашем примере с сервера должен скачаться +файл с именем `uImage.hi3518ev100`. + +Внимательно читайте сообщения на экране терминала! Если какая-то из команд +завершилась ошибкой, выясните, что именно пошло не так. Может вы допустили +опечатку? В любом случае не продолжайте процедуру, пока все предыдущие команды +не отработают безошибочно. В противном случае вы можете остаться с неработающей +камерой! + +Итак, вы убедились, что файл скачан и размещен в оперативной памяти камеры. +Теперь вам необходимо записать его во флэш-память. Для этого надо открыть доступ +к флэш-памяти: + +``` +sf probe 0 +``` + +...затем стереть содержимое раздела с адреса 0x50000 длиной 0x200000 байтов: + +``` +sf erase 0x50000 0x200000 +``` + +...и записать в раздел флэш-памяти, начинающийся с адреса 0x50000, содержимое +оперативной памяти с адреса 0x42000000 длиною в размер файла ядра: + +``` +sf write 0x42000000 0x50000 ${filesize} +``` + +Далее, надо проделать такую же манипуляцию с образом корневой файловой системы, +записав его в следующий раздел флэш-памяти, начинающийся с адреса 0x250000 и +имеющий длину 0x500000 байтов (5242880 байтов в десятеричной системе, что +соответствует 5120 килобайтов, именно столько мы отвели под раздел rootfs в +параметрах bootargs). Порядок действий прост, и его довольно легко запомнить, +если понимать, какие именно действия вы производите и зачем: очистить память, +скачать файл, открыть доступ к флэш-памяти, стереть содержимое раздела, +записать скачанный файл. + +``` +mw.b 0x82000000 ff 1000000 +tftp 0x82000000 rootfs.squashfs.${soc} +sf probe 0 +sf erase 0x250000 0x500000 +sf write 0x82000000 0x250000 ${filesize} +``` + +После того как оба раздела успешно записаны во флэш-память и сделана необходимые +изменения в загрузчике для старта новой прошивки, наступило время перезагрузить +камеру. Для этого наберите в консоли следующую команду: + +``` +reset +``` + +##### Часть вторая. + +Если вы прочитали первую часть этого раздела (если нет -- идите и прочитайте), +то вы уже знаете, какие манипуляции и почему вам необходимо сделать, чтобы +установить прошивку OpenIPC. И всё, что вам нужно -- это команды, подходящие +для вашей конкретной камеры. + +Вот примеры команд для камер на процессорах [Goke](#goke), +[HiSilicon](#hisilicon), [SigmaStar/MStar](#sigmastarmstar), [XM](#xm). + +###### Goke + +Процессоры gk7202v300, gk7205v200, gk7205v300. + +``` +setenv soc # gk7202v300, gk7205v200, or gk7205v300. +setenv sensor # +setenv totalmem # 64M for gk7202v300, gk7205v200, 128M for gk7205v300. + +setenv osmem 32M +setenv bootargs 'mem=${osmem:-32M} console=ttyAMA0,115200 panic=20 root=/dev/mtdblock3 rootfstype=squashfs init=/init mtdparts=sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)' +setenv bootcmd 'setenv setargs setenv bootargs ${bootargs}; run setargs; sf probe 0; sf read 0x42000000 0x50000 0x200000; bootm 0x42000000' + +setenv ethaddr 00:00:00:00:00:00 +setenv ipaddr 192.168.1.10 +setenv netmask 255.255.255.0 +setenv gatewayip 192.168.1.1 +setenv serverip 192.168.1.254 + +saveenv + +mw.b 0x42000000 ff 1000000 +tftp 0x42000000 uImage.${soc} +sf probe 0 +sf erase 0x50000 0x200000 +sf write 0x42000000 0x50000 ${filesize} + +mw.b 0x42000000 ff 1000000 +tftp 0x42000000 rootfs.squashfs.${soc} +sf probe 0 +sf erase 0x250000 0x500000 +sf write 0x42000000 0x250000 ${filesize} + +reset +``` + +###### HiSilicon + +Процессоры hi3516ev200, hi3516ev300, hi3518ev300. + +``` +setenv soc # hi3516ev200, hi3516ev300, or hi3518ev300. +setenv sensor # +setenv totalmem # 64M for hi3516ev200, hi3518ev300, 128M for hi3516ev300. + +setenv osmem 32M +setenv bootargs 'mem=${osmem:-32M} console=ttyAMA0,115200 panic=20 root=/dev/mtdblock3 rootfstype=squashfs init=/init mtdparts=hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)' +setenv bootcmd 'setenv setargs setenv bootargs ${bootargs}; run setargs; sf probe 0; sf read 0x42000000 0x50000 0x200000; bootm 0x42000000' + +setenv ethaddr 00:00:00:00:00:00 +setenv ipaddr 192.168.1.10 +setenv netmask 255.255.255.0 +setenv gatewayip 192.168.1.1 +setenv serverip 192.168.1.254 + +saveenv + +mw.b 0x42000000 ff 1000000 +tftp 0x42000000 uImage.${soc} +sf probe 0 +sf erase 0x50000 0x200000 +sf write 0x42000000 0x50000 ${filesize} + +mw.b 0x42000000 ff 1000000 +tftp 0x42000000 rootfs.squashfs.${soc} +sf probe 0 +sf erase 0x250000 0x500000 +sf write 0x42000000 0x250000 ${filesize} + +reset +``` + +##### SigmaStar/MStar + +Процессоры ssc325, ssc335, ssc337. + +``` +setenv soc # ssc325, ssc335, or ssc337. +setenv sensor # gc2053, imx307, or sc3335. +setenv totalmem 64M + +setenv osmem 32M +setenv bootargs 'mem=${osmem:-32M} console=ttyS0,115200 panic=20 root=/dev/mtdblock3 rootfstype=squashfs init=/init LX_MEM=0x3fe0000 mma_heap=mma_heap_name0,miu=0,sz=0x1C00000 mma_memblock_remove=1 mtdparts=NOR_FLASH:256k(boot),64k(tech),2048k(kernel),5120k(rootfs),-(rootfs_data)' +setenv bootcmd 'setenv setargs setenv bootargs ${bootargs}; run setargs; sf probe 0; sf read 0x21000000 0x50000 0x200000; bootm 0x21000000' + +setenv ethaddr 00:00:00:00:00:00 +setenv ipaddr 192.168.1.10 +setenv netmask 255.255.255.0 +setenv gatewayip 192.168.1.1 +setenv serverip 192.168.1.254 + +saveenv + +mw.b 0x21000000 ff 1000000 +tftpboot 0x21000000 uImage.${soc} +sf probe 0 +sf erase 0x50000 0x200000 +sf write 0x21000000 0x50000 ${filesize} + +mw.b 0x21000000 ff 1000000 +tftpboot 0x21000000 rootfs.squashfs.${soc} +sf probe 0 +sf erase 0x250000 0x500000 +sf write 0x21000000 0x250000 ${filesize} + +reset +``` + +##### XM + +Процессоры xm510, xm530, xm550. + +``` +setenv soc # xm510 for xm510, xm530 for both xm530 and xm550. +setenv sensor # +setenv totalmem # 32M for xm510, 64M for xm530, 128M for xm550. + +setenv osmem # 18M for xm510, 35M for xm530, 64M for xm550. +setenv bootargs 'mem=$(osmem) console=ttyAMA0,115200 panic=20 root=/dev/mtdblock3 rootfstype=squashfs init=/init mtdparts=xm_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)' +setenv bootcmd 'sf probe 0; sf read 0x80007fc0 0x50000 0x200000; bootm 0x80007fc0' + +setenv ethaddr 00:00:00:00:00:00 +setenv ipaddr 192.168.1.10 +setenv netmask 255.255.255.0 +setenv gatewayip 192.168.1.1 +setenv serverip 192.168.1.254 + +saveenv + +mw.b 0x80007fc0 ff 1000000 +tftp 0x80007fc0 uImage.${soc} +sf probe 0 +sf erase 0x50000 0x200000 +sf write 0x80007fc0 0x50000 ${filesize} + +mw.b 0x80007fc0 ff 1000000 +tftp 0x80007fc0 rootfs.squashfs.${soc} +sf probe 0 +sf erase 0x250000 0x500000 +sf write 0x80007fc 0x250000 ${filesize} + +reset +``` + +### Шаг 8. Первая загрузка. + +Если все предыдущие шаги выполнены правильно, ваша камера должна стартовать уже +с новой прошивкой. Добро пожаловать в OpenIPC! + +После первой загрузки с новой прошивкой вам нужно очистить перекрывающий раздел, +запустив для этого программу + +``` +firstboot +``` + +### Шаг в сторону. + +Для облегчения последующих процедур обновления прошивки из консоли загрузчика, +создайте два макро, записав в них последовательности команд, необходимых для +загрузки с сервера TFTP и записи во флэш-память ядра и корневой файловой системы +для вашей модели камеры. + +Мы будем использовать `uk` и `ur` для имен макро, что можно расшифровать как +`update kernel` и `update rootfs`. Легко запомнить. + +Вы помните, что в примере с установкой прошивки на камеру с hi3518ev100 мы +использовали следующие команды для установки ядра: + +``` +mw.b 0x42000000 ff 1000000 +tftp 0x42000000 uImage.${soc} +sf probe 0 +sf erase 0x50000 0x200000 +sf write 0x42000000 0x50000 ${filesize} +``` + +Чтобы создать макро `uk`, соберите все команды в одну строку, чередуя их +точками-с-запятой. Для дополнительной защиты от записи неверных данных во +флэш-память в том случае, когда не удалось скачать файл с сервера TFTP, +замените точку-с-запятой перед командой `sf probe 0` на оператор логической И +(`&&`). В таком случае выполнение макро прервется, если скачивании файла +завершилось с ошибкой. + +``` +fw_setenv uk 'mw.b 0x42000000 ff 1000000; tftp 0x42000000 uImage.${soc} && sf probe 0; sf erase 0x50000 0x200000; sf write 0x42000000 0x50000 ${filesize}' +``` + +Проделайте то же с командами установки корневой файловой системы + +``` +mw.b 0x82000000 ff 1000000 +tftp 0x82000000 rootfs.squashfs.${soc} +sf probe 0 +sf erase 0x250000 0x500000 +sf write 0x82000000 0x250000 ${filesize} +``` + +..., записав результат в макро `ur`: + +``` +fw_setenv ur 'mw.b 0x42000000 ff 1000000; tftp 0x42000000 rootfs.squashfs.${soc} && sf probe 0; sf erase 0x250000 0x500000; sf write 0x42000000 0x250000 ${filesize}' +``` + +Естественно, для создания своих собственных макро, вы должны использовать +команды для вашей конкретной камеры, не бездумно копируя вышеприведенные строки, +но используя их как пример и понимая суть совершаемых действий. + +Обратите внимание, что хоть эти команды и создают макро для запуска в консоли +загрузчика, выполнить их надо в среде линукса. Таким образом мы избегаем +ограничений на количество аргументов в команде `setenv` в некоторых старых +версиях загрузчиков. + +Теперь вы сможете запускать прошивку ядра и корневой файловой системы из +консоли загрузчика с последующей перезагрузкой камеры командой + +``` +run uk; run ur; reset +``` _...to be continued._