From 729243910ba203d968e834f0190634928e46b290 Mon Sep 17 00:00:00 2001 From: Stijn Tintel Date: Sun, 20 Sep 2020 22:55:41 +0300 Subject: [PATCH] oc200.py: script to generate OC200 factory image --- include/image-commands.mk | 9 ++++ scripts/oc200.py | 88 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100755 scripts/oc200.py diff --git a/include/image-commands.mk b/include/image-commands.mk index 77a35f3eec..8fbeb61c6a 100644 --- a/include/image-commands.mk +++ b/include/image-commands.mk @@ -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 index 0000000000..1376369ea0 --- /dev/null +++ b/scripts/oc200.py @@ -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 ', required=True) + +parser.add_argument( + '-k', '--kernel', help='read kernel image from ', required=True) + +parser.add_argument( + '-r', '--rootfs', help='read rootfs image from ', required=True) + +parser.add_argument( + '-o', '--output', help='write image to ', 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() -- 2.30.2