/**@brief Function for preparing the reset, disabling SoftDevice, and jumping to the bootloader. * * @param[in] conn_handle Connection handle for peer requesting to enter DFU mode. */ static void bootloader_start(uint16_t conn_handle) { uint32_t err_code; uint16_t sys_serv_attr_len = sizeof(m_peer_data.sys_serv_attr); err_code = sd_ble_gatts_sys_attr_get(conn_handle, m_peer_data.sys_serv_attr, &sys_serv_attr_len, BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS); if (err_code != NRF_SUCCESS) { // Any error at this stage means the system service attributes could not be fetched. // This means the service changed indication cannot be sent in DFU mode, but connection // is still possible to establish. } m_reset_prepare(); err_code = sd_power_gpregret_set(BOOTLOADER_DFU_START); APP_ERROR_CHECK(err_code); err_code = sd_softdevice_disable(); APP_ERROR_CHECK(err_code); err_code = sd_softdevice_vector_table_base_set(NRF_UICR->BOOTLOADERADDR); APP_ERROR_CHECK(err_code); dfu_app_peer_data_set(conn_handle); NVIC_ClearPendingIRQ(SWI2_IRQn); interrupts_disable(); bootloader_util_app_start(NRF_UICR->BOOTLOADERADDR); }
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 // can start the application safely. interrupts_disable(); uint32_t err_code = sd_softdevice_forward_to_application(); APP_ERROR_CHECK(err_code); bootloader_util_app_start(CODE_REGION_1_START); }
void bootloader_abort(dfu_end_t end_reason) { __LOG("ABORT...\n"); bl_info_entry_t* p_segment_entry = bootloader_info_entry_get(BL_INFO_TYPE_SEGMENT_APP); switch (end_reason) { case DFU_END_SUCCESS: case DFU_END_ERROR_TIMEOUT: case DFU_END_FWID_VALID: case DFU_END_ERROR_MBR_CALL_FAILED: if (p_segment_entry && dfu_mesh_app_is_valid()) { if (fifo_is_empty(&m_flash_fifo)) { interrupts_disable(); sd_mbr_command_t com = {SD_MBR_COMMAND_INIT_SD, }; uint32_t err_code = sd_mbr_command(&com); APP_ERROR_CHECK(err_code); err_code = sd_softdevice_vector_table_base_set(p_segment_entry->segment.start); APP_ERROR_CHECK(err_code); #ifdef DEBUG_LEDS NRF_GPIO->OUTSET = (1 << 21) | (1 << 22) | (1 << 23) | (1 << 24); #endif bootloader_util_app_start(p_segment_entry->segment.start); } else { __LOG("->Will go to app once flash is finished.\n"); m_go_to_app = true; } } else if (p_segment_entry) { __LOG("->App not valid.\n"); } else { __LOG("->No segment entry found\n"); } break; case DFU_END_ERROR_INVALID_PERSISTENT_STORAGE: APP_ERROR_CHECK_BOOL(false); default: __LOG(RTT_CTRL_TEXT_RED "SYSTEM RESET (reason 0x%x)\n", end_reason); __disable_irq(); while(1); //NVIC_SystemReset(); } }
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 // can start the application safely. sd_mbr_command_t com = {SD_MBR_COMMAND_INIT_SD, }; uint32_t err_code = sd_mbr_command(&com); APP_ERROR_CHECK(err_code); interrupts_disable(); err_code = sd_softdevice_vector_table_base_set(CODE_REGION_1_START); APP_ERROR_CHECK(err_code); bootloader_util_app_start(CODE_REGION_1_START); }
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 // can start the application safely. uint32_t err_code = sd_softdevice_disable(); APP_ERROR_CHECK(err_code); interrupts_disable(); #if defined (S210_V3_STACK) err_code = sd_softdevice_forward_to_application(); #else err_code = sd_softdevice_vector_table_base_set(CODE_REGION_1_START); #endif APP_ERROR_CHECK(err_code); bootloader_util_app_start(CODE_REGION_1_START); }
void bootloader_abort(bl_end_t end_reason) { uint32_t app_length = m_bl_info_pointers.p_segment_app->length; if (m_transaction.transaction_id != 0) { app_length = m_transaction.length; } switch (end_reason) { case BL_END_SUCCESS: case BL_END_ERROR_TIMEOUT: case BL_END_FWID_VALID: if (app_is_valid((uint32_t*) m_bl_info_pointers.p_segment_app->start, app_length)) { interrupts_disable(); #ifdef DEBUG_LEDS NRF_GPIO->OUTCLR = (1 << 22); #endif sd_mbr_command_t com = {SD_MBR_COMMAND_INIT_SD, }; volatile uint32_t err_code = sd_mbr_command(&com); APP_ERROR_CHECK(err_code); err_code = sd_softdevice_vector_table_base_set(m_bl_info_pointers.p_segment_app->start); APP_ERROR_CHECK(err_code); #ifdef DEBUG_LEDS NRF_GPIO->OUTSET = (1 << 21); NRF_GPIO->OUTSET = (1 << 22); #endif bootloader_util_app_start(m_bl_info_pointers.p_segment_app->start); } break; case BL_END_ERROR_INVALID_PERSISTENT_STORAGE: APP_ERROR_CHECK_BOOL(false); default: NVIC_SystemReset(); break; } }
/**@brief Function for preparing the reset, disabling SoftDevice and jump to the bootloader. */ static void bootloader_start(void) { m_reset_prepare(); uint32_t err_code = sd_power_gpregret_set(BOOTLOADER_DFU_START); APP_ERROR_CHECK(err_code); err_code = sd_softdevice_disable(); APP_ERROR_CHECK(err_code); err_code = sd_softdevice_vector_table_base_set(NRF_UICR->BOOTLOADERADDR); APP_ERROR_CHECK(err_code); if (m_dm_handle_valid) { dfu_app_set_peer_data(); } NVIC_ClearPendingIRQ(SWI2_IRQn); interrupts_disable(); bootloader_util_app_start(NRF_UICR->BOOTLOADERADDR); }
/**@brief Function for preparing the reset, disabling SoftDevice and jump to the bootloader. */ void bootloader_start(void) { m_reset_prepare(); uint32_t err_code = sd_power_gpregret_set(BOOTLOADER_DFU_START); APP_ERROR_CHECK(err_code); err_code = sd_softdevice_disable(); APP_ERROR_CHECK(err_code); err_code = sd_softdevice_vector_table_base_set(NRF_UICR->BOOTLOADERADDR); APP_ERROR_CHECK(err_code); // Commenting out the following block because it brings in unwanted dependencies from bonding. // TODO: discuss this with Nordic. // if (m_dm_handle_valid) // { // dfu_app_set_peer_data(); // } NVIC_ClearPendingIRQ(SWI2_IRQn); interrupts_disable(); bootloader_util_app_start(NRF_UICR->BOOTLOADERADDR); }
/** Interrupt handling Flash operations. */ void FLASH_HANDLER_IRQHandler(void) { flash_queue_entry_t flash_entry; uint32_t op_count = 0; while (fifo_pop(&m_flash_fifo, &flash_entry) == NRF_SUCCESS) { op_count++; bl_cmd_t rsp_cmd; if (flash_entry.type == FLASH_OP_TYPE_WRITE) { APP_ERROR_CHECK_BOOL(IS_WORD_ALIGNED(flash_entry.op.write.start_addr)); APP_ERROR_CHECK_BOOL(IS_WORD_ALIGNED(flash_entry.op.write.length)); APP_ERROR_CHECK_BOOL(IS_WORD_ALIGNED(flash_entry.op.write.p_data)); __LOG("WRITING to 0x%x.(len %d)\n", flash_entry.op.write.start_addr, flash_entry.op.write.length); if (flash_entry.op.write.start_addr >= 0x20000000) { uint8_t* p_dst = ((uint8_t*) flash_entry.op.write.start_addr); for (uint32_t i = 0; i < flash_entry.op.write.length; ++i, p_dst++) { *p_dst = (*p_dst & flash_entry.op.write.p_data[i]); } } else { nrf_flash_store((uint32_t*) flash_entry.op.write.start_addr, flash_entry.op.write.p_data, flash_entry.op.write.length, 0); } rsp_cmd.type = BL_CMD_TYPE_FLASH_WRITE_COMPLETE; rsp_cmd.params.flash.write.p_data = flash_entry.op.write.p_data; } else { __LOG("ERASING 0x%x.\n", flash_entry.op.erase.start_addr); if (flash_entry.op.erase.start_addr >= 0x20000000) { memset((uint32_t*) flash_entry.op.erase.start_addr, 0xFF, flash_entry.op.erase.length); } else { nrf_flash_erase((uint32_t*) flash_entry.op.erase.start_addr, flash_entry.op.erase.length); } rsp_cmd.type = BL_CMD_TYPE_FLASH_ERASE_COMPLETE; rsp_cmd.params.flash.erase.p_dest = (uint32_t*) flash_entry.op.erase.start_addr; } bl_cmd_handler(&rsp_cmd); } if (op_count > 0) { bl_cmd_t idle_cmd; idle_cmd.type = BL_CMD_TYPE_FLASH_ALL_COMPLETE; bl_cmd_handler(&idle_cmd); } if (fifo_is_empty(&m_flash_fifo) && m_go_to_app) { bl_info_entry_t* p_segment_entry = bootloader_info_entry_get(BL_INFO_TYPE_SEGMENT_APP); bootloader_util_app_start(p_segment_entry->segment.start); } }