Не пишу, что камера Dahua DH-IPC1230SP, потому что это не совсем так. Производит её, конечно, Dahua, но модель явно какая-то другая. Подтверждением этому является то, что прошивки от оригинальных соответствующих моделей Dahua не подходят для этого кадавра.
К счастью, аппаратная платформа поддерживается проектом OpenIPC.
Платформа
- Процессор hi3516cv300
- Память nand
- Сенсор ov2735
Возможности
• Веб-интерфейс
• Протоколы: RTSP, ONVIF, JPEG, MJPEG
• Облако IP EYE (бесплатная трансляция, только H264)
• Переключение режима день/ночь по датчику освещённости
• Картинка есть, но нее всё с ней хорошо и качество изображения вряд ли кого-то устроит. Что-то не то с драйвером или ещё с чем-то.
Подготовка
Качаем с 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, пароль пустой. Можно открывать веб-морду и смотреть, что там и как.
Веб-интерфейс
Веб-интерфейс по умолчанию доступен по порту 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
Картинка есть и поупражняться с камерой можно, но основная задача теперь – понять в чём дело и добиться качественного изображения.
GPIO Датчика освещённости 64
GPIO ИК-фильтра 59,58
GPIO ИК-подсветки 53
Здравствуйте! А от куда вы взяли данные?
Здравствуйте! Из прошивки Ростелеком. Там они практически в открытом виде в конфигах.