openmv/tools/alif/utils/gen_fw_cfg.py
2024-10-05 09:57:27 +02:00

189 lines
6.8 KiB
Python
Executable File

#!/usr/bin/env python3
"""
__author__ = ""
__copyright__ = "ALIF Seminconductor"
__version__ = "0.1.0"
__status__ = "Dev"
"""
# pylint: disable=unused-argument, invalid-name, bare-except
import sys
import argparse
import json
import os
import utils.toc_common
TOOL_VERSION ="0.1.001" # Define Version constant for each separate tool
EXIT_WITH_ERROR = 1
FW_CFG_FILE = "build/fw_cfg.json"
def mram_size_to_address(mram_size):
mram_size_int = 0
if mram_size == '1.8': # @todo this should be improved
mram_size_int = int("0x001CD000", 16)
elif mram_size == '1.86':
mram_size_int = int("0x001DD000", 16)
else:
mram_size_int = int(float(mram_size) * 1024 * 1024)
mram_base_int = int("0x80000000", 16)
stoc_start = mram_base_int + mram_size_int
atoc_end = stoc_start - 1
atoc_end_str = "0x" + hex(atoc_end).lstrip("0x").upper()
stoc_start_str = "0x" + hex(stoc_start).lstrip("0x").upper()
return atoc_end_str, stoc_start_str
def handle_sram_rev_b(sram_size, firewall_components, protected_areas):
if "13.5" == sram_size: # no SRAM wounding
#print("**** no SRAM wounding")
return
# load the definitions for REV_B
with open('firewall/sram_rev_b.json', "r") as json_file:
sram_json = json.load(json_file)
# Wound the Modem TCMs - FC #12
firewall_components.append(sram_json["firewall_components"][0])
protected_areas.append(sram_json["protected_areas"][0])
if "8.25" == sram_size: # no other wounding
#print("**** 8.25MB wounding")
return
if "5.75" == sram_size: # E3 with 5.75MB SRAM
# Wound SRAM1 - FC #4 - XNVM
firewall_components.append(sram_json["firewall_components"][1])
protected_areas.append(sram_json["protected_areas"][1])
#print("**** 5.75MB wounding")
return
if "4.5" == sram_size: # E1
# Wound SRAM1 - FC #4 - XNVM
firewall_components.append(sram_json["firewall_components"][1])
protected_areas.append(sram_json["protected_areas"][1])
# Wound M55-HP TCMs - 0x50000000-0x57FFFFFF
firewall_components.append(sram_json["firewall_components"][4])
protected_areas.append(sram_json["protected_areas"][4])
#print("**** 4.5MB wounding")
return
if "3.75" == sram_size: #E3 with 3.75MB SRAM:
# Wound SRAM0 - FC #5 - CVM
firewall_components.append(sram_json["firewall_components"][3])
protected_areas.append(sram_json["protected_areas"][3])
# Wound SRAM1 to 2MB
firewall_components.append(sram_json["firewall_components"][2])
protected_areas.append(sram_json["protected_areas"][2])
#print("**** 3.75MB wounding")
return
# Invalid sram_size - wound SRAM0, SRAM1, and the M55-HP TCMs
firewall_components.append(sram_json["firewall_components"][1])
protected_areas.append(sram_json["protected_areas"][1])
firewall_components.append(sram_json["firewall_components"][3])
protected_areas.append(sram_json["protected_areas"][3])
firewall_components.append(sram_json["firewall_components"][4])
protected_areas.append(sram_json["protected_areas"][4])
print("**** Invalid SRAM size!")
def write_json(json_content):
out_file = FW_CFG_FILE
if (os.path.exists(out_file)):
os.remove(out_file)
with open(out_file, 'w') as f:
json.dump(json_content, f, indent=2)
def gen_fw_cfg_icv(family, mram_size, sram_size, device_revision):
atoc_end_address, stoc_start_address = mram_size_to_address(mram_size)
print(family)
if family == "Balletto-B1-Series" or family == "Balletto-E1C-Series":
print("*** generate FW cfg for Spark")
with open('firewall/fw_cfg_spark.json', "r") as json_file:
spark_json = json.load(json_file)
spark_json["firewall_components"][1]["configured_regions"][0]["end_address"] = atoc_end_address
spark_json["protected_areas"][2]["start_address"] = stoc_start_address
if family == "Balletto-E1C-Series":
# Delete the sections for the BLE protected areas
spark_json["protected_areas"].pop(0)
spark_json["protected_areas"].pop(0)
write_json(spark_json)
return
# MRAM
# The following code is tightly coupled with the structure of the file mram.json.
# Should we define the data structures in Python code instead of reading them from a JSON file?
with open('firewall/mram.json', "r") as json_file:
mram_json = json.load(json_file)
mram_json["firewall_components"][0]["configured_regions"][0]["end_address"] = atoc_end_address
mram_json["protected_areas"][0]["start_address"] = stoc_start_address
is_rev_a = device_revision == 'A0' or device_revision == 'A1'
# generate Master FC configuration
if is_rev_a:
extra_cfg = "firewall/fw_cfg_rev_a.json"
with open(extra_cfg, "r") as extra_cfg_file:
extra_cfg_json = json.load(extra_cfg_file)
firewall_components = extra_cfg_json['firewall_components']
else:
firewall_components = []
# generate Slave FC configuration
firewall_components.append(mram_json['firewall_components'][0])
protected_areas = mram_json['protected_areas']
# SRAM
if not is_rev_a: # rev B
handle_sram_rev_b(sram_size, firewall_components, protected_areas)
out_json = {}
out_json['firewall_components'] = firewall_components
out_json['protected_areas'] = protected_areas
write_json(out_json)
def update_fw_cfg_oem():
with open('build/config/app-device-config.json', "r") as json_file:
json_text = json.load(json_file)
with open('build/config/app-device-config.json', "w") as json_file:
json.dump(json_text, json_file, indent=2)
# TODO: update/generate the Master FC sections
#print("json_text: ", json_text)
#json.dump("", json_file, indent=2)
def main():
"""
"""
if sys.version_info.major == 2:
print("[ERROR] You need Python 3 for this application!")
sys.exit(EXIT_WITH_ERROR)
# Deal with Command Line
parser = argparse.ArgumentParser(description=
'Generate STOC device configuration')
parser.add_argument("-m", "--mram", type=str, default="5.5", help='MRAM size in MB, default 5.5')
parser.add_argument("-s", "--sram", type=str, default="13.5", help="SRAM size in MB, default 13.5")
parser.add_argument("-V" , "--version",
help="Display Version Number", action="store_true")
args = parser.parse_args()
if args.version:
print(TOOL_VERSION)
sys.exit()
mram_size = args.mram.rstrip('0').rstrip('.')
sram_size = args.sram.rstrip('0').rstrip('.')
gen_fw_cfg_icv("", mram_size, sram_size)
if __name__ == "__main__":
main()