示例#1
0
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;
    }
}
示例#2
0
文件: frame.c 项目: lochsh/thegrid
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;
    }
}
示例#4
0
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);
}