uf2 does not depend on softdevice

This commit is contained in:
hathach 2018-08-11 11:43:57 +07:00
parent b1f3772364
commit e946aabd6d
2 changed files with 35 additions and 16 deletions

View File

@ -182,14 +182,26 @@ bool bootloader_app_is_valid(uint32_t app_addr)
static void bootloader_settings_save(bootloader_settings_t * p_settings) static void bootloader_settings_save(bootloader_settings_t * p_settings)
{ {
uint8_t sd_en = false;
sd_softdevice_is_enabled(&sd_en);
if ( sd_en )
{
uint32_t err_code = pstorage_clear(&m_bootsettings_handle, sizeof(bootloader_settings_t)); uint32_t err_code = pstorage_clear(&m_bootsettings_handle, sizeof(bootloader_settings_t));
APP_ERROR_CHECK(err_code); APP_ERROR_CHECK(err_code);
err_code = pstorage_store(&m_bootsettings_handle, err_code = pstorage_store(&m_bootsettings_handle,
(uint8_t *)p_settings, (uint8_t *) p_settings,
sizeof(bootloader_settings_t), sizeof(bootloader_settings_t),
0); 0);
APP_ERROR_CHECK(err_code); APP_ERROR_CHECK(err_code);
}
else
{
flash_write(BOOTLOADER_SETTINGS_ADDRESS, p_settings, sizeof(bootloader_settings_t));
flash_flush();
m_update_status = BOOTLOADER_COMPLETE;
}
} }
@ -373,13 +385,11 @@ void bootloader_app_start(uint32_t app_addr)
{ {
// If the applications CRC has been checked and passed, the magic number will be written and we // If the applications CRC has been checked and passed, the magic number will be written and we
// can start the application safely. // can start the application safely.
uint32_t err_code = sd_softdevice_disable(); APP_ERROR_CHECK ( sd_softdevice_disable() );
APP_ERROR_CHECK(err_code);
interrupts_disable(); interrupts_disable();
err_code = sd_softdevice_vector_table_base_set(CODE_REGION_1_START); APP_ERROR_CHECK( sd_softdevice_vector_table_base_set(CODE_REGION_1_START) );
APP_ERROR_CHECK(err_code);
bootloader_util_app_start(CODE_REGION_1_START); bootloader_util_app_start(CODE_REGION_1_START);
} }

View File

@ -164,7 +164,7 @@ static void blinky_handler(void)
led_control(LED_BLUE, state); led_control(LED_BLUE, state);
} }
// Feed all Watchdog just in case application enable it (WDT last through a hump from application to bootloader) // Feed all Watchdog just in case application enable it (WDT last through a jump from application to bootloader)
if ( nrf_wdt_started() ) if ( nrf_wdt_started() )
{ {
for (uint8_t i=0; i<8; i++) nrf_wdt_reload_request_set(i); for (uint8_t i=0; i<8; i++) nrf_wdt_reload_request_set(i);
@ -223,6 +223,11 @@ void board_teardown(void)
usb_teardown(); usb_teardown();
} }
void softdev_mbr_init(void)
{
sd_mbr_command_t com = { .command = SD_MBR_COMMAND_INIT_SD };
sd_mbr_command(&com);
}
/** /**
* Initializes the SoftDevice and the BLE event interrupt. * Initializes the SoftDevice and the BLE event interrupt.
@ -232,11 +237,7 @@ void board_teardown(void)
*/ */
uint32_t softdev_init(bool init_softdevice) uint32_t softdev_init(bool init_softdevice)
{ {
if (init_softdevice) if (init_softdevice) softdev_mbr_init();
{
sd_mbr_command_t com = { .command = SD_MBR_COMMAND_INIT_SD };
APP_ERROR_CHECK( sd_mbr_command(&com) );
}
// map vector table to bootloader address // map vector table to bootloader address
APP_ERROR_CHECK( sd_softdevice_vector_table_base_set(BOOTLOADER_REGION_START) ); APP_ERROR_CHECK( sd_softdevice_vector_table_base_set(BOOTLOADER_REGION_START) );
@ -308,7 +309,7 @@ void softdev_teardown(void)
int main(void) int main(void)
{ {
// SD is already Initialized in case of BOOTLOADER_DFU_OTA_MAGIC // SD is already Initialized in case of BOOTLOADER_DFU_OTA_MAGIC
bool const sd_inited = (NRF_POWER->GPREGRET == BOOTLOADER_DFU_OTA_MAGIC); bool sd_inited = (NRF_POWER->GPREGRET == BOOTLOADER_DFU_OTA_MAGIC);
// Start Bootloader in BLE OTA mode // Start Bootloader in BLE OTA mode
_ota_update = (NRF_POWER->GPREGRET == BOOTLOADER_DFU_OTA_MAGIC) || _ota_update = (NRF_POWER->GPREGRET == BOOTLOADER_DFU_OTA_MAGIC) ||
@ -333,15 +334,14 @@ int main(void)
{ {
APP_ERROR_CHECK( bootloader_dfu_sd_update_continue() ); APP_ERROR_CHECK( bootloader_dfu_sd_update_continue() );
softdev_init(!sd_inited); softdev_init(!sd_inited);
sd_inited = true;
APP_ERROR_CHECK( bootloader_dfu_sd_update_finalize() ); APP_ERROR_CHECK( bootloader_dfu_sd_update_finalize() );
} }
else else
{ {
softdev_init(!sd_inited); // softdev_init();
} }
usb_init();
/*------------- Determine DFU mode (Serial, OTA, FRESET or normal) -------------*/ /*------------- Determine DFU mode (Serial, OTA, FRESET or normal) -------------*/
// DFU button pressed // DFU button pressed
dfu_start = dfu_start || button_pressed(BUTTON_DFU); dfu_start = dfu_start || button_pressed(BUTTON_DFU);
@ -352,7 +352,13 @@ int main(void)
if ( dfu_start || !bootloader_app_is_valid(DFU_BANK_0_REGION_START) ) if ( dfu_start || !bootloader_app_is_valid(DFU_BANK_0_REGION_START) )
{ {
// Enable BLE if in OTA // Enable BLE if in OTA
// if ( _ota_update ) softdev_ble_enable(); if ( _ota_update )
{
softdev_init(!sd_inited);
sd_inited = true;
}
usb_init();
// Initiate an update of the firmware. // Initiate an update of the firmware.
APP_ERROR_CHECK( bootloader_dfu_start(_ota_update, 0) ); APP_ERROR_CHECK( bootloader_dfu_start(_ota_update, 0) );
@ -381,6 +387,9 @@ int main(void)
if (bootloader_app_is_valid(DFU_BANK_0_REGION_START) && !bootloader_dfu_sd_in_progress()) if (bootloader_app_is_valid(DFU_BANK_0_REGION_START) && !bootloader_dfu_sd_in_progress())
{ {
// MBR must be init before start application
if ( !sd_inited ) softdev_mbr_init();
// Select a bank region to use as application region. // Select a bank region to use as application region.
// @note: Only applications running from DFU_BANK_0_REGION_START is supported. // @note: Only applications running from DFU_BANK_0_REGION_START is supported.
bootloader_app_start(DFU_BANK_0_REGION_START); bootloader_app_start(DFU_BANK_0_REGION_START);