示例#1
0
void
main(void) {
    GPIO_OFF(E_NRST);
    unstick_i2c();
    GPIO_ON(E_NRST);
    setup_clocks((int)info_get(boot_table, INFO_HSE_FREQ));
    iwdg_start(4, 0xFFF);
    watchdog_main = watchdog_net = 5;
    ASSERT(xTaskCreate(main_thread, "main", MAIN_STACK_SIZE, NULL,
                THREAD_PRIO_MAIN, &thread_main));
    vTaskStartScheduler();
}
示例#2
0
PinName port_pin(PortName port, int pin_n) {
    MBED_ASSERT((port <= Port7) && (pin_n < 32));
    int offset = 0;

    // Lookup table only maps pins 0 to 15
    if (pin_n > 15) {
        return NC;
    }

    // Lookup SCU offset
    if (port < Port4) {
        offset = _scu_off[port][pin_n];
    } else {
        offset = _scu_off2[port - Port4][pin_n];
        offset = ((offset & 0xf0) << 1) | (offset & 0x0f);
    }

    // Return pin name
    return (PinName)((offset << 18) | GPIO_OFF(port, pin_n));
}
示例#3
0
static void
main_thread(void *pdata) {
    QueueSetHandle_t qs;
    QueueSetMemberHandle_t active;

    ASSERT((qs = xQueueCreateSet(SERIAL_RX_SIZE * 3)));
    serial_start(cli_serial, 115200, qs);
    serial_start(&Serial4, 57600, qs);
    serial_start(&Serial5, cfg.gps_baud_rate ? cfg.gps_baud_rate : 57600, qs);
    cli_set_output(cli_serial);
    log_start(cli_serial);
    cl_enabled = 1;

    load_eeprom();
    cfg.flags &= ~FLAG_HOLDOVER_TEST;
    if (cfg.flags & FLAG_GPSEXT) {
        gps_serial = &Serial5;
    } else {
        gps_serial = &Serial4;
    }
    if (!cfg.holdover) {
        cfg.holdover = 60;
    }
    if (!cfg.loopstats_interval) {
        cfg.loopstats_interval = 60;
    }
    ppscapture_start();
    vtimer_start();
    tcpip_start();
    test_reset();
    cli_banner();
    if (!(cfg.flags & FLAG_GPSEXT)) {
        ublox_configure();
        if (HAS_FEATURE(PPSEN) && (cfg.flags & FLAG_PPSEN)) {
            GPIO_OFF(PPSEN);
        }
    }
    cl_enabled = 0;
    while (1) {
        watchdog_main = 5;
        active = xQueueSelectFromSet(qs, pdMS_TO_TICKS(1000));
        if (active == cli_serial->rx_q) {
            int16_t val = serial_get(cli_serial, TIMEOUT_NOBLOCK);
            ASSERT(val >= 0);
            cli_feed(val);
        } else if (active == gps_serial->rx_q) {
            int16_t val = serial_get(gps_serial, TIMEOUT_NOBLOCK);
            ASSERT(val >= 0);
            gps_byte_received(val);
            if (cfg.flags & FLAG_GPSOUT) {
                char tmp = val;
                serial_write(&Serial5, &tmp, 1);
            }
#if 0
        } else if (active == Serial5.rx_q) {
            char tmp = serial_get(&Serial5, TIMEOUT_NOBLOCK);
            serial_write(&Serial4, &tmp, 1);
#endif
        }
    }
}
示例#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();
    }
}