void test_memory_is_copied_1(void) { uint32_t addr_min; uint32_t addr_max; ihex_recordset_t *rs; int rv; uint8_t *dst; ulong_t size; ulong_t ofst; ulong_t n; rs = ihex_rs_from_file("C:/ble_nrf51/tandd/nrf51/examples/ble_peripheral/ble_app_K1/pca10028/s110/arm4/_build/nrf51422_xxac_s110.hex"); size = ihex_rs_get_size(rs); printf("ihex_rs_get_size: size = %d\n", size); rv = ihex_rs_get_address_range(rs, &addr_min, &addr_max); printf("ihex_rs_get_address_range: rv = %d, addr_min = 0x%08x, addr_max = 0x%08x\n", rv, addr_min, addr_max); dst = (uint8_t*) malloc(0x30000);//8192); if (rs == NULL) { //CU_FAIL("File \"res/big-a.hex\" does not exist."); return; } //rv = ihex_mem_copy(rs, dst, 0x30000/*8192*/, IHEX_WIDTH_8BIT, IHEX_ORDER_BIGENDIAN); ofst = 0; n = 0x20; rv = ihex_mem_copy_from_offset(rs, dst, ofst, n, IHEX_WIDTH_8BIT, IHEX_ORDER_BIGENDIAN); printf("rv = %d\n", rv); ofst = 0x08; n = 0x10; rv = ihex_mem_copy_from_offset(rs, dst, ofst, n, IHEX_WIDTH_8BIT, IHEX_ORDER_BIGENDIAN); printf("rv = %d\n", rv); ofst = 0x2744; n = 0x100; rv = ihex_mem_copy_from_offset(rs, dst, ofst, n, IHEX_WIDTH_8BIT, IHEX_ORDER_BIGENDIAN); printf("rv = %d\n", rv); free(dst); }
int image_ihex_merge_file(const char *filename, const nvm_symbol *list, int list_size, size_t blob_size) { ihex_recordset_t *rs; uint32_t start, end; char *blob; int symbols = 0; if (! filename || ! blob_size) return -1; //invalid parameters rs = ihex_rs_from_file(filename); if (! rs) { switch (ihex_errno()) { case IHEX_ERR_INCORRECT_CHECKSUM: case IHEX_ERR_NO_EOF: case IHEX_ERR_PARSE_ERROR: case IHEX_ERR_WRONG_RECORD_LENGTH: case IHEX_ERR_UNKNOWN_RECORD_TYPE: // Parse error, not a well-formed Intel Hex file return 0; case IHEX_ERR_NO_INPUT: case IHEX_ERR_MMAP_FAILED: case IHEX_ERR_READ_FAILED: // File not accessible symbols = -2; break; case IHEX_ERR_MALLOC_FAILED: default: // System error symbols = -3; break; } fprintf(stderr, _("Cannot open image \"%s\" (%s)\n"), filename, ihex_error()); return symbols; } if (0 != ihex_rs_get_address_range(rs, &start, &end)) { fprintf(stderr, _("Could not determine data range in Intel Hex file \"%s\" (%s)\n"), filename, ihex_error()); symbols = -4; } else if (rs->ihrs_count == 0 || start >= end) { fprintf(stderr, _("Image file \"%s\" is empty\n"), filename); } else { if (DEBUG) printf(_("%s: %s contains range 0x%04" PRIx32 " to 0x%04" PRIx32 "\n"), __func__, filename, start, end > 0 ? end - 1 : 0); if (blob_size > end) { fprintf(stderr, _("Image file \"%s\" is too small, %zu of %zu bytes missing\n"), filename, blob_size - end, blob_size); blob_size = end; } // Allocate and initialize memory for needed ihex content blob = calloc(1, blob_size); if (! blob) { fprintf(stderr, _("Could not copy data from Intel Hex file \"%s\" (%s)\n"), filename, strerror(errno)); symbols = -3; } else { if (0 != ihex_byte_copy(rs, (void*) blob, blob_size, 0)) { fprintf(stderr, _("Could not copy data from Intel Hex file \"%s\" (%s)\n"), filename, ihex_error()); symbols = -4; } else { symbols = image_raw_merge_mem(blob, list, list_size, blob_size); } free(blob); } } ihex_rs_free(rs); return symbols; }