uint32_t ble_dfu_init(ble_dfu_t * p_dfu, const ble_dfu_init_t * p_dfu_init) { uint32_t err_code; ble_uuid_t ble_uuid; ble_uuid128_t nus_base_uuid = BLE_DFU_BASE_UUID; VERIFY_PARAM_NOT_NULL(p_dfu); VERIFY_PARAM_NOT_NULL(p_dfu_init); p_m_dfu = p_dfu; // TODO: find a nicer solution to this // Initialize the service structure. p_dfu->conn_handle = BLE_CONN_HANDLE_INVALID; p_dfu->evt_handler = p_dfu_init->evt_handler; p_dfu->is_waiting_for_disconnection = false; p_dfu->is_ctrlpt_notification_enabled = false; /**@snippet [Adding proprietary Service to S110 SoftDevice] */ // Add a custom base UUID. err_code = sd_ble_uuid_vs_add(&nus_base_uuid, &p_dfu->uuid_type); VERIFY_SUCCESS(err_code); ble_uuid.type = p_dfu->uuid_type; ble_uuid.uuid = BLE_UUID_DFU_SERVICE; // Add the service. err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &p_dfu->service_handle); /**@snippet [Adding proprietary Service to S110 SoftDevice] */ VERIFY_SUCCESS(err_code); // Add the RX Characteristic. err_code = rx_char_add(p_dfu, p_dfu_init); VERIFY_SUCCESS(err_code); err_code = nrf_dfu_flash_init(true); VERIFY_SUCCESS(err_code); nrf_dfu_settings_init(); return NRF_SUCCESS; }
void nrf_dfu_settings_init(bool sd_irq_initialized) { NRF_LOG_DEBUG("Running nrf_dfu_settings_init(sd_irq_initialized=%s).", sd_irq_initialized ? (uint32_t)"true" : (uint32_t)"false"); ret_code_t rc = nrf_dfu_flash_init(sd_irq_initialized); if (rc != NRF_SUCCESS) { NRF_LOG_ERROR("nrf_dfu_flash_init() failed with error: %x", rc); APP_ERROR_HANDLER(rc); } // Copy the DFU settings out of flash and into a buffer in RAM. memcpy((void*)&s_dfu_settings, m_dfu_settings_buffer, sizeof(nrf_dfu_settings_t)); if (s_dfu_settings.crc != 0xFFFFFFFF) { // CRC is set. Content must be valid uint32_t crc = nrf_dfu_settings_crc_get(); if (crc == s_dfu_settings.crc) { return; } } // Reached if the page is erased or CRC is wrong. NRF_LOG_DEBUG("Resetting bootloader settings."); memset(&s_dfu_settings, 0x00, sizeof(nrf_dfu_settings_t)); s_dfu_settings.settings_version = NRF_DFU_SETTINGS_VERSION; rc = nrf_dfu_settings_write(NULL); if (rc != NRF_SUCCESS) { NRF_LOG_ERROR("nrf_dfu_flash_write() failed with error: %x", rc); APP_ERROR_HANDLER(rc); } }