* Scripts: new radio firmware bundling scheme, manifest for resources. * Scripts: add destination address for copro binaries. * Bootloader: update linker scripts * Scripts: resource manifest FsTree.
		
			
				
	
	
		
			96 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import logging
 | 
						|
import datetime
 | 
						|
import shutil
 | 
						|
import json
 | 
						|
 | 
						|
import xml.etree.ElementTree as ET
 | 
						|
from .utils import *
 | 
						|
 | 
						|
CUBE_COPRO_PATH = "Projects/STM32WB_Copro_Wireless_Binaries"
 | 
						|
 | 
						|
MANIFEST_TEMPLATE = {
 | 
						|
    "manifest": {"version": 0, "timestamp": 0},
 | 
						|
    "copro": {
 | 
						|
        "fus": {"version": {"major": 1, "minor": 2, "sub": 0}, "files": []},
 | 
						|
        "radio": {
 | 
						|
            "version": {
 | 
						|
                "type": 1,
 | 
						|
                "major": 1,
 | 
						|
                "minor": 12,
 | 
						|
                "sub": 0,
 | 
						|
                "branch": 0,
 | 
						|
                "release": 7,
 | 
						|
            },
 | 
						|
            "files": [],
 | 
						|
        },
 | 
						|
    },
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
class Copro:
 | 
						|
    def __init__(self, mcu):
 | 
						|
        self.mcu = mcu
 | 
						|
        self.version = None
 | 
						|
        self.cube_dir = None
 | 
						|
        self.mcu_copro = None
 | 
						|
        self.logger = logging.getLogger(self.__class__.__name__)
 | 
						|
 | 
						|
    def loadCubeInfo(self, cube_dir):
 | 
						|
        if not os.path.isdir(cube_dir):
 | 
						|
            raise Exception(f'"{cube_dir}" doesn\'t exists')
 | 
						|
        self.cube_dir = cube_dir
 | 
						|
        self.mcu_copro = os.path.join(self.cube_dir, CUBE_COPRO_PATH, self.mcu)
 | 
						|
        if not os.path.isdir(self.mcu_copro):
 | 
						|
            raise Exception(f'"{self.mcu_copro}" doesn\'t exists')
 | 
						|
        cube_manifest_file = os.path.join(self.cube_dir, "package.xml")
 | 
						|
        cube_manifest = ET.parse(cube_manifest_file)
 | 
						|
        cube_version = cube_manifest.find("PackDescription")
 | 
						|
        if not cube_version:
 | 
						|
            raise Exception(f"Unknown Cube manifest format")
 | 
						|
        cube_version = cube_version.get("Release")
 | 
						|
        if not cube_version or not cube_version.startswith("FW.WB"):
 | 
						|
            raise Exception(f"Incorrect Cube package or version info")
 | 
						|
        cube_version = cube_version.replace("FW.WB.", "", 1)
 | 
						|
        if cube_version != "1.12.0":
 | 
						|
            raise Exception(f"Unknonwn cube version")
 | 
						|
        self.version = cube_version
 | 
						|
 | 
						|
    def addFile(self, array, filename, **kwargs):
 | 
						|
        source_file = os.path.join(self.mcu_copro, filename)
 | 
						|
        destination_file = os.path.join(self.output_dir, filename)
 | 
						|
        shutil.copyfile(source_file, destination_file)
 | 
						|
        array.append(
 | 
						|
            {"name": filename, "sha256": file_sha256(destination_file), **kwargs}
 | 
						|
        )
 | 
						|
 | 
						|
    def bundle(self, output_dir):
 | 
						|
        if not os.path.isdir(output_dir):
 | 
						|
            raise Exception(f'"{output_dir}" doesn\'t exists')
 | 
						|
        self.output_dir = output_dir
 | 
						|
        manifest_file = os.path.join(self.output_dir, "Manifest.json")
 | 
						|
        # Form Manifest
 | 
						|
        manifest = dict(MANIFEST_TEMPLATE)
 | 
						|
        manifest["manifest"]["timestamp"] = timestamp()
 | 
						|
        # Old FUS Update
 | 
						|
        self.addFile(
 | 
						|
            manifest["copro"]["fus"]["files"],
 | 
						|
            "stm32wb5x_FUS_fw_for_fus_0_5_3.bin",
 | 
						|
            condition="==0.5.3",
 | 
						|
            address="0x080EC000",
 | 
						|
        )
 | 
						|
        # New FUS Update
 | 
						|
        self.addFile(
 | 
						|
            manifest["copro"]["fus"]["files"],
 | 
						|
            "stm32wb5x_FUS_fw.bin",
 | 
						|
            condition=">0.5.3",
 | 
						|
            address="0x080EC000",
 | 
						|
        )
 | 
						|
        # BLE Full Stack
 | 
						|
        self.addFile(
 | 
						|
            manifest["copro"]["radio"]["files"],
 | 
						|
            "stm32wb5x_BLE_Stack_full_fw.bin",
 | 
						|
            address="0x080CA000",
 | 
						|
        )
 | 
						|
        # Save manifest to
 | 
						|
        json.dump(manifest, open(manifest_file, "w"))
 |