2 #------------------------------------------------------------------------------
3 # $File: tplink,v 1.4 2019/04/19 00:42:27 christos Exp $
4 # tplink: File magic for openwrt firmware files
6 # URL: https://wiki.openwrt.org/doc/techref/header
7 # Reference: https://git.openwrt.org/?p=openwrt.git;a=blob;f=tools/firmware-utils/src/mktplinkfw.c
9 # check for valid header version 1 or 2
12 # test for header padding with nulls
14 # skip Norton Commander Cleanup Utility NCCLEAN.INI by looking for valid vendor
15 >>>4 ubelong >0x1F000000
16 >>>>0 use firmware-tplink
18 0 name firmware-tplink
20 !:mime application/x-tplink-bin
22 # hardware id like 10430001 07410001 09410004 09410006
25 # hardware revision like 1
26 >0x44 ubelong !1 (revision %u)
27 # vendor_name[24] like OpenWrt or TP-LINK Technologies
29 # fw_version[36] like r49389 or ver. 1.0
31 # header version 1 or 2
33 # ver_hi.ver_mid.ver_lo
34 >0x98 long !0 \b, version
36 >>0x9A ubeshort x \b.%u
37 >>0x9C ubeshort x \b.%u
38 # region code 0~universal 1~US
40 #>>0x48 ubelong 0 (universal)
42 >>0x48 ubelong >1 (region %u)
43 # total length of the firmware. not always true
44 >0x7C ubelong x \b, %u bytes or less
46 >0x48 ubelong !0 \b, UNKNOWN1 0x%x
48 #>0x4c ubequad x \b, MD5 %llx
49 #>>0x54 ubequad x \b%llx
51 >0x5c ubelong !0 \b, UNKNOWN2 0x%x
53 #>0x60 ubequad !0 \b, 2nd MD5 %llx
54 #>>0x68 ubequad x \b%llx
56 >0x70 ubelong !0 \b, UNKNOWN3 0x%x
58 #>0x74 ubelong x \b, 0x%x load
60 #>0x78 ubelong x \b, 0x%x entry
61 # kernel data offset. 200h means direct after header
62 >0x80 ubelong x \b, at 0x%x
63 # kernel data length and 1 space
64 >0x84 ubelong x %u bytes
65 # look for kernel type (gzip compressed vmlinux.bin by ./compress)
67 # root file system data offset
68 # WRONG in 5.35 with above indirect expression
69 >0x88 ubelong x \b, at 0x%x
70 # rootfs data length and 1 space
71 >0x8C ubelong x %u bytes
72 # in 5.32 only true for offset ~< FILE_BYTES_MAX=9 MB defined in ../../src/file.h
74 # 'qshs' for wr940nv1_en_3_13_7_up(111228).bin
75 #>(0x88.L) string x \b, file system '%.4s'
76 #>(0x88.L) ubequad x \b, file system 0x%llx
77 # bootloader data offset
78 >0x90 ubelong !0 \b, at 0x%x
79 # bootloader data length only resonable if bootloader offset not null
80 >>0x94 ubelong !0 %u bytes
81 # pad[354] should be 354 null bytes.
82 #>0x9E ubequad !0 \b, padding 0x%llx
83 # But at 0x120 18 non null bytes in examples like
84 # wr940nv4_eu_3_16_9_up_boot(160620).bin
85 # wr940nv6_us_3_18_1_up_boot(171030).bin
86 #>0x120 ubequad !0 \b, other padding 0x%llx