void up_initialize(void) { /* Initialize global variables */ current_regs = NULL; /* Calibrate the timing loop */ up_calibratedelay(); /* Add any extra memory fragments to the memory manager */ up_addregion(); /* Initialize the interrupt subsystem */ up_irqinitialize(); /* Initialize the DMA subsystem if the weak function up_dmainitialize has been * brought into the build */ #ifdef CONFIG_ARCH_DMA #ifdef CONFIG_HAVE_WEAKFUNCTIONS if (up_dmainitialize) #endif { up_dmainitialize(); } #endif /* Initialize the system timer interrupt */ #if !defined(CONFIG_SUPPRESS_INTERRUPTS) && !defined(CONFIG_SUPPRESS_TIMER_INTS) up_timerinit(); #endif /* Register devices */ #if CONFIG_NFILE_DESCRIPTORS > 0 devnull_register(); /* Standard /dev/null */ #endif /* Initialize the serial device driver */ #ifdef CONFIG_USE_SERIALDRIVER up_serialinit(); #elif defined(CONFIG_DEV_LOWCONSOLE) lowconsole_init(); #endif /* Initialize the netwok */ up_netinitialize(); /* Initialize USB -- device and/or host */ up_usbinitialize(); up_ledon(LED_IRQSENABLED); }
void up_initialize(void) { /* Initialize global variables */ current_regs = NULL; /* Calibrate the timing loop */ up_calibratedelay(); /* Add any extra memory fragments to the memory manager */ up_addregion(); /* Initialize the interrupt subsystem */ up_irqinitialize(); /* Initialize the DMA subsystem if the weak function stm32_dmainitialize has been * brought into the build */ #ifdef CONFIG_ARCH_DMA #ifdef CONFIG_HAVE_WEAKFUNCTIONS if (up_dmainitialize) #endif { up_dmainitialize(); } #endif /* Initialize the system timer interrupt */ #if !defined(CONFIG_SUPPRESS_INTERRUPTS) && !defined(CONFIG_SUPPRESS_TIMER_INTS) up_timer_initialize(); #endif /* Register devices */ #if CONFIG_NFILE_DESCRIPTORS > 0 #if defined(CONFIG_DEV_NULL) devnull_register(); /* Standard /dev/null */ #endif #if defined(CONFIG_DEV_ZERO) devzero_register(); /* Standard /dev/zero */ #endif #endif /* CONFIG_NFILE_DESCRIPTORS */ /* Initialize the serial device driver */ #ifdef USE_SERIALDRIVER up_serialinit(); #endif /* Initialize the console device driver (if it is other than the standard * serial driver). */ #if defined(CONFIG_DEV_LOWCONSOLE) lowconsole_init(); #elif defined(CONFIG_SYSLOG_CONSOLE) syslog_console_init(); #elif defined(CONFIG_RAMLOG_CONSOLE) ramlog_consoleinit(); #endif /* Initialize the system logging device */ #ifdef CONFIG_SYSLOG_CHAR syslog_initialize(); #endif #ifdef CONFIG_RAMLOG_SYSLOG ramlog_sysloginit(); #endif #ifndef CONFIG_NETDEV_LATEINIT /* Initialize the network */ up_netinitialize(); #endif #ifdef CONFIG_NETDEV_LOOPBACK /* Initialize the local loopback device */ (void)localhost_initialize(); #endif #ifdef CONFIG_NET_TUN /* Initialize the TUN device */ (void)tun_initialize(); #endif /* Initialize USB -- device and/or host */ up_usbinitialize(); board_led_on(LED_IRQSENABLED); }
void up_initialize(void) { #ifdef CONFIG_SMP int i; /* Initialize global variables */ for (i = 0; i < CONFIG_SMP_NCPUS; i++) { g_current_regs[i] = NULL; } #else CURRENT_REGS = NULL; #endif /* Add any extra memory fragments to the memory manager */ xtensa_add_region(); /* Initialize the interrupt subsystem */ xtensa_irq_initialize(); #ifdef CONFIG_PM /* Initialize the power management subsystem. This MCU-specific function * must be called *very* early in the initialization sequence *before* any * other device drivers are initialized (since they may attempt to register * with the power management subsystem). */ up_pminitialize(); #endif #ifdef CONFIG_ARCH_DMA /* Initialize the DMA subsystem if the weak function xtensa_dma_initialize * has been brought into the build */ #ifdef CONFIG_HAVE_WEAKFUNCTIONS if (xtensa_dma_initialize) #endif { xtensa_dma_initialize(); } #endif #if !defined(CONFIG_SUPPRESS_INTERRUPTS) && !defined(CONFIG_SUPPRESS_TIMER_INTS) /* Initialize the system timer interrupt */ xtensa_timer_initialize(); #endif #ifdef CONFIG_MM_IOB /* Initialize IO buffering */ iob_initialize(); #endif #if CONFIG_NFILE_DESCRIPTORS > 0 /* Register devices */ #if defined(CONFIG_DEV_NULL) devnull_register(); /* Standard /dev/null */ #endif #if defined(CONFIG_DEV_RANDOM) devrandom_register(); /* Standard /dev/random */ #endif #if defined(CONFIG_DEV_URANDOM) devurandom_register(); /* Standard /dev/urandom */ #endif #if defined(CONFIG_DEV_ZERO) devzero_register(); /* Standard /dev/zero */ #endif #if defined(CONFIG_DEV_LOOP) loop_register(); /* Standard /dev/loop */ #endif #endif /* CONFIG_NFILE_DESCRIPTORS */ #if defined(CONFIG_SCHED_INSTRUMENTATION_BUFFER) && \ defined(CONFIG_DRIVER_NOTE) note_register(); /* Non-standard /dev/note */ #endif /* Initialize the serial device driver */ #ifdef USE_SERIALDRIVER xtensa_serial_initialize(); #endif /* Initialize the console device driver (if it is other than the standard * serial driver). */ #if defined(CONFIG_DEV_LOWCONSOLE) lowconsole_init(); #elif defined(CONFIG_CONSOLE_SYSLOG) syslog_console_init(); #elif defined(CONFIG_RAMLOG_CONSOLE) ramlog_consoleinit(); #endif #if CONFIG_NFILE_DESCRIPTORS > 0 && defined(CONFIG_PSEUDOTERM_SUSV1) /* Register the master pseudo-terminal multiplexor device */ (void)ptmx_register(); #endif /* Early initialization of the system logging device. Some SYSLOG channel * can be initialized early in the initialization sequence because they * depend on only minimal OS initialization. */ syslog_initialize(SYSLOG_INIT_EARLY); #if defined(CONFIG_CRYPTO) /* Initialize the HW crypto and /dev/crypto */ up_cryptoinitialize(); #endif #if CONFIG_NFILE_DESCRIPTORS > 0 && defined(CONFIG_CRYPTO_CRYPTODEV) devcrypto_register(); #endif #ifndef CONFIG_NETDEV_LATEINIT /* Initialize the network */ up_netinitialize(); #endif #ifdef CONFIG_NETDEV_LOOPBACK /* Initialize the local loopback device */ (void)localhost_initialize(); #endif #ifdef CONFIG_NET_TUN /* Initialize the TUN device */ (void)tun_initialize(); #endif #ifdef CONFIG_NETDEV_TELNET /* Initialize the Telnet session factory */ (void)telnet_initialize(); #endif /* Initialize USB -- device and/or host */ up_usbinitialize(); board_autoled_on(LED_IRQSENABLED); }
void up_initialize(void) { /* Initialize global variables */ current_regs = NULL; /* Calibrate the timing loop */ up_calibratedelay(); /* Colorize the interrupt stack */ up_color_intstack(); /* Add any extra memory fragments to the memory manager */ up_addregion(); /* Initialize the interrupt subsystem */ up_irqinitialize(); /* Initialize the power management subsystem. This MCU-specific function * must be called *very* early in the initialization sequence *before* any * other device drivers are initialized (since they may attempt to register * with the power management subsystem). */ #ifdef CONFIG_PM up_pminitialize(); #endif /* Initialize the DMA subsystem if the weak function up_dmainitialize has been * brought into the build */ #ifdef CONFIG_ARCH_DMA #ifdef CONFIG_HAVE_WEAKFUNCTIONS if (up_dmainitialize) #endif { up_dmainitialize(); } #endif /* Initialize the system timer interrupt */ #if !defined(CONFIG_SUPPRESS_INTERRUPTS) && !defined(CONFIG_SUPPRESS_TIMER_INTS) && \ !defined(CONFIG_SYSTEMTICK_EXTCLK) up_timer_initialize(); #endif /* Register devices */ #if CONFIG_NFILE_DESCRIPTORS > 0 #if defined(CONFIG_DEV_NULL) devnull_register(); /* Standard /dev/null */ #endif #if defined(CONFIG_CRYPTO) up_cryptoinitialize(); #endif #if defined(CONFIG_CRYPTO_CRYPTODEV) devcrypto_register(); /* /dev/crypto */ #endif #if defined(CONFIG_DEV_ZERO) devzero_register(); /* Standard /dev/zero */ #endif #endif /* CONFIG_NFILE_DESCRIPTORS */ /* Initialize the serial device driver */ #ifdef USE_SERIALDRIVER up_serialinit(); #endif /* Initialize the console device driver (if it is other than the standard * serial driver). */ #if defined(CONFIG_DEV_LOWCONSOLE) lowconsole_init(); #elif defined(CONFIG_RAMLOG_CONSOLE) ramlog_consoleinit(); #elif defined(CONFIG_ARM_SEMIHOSTING_CONSOLE) semihosting_consoleinit(); #elif defined(CONFIG_ARM_ITM_CONSOLE) itm_consoleinit(); #elif defined(CONFIG_APB_USB_LOG) usb_log_init(); #endif /* Initialize the Random Number Generator (RNG) */ #ifdef CONFIG_DEV_RANDOM up_rnginitialize(); #endif /* Initialize the system logging device */ #ifdef CONFIG_SYSLOG_CHAR syslog_initialize(); #endif #ifdef CONFIG_RAMLOG_SYSLOG ramlog_sysloginit(); #endif /* Initialize the network */ up_netinitialize(); /* Initialize USB -- device and/or host */ up_usbinitialize(); /* Initialize the L2 cache if present and selected */ up_l2ccinitialize(); board_led_on(LED_IRQSENABLED); }
void up_initialize(void) { /* Initialize global variables */ current_regs = NULL; /* Calibrate the timing loop */ up_calibratedelay(); /* Initialize the interrupt subsystem */ up_irqinitialize(); /* Initialize the system timer interrupt */ #if !defined(CONFIG_SUPPRESS_INTERRUPTS) && !defined(CONFIG_SUPPRESS_TIMER_INTS) up_timer_initialize(); #endif /* Register devices */ #if CONFIG_NFILE_DESCRIPTORS > 0 #if defined(CONFIG_DEV_NULL) devnull_register(); /* Standard /dev/null */ #endif #if defined(CONFIG_DEV_ZERO) devzero_register(); /* Standard /dev/zero */ #endif #endif /* CONFIG_NFILE_DESCRIPTORS */ /* Initialize the serial device driver */ #ifdef USE_SERIALDRIVER up_serialinit(); #endif /* Initialize the console device driver (if it is other than the standard * serial driver). NOTE that the naming implies that the console is a serial * driver. That is usually the case, however, if no UARTs are enabled, the * console could als be provided through some other device, such as an LCD. * Architecture-specific logic will have to detect that case. */ #if defined(CONFIG_DEV_LOWCONSOLE) lowconsole_init(); #elif defined(CONFIG_SYSLOG_CONSOLE) syslog_console_init(); #elif defined(CONFIG_RAMLOG_CONSOLE) ramlog_consoleinit(); #endif /* Initialize the system logging device */ #ifdef CONFIG_SYSLOG_CHAR syslog_initialize(); #endif #ifdef CONFIG_RAMLOG_SYSLOG ramlog_sysloginit(); #endif #ifndef CONFIG_NETDEV_LATEINIT /* Initialize the network */ up_netinitialize(); #endif #ifdef CONFIG_NETDEV_LOOPBACK /* Initialize the local loopback device */ (void)localhost_initialize(); #endif #ifdef CONFIG_NET_TUN /* Initialize the TUN device */ (void)tun_initialize(); #endif /* Initialize USB */ up_usbinitialize(); board_led_on(LED_IRQSENABLED); }
void up_initialize(void) { /* Initialize global variables */ g_current_regs = NULL; /* Calibrate the timing loop */ up_calibratedelay(); /* Initialize the interrupt subsystem */ up_irqinitialize(); #ifdef CONFIG_PM /* Initialize the power management subsystem. This MCU-specific function * must be called *very* early in the initialization sequence *before* any * other device drivers are initialized (since they may attempt to register * with the power management subsystem). */ up_pminitialize(); #endif #if !defined(CONFIG_SUPPRESS_INTERRUPTS) && !defined(CONFIG_SUPPRESS_TIMER_INTS) /* Initialize the system timer interrupt */ up_timer_initialize(); #endif /* Register devices */ #if CONFIG_NFILE_DESCRIPTORS > 0 #if defined(CONFIG_DEV_NULL) devnull_register(); /* Standard /dev/null */ #endif #if defined(CONFIG_DEV_RANDOM) devrandom_register(); /* Standard /dev/random */ #endif #if defined(CONFIG_DEV_URANDOM) devurandom_register(); /* Standard /dev/urandom */ #endif #if defined(CONFIG_DEV_ZERO) devzero_register(); /* Standard /dev/zero */ #endif #if defined(CONFIG_DEV_LOOP) loop_register(); /* Standard /dev/loop */ #endif #endif /* CONFIG_NFILE_DESCRIPTORS */ #if defined(CONFIG_SCHED_INSTRUMENTATION_BUFFER) && \ defined(CONFIG_DRIVER_NOTE) note_register(); /* Non-standard /dev/note */ #endif /* Initialize the serial device driver */ #ifdef USE_SERIALDRIVER up_serialinit(); #endif /* Initialize the console device driver (if it is other than the standard * serial driver). NOTE that the naming implies that the console is a serial * driver. That is usually the case, however, if no UARTs are enabled, the * console could als be provided through some other device, such as an LCD. * Architecture-specific logic will have to detect that case. */ #if defined(CONFIG_DEV_LOWCONSOLE) lowconsole_init(); #elif defined(CONFIG_CONSOLE_SYSLOG) syslog_console_init(); #elif defined(CONFIG_RAMLOG_CONSOLE) ramlog_consoleinit(); #endif #if CONFIG_NFILE_DESCRIPTORS > 0 && defined(CONFIG_PSEUDOTERM_SUSV1) /* Register the master pseudo-terminal multiplexor device */ (void)ptmx_register(); #endif /* Early initialization of the system logging device. Some SYSLOG channel * can be initialized early in the initialization sequence because they * depend on only minimal OS initialization. */ syslog_initialize(SYSLOG_INIT_EARLY); #if defined(CONFIG_CRYPTO) /* Initialize the HW crypto and /dev/crypto */ up_cryptoinitialize(); #endif #if CONFIG_NFILE_DESCRIPTORS > 0 && defined(CONFIG_CRYPTO_CRYPTODEV) devcrypto_register(); #endif #ifndef CONFIG_NETDEV_LATEINIT /* Initialize the network */ up_netinitialize(); #endif #ifdef CONFIG_NETDEV_LOOPBACK /* Initialize the local loopback device */ (void)localhost_initialize(); #endif #ifdef CONFIG_NET_TUN /* Initialize the TUN device */ (void)tun_initialize(); #endif #ifdef CONFIG_NETDEV_TELNET /* Initialize the Telnet session factory */ (void)telnet_initialize(); #endif /* Initialize USB */ up_usbinitialize(); board_autoled_on(LED_IRQSENABLED); }
void board_deepsleep_with_stopmode(uint32_t secs) { #if defined(CONFIG_RTC) && defined(CONFIG_RTC_DATETIME) struct tm t; struct timespec ts; struct timespec rtc_start_ts; struct timespec rtc_end_ts; #endif #ifdef CONFIG_BOARD_DEEPSLEEP_RECONFIGURE_GPIOS uint32_t gpio_off_mask; bool sdcard_enabled; #endif uint32_t regval; int ret; #ifdef DEEPSLEEP_WAKETIME_DEBUG static struct timespec wake_ts; #endif #ifdef DEEPSLEEP_SLEEPTIME_DEBUG bool slept = false; #endif /* Do not allow other tasks to takeover (for example, by wake-up with semaphore * from EXTI interrupt) before we have restored MCU functionalities. */ sched_lock(); #ifdef DEEPSLEEP_SLEEPTIME_DEBUG lldbg("sleep for %d\n", secs); #endif #ifdef CONFIG_BOARD_DEEPSLEEP_RECONFIGURE_GPIOS /* Special support for SDcard. */ if (stm32_gpioread(GPIO_CHIP_SELECT_SDCARD) == false) { lldbg("ERROR! SDcard communication active while trying deep-sleep!\n"); goto skip_deepsleep; } /* Following devices do not have proper GPIO reconfigure recovery yet (and * some cannot work with deep-sleep at all). Abort deep-sleep instead of * introducing hard-to-diagnose bugs and general instability. */ if (stm32_gpioread(GPIO_REGULATOR_WLAN)) { lldbg("ERROR! Trying to deep-sleep when WLAN active!\n"); goto skip_deepsleep; } if (stm32_gpioread(GPIO_PWR_SWITCH_MODEM)) { lldbg("ERROR! Trying to deep-sleep when Modem active!\n"); goto skip_deepsleep; } if (stm32_gpioread(GPIO_REGULATOR_GPS)) { lldbg("ERROR! Trying to deep-sleep when GPS active!\n"); goto skip_deepsleep; } if (stm32_gpioread(GPIO_REGULATOR_BLUETOOTH)) { lldbg("ERROR! Trying to deep-sleep when Bluetooth active!\n"); goto skip_deepsleep; } if (stm32_gpioread(GPIO_REGULATOR_DISPLAY)) { lldbg("ERROR! Trying to deep-sleep when Display active!\n"); goto skip_deepsleep; } #endif /* CONFIG_BOARD_DEEPSLEEP_RECONFIGURE_GPIOS */ #if defined(CONFIG_RTC) && defined(CONFIG_RTC_DATETIME) /* Get RTC clock before STOP. */ stm32_rtc_getdatetime_with_subseconds(&t, &rtc_start_ts.tv_nsec); rtc_start_ts.tv_sec = mktime(&t); /* Get current time. */ ret = clock_gettime(CLOCK_REALTIME, &ts); DEBUGASSERT(ret != ERROR); /* Add nanoseconds to entropy pool. */ add_time_randomness(ts.tv_nsec); #endif #ifdef DEEPSLEEP_WAKETIME_DEBUG if (wake_ts.tv_nsec || wake_ts.tv_sec) { struct timespec curr_ts; int64_t msecs; clock_gettime(CLOCK_REALTIME, &curr_ts); msecs = ((int64_t)curr_ts.tv_sec - wake_ts.tv_sec) * 1000; msecs += ((int64_t)curr_ts.tv_nsec - wake_ts.tv_nsec) / (1000 * 1000); lldbg("sleep to sleep time: %d msecs\n", (int)msecs); } else { lldbg("first sleep (for %u secs)\n", secs); } #endif #ifdef CONFIG_RTC_PERIODIC_AUTORELOAD_WAKEUP if (secs > 0) { /* Prepare RTC for wake-up. */ ret = up_rtc_setperiodicwakeup(secs, NULL); DEBUGASSERT(ret == OK); } #else DEBUGASSERT(secs == 0); #endif /* Prevent USART interrupt activity, make sure that last transmission has * completed. */ stm32_serial_set_suspend(true); #ifdef CONFIG_BOARD_DEEPSLEEP_RECONFIGURE_GPIOS /* Read control state of SDCard regulator (TODO: add proper pwrctl api) */ sdcard_enabled = stm32_gpioread(GPIO_REGULATOR_SDCARD); if (sdcard_enabled) { /* Mark SDcard as disconnected for block driver. */ mmcsd_slot_pm_suspend(CONFIG_BOARD_MMCSDSLOTNO); } /* Force SDcard off. */ stm32_gpiowrite(GPIO_REGULATOR_SDCARD, false); /* SDcard is off, and does not react on GPIOs. Force GPIOs low to avoid leak * current. */ gpio_off_mask = ~(GPIO_PUPD_MASK | GPIO_MODE_MASK | GPIO_OUTPUT_SET); stm32_configgpio((GPIO_SPI3_MOSI & gpio_off_mask) | GPIO_OUTPUT_CLEAR | GPIO_OUTPUT); stm32_configgpio((GPIO_SPI3_MISO & gpio_off_mask) | GPIO_OUTPUT_CLEAR | GPIO_OUTPUT); stm32_configgpio((GPIO_SPI3_SCK & gpio_off_mask) | GPIO_OUTPUT_CLEAR | GPIO_OUTPUT); stm32_configgpio((GPIO_CHIP_SELECT_SDCARD & gpio_off_mask) | GPIO_OUTPUT_CLEAR | GPIO_OUTPUT); /* Reconfigure GPIO's for stop mode (most pins are setup as analog input). */ up_reconfigure_gpios_for_pmstop(); #endif #if defined(CONFIG_USBDEV) && defined (CONFIG_STM32_USB) /* Reset USB peripheral */ regval = getreg32(STM32_RCC_APB1RSTR); putreg32(regval | RCC_APB1RSTR_USBRST, STM32_RCC_APB1RSTR); putreg32(regval, STM32_RCC_APB1RSTR); #endif #if defined(CONFIG_STM32_PWR) /* Disable PVD during sleep because I_DD (PVD/BOR) consumes 2.6 uA, and because there is nothing better to do than die while sleeping if lose power in stop-mode. */ stm32_pwr_disablepvd(); #endif #ifndef CONFIG_BOARD_DEEPSLEEP_SKIP_PMSTOP /* Enter stop-mode with MCU internal regulator in low-power mode. */ ret = stm32_pmstop(true); #endif #ifdef DEEPSLEEP_SLEEPTIME_DEBUG slept = true; #endif #if defined(CONFIG_STM32_PWR) /* Re-enable PVD and check if voltage has dropped too much while we slept. We might have enough power for MCU, but not for SD card or other peripherals. */ stm32_pwr_enablepvd(); board_pwr_checkpvd(); #endif #ifdef CONFIG_RTC_PERIODIC_AUTORELOAD_WAKEUP if (secs > 0) { /* Prevent more wake-ups. */ (void)up_rtc_cancelperiodicwakeup(); } #endif #if defined(CONFIG_RTC) && defined(CONFIG_RTC_DATETIME) /* Get RTC clock after STOP. */ stm32_rtc_getdatetime_with_subseconds(&t, &rtc_end_ts.tv_nsec); rtc_end_ts.tv_sec = mktime(&t); /* Advance time by RTC. */ ts.tv_sec += rtc_end_ts.tv_sec - rtc_start_ts.tv_sec; ts.tv_nsec += rtc_end_ts.tv_nsec - rtc_start_ts.tv_nsec; if (ts.tv_nsec < 0) { ts.tv_nsec += 1000 * 1000 * 1000; ts.tv_sec--; } if (ts.tv_nsec >= 1000 * 1000 * 1000) { ts.tv_nsec -= 1000 * 1000 * 1000; ts.tv_sec++; } /* Set current time / date */ ret = clock_settime(CLOCK_REALTIME, &ts); DEBUGASSERT(ret != ERROR); #ifdef DEEPSLEEP_WAKETIME_DEBUG wake_ts = ts; #endif #if defined(CONFIG_CLOCK_MONOTONIC) && defined(CONFIG_CLOCK_MONOTONIC_OFFSET_TIME) /* Get amount of time adjusted by RTC. */ ts.tv_sec = rtc_end_ts.tv_sec - rtc_start_ts.tv_sec; ts.tv_nsec = rtc_end_ts.tv_nsec - rtc_start_ts.tv_nsec; if (ts.tv_nsec < 0) { ts.tv_nsec += 1000 * 1000 * 1000; ts.tv_sec--; } if (ts.tv_nsec >= 1000 * 1000 * 1000) { ts.tv_nsec -= 1000 * 1000 * 1000; ts.tv_sec++; } /* Adjust CLOCK_MONOTONIC offset. */ clock_increase_monotonic_offset(&ts); #endif #endif /* Stop mode disables HSE/HSI/PLL and wake happens with default system * clock (MSI, 2Mhz). So reconfigure clocks early on. RTC is however * handled before this for accurate time keeping. */ stm32_clockconfig(); #ifdef CONFIG_BOARD_DEEPSLEEP_RECONFIGURE_GPIOS /* Restore pin configuration */ up_restore_gpios_after_pmstop(); #endif #if defined(CONFIG_USBDEV) && defined (CONFIG_STM32_USB) /* Initialize USB */ /* TODO initialize USB properly, up_usbinitialize() call alone is not sufficient */ up_usbinitialize(); #endif /* Resume serial ports after setting up system clock, as USART baud rate is * configured relative to system clock. */ stm32_serial_set_suspend(false); /* Check that we have enough battery left, just in case PVD detection missed it. */ board_pwr_checkvbat(false); #ifdef CONFIG_BOARD_DEEPSLEEP_RECONFIGURE_GPIOS /* Special support for SD card. */ /* Restore SDcard GPIOs */ stm32_configgpio(GPIO_SPI3_MOSI); stm32_configgpio(GPIO_SPI3_MISO); stm32_configgpio(GPIO_SPI3_SCK); stm32_configgpio(GPIO_CHIP_SELECT_SDCARD); if (sdcard_enabled) { /* Re-enable power now that GPIOs are in correct state. */ stm32_gpiowrite(GPIO_REGULATOR_SDCARD, true); /* Mark SDcard as reconnected for block driver, will reinitialize/reconfigure * SDcard. Apparently, block driver works fine without additional delay * for regulator. Might be because plug-in nature of SDcards require * block driver to keep retrying initialization until card stabilizes. */ mmcsd_slot_pm_resume(CONFIG_BOARD_MMCSDSLOTNO); } skip_deepsleep: #endif /* Allow scheduler to switch tasks. */ sched_unlock(); #ifdef DEEPSLEEP_SLEEPTIME_DEBUG if (slept) { /* Get amount of time adjusted by RTC. */ ts.tv_sec = rtc_end_ts.tv_sec - rtc_start_ts.tv_sec; ts.tv_nsec = rtc_end_ts.tv_nsec - rtc_start_ts.tv_nsec; if (ts.tv_nsec < 0) { ts.tv_nsec += 1000 * 1000 * 1000; ts.tv_sec--; } if (ts.tv_nsec >= 1000 * 1000 * 1000) { ts.tv_nsec -= 1000 * 1000 * 1000; ts.tv_sec++; } lldbg("slept for %u.%03u\n", ts.tv_sec, ts.tv_nsec / (1000 * 1000)); } #endif }
void up_initialize(void) { /* Initialize global variables */ g_current_regs = NULL; /* Calibrate the timing loop */ up_calibratedelay(); /* Add any extra memory fragments to the memory manager */ up_addregion(); /* Initialize the interrupt subsystem */ up_irqinitialize(); /* Initialize the DMA subsystem if the weak function stm32_dmainitialize has been * brought into the build */ #ifdef CONFIG_ARCH_DMA #ifdef CONFIG_HAVE_WEAKFUNCTIONS if (up_dmainitialize) #endif { up_dmainitialize(); } #endif /* Initialize the system timer interrupt */ #if !defined(CONFIG_SUPPRESS_INTERRUPTS) && !defined(CONFIG_SUPPRESS_TIMER_INTS) up_timer_initialize(); #endif /* Register devices */ #if CONFIG_NFILE_DESCRIPTORS > 0 #if defined(CONFIG_DEV_NULL) devnull_register(); /* Standard /dev/null */ #endif #if defined(CONFIG_DEV_ZERO) devzero_register(); /* Standard /dev/zero */ #endif #if defined(CONFIG_DEV_LOOP) loop_register(); /* Standard /dev/loop */ #endif #endif /* CONFIG_NFILE_DESCRIPTORS */ #if defined(CONFIG_SCHED_INSTRUMENTATION_BUFFER) && \ defined(CONFIG_DRIVER_NOTE) note_register(); /* Non-standard /dev/note */ #endif /* Initialize the serial device driver */ #ifdef USE_SERIALDRIVER up_serialinit(); #endif /* Initialize the console device driver (if it is other than the standard * serial driver). */ #if defined(CONFIG_DEV_LOWCONSOLE) lowconsole_init(); #elif defined(CONFIG_CONSOLE_SYSLOG) syslog_console_init(); #elif defined(CONFIG_RAMLOG_CONSOLE) ramlog_consoleinit(); #endif #if CONFIG_NFILE_DESCRIPTORS > 0 && defined(CONFIG_PSEUDOTERM_SUSV1) /* Register the master pseudo-terminal multiplexor device */ (void)ptmx_register(); #endif /* Early initialization of the system logging device. Some SYSLOG channel * can be initialized early in the initialization sequence because they * depend on only minimal OS initialization. */ syslog_initialize(SYSLOG_INIT_EARLY); #if defined(CONFIG_CRYPTO) /* Initialize the HW crypto and /dev/crypto */ up_cryptoinitialize(); #endif #if CONFIG_NFILE_DESCRIPTORS > 0 && defined(CONFIG_CRYPTO_CRYPTODEV) devcrypto_register(); #endif #ifdef CONFIG_DEV_RANDOM /* Initialize the Random Number Generator (RNG) */ up_rnginitialize(); #endif #ifndef CONFIG_NETDEV_LATEINIT /* Initialize the network */ up_netinitialize(); #endif #ifdef CONFIG_NETDEV_LOOPBACK /* Initialize the local loopback device */ (void)localhost_initialize(); #endif #ifdef CONFIG_NET_TUN /* Initialize the TUN device */ (void)tun_initialize(); #endif #ifdef CONFIG_NETDEV_TELNET /* Initialize the Telnet session factory */ (void)telnet_initialize(); #endif /* Initialize USB -- device and/or host */ up_usbinitialize(); board_autoled_on(LED_IRQSENABLED); }