From da9ac149754751f11749e812df48fe39ef1d81fd Mon Sep 17 00:00:00 2001 From: Li Hua Qian Date: Mon, 25 Mar 2024 14:00:38 +0800 Subject: [PATCH] iot2050-module-firmware-update: Add module firmware update The firmware update for the module should not be included with the image. This is because the image becomes too large and cumbersome to release when only the update tool needs to be released. Instead, the module firmware update should be packaged separately in its own Debian package for a more efficient and manageable release process. Signed-off-by: Li Hua Qian --- .../files/iot2050-module-firmware-update.tmpl | 84 +++++++++++++++++++ .../iot2050-module-firmware-update_01.bb | 26 ++++++ recipes-core/images/iot2050-image-example.bb | 1 + 3 files changed, 111 insertions(+) create mode 100755 recipes-app/iot2050-module-firmware-update/files/iot2050-module-firmware-update.tmpl create mode 100644 recipes-app/iot2050-module-firmware-update/iot2050-module-firmware-update_01.bb diff --git a/recipes-app/iot2050-module-firmware-update/files/iot2050-module-firmware-update.tmpl b/recipes-app/iot2050-module-firmware-update/files/iot2050-module-firmware-update.tmpl new file mode 100755 index 000000000..589407d02 --- /dev/null +++ b/recipes-app/iot2050-module-firmware-update/files/iot2050-module-firmware-update.tmpl @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 +# +# Copyright (c) Siemens AG, 2024 +# +# Authors: +# Li Hua Qian +# +# SPDX-License-Identifier: MIT + +import os +import sys +import argparse +import textwrap + +def main(args): + description=textwrap.dedent('''\ + Script for updating module firmware on IoT2050 + Examples usage: + 1. iot2050-module-firmware-update -s 1 -fwa firmwareA.bin + 2. iot2050-module-firmware-update -s 1 -fwa firmwareA.bin -fwb firmwareB.bin + ''') + parser = argparse.ArgumentParser( + description=description, + formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument( + "-s", "--slot", + type=int, + help="Slot number" + ) + parser.add_argument( + "-fwa", "--firmware-a", + help="Path to firmware A file", + type=argparse.FileType('rb') + ) + parser.add_argument( + "-fwb", "--firmware-b", + help="Path to firmware B file", + type=argparse.FileType('rb') + ) + args = parser.parse_args(args) + + if not any(vars(args).values()): + parser.print_help() + return 0 + + if not args.firmware_a and not args.firmware_b: + print("Error: No firmware file specified") + parser.print_help() + return 1 + if not args.slot: + print("Error: No slot number specified") + parser.print_help() + return 1 + else: + slot = args.slot + if not os.path.exists(f"/eiofs/controller/slot{slot}"): + print(f"Error: Invalid slot number {slot}") + return 1 + else: + slot_path = f"/eiofs/controller/slot{slot}" + + if args.firmware_a: + print("Updating firmware A ...") + with open(slot_path + "/fwa", "wb") as f: + ret = f.write(args.firmware_a.read()) + if ret < 0: + print("Error: Failed to write firmware A") + return 1 + if args.firmware_b: + print("Updating firmware B ...") + with open(slot_path + "/fwb", "wb") as f: + ret = f.write(args.firmware_b.read()) + if ret < 0: + print("Error: Failed to write firmware B") + return 1 + + print("Firmware updated successfully") + + return 0 + +if __name__ == '__main__': + CODE = main(sys.argv[1:]) + sys.exit(CODE) diff --git a/recipes-app/iot2050-module-firmware-update/iot2050-module-firmware-update_01.bb b/recipes-app/iot2050-module-firmware-update/iot2050-module-firmware-update_01.bb new file mode 100644 index 000000000..432c3a72f --- /dev/null +++ b/recipes-app/iot2050-module-firmware-update/iot2050-module-firmware-update_01.bb @@ -0,0 +1,26 @@ +# +# Copyright (c) Siemens AG, 2024 +# +# Authors: +# Li Hua Qian +# +# This file is subject to the terms and conditions of the MIT License. See +# COPYING.MIT file in the top-level directory. +# + +DESCRIPTION = "Customized Module(Special DI) Firmware Update Scripts" +MAINTAINER = "huaqian.li@siemens.com" + +SRC_URI = " \ + file://iot2050-module-firmware-update.tmpl" + +TEMPLATE_FILES = "iot2050-module-firmware-update.tmpl" + +inherit dpkg-raw + +do_install() { + install -v -d ${D}/usr/sbin/ + install -v -m 755 ${WORKDIR}/iot2050-module-firmware-update ${D}/usr/sbin/ +} + +do_deploy_deb[dirs] = "${DEPLOY_DIR_IMAGE}" diff --git a/recipes-core/images/iot2050-image-example.bb b/recipes-core/images/iot2050-image-example.bb index cc9fdae3c..e06a1b776 100644 --- a/recipes-core/images/iot2050-image-example.bb +++ b/recipes-core/images/iot2050-image-example.bb @@ -35,6 +35,7 @@ IMAGE_INSTALL += " \ customizations-example \ switchserialmode \ iot2050-firmware-update \ + iot2050-module-firmware-update \ tcf-agent \ mraa \ ${@ 'board-conf-tools' if d.getVar('QEMU_IMAGE') != '1' else '' } \