Example #1
0
    def test_write_and_read_flash_pic16f18446(self):
        """
        This test exercises the write_memory_to_hex function (single segment)
        """
        filename = "{}flash.hex".format(TESTFILE_FOLDER)
        offset = 16
        numbytes = 256
        info = Backend.get_device_info('pic16f18446')
        device_memory_info = deviceinfo.DeviceMemoryInfo(info)
        flash_info = device_memory_info.memory_info_by_name(MemoryNames.FLASH)

        mem_tuple = self._generate_memorytuple(numbytes, flash_info)

        write_memory_to_hex(filename, mem_tuple, offset=offset)
        segments_read = read_memories_from_hex(filename, device_memory_info)

        flash_read = segments_read[0]
        self.assertEqual(len(segments_read),
                         1,
                         msg="There should be only one segment in the hex")
        self.assertEqual(flash_read.offset, offset, msg="Incorrect offset")
        self.assertEqual(flash_read.memory_info[DeviceMemoryInfoKeys.NAME],
                         MemoryNames.FLASH,
                         msg="Incorrect memory name")
        self.assertEqual(flash_read.data, mem_tuple.data, msg="Incorrect data")
Example #2
0
    def test_write_and_read_eeprom_pic16f18446(self):
        """
        This test exercises the write_memory_to_hex function (single segment)
        """
        filename = "{}eeprom.hex".format(TESTFILE_FOLDER)
        offset = 0
        info = Backend.get_device_info('pic16f18446')
        device_memory_info = deviceinfo.DeviceMemoryInfo(info)
        eeprom_info = device_memory_info.memory_info_by_name(
            MemoryNames.EEPROM)
        numbytes_eeprom = eeprom_info[DeviceMemoryInfoKeys.SIZE]

        mem_tuple_eeprom = self._generate_memorytuple(numbytes_eeprom,
                                                      eeprom_info)

        write_memory_to_hex(filename, mem_tuple_eeprom, offset)
        segments_read = read_memories_from_hex(filename, device_memory_info)

        for segment_read in segments_read:
            memory_name = segment_read.memory_info[DeviceMemoryInfoKeys.NAME]
            # When writing multiple segments all will start from relative offset 0
            self.assertEqual(segment_read.offset,
                             offset,
                             msg="Incorrect offset for {}".format(memory_name))
            if memory_name == MemoryNames.EEPROM:
                self.assertEqual(segment_read.data,
                                 mem_tuple_eeprom.data,
                                 msg="Incorrect EEPROM data")
            else:
                self.fail("Unexpected memory: {}".format(memory_name))

        # Sanity check to see that the phantom bytes actually were added by the write to hex
        hexfile = IntelHex()
        hexfile.fromfile(filename, format='hex')
        hexadr = eeprom_info[DeviceMemoryInfoKeys.HEXFILE_ADDRESS]
        data_read = hexfile.tobinarray(start=hexadr,
                                       end=hexadr + numbytes_eeprom * 2 - 1)
        self.assertEqual(
            len(data_read),
            numbytes_eeprom * 2,
            msg=
            "EEPROM should include twice as many bytes as was written due to the phantom bytes"
        )
        index = 0
        for index in range(numbytes_eeprom):
            self.assertEqual(
                data_read[index * 2],
                mem_tuple_eeprom.data[index],
                msg="Incorrect EEROM data in written hex at index {}".format(
                    index * 2))
            self.assertEqual(
                data_read[index * 2 + 1],
                0x00,
                msg="Incorrect phantom byte in written hex at index {}".format(
                    index * 2 + 1))
