Hi
I am using the nrf52832 with zephyr os , NCS 1.9.1, also using the external flash as a secondary slot, using a nor flash
I tried to upgrade my app but i an error occurred in img_mgmt.c --function img_mgmt_read_info in the NCS while checking the magic number
else if (hdr.ih_magic == erased_val_32) {
printf("MGMT_ERR_ENOENT 5 \n"); // print for debug only
return MGMT_ERR_ENOENT;
Is there any modification i have to do to make this work also I checked and the failure is in slot 1 which is the secondary slot and slot 0 erased without problem
int img_mgmt_read_info(int image_slot, struct image_version *ver, uint8_t *hash, uint32_t *flags) { printf("img_mgmt_read_info \n"); #if IMG_MGMT_DUMMY_HDR uint8_t dummy_hash[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77}; if (!hash && !ver && !flags) { return 0; } if (hash) { memcpy(hash, dummy_hash, IMG_MGMT_HASH_LEN); } if (ver) { memset(ver, 0xff, sizeof(*ver)); } if (flags) { *flags = 0; } return 0; #endif struct image_header hdr; struct image_tlv tlv; size_t data_off; size_t data_end; bool hash_found; uint8_t erased_val; uint32_t erased_val_32; int rc; rc = img_mgmt_impl_erased_val(image_slot, &erased_val); if (rc != 0) { return MGMT_ERR_EUNKNOWN; } printf("img_mgmt_impl_erased_val image_slot = %d \n", image_slot); rc = img_mgmt_impl_read(image_slot, 0, &hdr, sizeof(hdr)); if (rc != 0) { return MGMT_ERR_EUNKNOWN; } printf("img_mgmt_impl_read \n"); if (ver != NULL) { printf("ver null\n"); memset(ver, erased_val, sizeof(*ver)); } erased_val_32 = ERASED_VAL_32(erased_val); if (hdr.ih_magic == IMAGE_MAGIC) { if (ver != NULL) { memcpy(ver, &hdr.ih_ver, sizeof(*ver)); } } else if (hdr.ih_magic == erased_val_32) { printf("MGMT_ERR_ENOENT 5 \n"); return MGMT_ERR_ENOENT; } else { printf("MGMT_ERR_EUNKNOWN 6 \n"); return MGMT_ERR_EUNKNOWN; } if (flags != NULL) { *flags = hdr.ih_flags; } printf("img_mgmt_find_tlvs before 1\n"); /* Read the image's TLVs. We first try to find the protected TLVs, if the protected * TLV does not exist, we try to find non-protected TLV which also contains the hash * TLV. All images are required to have a hash TLV. If the hash is missing, the image * is considered invalid. */ data_off = hdr.ih_hdr_size + hdr.ih_img_size; rc = img_mgmt_find_tlvs(image_slot, &data_off, &data_end, IMAGE_TLV_PROT_INFO_MAGIC); if (!rc) { /* The data offset should start after the header bytes after the end of * the protected TLV, if one exists. */ data_off = data_end - sizeof(struct image_tlv_info); } rc = img_mgmt_find_tlvs(image_slot, &data_off, &data_end, IMAGE_TLV_INFO_MAGIC); if (rc != 0) { return MGMT_ERR_EUNKNOWN; } printf("img_mgmt_find_tlvs 2 \n"); hash_found = false; while (data_off + sizeof(tlv) <= data_end) { rc = img_mgmt_impl_read(image_slot, data_off, &tlv, sizeof(tlv)); if (rc != 0) { return MGMT_ERR_EUNKNOWN; } printf("img_mgmt_impl_read 1\n"); if (tlv.it_type == 0xff && tlv.it_len == 0xffff) { return MGMT_ERR_EUNKNOWN; } if (tlv.it_type != IMAGE_TLV_SHA256 || tlv.it_len != IMAGE_HASH_LEN) { /* Non-hash TLV. Skip it. */ data_off += sizeof(tlv) + tlv.it_len; continue; } if (hash_found) { /* More than one hash. */ return MGMT_ERR_EUNKNOWN; } hash_found = true; data_off += sizeof(tlv); if (hash != NULL) { if (data_off + IMAGE_HASH_LEN > data_end) { printf("MGMT_ERR_EUNKNOWN 1 \n"); return MGMT_ERR_EUNKNOWN; } rc = img_mgmt_impl_read(image_slot, data_off, hash, IMAGE_HASH_LEN); printf("img_mgmt_impl_read 2\n"); if (rc != 0) { printf("MGMT_ERR_EUNKNOWN 2 \n"); return MGMT_ERR_EUNKNOWN; } } } if (!hash_found) { printf("MGMT_ERR_EUNKNOWN \n"); return MGMT_ERR_EUNKNOWN; } return 0; }
In the end i am getting an mpu fail
Any suggestion ?
Thanks a lot
Ibrahim