vos/ambiq-hal-sys/ambiq-sparkfun-sdk/tools/apollo3_scripts/create_info0.py
2022-10-23 23:45:43 -07:00

410 lines
22 KiB
Python

#!/usr/bin/env python3
# Utility to create info0 for Apollo3
import argparse
import sys
from Crypto.Cipher import AES
import array
import hashlib
import hmac
import os
import binascii
import importlib
from am_defines import *
#from keys_info import keyTblAes, keyTblHmac, custKey
def copy_keys(binarray, offset, key, size):
for i in range (0, size):
binarray[offset + i] = key[i]
#******************************************************************************
#
# Generate the info0 blob as per command line parameters
#
#******************************************************************************
def process(valid, version, output, mainPtr, secPol, keyWrap, secBoot, secBootOnRst, plOnExit, sDbg, bEnErase, infoProg, bNoSramWipe, bSwoCtrl, bDbgAllowed, custTrim, custTrim2, overrideGpio, overridePol, wiredIfMask, wiredSlvInt, wiredI2cAddr, wiredTimeout, u0, u1, u2, u3, u4, u5, krev, arev, chipId0, chipId1, sresv, wprot0, wprot1, rprot0, rprot1, swprot0, swprot1, srprot0, srprot1, wprot2, wprot3, rprot2, rprot3, swprot2, swprot3, srprot2, srprot3, chip, keyFile):
if (chip == 'apollo3'):
import apollo3_info0 as info0
am_print("Apollo3 INFO0")
elif (chip == 'apollo3p'):
import apollo3p_info0 as info0
am_print("Apollo3P INFO0")
filenames = keyFile.split('.')
keys = importlib.import_module(filenames[0])
#generate mutable byte array for the header
hdr_binarray = bytearray([0xFF]*INFO_SIZE_BYTES);
# initialize signature
if (valid == 1):
fill_word(hdr_binarray, info0.INFO0_SIGNATURE0_O, AM_SECBOOT_INFO0_SIGN_PROGRAMMED0)
fill_word(hdr_binarray, info0.INFO0_SIGNATURE1_O, AM_SECBOOT_INFO0_SIGN_PROGRAMMED1)
fill_word(hdr_binarray, info0.INFO0_SIGNATURE2_O, AM_SECBOOT_INFO0_SIGN_PROGRAMMED2)
fill_word(hdr_binarray, info0.INFO0_SIGNATURE3_O, AM_SECBOOT_INFO0_SIGN_PROGRAMMED3)
elif (valid == 0):
fill_word(hdr_binarray, info0.INFO0_SIGNATURE0_O, AM_SECBOOT_INFO0_SIGN_UINIT0)
fill_word(hdr_binarray, info0.INFO0_SIGNATURE1_O, AM_SECBOOT_INFO0_SIGN_UINIT1)
fill_word(hdr_binarray, info0.INFO0_SIGNATURE2_O, AM_SECBOOT_INFO0_SIGN_UINIT2)
fill_word(hdr_binarray, info0.INFO0_SIGNATURE3_O, AM_SECBOOT_INFO0_SIGN_UINIT3)
else:
fill_word(hdr_binarray, info0.INFO0_SIGNATURE0_O, FLASH_INVALID)
fill_word(hdr_binarray, info0.INFO0_SIGNATURE1_O, FLASH_INVALID)
fill_word(hdr_binarray, info0.INFO0_SIGNATURE2_O, FLASH_INVALID)
fill_word(hdr_binarray, info0.INFO0_SIGNATURE3_O, FLASH_INVALID)
am_print("info0 Signature...")
am_print([hex(hdr_binarray[n]) for n in range(0, 16)])
# Flash wipe is no longer supported
bNoFlashWipe = 1
if (valid == 1):
# Build Security word
blAtReset = 1
if (secBoot == 0):
secBoot = 0x5
else:
secBoot = 0x2
if (secBootOnRst == 0):
secBootOnRst = 0x5
else:
secBootOnRst = 0x2
security = (((secPol & 0x7) << 24) | ((keyWrap & 0xf) << 20) | (secBootOnRst << 16) | (secBoot << 12) | ((plOnExit & 0x1) << 11) | ((sDbg & 0x1) << 10) | ((blAtReset & 0x1) << 9) | ((bEnErase & 0x1) << 8) | ((infoProg & 0xf) << 4) | ((bNoFlashWipe & 0x1) << 3) | ((bNoSramWipe & 0x1) << 2) | ((bSwoCtrl & 0x1) << 1) | ((bDbgAllowed & 0x1)))
am_print("Security Word = ", hex(security))
fill_word(hdr_binarray, info0.INFO0_SECURITY_O, security)
# Customer trim
am_print("Customer Trim = ", hex(custTrim))
fill_word(hdr_binarray, info0.INFO0_CUSTOMER_TRIM_O, custTrim)
am_print("Customer Trim2 = ", hex(custTrim2))
fill_word(hdr_binarray, info0.INFO0_CUSTOMER_TRIM2_O, custTrim2)
# Override
override = ((overridePol & 0x1) << 7) | (overrideGpio & 0x7f)
am_print("Override = ", hex(override))
fill_word(hdr_binarray, info0.INFO0_SECURITY_OVR_O, override)
# Wired interface config
wired = ((wiredIfMask & 0x7) | ((wiredSlvInt & 0x3f) << 3) | ((wiredI2cAddr & 0x7f) << 9) | ((wiredTimeout & 0xffff) << 16))
am_print("WiredCfg = ", hex(wired))
fill_word(hdr_binarray, info0.INFO0_SECURITY_WIRED_CFG_O, wired)
# Wired UART cfg
if (wiredIfMask & 0x1): # UART
am_print("UART Config ", hex(u0), hex(u1), hex(u2), hex(u3), hex(u4), hex(u5))
fill_word(hdr_binarray, info0.INFO0_SECURITY_WIRED_IFC_CFG0_O, u0)
fill_word(hdr_binarray, info0.INFO0_SECURITY_WIRED_IFC_CFG1_O, u1)
fill_word(hdr_binarray, info0.INFO0_SECURITY_WIRED_IFC_CFG2_O, u2)
fill_word(hdr_binarray, info0.INFO0_SECURITY_WIRED_IFC_CFG3_O, u3)
fill_word(hdr_binarray, info0.INFO0_SECURITY_WIRED_IFC_CFG4_O, u4)
fill_word(hdr_binarray, info0.INFO0_SECURITY_WIRED_IFC_CFG5_O, u5)
# version
am_print("Version = ", hex(version))
fill_word(hdr_binarray, info0.INFO0_SECURITY_VERSION_O, version)
# main ptr
am_print("Main Ptr = ", hex(mainPtr))
fill_word(hdr_binarray, info0.INFO0_MAIN_PTR1_O, mainPtr)
# SRAM Reservation
am_print("SRAM Reservation = ", hex(sresv))
fill_word(hdr_binarray, info0.INFO0_SECURITY_SRAM_RESV_O, sresv)
# Flash Protections
if (chip == 'apollo3'):
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT_L_O, wprot0)
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT_H_O, wprot1)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT_L_O, rprot0)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT_H_O, rprot1)
am_print("Permanent Write Protections = ", hex(wprot0), ":", hex(wprot1))
am_print("Permanent Copy Protections = ", hex(rprot0), ":", hex(rprot1))
elif (chip == 'apollo3p'):
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT0_O, wprot0)
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT1_O, wprot1)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT0_O, rprot0)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT1_O, rprot1)
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT2_O, wprot2)
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT3_O, wprot3)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT2_O, rprot2)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT3_O, rprot3)
am_print("Permanent Write Protections = ", hex(wprot0), ":", hex(wprot1), ":", hex(wprot2), ":", hex(wprot3))
am_print("Permanent Copy Protections = ", hex(rprot0), ":", hex(rprot1), ":", hex(rprot2), ":", hex(rprot3))
if (chip == 'apollo3'):
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT_SBL_L_O, swprot0)
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT_SBL_H_O, swprot1)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT_SBL_L_O, srprot0)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT_SBL_H_O, srprot1)
am_print("SBL Overridable Write Protections = ", hex(swprot0), ":", hex(swprot1))
am_print("SBL Overridable Copy Protections = ", hex(srprot0), ":", hex(srprot1))
elif (chip == 'apollo3p'):
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT0_SBL_O, swprot0)
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT1_SBL_O, swprot1)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT0_SBL_O, srprot0)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT1_SBL_O, srprot1)
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT2_SBL_O, swprot2)
fill_word(hdr_binarray, info0.INFO0_WRITE_PROTECT3_SBL_O, swprot3)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT2_SBL_O, srprot2)
fill_word(hdr_binarray, info0.INFO0_COPY_PROTECT3_SBL_O, srprot3)
am_print("SBL Overridable Write Protections = ", hex(swprot0), ":", hex(swprot1), ":", hex(swprot2), ":", hex(swprot3))
am_print("SBL Overridable Copy Protections = ", hex(srprot0), ":", hex(srprot1), ":", hex(srprot2), ":", hex(srprot3))
# Customer Key
am_print("Customer Key")
am_print([hex(n) for n in keys.custKey])
copy_keys(hdr_binarray, info0.INFO0_CUSTOMER_KEY0_O, keys.custKey, 16)
# Keys
chipId = int_to_bytes(chipId0) + int_to_bytes(chipId1)
while (len(chipId) != AM_SECBOOT_KEYIDX_BYTES):
chipId = chipId + chipId
am_print("chipID 16")
am_print([hex(n) for n in chipId])
kekOffset = info0.INFO0_CUST_KEK_W0_O
authKeyOffset = info0.INFO0_CUST_AUTH_W0_O
if (keyWrap == 0): ## None
am_print("wrap mode 0")
am_print("KEK")
for i in range (0, INFO_MAX_ENC_KEYS):
am_print([hex(n) for n in keys.keyTblAes[i*AM_SECBOOT_KEYIDX_BYTES:(i*AM_SECBOOT_KEYIDX_BYTES + AM_SECBOOT_KEYIDX_BYTES)]])
copy_keys(hdr_binarray, kekOffset + i*AM_SECBOOT_KEYIDX_BYTES, keys.keyTblAes[i*AM_SECBOOT_KEYIDX_BYTES:(i*AM_SECBOOT_KEYIDX_BYTES + AM_SECBOOT_KEYIDX_BYTES)], AM_SECBOOT_KEYIDX_BYTES)
am_print("AuthKey")
for i in range (0, INFO_MAX_AUTH_KEYS):
am_print([hex(n) for n in keys.keyTblHmac[i*AM_SECBOOT_KEYIDX_BYTES:(i*AM_SECBOOT_KEYIDX_BYTES + AM_SECBOOT_KEYIDX_BYTES)]])
copy_keys(hdr_binarray, authKeyOffset + i*AM_SECBOOT_KEYIDX_BYTES, keys.keyTblHmac[i*AM_SECBOOT_KEYIDX_BYTES:(i*AM_SECBOOT_KEYIDX_BYTES + AM_SECBOOT_KEYIDX_BYTES)], AM_SECBOOT_KEYIDX_BYTES)
elif (keyWrap == 1): ## XOR
am_print("wrap mode 1")
am_print("KEK")
for i in range (0, INFO_MAX_ENC_KEYS):
scrambledKey = keys.keyTblAes[i*AM_SECBOOT_KEYIDX_BYTES:(i*AM_SECBOOT_KEYIDX_BYTES + AM_SECBOOT_KEYIDX_BYTES)]
for j in range (0, AM_SECBOOT_KEYIDX_BYTES):
scrambledKey[j] = scrambledKey[j] ^ keys.custKey[j] ^ chipId[j]
am_print([hex(n) for n in scrambledKey])
copy_keys(hdr_binarray, kekOffset + i*AM_SECBOOT_KEYIDX_BYTES, scrambledKey, AM_SECBOOT_KEYIDX_BYTES)
am_print("AuthKey")
for i in range (0, INFO_MAX_AUTH_KEYS):
scrambledKey = keys.keyTblHmac[i*AM_SECBOOT_KEYIDX_BYTES:(i*AM_SECBOOT_KEYIDX_BYTES + AM_SECBOOT_KEYIDX_BYTES)]
for j in range (0, AM_SECBOOT_KEYIDX_BYTES):
scrambledKey[j] = scrambledKey[j] ^ keys.custKey[j] ^ chipId[j]
am_print([hex(n) for n in scrambledKey])
copy_keys(hdr_binarray, authKeyOffset + i*AM_SECBOOT_KEYIDX_BYTES, scrambledKey, AM_SECBOOT_KEYIDX_BYTES)
elif (keyWrap == 2): ## AES128
am_print("wrap mode 2")
am_print("KEK")
for i in range (0, INFO_MAX_ENC_KEYS):
scrambledKey = encrypt_app_aes(keys.keyTblAes[i*AM_SECBOOT_KEYIDX_BYTES:(i*AM_SECBOOT_KEYIDX_BYTES + AM_SECBOOT_KEYIDX_BYTES)], keys.custKey, chipId)
am_print([hex(n) for n in scrambledKey])
copy_keys(hdr_binarray, kekOffset + i*AM_SECBOOT_KEYIDX_BYTES, scrambledKey, AM_SECBOOT_KEYIDX_BYTES)
am_print("AuthKey")
for i in range (0, INFO_MAX_AUTH_KEYS):
scrambledKey = encrypt_app_aes(keys.keyTblHmac[i*AM_SECBOOT_KEYIDX_BYTES:(i*AM_SECBOOT_KEYIDX_BYTES + AM_SECBOOT_KEYIDX_BYTES)], keys.custKey, chipId)
am_print([hex(n) for n in scrambledKey])
copy_keys(hdr_binarray, authKeyOffset + i*AM_SECBOOT_KEYIDX_BYTES, scrambledKey, AM_SECBOOT_KEYIDX_BYTES)
else:
am_print("Unknown wrap mode")
# Revocation Masks
am_print("KREV Mask = ", hex(krev))
fill_word(hdr_binarray, info0.INFO0_KREVTRACK_O, krev)
am_print("AREV Mask = ", hex(arev))
fill_word(hdr_binarray, info0.INFO0_AREVTRACK_O, arev)
# now output all three binary arrays in the proper order
with open(output + '.bin', mode = 'wb') as out:
am_print("Writing to file ", output + '.bin')
out.write(hdr_binarray)
def parse_arguments():
parser = argparse.ArgumentParser(description =
'Generate Corvette Info0 Blob')
parser.add_argument('output',
help = 'Output filename (without the extension)')
parser.add_argument('--valid', dest = 'valid', type=auto_int, default=1, choices = [0,1,2],
help = 'INFO0 Valid 0 = Uninitialized, 1 = Valid, 2 = Invalid (Default = 1)?')
parser.add_argument('--version', dest = 'version', type=auto_int, default=0,
help = 'version (Default = 0)?')
parser.add_argument('--main', dest = 'mainPtr', type=auto_int, default=hex(AM_SECBOOT_DEFAULT_NONSECURE_MAIN),
help = 'Main Firmware location (Default = ' + str(hex(AM_SECBOOT_DEFAULT_NONSECURE_MAIN)) + ')?')
parser.add_argument('--secpol', dest = 'secPol', type=auto_int, default=hex(0x0), choices = [0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7],
help = 'Security Policy Bitmask (Default = 0)? (bit 0 = Auth, bit 1 = Enc, bit 2 = Version Rollback)')
parser.add_argument('--wrap', dest = 'keyWrap', type=auto_int, default=0, choices = [0,1,2],
help = 'KeyWrap Algo (Default = 0)? (0 = none, 1 = XOR, 2 = AES128)')
parser.add_argument('--sRst', dest = 'secBootOnRst', type=auto_int, default=0, choices = [0,1],
help = 'Secure Boot on Soft Reset (Default = 0) ?')
parser.add_argument('-s', dest = 'secBoot', type=auto_int, default=0, choices = [0,1],
help = 'Secure Boot (Default = 0) ?')
parser.add_argument('--pl', dest = 'plOnExit', type=auto_int, default=0, choices = [0,1],
help = 'Protection Lock Enabled (Default = 0) ?')
parser.add_argument('--sDbgAllowed', dest = 'sDbg', type=auto_int, default=1, choices = [0,1],
help = 'Debugger allowed during (optional) Secondary Bootloader (Default = 1) ?')
parser.add_argument('--erase', dest = 'bEnErase', type=auto_int, default=1, choices = [0,1],
help = 'Info0 Erase Allowed (Default = 1) ?')
parser.add_argument('--prog', dest = 'infoProg', type=auto_int, default=hex(0xf),
help = 'INFO0 Program allowed (1 bit per quadrant) (Default = 0xf) ?')
parser.add_argument('--snowipe', dest = 'bNoSramWipe', type=auto_int, default=1, choices = [0,1],
help = ' Do not wipe SRAM on debugger connection (Default = 1) ?')
parser.add_argument('--swo', dest = 'bSwoCtrl', type=auto_int, default=1, choices = [0,1],
help = 'debugger connection allowed (Default = 1) ?')
parser.add_argument('--dbgprot', dest = 'bDbgAllowed', type=auto_int, default=1, choices = [0,1],
help = 'Do not lock debugger (Default = 1) ?')
parser.add_argument('--trim', dest = 'custTrim', type=auto_int, default=hex(0xFFFFFFFF),
help = 'customer trim ?')
parser.add_argument('--trim2', dest = 'custTrim2', type=auto_int, default=hex(0xFFFFFFFF),
help = 'customer trim 2?')
parser.add_argument('--gpio', dest = 'overrideGpio', type=auto_int, default=hex(0x7f),
help = 'Override GPIO (7 bit - in hex) - 0x7f for disabled (Default = 0x7f)')
parser.add_argument('--gpiolvl', dest = 'overridePol', type=auto_int, default=0, choices = [0,1],
help = 'Override GPIO Polarity (0 = low, 1 = hi) (Default = 0)')
parser.add_argument('--wmask', dest = 'wiredIfMask', type=auto_int, default=0x1,
help = 'Wired interface mask (bit 0 = UART, bit 1 = SPI, bit 2 = I2C) (default = UART)')
parser.add_argument('--wSlInt', dest = 'wiredSlvInt', type=auto_int, default=4,
help = 'Wired IOS interface handshake pin (default = 4)')
parser.add_argument('--wI2c', dest = 'wiredI2cAddr', type=auto_int, default=hex(0x20),
help = 'Wired IOS interface I2C Address (default = 0x20)')
parser.add_argument('--wTO', dest = 'wiredTimeout', type=auto_int, default=20000,
help = 'Wired interface timeout in millisec (default = 20000)')
parser.add_argument('--u0', dest = 'u0', type=auto_int, default=hex(0xFFFFFFFF),
help = 'UART Config 0 (default = 0xFFFFFFFF)')
parser.add_argument('--u1', dest = 'u1', type=auto_int, default=hex(0xFFFFFFFF),
help = 'UART Config 1 (default = 0xFFFFFFFF)')
parser.add_argument('--u2', dest = 'u2', type=auto_int, default=hex(0xFFFFFFFF),
help = 'UART Config 2 (default = 0xFFFFFFFF)')
parser.add_argument('--u3', dest = 'u3', type=auto_int, default=hex(0xFFFFFFFF),
help = 'UART Config 3 (default = 0xFFFFFFFF)')
parser.add_argument('--u4', dest = 'u4', type=auto_int, default=hex(0xFFFFFFFF),
help = 'UART Config 4 (default = 0xFFFFFFFF)')
parser.add_argument('--u5', dest = 'u5', type=auto_int, default=hex(0xFFFFFFFF),
help = 'UART Config 5 (default = 0xFFFFFFFF)')
parser.add_argument('--krev', dest='krev', type=auto_int, default = hex(0xFFFFFFFF),
help='KEK Revocation Mask (Default 0xFFFFFFFF)')
parser.add_argument('--arev', dest='arev', type=auto_int, default = hex(0xFFFFFFFF),
help='AuthKey Revocation Mask (Default 0xFFFFFFFF)')
parser.add_argument('--sresv', dest='sresv', type=auto_int, default = hex(0x0),
help='SRAM Reservation (Default 0x0)')
parser.add_argument('--chipid0', dest='chipId0', type=auto_int, default = 0,
help='CHIPID0 for the device (Default 0)')
parser.add_argument('--chipid1', dest='chipId1', type=auto_int, default = 0,
help='CHIPID1 for the device (Default 0)')
parser.add_argument('--wprot0', dest='wprot0', type=auto_int, default = hex(0xFFFFFFFF),
help='Permanent Write Protections Mask for flash#0 (Default 0xFFFFFFFF)')
parser.add_argument('--wprot1', dest='wprot1', type=auto_int, default = hex(0xFFFFFFFF),
help='Permanent Write Protections Mask for flash#1 (Default 0xFFFFFFFF)')
parser.add_argument('--rprot0', dest='rprot0', type=auto_int, default = hex(0xFFFFFFFF),
help='Permanent Copy Protections Mask for flash#0 (Default 0xFFFFFFFF)')
parser.add_argument('--rprot1', dest='rprot1', type=auto_int, default = hex(0xFFFFFFFF),
help='Permanent Copy Protections Mask for flash#1 (Default 0xFFFFFFFF)')
parser.add_argument('--swprot0', dest='swprot0', type=auto_int, default = hex(0xFFFFFFFF),
help='SBL overridable Write Protections Mask for flash#0 (Default 0xFFFFFFFF)')
parser.add_argument('--swprot1', dest='swprot1', type=auto_int, default = hex(0xFFFFFFFF),
help='SBL overridable Write Protections Mask for flash#1 (Default 0xFFFFFFFF)')
parser.add_argument('--srprot0', dest='srprot0', type=auto_int, default = hex(0xFFFFFFFF),
help='SBL overridable Copy Protections Mask for flash#0 (Default 0xFFFFFFFF)')
parser.add_argument('--srprot1', dest='srprot1', type=auto_int, default = hex(0xFFFFFFFF),
help='SBL overridable Copy Protections Mask for flash#1 (Default 0xFFFFFFFF)')
parser.add_argument('--wprot2', dest='wprot2', type=auto_int, default = hex(0xFFFFFFFF),
help='Permanent Write Protections Mask for flash#2 (Default 0xFFFFFFFF)')
parser.add_argument('--wprot3', dest='wprot3', type=auto_int, default = hex(0xFFFFFFFF),
help='Permanent Write Protections Mask for flash#3 (Default 0xFFFFFFFF)')
parser.add_argument('--rprot2', dest='rprot2', type=auto_int, default = hex(0xFFFFFFFF),
help='Permanent Copy Protections Mask for flash#2 (Default 0xFFFFFFFF)')
parser.add_argument('--rprot3', dest='rprot3', type=auto_int, default = hex(0xFFFFFFFF),
help='Permanent Copy Protections Mask for flash#3 (Default 0xFFFFFFFF)')
parser.add_argument('--swprot2', dest='swprot2', type=auto_int, default = hex(0xFFFFFFFF),
help='SBL overridable Write Protections Mask for flash#2 (Default 0xFFFFFFFF)')
parser.add_argument('--swprot3', dest='swprot3', type=auto_int, default = hex(0xFFFFFFFF),
help='SBL overridable Write Protections Mask for flash#3 (Default 0xFFFFFFFF)')
parser.add_argument('--srprot2', dest='srprot2', type=auto_int, default = hex(0xFFFFFFFF),
help='SBL overridable Copy Protections Mask for flash#2 (Default 0xFFFFFFFF)')
parser.add_argument('--srprot3', dest='srprot3', type=auto_int, default = hex(0xFFFFFFFF),
help='SBL overridable Copy Protections Mask for flash#3 (Default 0xFFFFFFFF)')
parser.add_argument('--chipType', dest='chip', type=str, required=True,
choices = ['apollo3', 'apollo3p'],
help='Chip Type: apollo3, apollo3p (default = apollo3)')
parser.add_argument('-k', type=str, dest='keyFile', nargs='?', default='keys_info.py',
help='key file in specified format [default = keys_info.py]')
parser.add_argument('--loglevel', dest='loglevel', type=auto_int, default=AM_PRINT_LEVEL_INFO,
choices = range(AM_PRINT_LEVEL_MIN, AM_PRINT_LEVEL_MAX+1),
help=helpPrintLevel)
args = parser.parse_args()
return args
#******************************************************************************
#
# Main function.
#
#******************************************************************************
def main():
# Read the arguments.
args = parse_arguments()
am_set_print_level(args.loglevel)
process(args.valid, args.version, args.output, args.mainPtr, args.secPol, args.keyWrap, args.secBoot, args.secBootOnRst, args.plOnExit, args.sDbg, args.bEnErase, args.infoProg, args.bNoSramWipe, args.bSwoCtrl, args.bDbgAllowed, args.custTrim, args.custTrim2, args.overrideGpio, args.overridePol, args.wiredIfMask, args.wiredSlvInt, args.wiredI2cAddr, args.wiredTimeout, args.u0, args.u1, args.u2, args.u3, args.u4, args.u5, args.krev, args.arev, args.chipId0, args.chipId1, args.sresv, args.wprot0, args.wprot1, args.rprot0, args.rprot1, args.swprot0, args.swprot1, args.srprot0, args.srprot1, args.wprot2, args.wprot3, args.rprot2, args.rprot3, args.swprot2, args.swprot3, args.srprot2, args.srprot3, args.chip, args.keyFile)
if __name__ == '__main__':
main()