def __init__(self, data=''): HciPacket.sequence_number = (HciPacket.sequence_number + 1) % 8 temp_data = [] logger.debug("Data " + str(len(data)) + ": %s", data) slip_bytes = slip_parts_to_four_bytes(HciPacket.sequence_number, DATA_INTEGRITY_CHECK_PRESENT, RELIABLE_PACKET, HCI_PACKET_TYPE, len(data)) temp_data += [ord(x) for x in slip_bytes] logger.debug("Add slip preamble: %s", [hex(i) for i in temp_data]) temp_data += [ord(x) for x in data] logger.debug("Add Data: %s", [hex(i) for i in temp_data]) # Add escape characters crc = crc16.calc_crc16(bytes(temp_data), crc=0xffff) logger.debug("CRC: %s", hex(crc)) temp_data.append(crc & 0xFF) temp_data.append((crc & 0xFF00) >> 8) logger.debug("Add CRC: %s", [hex(i) for i in temp_data]) encoded = slip_encode_esc_chars("".join( chr(x) for x in bytearray(temp_data))) temp_data = [ord(x) for x in encoded] logger.debug("SLIP encoded: %s", [hex(i) for i in temp_data]) self.data = [0xc0] self.data += temp_data self.data += [0xc0] logger.debug("Final packet: %s", [hex(i) for i in self.data])
def test_dfu_methods(self): def timeout_callback(log_message): logging.debug("timeout_callback. Message: %s", log_message) def progress_callback(progress, log_message, done): logging.debug("Log message: %s, Progress: %d, done: %s", log_message, progress, done) def error_callback(log_message=""): logging.error("Log message: %s", log_message) self.transport.register_events_callback(DfuEvent.TIMEOUT_EVENT, timeout_callback) self.transport.register_events_callback(DfuEvent.PROGRESS_EVENT, progress_callback) self.transport.register_events_callback(DfuEvent.ERROR_EVENT, error_callback()) firmware = '' test_firmware_path = os.path.join("firmwares", "pca10028_nrf51422_xxac_blinky.bin") with open(test_firmware_path, 'rb') as f: while True: data = f.read() if data: firmware += data else: break crc = crc16.calc_crc16(firmware, 0xffff) self.transport.open() # Sending start DFU command to target self.transport.send_start_dfu(HexType.APPLICATION, app_size=len(firmware), softdevice_size=0, bootloader_size=0) # Sending DFU init packet to target init_packet_vars = { PacketField.DEVICE_TYPE: 1, PacketField.DEVICE_REVISION: 2, PacketField.APP_VERSION: 0xfffa, PacketField.REQUIRED_SOFTDEVICES_ARRAY: [0x005a], PacketField.NORDIC_PROPRIETARY_OPT_DATA_FIRMWARE_CRC16: crc } pkt = Packet(init_packet_vars) self.transport.send_init_packet(pkt.generate_packet()) # Sending firmware to target self.transport.send_firmware(firmware) # Validating firmware self.transport.send_validate_firmware() self.transport.send_activate_firmware() self.transport.close()
def __init__(self, data=''): HciPacket.sequence_number = (HciPacket.sequence_number + 1) % 8 self.temp_data = '' self.temp_data += slip_parts_to_four_bytes(HciPacket.sequence_number, DATA_INTEGRITY_CHECK_PRESENT, RELIABLE_PACKET, HCI_PACKET_TYPE, len(data)) self.temp_data += data # Add escape characters crc = crc16.calc_crc16(self.temp_data, crc=0xffff) self.temp_data += chr(crc & 0xFF) self.temp_data += chr((crc & 0xFF00) >> 8) self.temp_data = slip_encode_esc_chars(self.temp_data) self.data = chr(0xc0) self.data += self.temp_data self.data += chr(0xc0)
def calculate_crc(crc, firmware_filename): """ Calculates CRC16 has on provided firmware filename :type str firmware_filename: """ data_buffer = b'' read_size = 4096 with open(firmware_filename, 'rb') as firmware_file: while True: data = firmware_file.read(read_size) if data: data_buffer += data else: break if crc == 16: return calc_crc16(data_buffer, 0xffff) elif crc == 32: return binascii.crc32(data_buffer) else: raise NordicSemiException("Invalid CRC type")