#!/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()