JFFS2 fájlrendszer patchelése

Haver hozott egy pár emberi fej nagyságú PTZ-s IP kamerát javításra.

Van közte olyan, ami nem is linkel, meg csak fekete képet ad.

Széttúrtam, modulárisak (külön zoom, külön PT elektronika, külön 4G modem), így lendülettel rendeltem bele egy ugyanolyannak tűnő modult az aliról, mondván, hogy max átdobom a flashet oszt' jóidő.

Meg is jött, bele is patkoltam a kamerába, de hát nem viszi a PTZ részt...

Na SPI Flasht kicseréltem így a PTZ megy, de a kép színei meg élessége nem stimmelnek...

A flash tartalmakat kidumpotlam:
binwalk:

mm@P15:~/Dokumentumok/szervizkonyvek/Kazan panelek/Egyéb javítások/Formann kamerák$ binwalk 249_flash.bin 

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
17776         0x4570          gzip compressed data, has original file name: "u-boot.bin", from Unix, last modified: 2021-11-04 09:08:17
262144        0x40000         uImage header, header size: 64 bytes, header CRC: 0x71F51980, created: 2021-11-05 04:42:50, image size: 1684778 bytes, Data Address: 0x40008000, Entry Point: 0x40008000, data CRC: 0x83DE0F58, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: none, image name: "Linux-4.9.37"
262208        0x40040         Linux kernel ARM boot executable zImage (little-endian)
279447        0x44397         LZMA compressed data, properties: 0x5D, dictionary size: 67108864 bytes, uncompressed size: -1 bytes
1934104       0x1D8318        Flattened device tree, size: 12882 bytes, version: 17
1966092       0x1E000C        JFFS2 filesystem, little endian
2162768       0x210050        Zlib compressed data, compressed
2164532       0x210734        Zlib compressed data, compressed
2167192       0x211198        Zlib compressed data, compressed

Forrasztottam be UART-ot:

Kernel command line: mem=66M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=sfc:256K(boot),1664K(kernel),14464K(rootfs)

Ebből a 256+1664K == 1920K == 1966080 majdnem stimmel a binwalk kimenettel (1966092) úgyhogy dd-vel kicsaptam a flash végét egy jffs fájlba:

dd if=249_flash.bin of=249_mtdparts2.jffs2 bs=1 skip=1966092

Ezt kicsomagoltam jeffersonnal, majd körbenézve az jött le, hogy az mnt/mtd/ipc/ van valami kínai bináris takony, ami az user facing dolgokat (kamera stream, webes felület) intézi.

Itt van egy imx335.bin fájl:

https://gist.github.com/martonmiklos/5649ab10cb19bba251ee078dce6024d9

Ami jelentősen eltér az aliexpresszes modulon találhatótól:

https://gist.github.com/martonmiklos/958dd62b5dc49b4e64c700b39cd7259d

Gondoltam ezt a fájlt átműtöm (illetve megpróbálom a root passwordot átírni, illetve egy config_debug.ini -ben a telnetet engedélyezni).

Ehhez megmókoltam amit kell majd újra generáltam a rootfs-t:

mkfs.jffs2 -d ./jffs2_fs -o new_jffs2.img -l

illetve toltam rá egy sumtool-t:

sumtool -i new_jffs2.img -o new_jffs2.sum.img

Majd vissza dd-ztem az eredeti image-ba:

dd if=new_jffs2.sum.img of=249_flash_mod.bin bs=1 seek=1966092 conv=notrunc

Felflasheltem de ez fogad.

goke-i2c 12062000.i2c: goke-i2c2@100000hz registered
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
mmc0: SDHCI controller on 10010000.sdhci [10010000.sdhci] using ADMA in legacy mode
NET: Registered protocol family 17
NET: Registered protocol family 15
lib80211: common routines for IEEE802.11 drivers
Key type dns_resolver registered
goke_rtc 120e0000.rtc: setting system clock to 1970-01-01 00:00:00 UTC (0)
jffs2: CLEANMARKER node found at 0x0000000c, not first node in block (0x00000000)
jffs2: Node at 0x0000e654 with length 0x000019b8 would run over the end of the erase block
jffs2: Perhaps the file system was created with the wrong erase size?
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000e658: 0x19b8 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000e65c: 0x6030 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000e660: 0x0047 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000e664: 0x000c instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000e66c: 0xc2d8 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000e670: 0x4b30 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000e674: 0xe001 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000e68c: 0x6962 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000e690: 0x02e0 instead
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000e694: 0x0100 instead
jffs2: Further such events for this erase block will not be printed
jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00010004: 0xe648 instead

