void gpio_pre_init(void) { const struct gpio_info *g = gpio_list; int is_warm = system_is_reboot_warm(); int i; /* Required to configure external IRQ lines (SYSCFG_EXTICRn) */ STM32_RCC_APB2ENR |= 1 << 0; /* Delay 1 APB clock cycle after the clock is enabled */ clock_wait_bus_cycles(BUS_APB, 1); if (!is_warm) gpio_enable_clocks(); /* Set all GPIOs to defaults */ for (i = 0; i < GPIO_COUNT; i++, g++) { int flags = g->flags; if (flags & GPIO_DEFAULT) continue; /* * If this is a warm reboot, don't set the output levels or * we'll shut off the AP. */ if (is_warm) flags &= ~(GPIO_LOW | GPIO_HIGH); /* Set up GPIO based on flags */ gpio_set_flags_by_mask(g->port, g->mask, flags); } }
void gpio_enable_clocks(void) { /* * Enable all GPIOs clocks * * TODO(crosbug.com/p/23770): only enable the banks we need to, * and support disabling some of them in low-power idle. */ STM32_RCC_AHBENR |= 0x3f; /* Delay 1 AHB clock cycle after the clock is enabled */ clock_wait_bus_cycles(BUS_AHB, 1); }