ON Semiconductor / mbed-os

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
group-onsemi
Date:
Wed Jan 25 20:34:15 2017 +0000
Revision:
0:098463de4c5d
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-onsemi 0:098463de4c5d 1 """
group-onsemi 0:098463de4c5d 2 @copyright (c) 2012 ON Semiconductor. All rights reserved.
group-onsemi 0:098463de4c5d 3 ON Semiconductor is supplying this software for use with ON Semiconductor
group-onsemi 0:098463de4c5d 4 processor based microcontrollers only.
group-onsemi 0:098463de4c5d 5 THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
group-onsemi 0:098463de4c5d 6 OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
group-onsemi 0:098463de4c5d 7 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
group-onsemi 0:098463de4c5d 8 ON SEMICONDUCTOR SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL,
group-onsemi 0:098463de4c5d 9 INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
group-onsemi 0:098463de4c5d 10 """
group-onsemi 0:098463de4c5d 11
group-onsemi 0:098463de4c5d 12 from __future__ import absolute_import
group-onsemi 0:098463de4c5d 13 from __future__ import print_function
group-onsemi 0:098463de4c5d 14
group-onsemi 0:098463de4c5d 15 import itertools
group-onsemi 0:098463de4c5d 16 import binascii
group-onsemi 0:098463de4c5d 17 import intelhex
group-onsemi 0:098463de4c5d 18 from tools.config import Config
group-onsemi 0:098463de4c5d 19
group-onsemi 0:098463de4c5d 20 FIB_BASE = 0x2000
group-onsemi 0:098463de4c5d 21 FLASH_BASE = 0x3000
group-onsemi 0:098463de4c5d 22 FW_REV = 0x01000100
group-onsemi 0:098463de4c5d 23 TRIM_BASE = 0x2800
group-onsemi 0:098463de4c5d 24
group-onsemi 0:098463de4c5d 25 def ranges(i):
group-onsemi 0:098463de4c5d 26 for _, b in itertools.groupby(enumerate(i), lambda x_y: x_y[1] - x_y[0]):
group-onsemi 0:098463de4c5d 27 b = list(b)
group-onsemi 0:098463de4c5d 28 yield b[0][1], b[-1][1]
group-onsemi 0:098463de4c5d 29
group-onsemi 0:098463de4c5d 30
group-onsemi 0:098463de4c5d 31 def add_fib_at_start(arginput):
group-onsemi 0:098463de4c5d 32 input_file = arginput + ".bin"
group-onsemi 0:098463de4c5d 33 file_name_hex = arginput + "_fib.hex"
group-onsemi 0:098463de4c5d 34 file_name_bin = arginput + ".bin"
group-onsemi 0:098463de4c5d 35
group-onsemi 0:098463de4c5d 36 # Read in hex file
group-onsemi 0:098463de4c5d 37 input_hex_file = intelhex.IntelHex()
group-onsemi 0:098463de4c5d 38 input_hex_file.padding = 0x00
group-onsemi 0:098463de4c5d 39 input_hex_file.loadbin(input_file, offset=FLASH_BASE)
group-onsemi 0:098463de4c5d 40
group-onsemi 0:098463de4c5d 41 output_hex_file = intelhex.IntelHex()
group-onsemi 0:098463de4c5d 42 output_hex_file.padding = 0x00
group-onsemi 0:098463de4c5d 43
group-onsemi 0:098463de4c5d 44 # Get the starting and ending address
group-onsemi 0:098463de4c5d 45 addresses = input_hex_file.addresses()
group-onsemi 0:098463de4c5d 46 addresses.sort()
group-onsemi 0:098463de4c5d 47 start_end_pairs = list(ranges(addresses))
group-onsemi 0:098463de4c5d 48 regions = len(start_end_pairs)
group-onsemi 0:098463de4c5d 49
group-onsemi 0:098463de4c5d 50 if regions == 1:
group-onsemi 0:098463de4c5d 51 start, end = start_end_pairs[0]
group-onsemi 0:098463de4c5d 52 else:
group-onsemi 0:098463de4c5d 53 start = min(min(start_end_pairs))
group-onsemi 0:098463de4c5d 54 end = max(max(start_end_pairs))
group-onsemi 0:098463de4c5d 55
group-onsemi 0:098463de4c5d 56 assert start >= FLASH_BASE, ("Error - start 0x%x less than begining of user\
group-onsemi 0:098463de4c5d 57 flash area" %start)
group-onsemi 0:098463de4c5d 58 # Compute checksum over the range (don't include data at location of crc)
group-onsemi 0:098463de4c5d 59 size = end - start + 1
group-onsemi 0:098463de4c5d 60 data = input_hex_file.tobinarray(start=start, size=size)
group-onsemi 0:098463de4c5d 61 crc32 = binascii.crc32(data) & 0xFFFFFFFF
group-onsemi 0:098463de4c5d 62
group-onsemi 0:098463de4c5d 63 fw_rev = FW_REV
group-onsemi 0:098463de4c5d 64
group-onsemi 0:098463de4c5d 65 checksum = (start + size + crc32 + fw_rev) & 0xFFFFFFFF
group-onsemi 0:098463de4c5d 66
group-onsemi 0:098463de4c5d 67 print("Writing FIB: base 0x%08X, size 0x%08X, crc32 0x%08X, fw rev 0x%08X,\
group-onsemi 0:098463de4c5d 68 checksum 0x%08X" % (start, size, crc32, fw_rev, checksum))
group-onsemi 0:098463de4c5d 69
group-onsemi 0:098463de4c5d 70 #expected initial values used by daplink to validate that it is a valid bin
group-onsemi 0:098463de4c5d 71 #file added as dummy values in this file because the fib area preceeds the
group-onsemi 0:098463de4c5d 72 #application area the bootloader will ignore these dummy values
group-onsemi 0:098463de4c5d 73 # 00 is stack pointer (RAM address)
group-onsemi 0:098463de4c5d 74 # 04 is Reset vector (FLASH address)
group-onsemi 0:098463de4c5d 75 # 08 NMI_Handler (FLASH address)
group-onsemi 0:098463de4c5d 76 # 0C HardFault_Handler(FLASH address)
group-onsemi 0:098463de4c5d 77 # 10 dummy
group-onsemi 0:098463de4c5d 78 dummy_sp = 0x3FFFFC00
group-onsemi 0:098463de4c5d 79 dummy_reset_vector = 0x00003625
group-onsemi 0:098463de4c5d 80 dummy_nmi_handler = 0x00003761
group-onsemi 0:098463de4c5d 81 dummy_hardfault_handler = 0x00003691
group-onsemi 0:098463de4c5d 82 dummy_blank = 0x00000000
group-onsemi 0:098463de4c5d 83
group-onsemi 0:098463de4c5d 84 #expected fib structure
group-onsemi 0:098463de4c5d 85 #typedef struct fib{
group-onsemi 0:098463de4c5d 86 #uint32_t base; /**< Base offset of firmware, indicating what flash the
group-onsemi 0:098463de4c5d 87 # firmware is in. (will never be 0x11111111) */
group-onsemi 0:098463de4c5d 88 #uint32_t size; /**< Size of the firmware */
group-onsemi 0:098463de4c5d 89 #uint32_t crc; /**< CRC32 for firmware correctness check */
group-onsemi 0:098463de4c5d 90 #uint32_t rev; /**< Revision number */
group-onsemi 0:098463de4c5d 91 #uint32_t checksum; /**< Check-sum of information block */
group-onsemi 0:098463de4c5d 92 #}fib_t, *fib_pt;
group-onsemi 0:098463de4c5d 93
group-onsemi 0:098463de4c5d 94 fib_start = FIB_BASE
group-onsemi 0:098463de4c5d 95 dummy_fib_size = 20
group-onsemi 0:098463de4c5d 96 fib_size = 20
group-onsemi 0:098463de4c5d 97 trim_size = 24
group-onsemi 0:098463de4c5d 98 user_code_start = FLASH_BASE
group-onsemi 0:098463de4c5d 99 trim_area_start = TRIM_BASE
group-onsemi 0:098463de4c5d 100
group-onsemi 0:098463de4c5d 101 # Write FIB to the file in little endian
group-onsemi 0:098463de4c5d 102 output_hex_file[fib_start + 0] = (dummy_sp >> 0) & 0xFF
group-onsemi 0:098463de4c5d 103 output_hex_file[fib_start + 1] = (dummy_sp >> 8) & 0xFF
group-onsemi 0:098463de4c5d 104 output_hex_file[fib_start + 2] = (dummy_sp >> 16) & 0xFF
group-onsemi 0:098463de4c5d 105 output_hex_file[fib_start + 3] = (dummy_sp >> 24) & 0xFF
group-onsemi 0:098463de4c5d 106
group-onsemi 0:098463de4c5d 107 output_hex_file[fib_start + 4] = (dummy_reset_vector >> 0) & 0xFF
group-onsemi 0:098463de4c5d 108 output_hex_file[fib_start + 5] = (dummy_reset_vector >> 8) & 0xFF
group-onsemi 0:098463de4c5d 109 output_hex_file[fib_start + 6] = (dummy_reset_vector >> 16) & 0xFF
group-onsemi 0:098463de4c5d 110 output_hex_file[fib_start + 7] = (dummy_reset_vector >> 24) & 0xFF
group-onsemi 0:098463de4c5d 111
group-onsemi 0:098463de4c5d 112 output_hex_file[fib_start + 8] = (dummy_nmi_handler >> 0) & 0xFF
group-onsemi 0:098463de4c5d 113 output_hex_file[fib_start + 9] = (dummy_nmi_handler >> 8) & 0xFF
group-onsemi 0:098463de4c5d 114 output_hex_file[fib_start + 10] = (dummy_nmi_handler >> 16) & 0xFF
group-onsemi 0:098463de4c5d 115 output_hex_file[fib_start + 11] = (dummy_nmi_handler >> 24) & 0xFF
group-onsemi 0:098463de4c5d 116
group-onsemi 0:098463de4c5d 117 output_hex_file[fib_start + 12] = (dummy_hardfault_handler >> 0) & 0xFF
group-onsemi 0:098463de4c5d 118 output_hex_file[fib_start + 13] = (dummy_hardfault_handler >> 8) & 0xFF
group-onsemi 0:098463de4c5d 119 output_hex_file[fib_start + 14] = (dummy_hardfault_handler >> 16) & 0xFF
group-onsemi 0:098463de4c5d 120 output_hex_file[fib_start + 15] = (dummy_hardfault_handler >> 24) & 0xFF
group-onsemi 0:098463de4c5d 121
group-onsemi 0:098463de4c5d 122 output_hex_file[fib_start + 16] = (dummy_blank >> 0) & 0xFF
group-onsemi 0:098463de4c5d 123 output_hex_file[fib_start + 17] = (dummy_blank >> 8) & 0xFF
group-onsemi 0:098463de4c5d 124 output_hex_file[fib_start + 18] = (dummy_blank >> 16) & 0xFF
group-onsemi 0:098463de4c5d 125 output_hex_file[fib_start + 19] = (dummy_blank >> 24) & 0xFF
group-onsemi 0:098463de4c5d 126
group-onsemi 0:098463de4c5d 127 # Write FIB to the file in little endian
group-onsemi 0:098463de4c5d 128 output_hex_file[fib_start + 20] = (start >> 0) & 0xFF
group-onsemi 0:098463de4c5d 129 output_hex_file[fib_start + 21] = (start >> 8) & 0xFF
group-onsemi 0:098463de4c5d 130 output_hex_file[fib_start + 22] = (start >> 16) & 0xFF
group-onsemi 0:098463de4c5d 131 output_hex_file[fib_start + 23] = (start >> 24) & 0xFF
group-onsemi 0:098463de4c5d 132
group-onsemi 0:098463de4c5d 133 output_hex_file[fib_start + 24] = (size >> 0) & 0xFF
group-onsemi 0:098463de4c5d 134 output_hex_file[fib_start + 25] = (size >> 8) & 0xFF
group-onsemi 0:098463de4c5d 135 output_hex_file[fib_start + 26] = (size >> 16) & 0xFF
group-onsemi 0:098463de4c5d 136 output_hex_file[fib_start + 27] = (size >> 24) & 0xFF
group-onsemi 0:098463de4c5d 137
group-onsemi 0:098463de4c5d 138 output_hex_file[fib_start + 28] = (crc32 >> 0) & 0xFF
group-onsemi 0:098463de4c5d 139 output_hex_file[fib_start + 29] = (crc32 >> 8) & 0xFF
group-onsemi 0:098463de4c5d 140 output_hex_file[fib_start + 30] = (crc32 >> 16) & 0xFF
group-onsemi 0:098463de4c5d 141 output_hex_file[fib_start + 31] = (crc32 >> 24) & 0xFF
group-onsemi 0:098463de4c5d 142
group-onsemi 0:098463de4c5d 143 output_hex_file[fib_start + 32] = (fw_rev >> 0) & 0xFF
group-onsemi 0:098463de4c5d 144 output_hex_file[fib_start + 33] = (fw_rev >> 8) & 0xFF
group-onsemi 0:098463de4c5d 145 output_hex_file[fib_start + 34] = (fw_rev >> 16) & 0xFF
group-onsemi 0:098463de4c5d 146 output_hex_file[fib_start + 35] = (fw_rev >> 24) & 0xFF
group-onsemi 0:098463de4c5d 147
group-onsemi 0:098463de4c5d 148 output_hex_file[fib_start + 36] = (checksum >> 0) & 0xFF
group-onsemi 0:098463de4c5d 149 output_hex_file[fib_start + 37] = (checksum >> 8) & 0xFF
group-onsemi 0:098463de4c5d 150 output_hex_file[fib_start + 38] = (checksum >> 16) & 0xFF
group-onsemi 0:098463de4c5d 151 output_hex_file[fib_start + 39] = (checksum >> 24) & 0xFF
group-onsemi 0:098463de4c5d 152
group-onsemi 0:098463de4c5d 153 #pad the rest of the file
group-onsemi 0:098463de4c5d 154 for i in range(fib_start + dummy_fib_size + fib_size, trim_area_start):
group-onsemi 0:098463de4c5d 155 output_hex_file[i] = 0xFF
group-onsemi 0:098463de4c5d 156
group-onsemi 0:098463de4c5d 157 # Read in configuration data from the config parameter in targets.json
group-onsemi 0:098463de4c5d 158 configData = Config('NCS36510')
group-onsemi 0:098463de4c5d 159 paramData = configData.get_target_config_data()
group-onsemi 0:098463de4c5d 160 for v in paramData.values():
group-onsemi 0:098463de4c5d 161 if (v.name == "target.mac-addr-high"):
group-onsemi 0:098463de4c5d 162 mac_addr_high = int(v.value, 16)
group-onsemi 0:098463de4c5d 163 elif (v.name == "target.mac-addr-low"):
group-onsemi 0:098463de4c5d 164 mac_addr_low = int(v.value,16)
group-onsemi 0:098463de4c5d 165 elif (v.name == "target.32KHz-clk-trim"):
group-onsemi 0:098463de4c5d 166 clk_32k_trim = int(v.value,16)
group-onsemi 0:098463de4c5d 167 elif (v.name == "target.32MHz-clk-trim"):
group-onsemi 0:098463de4c5d 168 clk_32m_trim = int(v.value,16)
group-onsemi 0:098463de4c5d 169 elif (v.name == "target.rssi-trim"):
group-onsemi 0:098463de4c5d 170 rssi = int(v.value,16)
group-onsemi 0:098463de4c5d 171 elif (v.name == "target.txtune-trim"):
group-onsemi 0:098463de4c5d 172 txtune = int(v.value,16)
group-onsemi 0:098463de4c5d 173 else:
group-onsemi 0:098463de4c5d 174 print("Not a valid param")
group-onsemi 0:098463de4c5d 175
group-onsemi 0:098463de4c5d 176 output_hex_file[trim_area_start + 0] = mac_addr_low & 0xFF
group-onsemi 0:098463de4c5d 177 output_hex_file[trim_area_start + 1] = (mac_addr_low >> 8) & 0xFF
group-onsemi 0:098463de4c5d 178 output_hex_file[trim_area_start + 2] = (mac_addr_low >> 16) & 0xFF
group-onsemi 0:098463de4c5d 179 output_hex_file[trim_area_start + 3] = (mac_addr_low >> 24) & 0xFF
group-onsemi 0:098463de4c5d 180
group-onsemi 0:098463de4c5d 181 output_hex_file[trim_area_start + 4] = mac_addr_high & 0xFF
group-onsemi 0:098463de4c5d 182 output_hex_file[trim_area_start + 5] = (mac_addr_high >> 8) & 0xFF
group-onsemi 0:098463de4c5d 183 output_hex_file[trim_area_start + 6] = (mac_addr_high >> 16) & 0xFF
group-onsemi 0:098463de4c5d 184 output_hex_file[trim_area_start + 7] = (mac_addr_high >> 24) & 0xFF
group-onsemi 0:098463de4c5d 185
group-onsemi 0:098463de4c5d 186 output_hex_file[trim_area_start + 8] = clk_32k_trim & 0xFF
group-onsemi 0:098463de4c5d 187 output_hex_file[trim_area_start + 9] = (clk_32k_trim >> 8) & 0xFF
group-onsemi 0:098463de4c5d 188 output_hex_file[trim_area_start + 10] = (clk_32k_trim >> 16) & 0xFF
group-onsemi 0:098463de4c5d 189 output_hex_file[trim_area_start + 11] = (clk_32k_trim >> 24) & 0xFF
group-onsemi 0:098463de4c5d 190
group-onsemi 0:098463de4c5d 191 output_hex_file[trim_area_start + 12] = clk_32m_trim & 0xFF
group-onsemi 0:098463de4c5d 192 output_hex_file[trim_area_start + 13] = (clk_32m_trim >> 8) & 0xFF
group-onsemi 0:098463de4c5d 193 output_hex_file[trim_area_start + 14] = (clk_32m_trim >> 16) & 0xFF
group-onsemi 0:098463de4c5d 194 output_hex_file[trim_area_start + 15] = (clk_32m_trim >> 24) & 0xFF
group-onsemi 0:098463de4c5d 195
group-onsemi 0:098463de4c5d 196 output_hex_file[trim_area_start + 16] = rssi & 0xFF
group-onsemi 0:098463de4c5d 197 output_hex_file[trim_area_start + 17] = (rssi >> 8) & 0xFF
group-onsemi 0:098463de4c5d 198 output_hex_file[trim_area_start + 18] = (rssi >> 16) & 0xFF
group-onsemi 0:098463de4c5d 199 output_hex_file[trim_area_start + 19] = (rssi >> 24) & 0xFF
group-onsemi 0:098463de4c5d 200
group-onsemi 0:098463de4c5d 201 output_hex_file[trim_area_start + 20] = txtune & 0xFF
group-onsemi 0:098463de4c5d 202 output_hex_file[trim_area_start + 21] = (txtune >> 8) & 0xFF
group-onsemi 0:098463de4c5d 203 output_hex_file[trim_area_start + 22] = (txtune >> 16) & 0xFF
group-onsemi 0:098463de4c5d 204 output_hex_file[trim_area_start + 23] = (txtune >> 24) & 0xFF
group-onsemi 0:098463de4c5d 205
group-onsemi 0:098463de4c5d 206 # pad the rest of the area with 0xFF
group-onsemi 0:098463de4c5d 207 for i in range(trim_area_start + trim_size, user_code_start):
group-onsemi 0:098463de4c5d 208 output_hex_file[i] = 0xFF
group-onsemi 0:098463de4c5d 209
group-onsemi 0:098463de4c5d 210 #merge two hex files
group-onsemi 0:098463de4c5d 211 output_hex_file.merge(input_hex_file, overlap='error')
group-onsemi 0:098463de4c5d 212
group-onsemi 0:098463de4c5d 213 # Write out file(s)
group-onsemi 0:098463de4c5d 214 output_hex_file.tofile(file_name_hex, 'hex')
group-onsemi 0:098463de4c5d 215 output_hex_file.tofile(file_name_bin, 'bin')