Example #3
0
    def test_read_hex_when_data_is_outside_any_memory_raises_indexerror(self):
        # Just use a PIC device to avoid having to create fake device info
        devinfo = Backend.get_device_info('pic16f18446')
        device_memory_info = deviceinfo.DeviceMemoryInfo(devinfo)
        flashinfo = device_memory_info.memory_info_by_name(MemoryNames.FLASH)
        filename = "{}out_of_range.hex".format(TESTFILE_FOLDER)
        numbytes = 16
        data = self._generate_dummydata(numbytes)

        # Make a hex file with some data inside flash memory and some data just after the
        # flash memory (outside any memory boundary)
        ihex = IntelHex()
        hexindex = flashinfo[DeviceMemoryInfoKeys.HEXFILE_ADDRESS] + flashinfo[
            DeviceMemoryInfoKeys.SIZE] - 4
        for databyte in data:
            ihex[hexindex] = databyte
            hexindex += 1
        _write_hex_to_file(ihex, filename)

        with self.assertRaises(IndexError):
            read_memories_from_hex(filename, device_memory_info)
Example #4
0
    def test_read_hex_with_several_segments_within_same_memory(self):
        # Just use a PIC device to avoid having to create fake device info
        devinfo = Backend.get_device_info('pic16f18446')
        device_memory_info = deviceinfo.DeviceMemoryInfo(devinfo)
        flashinfo = device_memory_info.memory_info_by_name(MemoryNames.FLASH)
        filename = "{}multi_flash.hex".format(TESTFILE_FOLDER)

        flash1_numbytes = 256
        flash1_offset = 0
        flash1_data = self._generate_dummydata(flash1_numbytes)

        flash2_numbytes = 512
        flash2_offset = 1024
        flash2_data = self._generate_dummydata(flash2_numbytes)

        # Make a hex file with the two flash segments
        ihex = IntelHex()
        hexindex = flash1_offset
        for databyte in flash1_data:
            ihex[hexindex] = databyte
            hexindex += 1
        hexindex = flash2_offset
        for databyte in flash2_data:
            ihex[hexindex] = databyte
            hexindex += 1
        _write_hex_to_file(ihex, filename)

        segments_read = read_memories_from_hex(filename, device_memory_info)

        self.assertEqual(len(segments_read),
                         2,
                         msg="Too many segments read from the hex")
        for segment_read in segments_read:
            memory_name = segment_read.memory_info[DeviceMemoryInfoKeys.NAME]
            self.assertEqual(memory_name, flashinfo[DeviceMemoryInfoKeys.NAME])
            if segment_read.offset == flash1_offset:
                self.assertEqual(segment_read.data, flash1_data,
                                 "First flash segment data mistmatch")
            elif segment_read.offset == flash2_offset:
                self.assertEqual(segment_read.data, flash2_data,
                                 "Second flash segment data mistmatch")
            else:
                self.fail("Segment with invalid offset: {}".format(
                    segment_read.offset))
Example #5
0
    def test_write_and_read_flash_eeprom_atmega4809(self):
        """
        This test exercises the write_memories_to_hex function (multiple segments)
        """
        filename = "{}flasheeprom.hex".format(TESTFILE_FOLDER)
        numbytes_flash = 256
        numbytes_eeprom = 8
        info = Backend.get_device_info('atmega4809')
        device_memory_info = deviceinfo.DeviceMemoryInfo(info)
        flash_info = device_memory_info.memory_info_by_name(MemoryNames.FLASH)
        eeprom_info = device_memory_info.memory_info_by_name(
            MemoryNames.EEPROM)

        mem_tuple_flash = self._generate_memorytuple(numbytes_flash,
                                                     flash_info)
        mem_tuple_eeprom = self._generate_memorytuple(numbytes_eeprom,
                                                      eeprom_info)
        memories = [mem_tuple_flash, mem_tuple_eeprom]

        write_memories_to_hex(filename, memories)
        segments_read = read_memories_from_hex(filename, device_memory_info)

        for segment_read in segments_read:
            memory_name = segment_read.memory_info[DeviceMemoryInfoKeys.NAME]
            # When writing multiple segments all will start from relative offset 0
            self.assertEqual(segment_read.offset,
                             0,
                             msg="Incorrect offset for {}".format(memory_name))
            if memory_name == MemoryNames.FLASH:
                self.assertEqual(segment_read.data,
                                 mem_tuple_flash.data,
                                 msg="Incorrect FLASH data")
            elif memory_name == MemoryNames.EEPROM:
                self.assertEqual(segment_read.data,
                                 mem_tuple_eeprom.data,
                                 msg="Incorrect EEPROM data")
            else:
                self.fail("Unexpected memory: {}".format(memory_name))
