Запуск OpenIPC на камере Ростелеком IPC-HFW1230SP/IPC-HDW1230SP

OpenIPC

Эта модель является камерой Dahua DH-IPC1230SP, но с другой прошивкой. Долго разбирался с ней, но с помощью камрадов из сообщества OpenIPC результат таки был достигнут. Как восстановить эту модель до оригинала рассказано в статье Отвязка от Ростелеком камеры IPC-HFW1230SP/IPC-HDW1230SP, а здесь про другое. Заниматься этим стоит разве что чисто с исследовательскими целями, т.к. имеет место проблема с драйвером сенсора и картинка выглядит очень плохо.

Прошивка OpenIPC находится в статусе разработки и это нужно учитывать при работе с ней. Всё течёт, всё меняется и когда-то OpenIPC станет универсальным и стабильным продуктом, но пока это не так. В процессе настройки возможны сбои.

Платформа

  • Процессор hi3516cv300
  • Память nand
  • Сенсор ov2735

Возможности

• Загрузчик OpenIPC
• Веб-интерфейс
• Протоколы: RTSP, ONVIF, JPEG, MJPEG
• Облако IP EYE (бесплатная трансляция, только H264)
• Переключение режима день/ночь по датчику освещённости
• При изменении настроек Majestic нужно перезапускать камеру.
• Картинка есть, но нее всё с ней хорошо и качество изображения вряд ли кого-то устроит. Что-то не то с драйвером или ещё с чем-то.

Подготовка

Качаем с GitHub архивы с загрузчиком и образами ядра и файловой системы для имеющегося процессора.

Загрузчик кладём в папку tftp-сервера как есть, а образы ядра и файловой системы нужно предварительно распаковать.

Для прошивки понадобится подключиться через UART, что соответственно, потребует адаптер USB-TTL, коннектор к нему и программу-терминал. Подробнее об этом в статье Работа с загрузчиком.

Подключение

  • Подключаем коннектор к камере и адаптеру.
  • Подключаем адаптер к компьютеру – появится виртуальный COM-порт. Исхожу из того, что драйверы уже установлены.
  • Запускаем терминал.
  • Подаём питание на камеру и, как только побежит лог загрузки, нажимаем любую клавишу для остановки запуска и попадания в загрузчик.

Приглашение ввода выглядит так:

hi3516cv300-vc #

Прошивка

Загрузчик

Прошьём загрузчик.

mw.b 0x82000000 0xff 0x100000
tftp 0x82000000 u-boot-hi3516cv300-universal.bin
nand erase 0x0 0x100000
nand write.i 0x82000000 0x0 0x100000

reset

Если всё прошло успешно, после перезапуска системы нужно будет снова нажимать любую клавишу для остановки и попадания уже в загрузчик OpenIPC.

OpenIPC #

Для понимания торжественности момента, предлагаю ввести printenv и оценить всю красоту:

bootargs=mem=${osmem} console=ttyAMA0,115200 panic=20 root=/dev/mtdblock3 rootfstype=squashfs init=/init mtdparts=${mtdparts}
bootcmd=setenv setargs setenv bootargs ${bootargs}; run setargs; sf probe 0; sf read ${baseaddr} 0x50000 0x300000; bootm ${baseaddr}; reset
bootdelay=1
baudrate=115200
ethaddr=00:00:23:34:45:66
ipaddr=192.168.1.10
serverip=192.168.1.254
gatewayip=192.168.1.1
netmask=255.255.255.0
bootfile="uImage"
baseaddr=0x82000000
uknor8m=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} uImage.${soc} && sf probe 0; sf erase 0x50000 0x200000; sf write ${baseaddr} 0x50000 ${filesize}
uknor16m=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} uImage.${soc} && sf probe 0; sf erase 0x50000 0x300000; sf write ${baseaddr} 0x50000 ${filesize}
urnor8m=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} rootfs.squashfs.${soc} && sf probe 0; sf erase 0x250000 0x500000; sf write ${baseaddr} 0x250000 ${filesize}
urnor16m=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} rootfs.squashfs.${soc} && sf probe 0; sf erase 0x350000 0xa00000; sf write ${baseaddr} 0x350000 ${filesize}
uknand=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} uImage.${soc} && nand erase 0x100000 0x300000; nand write ${baseaddr} 0x100000 0x300000
urnand=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} rootfs.ubi.${soc} && nand erase 0x400000 0x7c00000; nand write ${baseaddr} 0x400000 ${filesize}
mtdparts=hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)
mtdpartsubi=setenv mtdparts hinand:256k(boot),768k(wtf),3072k(kernel),-(ubi)
mtdpartsnand=setenv mtdparts hinand:256k(boot),768k(wtf),3072k(kernel),10240k(rootfs),-(rootfs_data)
mtdpartsnor8m=setenv mtdparts hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)
mtdpartsnor16m=setenv mtdparts hi_sfc:256k(boot),64k(env),3072k(kernel),10240k(rootfs),-(rootfs_data)
nfsroot=/srv/nfs/hi3516cv300
bootargsnfs=mem=${osmem} console=ttyAMA0,115200 panic=20 root=/dev/nfs rootfstype=nfs ip=${ipaddr}:::255.255.255.0::eth0 nfsroot=${serverip}:${nfsroot},v3,nolock rw
bootargsubi=mem=${osmem} console=ttyAMA0,115200 panic=20 init=/init root=ubi0:rootfs rootfstype=ubifs ubi.mtd=3,2048 mtdparts=${mtdparts}
bootnfs=setenv setargs setenv bootargs ${bootargsnfs}; run setargs; tftpboot ${baseaddr} uImage.${soc}; bootm ${baseaddr}
bootcmdnand=setenv setargs setenv bootargs ${bootargs}; run setargs; nand read ${baseaddr} 0x100000 0x300000; bootm ${baseaddr}
bootcmdubi=setenv setargs setenv bootargs ${bootargsubi}; run setargs; nand read ${baseaddr} 0x100000 0x300000; bootm ${baseaddr}
bootcmdnor=setenv setargs setenv bootargs ${bootargs}; run setargs; sf probe 0; sf read ${baseaddr} 0x50000 0x300000; bootm ${baseaddr}
setnand=run mtdpartsubi; setenv bootcmd ${bootcmdubi}; saveenv; reset
setnor8m=run mtdpartsnor8m; setenv bootcmd ${bootcmdnor}; saveenv; reset
setnor16m=run mtdpartsnor16m; setenv bootcmd ${bootcmdnor}; saveenv; reset
restore=n
osmem=32M
soc=hi3516cv300
stdin=serial
stdout=serial
stderr=serial
totalmem=256M
verify=n
ver=U-Boot 2010.06 (Nov 14 2022 - 19:27:03)

