This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Flash Writing on Zephyr

Hello,

I've recently been porting a program over to Zephyr and hoping someone here might be able to shed some insight on this issue. 

I can't seem to get flash_write to actually write anything even though it returns successful.

Here is my device tree section, 

/* Flash Layout
 *    Bootloader    0x00000 - 0x10000 (Size 0x10000 65536 Bytes)
 *    Code          0x10000 - 0xFC000 (Size 0xEC000 966656 Bytes)
 *    NVM Data      0xFC000 - 0x100000 (Size 0x4000 16384 Bytes)
 */

&flash0 {
	partitions {
		compatible = "fixed-partitions";
		#address-cells = <1>;
		#size-cells = <1>;

		code_partition: partition@10000 {
			label = "code";
			reg = <0x10000 0xEC000>;
			read-only;
		};

        datapt_partition: partition@EC000 {
            label = "datapt";
            reg = <0xEC000 0x4000>;
        };

	};
};

And KConfig,

# Flash
CONFIG_FLASH=y
CONFIG_FLASH_PAGE_LAYOUT=y
CONFIG_SOC_FLASH_NRF=y
CONFIG_MPU_ALLOW_FLASH_WRITE=y

And finally the code,

#define FLASH_ADDR FLASH_AREA_OFFSET(datapt)
#define FLASH_SPACE FLASH_AREA_SIZE(datapt)

void flash_Init() {
    flash_device = device_get_binding(DT_CHOSEN_ZEPHYR_FLASH_CONTROLLER_LABEL);
	if (!flash_device) {
		serialWrite("**No flash controller found!**\r\n");
		serialWrite("Run set_device <name> to specify one before using other commands.\r\n");
        return;
	}

    serialWrite("Found flash controller %s.\r\n");
    serialWrite(DT_CHOSEN_ZEPHYR_FLASH_CONTROLLER_LABEL);
    serialWrite("Flash I/O commands can be run.\r\n");
}

int writeFlash(const char *datain, int len)
{
    if(!flash_device)
        return -1;

    // Don't let other flash get overwritten
    if(len > FLASH_SPACE)
        return -1;

    // Erase flash space, enough for all settings. JSON formatted
    printf("HT: Flash Address %#10x \r\n", FLASH_ADDR);
    printf("HT: Flash Space %d\r\n", FLASH_SPACE);

    if(flash_erase(flash_device, FLASH_ADDR, FLASH_SPACE) != 0) {
        printf("HT: Flash Erase Failed");
        return -1;
    }

    printf("HT: Flash Space Erased (%d bytes)\r\n", FLASH_SPACE);
    int rv = flash_write(flash_device, FLASH_ADDR, datain, len);
    if(!rv) {
        printf("HT: Flash Write Failure %d\r\n", rv);
        return -1;
    }

    return 0;
}

When I call write flash it returns success, but if I examine the memory after at 0xEC000 it's still all erased at 0xFF

Did I do something wrong here? Not sure if this is a Zephyr specific thing or part of Nordics driver.. so I'm asking here first.

Thank you for any help

Related