Az erase blokk méretet valószínűleg eltaláltam a default 64 KB-al, mert erre utal a bootlog:



bsp-sfc bsp_spi_nor.0: SPI Nor ID Table Version 1.2
bsp-sfc bsp_spi_nor.0: The ID: 0xa1 isn't in the BP table, Current device can't not protect
bsp-sfc bsp_spi_nor.0: FM25Q128-SOB-T-G (Chipsize 16 Mbytes, Blocksize 64KiB)

Mind az mkfs.jffs2 mind a sumtool kisebb imaget csinált mint ami az eredeti image-ből kijött:

mm@P15:~/Dokumentumok/szervizkonyvek/Kazan panelek/Egyéb javítások/Formann kamerák$ ls -l  249_mtdparts2.jffs2 
-rw-rw-r-- 1 mm mm 14811124 jún   15 19:26 249_mtdparts2.jffs2
mm@P15:~/Dokumentumok/szervizkonyvek/Kazan panelek/Egyéb javítások/Formann kamerák$ ls -l  new_jffs2.img 
-rw-r--r-- 1 mm mm 12018220 jún   15 19:29 new_jffs2.img
mm@P15:~/Dokumentumok/szervizkonyvek/Kazan panelek/Egyéb javítások/Formann kamerák$ ls -l  new_jffs2.sum.img 
-rw-r--r-- 1 mm mm 12826728 jún   15 19:30 new_jffs2.sum.img

Az ezen a területen túl eső részt nem FF-eltem ki.

MI lehet még a gyíkja a mutatványnak?

 

Hozzászólások

Szerkesztve: 2025. 06. 16., h – 07:17

jffs2: CLEANMARKER node found at 0x0000000c, not first node in block (0x00000000)

Ebből nekem úgy tűnik mintha az egész fs 12 byteal el lenne csúszva a flashben és ezért nem találja meg a magic-et sem.

Az erasesize az tuti jó 64KB ebből kiindulva : "Block:64KB Chip:16MB Name:"SK25P128-QBLI""

A default pagesize amit az mkfs.jffs2 (--pagesize) 4KiB, ami spi-nor flashnél lehet nem játszik annyira jól, én megnézném 1 byteal, vagy 128 byteal, vagy 256 byteal, lehet azért sír.

Tákizni fogok 1,27 headert a flash alá, meg socketet hozzá a programozóra meg a boardra és úgy próbálkozok, mert így elég szopás próbálkozni és félek, hogy a padeket feltépem.
 

Nekem annyi furcsaság van, hogy miért rakta a kínai az /mnt/mtd mappába a cuccait, illetve miért hiányzik onnan minden.

Illetve ez még nekem furcsa:

[debug]: {/home/devin/visionjffs2: warning: (88) jffs2_do_read_inode_internal: Truncating ino #295 to 43052 bytes failed because it only had 8192 bytes to start with!
 

a visionjffs2-t nem ismeri az internet, valószínűleg ez valami kínai tool lehet. 

Lehet, hogy machinálnak valamit boot után is a flashhel...

Szerintem a /mnt/mtd az sdk sajátossága, a provision nvr nálunk is ott tartja a kínai blobokat :)

/mnt/mtd # cat /sys/class/mtd/mtd0/type
nor
/mnt/mtd # cat /sys/class/mtd/mtd0/writesize
1
/mnt/mtd # cat /sys/class/mtd/mtd0/erasesize
65536

Úgyhogy szerintem a pagesize 1 nor-nál az mk.jffs2 meg 4k az alap, a fenti hibát simán okozhatja ez is.

Amúgy ha a loginig eljut be tudsz lépni nem?

OFF: az ilyen témákért jó még mindig a hupra járni. Öröm olvasni az ilyen fekete öves problémákat és a megoldás felé vezető lépéseket :)