oc200.py: script to generate OC200 factory image
authorStijn Tintel <stijn@linux-ipv6.be>
Sun, 20 Sep 2020 19:55:41 +0000 (22:55 +0300)
committerStijn Tintel <stijn@linux-ipv6.be>
Wed, 8 Nov 2023 12:00:41 +0000 (14:00 +0200)
include/image-commands.mk
scripts/oc200.py [new file with mode: 0755]

index 77a35f3eec00703ad3b61a38ff24218157d68ff6..8fbeb61c6afb8cd3e1d4f932502c5eed2dce5bfc 100644 (file)
@@ -532,6 +532,15 @@ define Build/sysupgrade-tar
                $@
 endef
 
+define Build/tplink-mvebu
+       $(SCRIPT_DIR)/oc200.py \
+               --dtb $(KDIR)/image-$(firstword $(DEVICE_DTS)).dtb \
+               --kernel $(IMAGE_KERNEL) \
+               --rootfs $@ \
+               --output $@.new && mv $@.new $@
+
+endef
+
 define Build/tplink-safeloader
        -$(STAGING_DIR_HOST)/bin/tplink-safeloader \
                -B $(TPLINK_BOARD_ID) \
diff --git a/scripts/oc200.py b/scripts/oc200.py
new file mode 100755 (executable)
index 0000000..1376369
--- /dev/null
@@ -0,0 +1,88 @@
+#!/usr/bin/python3
+
+"""Script to generate firmware image for TP-Link OC200"""
+
+import argparse
+import hashlib
+import struct
+
+PT_OFFSET = 0x1000
+
+
+struct_header = struct.Struct('>4I')
+struct_img_part = struct.Struct('>32s5I')
+
+
+def gen_checksum(data):
+    img_data = bytearray(data)
+    for i in range(0x10):
+        img_data[0x10+1] = 0
+    for i in range(0x80):
+        img_data[0x130+1] = 0
+    md5sum = hashlib.md5(data)
+    print(md5sum.hexdigest())
+    return (hashlib.md5(data).digest())
+
+def gen_header(pt_offset, size):
+    return struct_header.pack(int(0x00000001), int(0xaa55d98f), pt_offset, size)
+
+
+def gen_pt(name, nand, fl_offset, fl_size, img_offset, img_size):
+    return struct_img_part.pack(name.encode('ascii'), fl_offset, fl_size, img_offset, img_size, nand)
+
+
+parser = argparse.ArgumentParser('generate TP-Link mvebu image')
+
+parser.add_argument(
+        '-d', '--dtb', help='read device tree image from <file>', required=True)
+
+parser.add_argument(
+        '-k', '--kernel', help='read kernel image from <file>', required=True)
+
+parser.add_argument(
+        '-r', '--rootfs', help='read rootfs image from <file>', required=True)
+
+parser.add_argument(
+        '-o', '--output', help='write image to <file>', required=True)
+
+args = parser.parse_args()
+
+img_dtb = open(args.dtb, "rb").read()
+img_knl = open(args.kernel, "rb").read()
+img_rfs = open(args.rootfs, "rb").read()
+
+
+
+with open(args.output, 'wb') as img_factory:
+    img_factory.seek(PT_OFFSET)
+    img_factory.write(gen_pt("dtb", True, 0x70000, 0x1000, 0xd0000, len(img_dtb)))
+    img_factory.seek(0xd0000)
+    img_factory.write(img_dtb)
+
+    img_factory.seek(PT_OFFSET + 1 * struct_img_part.size)
+    img_factory.write(gen_pt("kernel", True, 0x80000, 0x1000000, 0xd0000 + len(img_dtb), len(img_knl)))
+    img_factory.seek(0xd0000 + len(img_dtb))
+    img_factory.write(img_knl)
+
+    img_factory.seek(PT_OFFSET + 2 * struct_img_part.size)
+    img_factory.write(gen_pt("rootfs", True, 0x2080000, 0x10000000, 0xd0000 + len(img_dtb) + len(img_knl), len(img_rfs)))
+    img_factory.seek(0xd0000 + len(img_dtb) + len(img_knl))
+    img_factory.write(img_rfs)
+
+    img_factory.seek(0, 2)
+    img_size = img_factory.tell()
+    img_factory.seek(0)
+    img_factory.write(gen_header(PT_OFFSET, img_size))
+
+    img_factory.close()
+
+with open(args.output, 'rb') as img_factory:
+    img_data = bytearray(img_factory.read())
+    img_factory.close()
+
+with open(args.output, 'wb') as img_factory:
+    img_factory.write(img_data)
+    img_factory.seek(0x10)
+    img_factory.write(gen_checksum(img_data))
+
+    img_factory.close()