コード例 #1
0
ファイル: bl_dfu_sett.py プロジェクト: stianrh/pc-nrfutil
 def __init__(self, ):
     """
     """
     # instantiate a hex object
     self.ihex = intelhex.IntelHex()
     self.temp_dir = None
     self.hex_file = ""
コード例 #2
0
    def comparefiles(self, actual, wanted):
        actualfile = intelhex.IntelHex()
        actualfile.loadfile(actual, format="bin")

        wantedfile = intelhex.IntelHex()
        wantedfile.loadfile(wanted, format="bin")

        self.assertEqual(actualfile.minaddr(), wantedfile.minaddr())
        self.assertEqual(actualfile.maxaddr(), wantedfile.maxaddr())

        minaddress = actualfile.minaddr()
        maxaddress = actualfile.maxaddr()

        length = maxaddress - minaddress

        actualfile_data = actualfile.gets(minaddress, length)
        wantedfile_data = wantedfile.gets(minaddress, length)

        self.assertEqual(actualfile_data, wantedfile_data)
コード例 #3
0
ファイル: nrfhex.py プロジェクト: SKEngineering/pc-nrfutil
 def process_qspi(self):
     qspi_start_address = 0x12000000
     maxaddress = self.maxaddr()
     print "qspi=", hex(maxaddress)
     if maxaddress >= qspi_start_address:
         self.qspi = {}
         self.qspisize = maxaddress + 1 - qspi_start_address
         for i in range(qspi_start_address, maxaddress + 1):
             self.qspi[i] = self._buf[i]
             self._buf.pop(i, 0)
         self.qspihex = intelhex.IntelHex(self.qspi)
         print self.qspihex
         print self.qspisize