Example #6
0
    def test_write_and_read_several_memories_in_one_hex_segment(self):
        """
        This test hacks the memory information for PIC16F18446 to pretend flash and eeprom memories are next to each
        other so that it becomes possible to test writing and reading a hex with several memories in the same hex
        segment.
        """
        filename = "{}consecutive_memories.hex".format(TESTFILE_FOLDER)
        info = Backend.get_device_info('pic16f18446')

        # Hack info to make flash and eeprom segments smaller and next to each other
        flash_size_key = MemoryNames.FLASH + '_' + DeviceMemoryInfoKeys.SIZE
        flash_size_words_key = flash_size_key + '_words'
        flash_size_bytes_key = flash_size_key + '_bytes'
        if flash_size_words_key in info:
            flash_size_words_original = info[flash_size_words_key]
            info[flash_size_words_key] = 1024
        else:
            flash_size_bytes_original = info[flash_size_bytes_key]
            info[flash_size_bytes_key] = 1024 * 2
        eeprom_address_key = MemoryNames.EEPROM + '_' + DeviceMemoryInfoKeys.ADDRESS
        eeprom_address_word_key = eeprom_address_key + '_word'
        eeprom_address_byte_key = eeprom_address_key + '_byte'
        if eeprom_address_word_key in info:
            eeprom_address_word_original = info[eeprom_address_word_key]
            info[eeprom_address_word_key] = 1024
        else:
            eeprom_address_byte_original = info[eeprom_address_byte_key]
            info[eeprom_address_byte_key] = 1024 * 2

        device_memory_info = deviceinfo.DeviceMemoryInfo(info)
        flash_info = device_memory_info.memory_info_by_name(MemoryNames.FLASH)
        eeprom_info = device_memory_info.memory_info_by_name(
            MemoryNames.EEPROM)

        mem_tuple_flash = self._generate_memorytuple(
            flash_info[DeviceMemoryInfoKeys.SIZE], flash_info)
        mem_tuple_eeprom = self._generate_memorytuple(
            eeprom_info[DeviceMemoryInfoKeys.SIZE], eeprom_info)
        memories = [mem_tuple_flash, mem_tuple_eeprom]

        write_memories_to_hex(filename, memories)
        segments_read = read_memories_from_hex(filename, device_memory_info)

        for segment_read in segments_read:
            memory_name = segment_read.memory_info[DeviceMemoryInfoKeys.NAME]
            # When writing multiple segments all will start from relative offset 0
            self.assertEqual(segment_read.offset,
                             0,
                             msg="Incorrect offset for {}".format(memory_name))
            if memory_name == MemoryNames.FLASH:
                self.assertEqual(segment_read.data,
                                 mem_tuple_flash.data,
                                 msg="Incorrect FLASH data")
            elif memory_name == MemoryNames.EEPROM:
                self.assertEqual(segment_read.data,
                                 mem_tuple_eeprom.data,
                                 msg="Incorrect EEPROM data")
            else:
                self.fail("Unexpected memory: {}".format(memory_name))

        # Write back original values to not mess up later tests
        if flash_size_words_key in info:
            info[flash_size_words_key] = flash_size_words_original
        else:
            info[flash_size_bytes_key] = flash_size_bytes_original
        if eeprom_address_word_key in info:
            info[eeprom_address_word_key] = eeprom_address_word_original
        else:
            info[eeprom_address_byte_key] = eeprom_address_byte_original
Example #7
0
 def test_read_when_file_does_not_exist_raises_filenotfounderror(self):
     with self.assertRaises(FileNotFoundError):
         read_memories_from_hex('nonexisting', {})