Environment size: 3056/65532 bytes

В загрузчике присутствуют необходимые макросы, поэтому всё стало намного проще. Сначала переключим загрузчик на тип памяти NAND командой setnand:

run setnand

После перезагрузки, введя снова printenv обнаружим, что разметка теперь другая:

bootdelay=1
baudrate=115200
ethaddr=00:00:23:34:45:66
ipaddr=192.168.1.10
serverip=192.168.1.254
gatewayip=192.168.1.1
netmask=255.255.255.0
bootfile="uImage"
baseaddr=0x82000000
uknor8m=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} uImage.${soc} && sf probe 0; sf erase 0x50000 0x200000; sf write ${baseaddr} 0x50000 ${filesize}
uknor16m=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} uImage.${soc} && sf probe 0; sf erase 0x50000 0x300000; sf write ${baseaddr} 0x50000 ${filesize}
urnor8m=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} rootfs.squashfs.${soc} && sf probe 0; sf erase 0x250000 0x500000; sf write ${baseaddr} 0x250000 ${filesize}
urnor16m=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} rootfs.squashfs.${soc} && sf probe 0; sf erase 0x350000 0xa00000; sf write ${baseaddr} 0x350000 ${filesize}
uknand=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} uImage.${soc} && nand erase 0x100000 0x300000; nand write ${baseaddr} 0x100000 0x300000
urnand=mw.b ${baseaddr} ff 1000000; tftpboot ${baseaddr} rootfs.ubi.${soc} && nand erase 0x400000 0x7c00000; nand write ${baseaddr} 0x400000 ${filesize}
mtdpartsubi=setenv mtdparts hinand:256k(boot),768k(wtf),3072k(kernel),-(ubi)
mtdpartsnand=setenv mtdparts hinand:256k(boot),768k(wtf),3072k(kernel),10240k(rootfs),-(rootfs_data)
mtdpartsnor8m=setenv mtdparts hi_sfc:256k(boot),64k(env),2048k(kernel),5120k(rootfs),-(rootfs_data)
mtdpartsnor16m=setenv mtdparts hi_sfc:256k(boot),64k(env),3072k(kernel),10240k(rootfs),-(rootfs_data)
nfsroot=/srv/nfs/hi3516cv300
bootargsnfs=mem=${osmem} console=ttyAMA0,115200 panic=20 root=/dev/nfs rootfstype=nfs ip=${ipaddr}:::255.255.255.0::eth0 nfsroot=${serverip}:${nfsroot},v3,nolock rw
bootargsubi=mem=${osmem} console=ttyAMA0,115200 panic=20 init=/init root=ubi0:rootfs rootfstype=ubifs ubi.mtd=3,2048 mtdparts=${mtdparts}
bootnfs=setenv setargs setenv bootargs ${bootargsnfs}; run setargs; tftpboot ${baseaddr} uImage.${soc}; bootm ${baseaddr}
bootcmdnand=setenv setargs setenv bootargs ${bootargs}; run setargs; nand read ${baseaddr} 0x100000 0x300000; bootm ${baseaddr}
bootcmdubi=setenv setargs setenv bootargs ${bootargsubi}; run setargs; nand read ${baseaddr} 0x100000 0x300000; bootm ${baseaddr}
bootcmdnor=setenv setargs setenv bootargs ${bootargs}; run setargs; sf probe 0; sf read ${baseaddr} 0x50000 0x300000; bootm ${baseaddr}
setnand=run mtdpartsubi; setenv bootcmd ${bootcmdubi}; saveenv; reset
setnor8m=run mtdpartsnor8m; setenv bootcmd ${bootcmdnor}; saveenv; reset
setnor16m=run mtdpartsnor16m; setenv bootcmd ${bootcmdnor}; saveenv; reset
restore=n
osmem=32M
soc=hi3516cv300
mtdparts=hinand:256k(boot),768k(wtf),3072k(kernel),-(ubi)
bootcmd=setenv setargs setenv bootargs ${bootargsubi}; run setargs; nand read ${baseaddr} 0x100000 0x300000; bootm ${baseaddr}
stdin=serial
stdout=serial
stderr=serial
totalmem=256M
verify=n
ver=U-Boot 2010.06 (Nov 14 2022 - 19:27:03)
setargs=setenv bootargs mem=${osmem} console=ttyAMA0,115200 panic=20 init=/init root=ubi0:rootfs rootfstype=ubifs ubi.mtd=3,2048 mtdparts=${mtdparts}
bootargs=mem=32M console=ttyAMA0,115200 panic=20 init=/init root=ubi0:rootfs rootfstype=ubifs ubi.mtd=3,2048 mtdparts=hinand:256k(boot),768k(wtf),3072k(kernel),-(ubi)

