flash_decoder_type_t flash_decoder_detect_type(const uint8_t *data, uint32_t size, uint32_t addr, bool addr_valid) { daplink_info_t info; util_assert(size >= FLASH_DECODER_MIN_SIZE); // Check if this is a daplink image memcpy(&info, data + DAPLINK_INFO_OFFSET, sizeof(info)); if (DAPLINK_HIC_ID == info.hic_id) { if (DAPLINK_BUILD_KEY_IF == info.build_key) { // Interface update return FLASH_DECODER_TYPE_INTERFACE; } else if (DAPLINK_BUILD_KEY_BL == info.build_key) { // Bootloader update return FLASH_DECODER_TYPE_BOOTLOADER; } else { return FLASH_DECODER_TYPE_UNKNOWN; } } // Check if a valid vector table for the target can be found if (validate_bin_nvic(data)) { return FLASH_DECODER_TYPE_TARGET; } // If an address is specified then the data can be decoded if (addr_valid) { // TODO - future improvement - make sure address is within target's flash return FLASH_DECODER_TYPE_TARGET; } return FLASH_DECODER_TYPE_UNKNOWN; }
static extension_t identify_start_sequence(uint8_t *buf) { if (1 == validate_bin_nvic(buf)) { return BIN; } else if (1 == validate_hexfile(buf)) { return HEX; } return UNKNOWN; }