Эта история началась больше года назад, когда в организацию были закуплены несколько относительно дешёвых китайских IP-камер Falcon Eye FE-MTR300 P2P, чтобы между сотрудниками и посетителями не происходило никаких эксцессов под присмотром большого брата.

image

Не сказать, чтобы всё было хорошо… Всё было средне. И нам показалось, что обновление ПО камер сможет что-то улучшить. Оказалось, что некоторые модели Falcon Eye, Tenvis, Foscam и, возможно, ещё каких-то фирм практически совпадают. Где-то кнопочки поудобнее, где-то интерфейс русский есть. И мы решились!

Обновили ПО камер на схожую модель от Tenvis TR3818. Потом почитали ещё и решили, что можно обновиться и на более крутую прошиву от другой камеры.

После обновления камера приказала долго жить. Проверки моторов при включении не происходило, динамики не шуршали, светодиод не мигал. Горел только светодиод на LAN интерфейсе, да при включении уходил одинокий широковещательный пакетик.

После такого казуса остальные камеры были развешаны по местам, а «кирпич» переселился жить к нам. Время от времени происходили попытки его реанимировать. Камера была разобрана, найдены площадки, куда можно подпаяться для доступа через консоль.

image
(там под проводами маркировка 3.3V, GND, TX, RX)

image
(платы камеры в сборе)

Пришлось взять USB-TTL преобразователь.

image
(есть контакт)

Подключаемся к консоли через putty или HyperTerminal и видим следующее:
U-Boot 1.1.3 (Aug 26 2014 - 17:15:00)

Board: Ralink APSoC DRAM: 16 MB
relocate_code Pointer at: 80fb0000
spi_wait_nsec: 42
spi device id: c2 20 17 c2 20 (2017c220)
find flash: MX25L6405D
raspi_read: from:2b000 len:1000
.raspi_read: from:2b000 len:1000
.============================================
Ralink UBoot Version: 3.6.0.0
--------------------------------------------
ASIC 5350_MP (Port5<->None)
DRAM_CONF_FROM: Boot-Strapping
DRAM_TYPE: SDRAM
DRAM_SIZE: 128 Mbits
DRAM_WIDTH: 16 bits
DRAM_TOTAL_WIDTH: 16 bits
TOTAL_MEMORY_SIZE: 16 MBytes
Flash component: 8 MBytes NOR Flash
Date:Aug 26 2014 Time:17:15:00
============================================
icache: sets:256, ways:4, linesz:32 ,total:32768
dcache: sets:128, ways:4, linesz:32 ,total:16384

##### The CPU freq = 360 MHZ ####
estimate memory size =16 Mbytes
raspi_read: from:80028 len:6
.
start time:31742632l
File: cmd_net.c, Func: do_my_tftpb, Line: 69

netboot_common, argc= 3

NetTxPacket = 0x80FE3C80

KSEG1ADDR(NetTxPacket) = 0xA0FE3C80

NetLoop,call eth_halt !

NetLoop,call eth_init !
Trying Eth0 (10/100-M)

Waitting for RX_DMA_BUSY status Start... done

Header Payload scatter function is Disable !!

ETH_STATE_ACTIVE!!
Using Eth0 (10/100-M) device
TFTP from server 51.204.51.204; our IP address is 192.168.1.5
Filename 'xx.img'.

TIMEOUT_COUNT=10,Load address: 0x80100000
Loading: ====================broadcast get file
T ====================broadcast get file

could not get file, cancel update
ret = 1

Please choose the operation:
1: Load system code to SDRAM via TFTP.
2: Load system code then write to Flash via TFTP.
3: Boot system code via Flash (default).
4: Entr boot command line interface.
7: Load Boot Loader code then write to Flash via Serial.
9: Load Boot Loader code then write to Flash via TFTP.

You choosed 3
0

3: System Boot system code via Flash.
## Booting image at bc0e0000 ...
raspi_read: from:e0000 len:40
.Magic Number,85190320
Bad Magic Number,85190320

Плохое, говорит, у Вас магическое число. И никак не хочет реагировать на мой выбор любого другого пункта меню. На этом был завершён первый подход к камере и она вернулась на полку в отделе.

Набравшись сил, мы совершили ещё один подход. Пришлось потратить нервы на то, чтобы понять, что именно в нашем случае RX преобразователя надо подключить к RX камеры, а TX к TX. Или маркировку неправильно нанесли или одно из двух. Камера начала реагировать на выбор пунктов меню, но это никак не объясняло природу магических чисел.

Тогда была скачана прошивка для Tenvis TR3818 и несколько прошивок для похожих камер, настроен tftp-сервер и выбран пункт номер 4, вход в командный интерфейс. Собственно, по ? нам выдаёт список возможных команд, где мы находим tftpboot — который загружает файл с tftp в память и bootm — который загружает приложение из памяти.

Порядок действий следующий:

  • загружаем прошивку в камеру через tftpboot
  • запускаем командой bootm
  • Смотрим на результат, обдумываем.

А результаты получились такие:

  • На прошивках похожих камер — несовпадает магическое число
  • На прошивке от Tenvis TR3818
    RT5350 # bootm
    ## Booting image at 80100000 ...
    Magic Number,27051956
    Image Name: SPI Flash Image
    Created: 2014-11-26 6:26:49 UTC
    Image Type: MIPS Linux Standalone Program (uncompressed)
    Data Size: 112920 Bytes = 110.3 kB
    Load Address: 80200000
    Entry Point: 80200000
    Verifying Checksum ... OK
    OK

    (Узнали магическое число, но только тут 110 КБ и это прошивка загрузчика, а файл прошивки 7 МБ)
  • Пытаемся скормить весь файл прошивки, как обновление загрузчика (пункт 9 в меню) — ругается на слишком большой файл. Просматриваем файл Frhed'ом и видим, что магическое число в самом начале файла. А раз мы знаем, что размер загрузчика 112920 байт + 64 байта размер заголовка, то копируем в отдельный файл 112984 байта, скармливаем камере через 9 пункт меню и радуемся обновлённому загрузчику.
  • Вдохновлённые успехом ищем в файле прошивки повторение магического числа и находим такой же заголовок в файле прошивки по адресу 0xE0000, но только c Linux Kernel Image.Копируем всё от него и до конца файла в отдельный файл и пытаемся проверить через tftpboot и bootm.
    RT5350 # bootm
    ## Booting image at 80100000 ...
    Magic Number,27051956
    Image Name: Linux Kernel Image
    Created: 2014-11-26 6:26:54 UTC
    Image Type: MIPS Linux Kernel Image (lzma compressed)
    Data Size: 1065116 Bytes = 1 MB
    Load Address: 80000000
    Entry Point: 80347000
    Verifying Checksum ... OK
    Uncompressing Kernel Image ... LZMA ERROR 1 - must RESET board to recover

    (Число сошлось, размер известен, загружаем как есть через 2-й пункт меню и видим, что записывается в память по смещению 0x30000, а при запуске камеры обращается к 0xE0000, т.е. промахиваемся на 0xB0000 байт мимо магического числа)
  • Значит берём из файла с прошивкой от Tenvis'а ещё 0xB0000 байт данных перед магическим числом. Заливаем через 2-й пункт меню и камера оживает!

Надеюсь, это гораздо более интересно и менее утомительно читать, чем переключать проводки, лопатить интернет и вычислять смещения, восстанавливая логику работы китайского гения. Наверное, это должно научить нас в следующий раз воздержаться от необдуманной прошивки техники чем попало.

И спасибо Вам! Если бы не желание порадовать хабр, возможно эта камера ещё долго бы стояла у нас в отделе.

Комментарии (6)