def read(self, address, length, hex_file_path): if ((int(length, 16) % 4) != 0): print("ERROR: number of bytes must be a multiple of 4") return NrfDfuErr.INVALID_PARAMETER if (not self._quiet): print("Reading %s bytes from address %s" % (length, address)) open(hex_file_path, 'w+') ih = IntelHex(hex_file_path) ih.__init__() self.api.write_u32(0x2000000C, 0x00000004, True) self.api.write_u32(0x20000010, int(address, 16), False) self.api.write_u32(0x20000014, int(length, 16), False) self.api.write_u32(0x4002A004, 0x00000001, False) start_time = time.time() event_received = False while (event_received == False): if ((time.time() - start_time) > 10): print ("ERROR: Time out, no event received after 10 sec.") return NrfDfuErr.TIME_OUT return_value, event_received = self.get_event_status() if return_value < 0: return return_value self.acknowlage_events() return_value, modem_response = self.read_be(0x2000000C) if (modem_response == "5a000001"): print("\n\n ERROR: UNKNOWN COMMAND") return NrfDfuErr.DFU_ERROR elif (modem_response == "5a000002"): print("\n\n ERROR: COMMAND ERROR") error_result = self.api.read_u32(0x20000010) print("ERROR: Read failed at {}".format(hex(error_result))) return NrfDfuErr.DFU_ERROR word_count = int(length, 16)//4 for i in range(0, word_count): return_value, lelevel = self.hex_read(0x20000010+(i*4)) ih.puts(int(address,16)+(i*4), codecs.decode(lelevel, "hex")) ih.write_hex_file(hex_file_path) if (not self._quiet): print ("Reading completed") return NrfDfuErr.SUCCESS