Про такую модель уже есть статья Отвязка от Ростелеком камеры Dahua DH-IPC-K22AP, но в тот раз прошивка была практически родная, только залоченная. Прислали на прошивку несколько аналогичных камер, но уже по внешнему виду стало понятно, что что-то c ними не так. Логотипа Dahua не было. Наклейка с серийником и MAC-ом была, но другого формата. Правда наклейка с правильным QR-кодом оказалась в наличии, а значит будет откуда брать серийник и к облаку можно будет подключить без особых трудностей.
Вскрытие показало, что сомнения были не напрасны и прошивка чисто ростелекомовская, т.е. для восстановления камеры до оригинала потребуется чуть больше телодвижений, чем в прошлый раз. Надо будет сначала залить загрузчик, задать необходимые переменные, а потом уже макросами шить остальные части прошивки.
IPL geaba80f
D-0a
128MB
BIST0_0001-OK
Load IPL_CUST from SPINAND
u16Pba: 0006
crc OK
IPL_CUST geaba80f
u16Pba: 0009
Load UBOOT from SPINAND
decomp_size=0x000741f0
U-Boot 2015.01 (Mar 31 2023 - 06:28:53)
Version: I6g#######
I2C: ready
DRAM:
WARNING: Caches not enabled
SPINAND_I: SPINAND: _MDrv_SPINAND_GET_INFO: Found spinand INFO
(0xC8), (0x1), (0x7F),
SPINAND: board_nand_init: CIS contains part info
128 MiB
MMC: MStar SD/MMC: 0
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: MAC Address 00:30:1B:BA:02:DB
Status Error!
sstar_emac
Warning: sstar_emac using MAC address from net device
gpio debug MHal_GPIO_Pad_Set:599
gpio[12] is 1
gpio debug MHal_GPIO_Pad_Set:599
gpio[13] is 1
gpio debug MHal_GPIO_Pad_Set:599
gpio[63] is 0
gpio debug MHal_GPIO_Pad_Set:599
gpio[52] is 0
gpio debug MHal_GPIO_Pad_Set:599
gpio[6] is 1
gpio debug MHal_GPIO_Pad_Set:599
gpio[7] is 1
gpio debug MHal_GPIO_Pad_Set:599
gpio[6] is 0
_[sdmmc_0] Err: #Cmd_8 (0x000001AA)=>(E: 0x0008)(S: 0x00000000)__(L:913)
_[sdmmc_0] Err: #Cmd_55 (0x00000000)=>(E: 0x0008)(S: 0x00000000)__(L:913)
_[sdmmc_0] Err: #Cmd_1 (0x00000000)=>(E: 0x0008)(S: 0x00000000)__(L:913)
Card did not respond to voltage select!
Invalid device index:part 0:1
help
? - alias for 'help'
aes - Control Mstar AES engine
base - print or set address offset
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
chpart - change active partition
cmp - memory compare
cp - memory copy
crc32 - checksum calculation
dbg - set debug message level. Default level is INFO
dcache - enable or disable data cache
debug - Disable uart rx via PAD_DDCA to use debug tool
dhcp - boot image via network using DHCP/TFTP protocol
dstar - script via SD/MMC
eeprom - EEPROM sub-system
env - environment handling commands
estar - script via network
estart - EMAC start
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
fatread - FAT fatread with FSTART
fatsize - determine a file's size
fwupdate- fwupdate command allows to flash vc camera firmware from file on mmc or from memory.
go - start application at address 'addr'
gpio - Config gpio port
help - print command description/usage
i2c - I2C sub-system
icache - enable or disable instruction cache
initDbgLevel- Initial varaible 'dbgLevel'
loop - infinite loop on address range
macaddr - setup EMAC MAC addr
md - memory display
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmcinfo - display MMC info
mssdmmc - Mstar SD/MMC IP Verification System
mstar - script via TFTP
mtdparts- define flash/nand partitions
mw - memory write (fill)
mxp - MXP function for Mstar MXP partition
nand - NAND sub-system
nboot - boot from NAND device
nm - memory modify (constant address)
ping - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
readcis - Read cis block content
reset - Perform RESET of the CPU
riu - riu - riu command
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
secauth - Control Sstar security authenticate sequence
setenv - set environment variables
sf - SPI flash sub-system
sfbin - for uploading sf image to a server(via network using TFTP protocol)
sigauth - Only verify digital signature without aes
srcfg - sensor pin and mclk configuration.
tftpboot- boot image via network using TFTP protocol
ubi - ubi commands
usb - USB sub-system
usbboot - boot from USB device
ustar - script via USB
version - print monitor, compiler and linker version
writecis- Search CIS in dram then write to spinand.
Вскрывается камера просто – нужно открутить только два винта снизу сзади и снять крышку.
TFTP-сервер
TFTP-сервер Tftpd64 нужно извлечь из архива и запустить. Речь идёт про портативную версию. Далее нужно положить распакованные файлы прошивки в ту же папку или в отдельную, но тогда эту отдельную папку надо указать в настройках Tftpd64. Нажатием на кнопку Show Dir можно открыть окно с содержимым текущей папки и убедиться, что файлы видны сервером.
Брандмауэр или антивирус с функцией брандмауэра должен быть отключён, либо в их настройках должен быть открыт UDP-порт 69.
UART-адаптер
Далее нужно подключить коннектор к контактным отверстиям UART-интерфейса. Ножки разъёма болтаются в отверстиях, поэтому надо либо их чуть подогнуть, либо наклонить сам коннектор, чтобы добиться надёжного соединения. Затем можно подключать адаптер к компьютеру. Исхожу из того, что драйверы уже установлены и номер порта известен.
Putty
При запуске Putty нужно выбрать тип соединения Serial, скорость 115200, прописать COM-порт, который система выделила UART-адаптеру и нажать кнопку Open.
Прошивка
Подать питание на камеру и сразу же нажать Enter. Отпустить можно тогда, когда запуск остановится и на экране появится приглашение ввода команд. Дальше нужно задать адреса камеры и компьютера с запущенным TFTP-сервером.
setenv serverip 192.168.1.128
setenv ipaddr 192.168.1.10
save
Бэкап делать не стал, т.к. tftp в этом загрузчике работает только в одну сторону – на приём, а возиться с картой памяти не хотелось. Да и ни к чему это!
В приведённых примерах адрес компьютера: 192.168.1.128, а адрес камеры: 192.168.1.10. Необязательно адреса должны быть именно такими. Главное, чтобы были из одной подсети.
Первым делом нужно прошить родной загрузчик, который состоит из двух частей. После завершения прошивки загрузчика вводим reset и готовимся снова остановить запуск.
При работе с загрузчиком учитывайте один интересный момент: при отсутствии активности в консоли больше 1 минуты происходит автоматический перезапуск. С одной из камер протупил и перезапуск произошёл после стирания загрузчика и перед записью нового. В результате пришлось воспользоваться новой версией snander для восстановления, о чём тоже скоро будет статья.
Поскольку загрузчик теперь даховский, то и останавливать его надо звёздочкой: *.
В родном загрузчике снова задаём адреса камеры и сервера и значения переменных HWID, devalias, ID и ethaddr. Узнать ID можно отсканировав QR-код, расположенный на задней крышке. В нём содержится строка для подключения к облаку вида:
В этом примере ID равен 8K00234PB000000. Значение ethaddr – это MAC-адрес, который берётся с наклейки со штрих-кодом.
setenv serverip 192.168.1.128;setenv ipaddr 192.168.1.10;save
setenv HWID IPC-K22A-HD:01:02:07:A8:3B:00:01:10:01:01:04:320:03:00:00:00:00:00:00:00:80
setenv devalias DH-IPC-K22AP
setenv ID 8K00234PB000000
setenv ethaddr C0:B3:C8:00:00:00
save
run dp;run dk;run dr;run pd;run dw;run da
reset
reset
Команду run da можно и не выполнять, т.к. это прошивка загрузчика, а его уже прошили ручками, но пусть будет. Мало ли…
В QR-коде, расположенном на задней стенке корпуса камеры, есть ещё и код безопасности, он же SC, но оказалось, что если прописать его в загрузчике, как и положено, то камеру можно подключить только к DMSS, а к IMOU она подключаться отказывается. Если же переменная SC в загрузчике отсутствует, то подключить можно и к DMSS и к IMOU. Более универсально получается.
Запуск
Запускаем утилиту ConfigTool и ждём пока в списке появится наш зверёк. Сначала адрес будет дефолтный 192.168.1.108, но если камера подключена не напрямую в комп, а в коммутатор или роутер, то бишь в сеть, а в сети есть DHCP-сервер, то не надо торопиться заходить по дефолтному адресу, потому что он поменяется. Смотрим какой адрес получила камера и открываем его в браузере. Полноценно интерфейс работает, опять же, только в Internet Explorer или в Edge в режиме Internet Explorer
После прошивки камера находится в неинициализированном состоянии. Инициализировать её можно задав пароль через ConfigTool, с помощью кнопки Initiallize, либо в браузере, при первом входе.
Результат
u-boot
IPL fd8e347
D-0a
128MB
BIST0_0001-OK
Load IPL_CUST from SPINAND
CIS in Block00
Match CIS ID( c8 01 )
BlSize 00004780
Checksum OK
IPL_CUST fd8e347
runUBOOT()
CIS in Block00
Match CIS ID( c8 01 )
ChkHealthy: 0003: 0007: 0000
ChkHealthy: 0004: 0007: 0000
ChkHealthy: 0005: 0007: 0000
Load BL from SPINAND
-Verify CRC32 passed!
-Decompress XZ
u32HeaderSize=0x00000040
u32Loadsize=0x00006948
decomp_size=0x0000f294
Disable MMU and D-cache before jump to UBOOT
U-Boot 2010.06-svn8061 (Nov 27 2021 - 10:11:10)
disable wdt
help
? - alias for 'help'
backup - backup - manual backup program.
boot - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
chpart - change active partition
ebist - PHY loopback test
edump - EMAC Register settings dump
eloopback- Long loopback test
epd - emac power down
erasepart- erasepart
err - get arm fsr
estart - EMAC start
ewavetest- EMAC wave test
fatls - list files in a directory (default /)
flwrite - flwrite - write data into FLASH memory
fsr - get arm fsr
help - print command description/usage
kload - kload - load uImage file from parttion
loadspi - load data from SPI
macaddr - setup EMAC MAC addr
memsize - memsize - set mem size
mtdparts- define flash/nand partitions
nand - NAND sub-system
nboot - boot from NAND device
otp_printf- print TracingCode environment variables
partition- print partition information
ping - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
rarpboot- boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv - set environment variables
tftpboot- tftpboot- boot image via network using TFTP protocol