コード例 #4
0
    def generate(self, arch, app_file, app_ver, bl_ver, bl_sett_ver,
                 custom_bl_sett_addr, no_backup, backup_address,
                 app_boot_validation_type, sd_boot_validation_type, sd_file,
                 key_file):

        self.set_arch(arch)

        if custom_bl_sett_addr is not None:
            self.bl_sett_addr = custom_bl_sett_addr

        if bl_sett_ver == 1:
            self.setts = BLDFUSettingsStructV1(self.bl_sett_addr)
        elif bl_sett_ver == 2:
            self.setts = BLDFUSettingsStructV2(self.bl_sett_addr)
        else:
            raise NordicSemiException("Unknown bootloader settings version")

        self.bl_sett_ver = bl_sett_ver & 0xffffffff
        self.bl_ver = bl_ver & 0xffffffff

        if app_ver is not None:
            self.app_ver = app_ver & 0xffffffff
        else:
            self.app_ver = 0x0 & 0xffffffff

        if app_file is not None:
            # load application to find out size and CRC
            self.temp_dir = tempfile.mkdtemp(prefix="nrf_dfu_bl_sett_")
            self.app_bin = Package.normalize_firmware_to_bin(
                self.temp_dir, app_file)

            # calculate application size and CRC32
            self.app_sz = int(Package.calculate_file_size(
                self.app_bin)) & 0xffffffff
            self.app_crc = int(Package.calculate_crc(
                32, self.app_bin)) & 0xffffffff
            self.bank0_bank_code = 0x1 & 0xffffffff

            # Calculate Boot validation fields for app
            if app_boot_validation_type == 'VALIDATE_GENERATED_CRC':
                self.app_boot_validation_type = 1 & 0xffffffff
                self.app_boot_validation_bytes = struct.pack(
                    '<I', self.app_crc)
            elif app_boot_validation_type == 'VALIDATE_GENERATED_SHA256':
                self.app_boot_validation_type = 2 & 0xffffffff
                sha256 = Package.calculate_sha256_hash(self.app_bin)
                self.app_boot_validation_bytes = bytearray([
                    int(binascii.hexlify(i), 16) for i in list(sha256)
                ][31::-1])
            elif app_boot_validation_type == 'VALIDATE_ECDSA_P256_SHA256':
                self.app_boot_validation_type = 3 & 0xffffffff
                ecdsa = Package.sign_firmware(key_file, self.app_bin)
                self.app_boot_validation_bytes = bytearray(
                    [int(binascii.hexlify(i), 16) for i in list(ecdsa)])
            else:  # This also covers 'NO_VALIDATION' case
                self.app_boot_validation_type = 0 & 0xffffffff
                self.app_boot_validation_bytes = bytearray(0)
        else:
            self.app_sz = 0x0 & 0xffffffff
            self.app_crc = 0x0 & 0xffffffff
            self.bank0_bank_code = 0x0 & 0xffffffff
            self.app_boot_validation_type = 0x0 & 0xffffffff
            self.app_boot_validation_bytes = bytearray(0)

        if sd_file is not None:
            # Load SD to calculate CRC
            self.temp_dir = tempfile.mkdtemp(prefix="nrf_dfu_bl_sett")
            temp_sd_file = os.path.join(os.getcwd(), 'temp_sd_file.hex')

            # Load SD hex file and remove MBR before calculating keys
            ih_sd = intelhex.IntelHex(sd_file)
            ih_sd_no_mbr = intelhex.IntelHex()
            ih_sd_no_mbr.merge(ih_sd[0x1000:], overlap='error')
            ih_sd_no_mbr.write_hex_file(temp_sd_file)

            self.sd_bin = Package.normalize_firmware_to_bin(
                self.temp_dir, temp_sd_file)
            os.remove(temp_sd_file)

            self.sd_sz = int(Package.calculate_file_size(
                self.sd_bin)) & 0xffffffff

            # Calculate Boot validation fields for SD
            if sd_boot_validation_type == 'VALIDATE_GENERATED_CRC':
                self.sd_boot_validation_type = 1 & 0xffffffff
                sd_crc = int(Package.calculate_crc(32,
                                                   self.sd_bin)) & 0xffffffff
                self.sd_boot_validation_bytes = struct.pack('<I', sd_crc)
            elif sd_boot_validation_type == 'VALIDATE_GENERATED_SHA256':
                self.sd_boot_validation_type = 2 & 0xffffffff
                sha256 = Package.calculate_sha256_hash(self.sd_bin)
                self.sd_boot_validation_bytes = bytearray([
                    int(binascii.hexlify(i), 16) for i in list(sha256)
                ][31::-1])
            elif sd_boot_validation_type == 'VALIDATE_ECDSA_P256_SHA256':
                self.sd_boot_validation_type = 3 & 0xffffffff
                ecdsa = Package.sign_firmware(key_file, self.sd_bin)
                self.sd_boot_validation_bytes = bytearray(
                    [int(binascii.hexlify(i), 16) for i in list(ecdsa)])
            else:  # This also covers 'NO_VALIDATION_CASE'
                self.sd_boot_validation_type = 0 & 0xffffffff
                self.sd_boot_validation_bytes = bytearray(0)
        else:
            self.sd_sz = 0x0 & 0xffffffff
            self.sd_boot_validation_type = 0 & 0xffffffff
            self.sd_boot_validation_bytes = bytearray(0)

        # additional harcoded values
        self.bank_layout = 0x0 & 0xffffffff
        self.bank_current = 0x0 & 0xffffffff

        # Fill the entire settings page with 0's
        for offset in range(0, self.setts.bytes_count):
            self.ihex[self.bl_sett_addr + offset] = 0x00

        self._add_value_tohex(self.setts.sett_ver, self.bl_sett_ver)
        self._add_value_tohex(self.setts.app_ver, self.app_ver)
        self._add_value_tohex(self.setts.bl_ver, self.bl_ver)
        self._add_value_tohex(self.setts.bank_layout, self.bank_layout)
        self._add_value_tohex(self.setts.bank_current, self.bank_current)
        self._add_value_tohex(self.setts.bank0_img_sz, self.app_sz)
        self._add_value_tohex(self.setts.bank0_img_crc, self.app_crc)
        self._add_value_tohex(self.setts.bank0_bank_code, self.bank0_bank_code)
        self._add_value_tohex(self.setts.sd_sz, self.sd_sz)

        self.boot_validation_crc = 0x0 & 0xffffffff
        if self.bl_sett_ver == 2:
            self._add_value_tohex(self.setts.sd_validation_type,
                                  self.sd_boot_validation_type, '<b')
            self.ihex.puts(self.setts.sd_validation_bytes,
                           self.sd_boot_validation_bytes)

            self._add_value_tohex(self.setts.app_validation_type,
                                  self.app_boot_validation_type, '<b')
            self.ihex.puts(self.setts.app_validation_bytes,
                           self.app_boot_validation_bytes)

            self.boot_validation_crc = self._calculate_crc32_from_hex(
                self.ihex,
                start_addr=self.setts.sd_validation_type,
                end_addr=self.setts.last_addr) & 0xffffffff
            self._add_value_tohex(self.setts.boot_validataion_crc,
                                  self.boot_validation_crc)

        self.crc = self._calculate_crc32_from_hex(
            self.ihex,
            start_addr=self.bl_sett_addr + 4,
            end_addr=self.setts.init_cmd - 1) & 0xffffffff
        self._add_value_tohex(self.setts.crc, self.crc)

        if backup_address is None:
            self.backup_address = self.bl_sett_addr - self.bl_sett_backup_offset
        else:
            self.backup_address = backup_address

        if not no_backup:
            for offset in range(0, self.setts.bytes_count):
                self.ihex[self.backup_address +
                          offset] = self.ihex[self.bl_sett_addr + offset]