Example #1
0
    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