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

bootloader_app_start() doesn't run newly flashed app

Hi,

i'm doing my own bootloader and i want to use external flash to download image trough a spi. Now it almost works. But after an app image has been successfully transferred to nrf52 flash and the bootloader reaches bootloader_app_start(DFU_BANK_0_REGION_START), the app is hanged. It seems the bootloader_app_start() works fine, crash occurred in the app at ble_stack_init(), but ONLY once after burning. Pin reset makes newly flashed app to run normal way. So i suppose something wrong in bootloader's SD init\deinit or wrong pstorage_store() callback handling.

My code flow:

static void dfu_cb_handler(uint32_t packet, uint32_t result, uint8_t * p_data)
{
	pstorage_is_busy = (result != NRF_SUCCESS);
}


// copied from bootloader.c\wait_for_events(void) 77
// this one used for wait pstorage_store() completion
static void pstorage_wait(void)
{
	pstorage_is_busy = true;
	while (pstorage_is_busy)
	{
		// Wait in low power state for any events.
		uint32_t err_code = sd_app_evt_wait();
		APP_ERROR_CHECK(err_code);
		// Event received. Process it from the scheduler.
		app_sched_execute();
	}
}

// END OF BOOTLOADER MAIN FUNC
if (dfu_start || (!bootloader_app_is_valid(DFU_BANK_0_REGION_START)))
{
	err_code = dfu_init();
	APP_ERROR_CHECK(err_code);
	FlashSpiInit();
	dfu_register_callback(dfu_cb_handler);
	start_data_process(FW_RST_APP_ADDRESS); // load start packet from external flash
	 // load init packet from external flash, uses pstorage_wait();
	init_data_process();
	// load image packet from external flash, uses pstorage_wait();
	app_data_process(); 
	err_code = dfu_image_validate();
	APP_ERROR_CHECK(err_code);
	err_code = dfu_image_activate();
	APP_ERROR_CHECK(err_code);
	wait_for_events();
}

if (bootloader_app_is_valid(DFU_BANK_0_REGION_START) && !bootloader_dfu_sd_in_progress())
{
    bootloader_app_start(DFU_BANK_0_REGION_START);
}

NVIC_SystemReset();

i use wait_for_events(); directly from example library bootloader.c (remove the static key).

Any help appreciated.

Parents
  • Hi, Hung Bui I use bootloader_app_start() directly (see the end of code in my post). This function will not return as it does the things you mentioned and jump to an app entry point. I have seen SPI bootloader example, but my project have different structure since it is SPI master. The problem still exists, so i'm trying to debug my application code from the bootloader project.

Reply
  • Hi, Hung Bui I use bootloader_app_start() directly (see the end of code in my post). This function will not return as it does the things you mentioned and jump to an app entry point. I have seen SPI bootloader example, but my project have different structure since it is SPI master. The problem still exists, so i'm trying to debug my application code from the bootloader project.

Children
No Data
Related