diff --git a/bootloader/main.c b/bootloader/main.c index 0132402dadaa63d97a0fa5f4b80afdd723c46f7b..70d8a1ebd9a9123d6875b1a76ed9c62795e13cf3 100644 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -210,6 +210,21 @@ int main(void) printf("Trying to shortcut to main epicardium\n"); boot((uintptr_t *)PARTITION_START); + }else if(boot_type == Reboot_USBStorage) { + card10_init_slim(); + bootloader_display_init(); + +// bootloader_display_header(); + bootloader_display_line(2, "USB activated.", 0xffff); + bootloader_display_line(3, "Ready.", 0xffff); + run_usbmsc(); + + // If we return, don't try to boot. Maybe rather trigger a software reset. + // Reason: Not sure in which state the USB peripheral is and what kind + // of interrupts are active. + card10_reset(); + while (1) + ; } card10_init(); diff --git a/lib/card10/card10.c b/lib/card10/card10.c index 6b7b9ddf1abbe4447ed182745911321819ec15c2..b85e366e13265f7ce17cacf1ead42026ee201fdf 100644 --- a/lib/card10/card10.c +++ b/lib/card10/card10.c @@ -35,10 +35,30 @@ const gpio_cfg_t bhi_interrupt_pin = { PORT_0, PIN_13, GPIO_FUNC_IN, GPIO_PAD_PULL_UP }; -void card10_init(void) -{ - printf("card10 init...\n"); +static void spi_init() { + // Enable SPI + sys_cfg_spi_t spi17y_master_cfg; + spi17y_master_cfg.map = MAP_A; + spi17y_master_cfg.ss0 = Enable; + spi17y_master_cfg.ss1 = Disable; + spi17y_master_cfg.ss2 = Disable; + + if (SPI_Init(SPI0, 0, SPI_SPEED, spi17y_master_cfg) != 0) { + printf("Error configuring SPI\n"); + while (1) + ; + } + + if (SPI_Init(SPI2, 0, SPI_SPEED, spi17y_master_cfg) != 0) { + printf("Error configuring SPI\n"); + while (1) + ; + } +} + +void card10_init_internal(bool skip_rtc) +{ //Setup the I2CM I2C_Shutdown(MXC_I2C0_BUS0); I2C_Init(MXC_I2C0_BUS0, I2C_FAST_MODE, NULL); @@ -56,46 +76,31 @@ void card10_init(void) pmic_set_led(0, 0); pmic_set_led(1, 0); pmic_set_led(2, 0); - TMR_Delay(MXC_TMR0, MSEC(1000), 0); - - while (RTC_EnableRTCE(MXC_RTC) == E_BUSY) - ; - - // Enable 32 kHz output - while (RTC_SquareWave( - MXC_RTC, - SQUARE_WAVE_ENABLED, - F_32KHZ, - NOISE_IMMUNE_MODE, - NULL) == E_BUSY - ) - ; - /* If we don't have a valid time yet, set it to 2019-01-01 */ - if (RTC_GetSecond() < 1546300800UL) { - while (RTC_Init(MXC_RTC, 1546300800UL, 0, NULL) == E_BUSY) - ; - } - // Enable SPI - sys_cfg_spi_t spi17y_master_cfg; + if (!skip_rtc) { + TMR_Delay(MXC_TMR0, MSEC(1000), 0); - spi17y_master_cfg.map = MAP_A; - spi17y_master_cfg.ss0 = Enable; - spi17y_master_cfg.ss1 = Disable; - spi17y_master_cfg.ss2 = Disable; - - if (SPI_Init(SPI0, 0, SPI_SPEED, spi17y_master_cfg) != 0) { - printf("Error configuring SPI\n"); - while (1) + while (RTC_EnableRTCE(MXC_RTC) == E_BUSY) ; - } - if (SPI_Init(SPI2, 0, SPI_SPEED, spi17y_master_cfg) != 0) { - printf("Error configuring SPI\n"); - while (1) + // Enable 32 kHz output + while (RTC_SquareWave( + MXC_RTC, + SQUARE_WAVE_ENABLED, + F_32KHZ, + NOISE_IMMUNE_MODE, + NULL) == E_BUSY + ) ; + /* If we don't have a valid time yet, set it to 2019-01-01 */ + if (RTC_GetSecond() < 1546300800UL) { + while (RTC_Init(MXC_RTC, 1546300800UL, 0, NULL) == E_BUSY) + ; + } } + spi_init(); + display_init(); leds_init(); @@ -103,6 +108,18 @@ void card10_init(void) GPIO_Config(&bhi_interrupt_pin); } +void card10_init(void) +{ + printf("card10 init...\n"); + card10_init_internal(false); +} + +void card10_init_slim(void) +{ + printf("card10 slim init...\n"); + card10_init_internal(true); +} + static uint32_t ecg_read_reg(uint8_t reg) { spi_req_t req; diff --git a/lib/card10/card10.h b/lib/card10/card10.h index f42dc58fd2ab5e19f46a7e62c7d98740db2c4e26..e474b98b40fb545fe33048a67025c947fba10c15 100644 --- a/lib/card10/card10.h +++ b/lib/card10/card10.h @@ -7,6 +7,7 @@ extern const gpio_cfg_t bhi_interrupt_pin; void card10_init(void); +void card10_init_slim(void); void card10_diag(void); void core1_start(void *isr);