From 7bd1f5c9ff950d90e9414aa8c425dc89db91052d Mon Sep 17 00:00:00 2001 From: swym <0xfd000000@gmail.com> Date: Sat, 3 Aug 2019 00:23:53 +0200 Subject: [PATCH] card10: provide slim init for faster reboot --- bootloader/main.c | 15 ++++++++ lib/card10/card10.c | 89 +++++++++++++++++++++++++++------------------ lib/card10/card10.h | 1 + 3 files changed, 69 insertions(+), 36 deletions(-) diff --git a/bootloader/main.c b/bootloader/main.c index 0132402d..70d8a1eb 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 6b7b9ddf..b85e366e 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 f42dc58f..e474b98b 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); -- GitLab