void dfu_app_on_dfu_evt(ble_dfu_t * p_dfu, ble_dfu_evt_t * p_evt) { switch (p_evt->ble_dfu_evt_type) { case BLE_DFU_START: // Starting the bootloader - will cause reset. bootloader_start(); break; case BLE_DFU_VALIDATE: case BLE_DFU_ACTIVATE_N_RESET: case BLE_DFU_SYS_RESET: case BLE_DFU_RECEIVE_INIT_DATA: case BLE_DFU_RECEIVE_APP_DATA: case BLE_DFU_PACKET_WRITE: case BLE_DFU_PKT_RCPT_NOTIF_ENABLED: case BLE_DFU_PKT_RCPT_NOTIF_DISABLED: case BLE_DFU_BYTES_RECEIVED_SEND: default: { // Unsupported event received from DFU Service. // Send back BLE_DFU_RESP_VAL_NOT_SUPPORTED message to peer. uint32_t err_code = ble_dfu_response_send(p_dfu, BLE_DFU_START_PROCEDURE, BLE_DFU_RESP_VAL_NOT_SUPPORTED); APP_ERROR_CHECK(err_code); } break; } }
static void bootload(Packet* pkt) { if(pkt->cmd_id == CMD_BOOTLOAD && pkt->payload[0] == CMD_BOOTLOAD && pkt->payload[1] == CMD_BOOTLOAD && pkt->payload[2] == CMD_BOOTLOAD && pkt->payload[3] == CMD_BOOTLOAD && pkt->payload[4] == CMD_BOOTLOAD) { bootloader_start(); } }
void dfu_app_on_dfu_evt(ble_dfu_t * p_dfu, ble_dfu_evt_t * p_evt) { switch (p_evt->ble_dfu_evt_type) { case BLE_DFU_START: // Starting the bootloader - will cause reset. bootloader_start(p_dfu->conn_handle); break; default: { // Unsupported event received from DFU Service. // Send back BLE_DFU_RESP_VAL_NOT_SUPPORTED message to peer. uint32_t err_code = ble_dfu_response_send(p_dfu, BLE_DFU_START_PROCEDURE, BLE_DFU_RESP_VAL_NOT_SUPPORTED); APP_ERROR_CHECK(err_code); } break; } }
static void try_flash(void) { int16_t rc; FIL fp; UINT nread; const char *errmsg; static uint8_t buf[512]; SPI3_Dev.cs_pad = SDIO_CS_PAD; SPI3_Dev.cs_pin = SDIO_CS_PNUM; spi_start(&SPI3_Dev, 0); mmc_start(); GPIO_OFF(SDIO_PDOWN); vTaskDelay(pdMS_TO_TICKS(100)); serial_puts(&Serial1, "Bootloader version: " VERSION "\r\n"); rc = mmc_connect(); if (rc == EERR_OK) { serial_puts(&Serial1, "SD connected\r\n"); } else if (rc == EERR_TIMEOUT) { serial_puts(&Serial1, "Timed out waiting for SD\r\n"); return; } else { serial_puts(&Serial1, "Failed to connect to SD\r\n"); return; } serial_puts(&Serial1, "Mounting SD filesystem\r\n"); if (f_mount(0, &MMC_FS) != FR_OK) { serial_puts(&Serial1, "ERROR: Unable to mount filesystem\r\n"); return; } serial_puts(&Serial1, "Opening file " MMC_FIRMWARE_FILENAME "\r\n"); if (f_open(&fp, MMC_FIRMWARE_FILENAME, FA_READ) != FR_OK) { serial_puts(&Serial1, "Error opening file, maybe it does not exist\r\n"); return; } serial_puts(&Serial1, "Comparing file to current flash contents\r\n"); bootloader_start(); while (bootloader_status == BLS_FLASHING) { if (f_read(&fp, buf, sizeof(buf), &nread) != FR_OK) { serial_puts(&Serial1, "Error reading file\r\n"); break; } if (nread == 0) { serial_puts(&Serial1, "Error: premature end of file\r\n"); break; } errmsg = bootloader_feed(buf, nread); if (errmsg != NULL) { serial_puts(&Serial1, "Error flashing firmware: "); serial_puts(&Serial1, errmsg); serial_puts(&Serial1, "\r\n"); break; } } if (bootloader_status == BLS_DONE) { if (bootloader_was_changed()) { serial_puts(&Serial1, "New firmware successfully loaded\r\n"); } else { serial_puts(&Serial1, "Firmware is up-to-date\r\n"); } } else { serial_puts(&Serial1, "ERROR: Reset to try again or load last known good firmware\r\n"); HALT(); } }
void agdongle_bootloader_start(void) { bootloader_start(m_agdongle.conn_handle); }