Hi
We want to add one flash partition to use to store external host files by http downloading, so we changed the dts to below:
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
&flash0 {
/*
* For more information, see:
* http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions
*/
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
boot_partition: partition@0 {
label = "mcuboot";
reg = <0x00000000 0x10000>;
};
slot0_partition: partition@10000 {
label = "image-0";
};
slot0_ns_partition: partition@20000 {
label = "image-0-nonsecure";
};
slot1_partition: partition@50000 {
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* Flash partition at /soc/peripheral@40000000/flash-controller@39000/flash@0/partitions/partition@90000 */
#define DT_FLASH_AREA_IMAGE_HOST_ID 5
#define DT_FLASH_AREA_IMAGE_HOST_READ_ONLY 0
#define DT_FLASH_AREA_IMAGE_HOST_OFFSET_0 589824
#define DT_FLASH_AREA_IMAGE_HOST_OFFSET DT_FLASH_AREA_IMAGE_HOST_OFFSET_0
#define DT_FLASH_AREA_IMAGE_HOST_SIZE_0 393216
#define DT_FLASH_AREA_IMAGE_HOST_SIZE DT_FLASH_AREA_IMAGE_HOST_SIZE_0
#define DT_FLASH_AREA_IMAGE_HOST_DEV "NRF_FLASH_DRV_NAME"
#define DT_FLASH_AREA_5_ID 5
#define DT_FLASH_AREA_5_READ_ONLY 0
#define DT_FLASH_AREA_5_OFFSET_0 589824
#define DT_FLASH_AREA_5_OFFSET DT_FLASH_AREA_5_OFFSET_0
#define DT_FLASH_AREA_5_SIZE_0 393216
#define DT_FLASH_AREA_5_SIZE DT_FLASH_AREA_5_SIZE_0
#define DT_FLASH_AREA_5_DEV "NRF_FLASH_DRV_NAME"
then we duplicated the dfu_target_mcuboot to dfu_target_host and flash_img to flash_host for this host file's OTA download, but the flash erase error occurred in dfu_target_host_write() of first fragment, here is the error log:
Fullscreen
1
2
3
4
5
6
7
8
9
10
[00:00:52.731,262] <inf> download_client: Downloaded 4096/142248 bytes (2%)
[00:00:52.731,292] <inf> dfu_target: Image type: DFU_TARGET_IMAGE_TYPE_HOST
[00:00:52.731,292] <inf> dfu_target_host: Falsh_host_init: dev_id 0, id 5, offset 0x00018200, size 0x0006de00
[00:00:52.731,323] <inf> flash_host: Erasing sector at offset 0x00018000
[00:00:52.731,323] <err> flash_host: Error -22 while erasing sector
[00:00:52.731,353] <err> flash_host: flash_name(NRF_FLASH_DRV_NAME) id(5) offset(0xfffffe00) size(0x1000)
[00:00:52.731,353] <err> flash_host: flash_progressive_erase error -22 offset=0x00000000
[00:00:52.731,384] <err> dfu_target_host: flash_host_buffered_write error -22
[00:00:52.731,384] <err> fota_download: dfu_target_write error -22
[00:00:52.834,716] <inf> download_client: Fragment refused, download stopped.
It seems the offset(0x00018200) of host flash partition was wrong, and if I correct it in dfu_target_host_init() as below, the firmware will crash and reboot. How to fix this issue?
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int dfu_target_host_init(size_t file_size, dfu_target_callback_t cb)
{
ARG_UNUSED(cb);
int err = flash_host_init(&flash_host);
//customer added:
//flash_host.flash_area->fa_off = DT_FLASH_AREA_IMAGE_HOST_OFFSET;
//flash_host.flash_area->fa_size = DT_FLASH_AREA_IMAGE_HOST_SIZE;
LOG_INF("Falsh_host_init: dev_id %d, id %d, offset 0x%08x, size 0x%08x", flash_host.flash_area->fa_device_id,
flash_host.flash_area->fa_id, flash_host.flash_area->fa_off, flash_host.flash_area->fa_size);
//customer added end
if (err != 0) {
LOG_ERR("flash_host_init error %d", err);
return err;
}
if (file_size > DT_FLASH_AREA_IMAGE_HOST_SIZE) {
LOG_ERR("Requested file too big to fit in flash %d > %d",
file_size, DT_FLASH_AREA_IMAGE_HOST_SIZE);
return -EFBIG;