Environment size: 3213/65532 bytes

Меняем serverip на адрес своего компьютера, задаём свой сенсор, MAC-адрес и сохраняем:

setenv serverip 192.168.1.128
setenv sensor ov2735_i2c
setenv ethaddr 00:12:34:56:78:90    //MAC-адрес с наклейки камеры

saveenv

Далее загружаем ядро, загружаем файловую систему и перезапускаем:

run uknand
run urnand

reset

После перезапуска видим в консоли приглашение:

openipc-hi3516cv300 login:

Система запущена! Логин: root, пароль пустой. Можно открывать веб-морду и смотреть, что там и как.

Для того чтобы определить какой адрес получит камера, достаточно ввести в консоли команду ifconfig eth0.

Веб-интерфейс

Веб-интерфейс по умолчанию доступен по порту 85. Логин: admin, пароль: 12345. При первом входе будет предложено задать новый сложный пароль.

По умолчанию транслируется только первый поток: кодек – H265, разрешение – 1920×1080, темп – 25 к/с.

Есть один нюанс конкретно с этой моделью – после изменения настроек стримера трансляция прекращается. Для возобновления трансляции нужно перезапустить камеру.

Увидеть картинку можно через VLC, выбрав в меню пункт Открыть URL и введя одну из строк:

  • rtsp://admin:password@ip-address:554/stream=0 – первый поток
  • rtsp://admin:password@ip-address:554/stream=1 – второй поток

где: password – ваш пароль, ip-address – адрес камеры.

Ночной режим

Для переключения режимов день/ночь нужно включить ночной режим и указать требуемые GPIO. Сделать это можно в консоли:

cli -s .nightMode.enabled true
cli -s .nightMode.irSensorPin 64
cli -s .nightMode.irCutPin1 59
cli -s .nightMode.irCutPin2 58
cli -s .nightMode.backlightPin 63

reset

Либо одной строкой:

cli -s .nightMode.enabled true;cli -s .nightMode.irSensorPin 64;cli -s .nightMode.irCutPin1 59;cli -s .nightMode.irCutPin2 58;cli -s .nightMode.backlightPin 63;reset

То же самое можно настроить и в веб-интерфейсе в разделе Majestic->Night Mode.

  • GPIO Датчика освещённости 64
  • GPIO ИК-фильтра 59,58
  • GPIO ИК-подсветки 53
Запуск OpenIPC на камере Ростелеком IPC-HFW1230SP/IPC-HDW1230SP
Night Mode

Картинка есть и поупражняться с камерой можно, но основная задача теперь – понять в чём дело и добиться качественного изображения.

Оцените статью
( 1 оценка, среднее 5 из 5 )
МихаТроник
Добавить комментарий

  1. Андрей

    GPIO Датчика освещённости 64
    GPIO ИК-фильтра 59,58
    GPIO ИК-подсветки 53
    Здравствуйте! А от куда вы взяли данные?

    Ответить
    1. mixatronik автор

      Здравствуйте! Из прошивки Ростелеком. Там они практически в открытом виде в конфигах.

      Ответить