void RX_PIN_WAKEUP_handler(void *arg) { (void)arg; platform_uart_driver_t* driver = arg; uint32_t uart_number; platform_gpio_enable_clock( driver->peripheral->pin_rx ); uart_number = platform_uart_get_port_number( driver->peripheral->port ); uart_peripheral_clock_functions[ uart_number ]( uart_peripheral_clocks[ uart_number ], ENABLE ); /* Enable DMA peripheral clock */ if ( driver->peripheral->tx_dma_config.controller == DMA1 ) { RCC->AHB1ENR |= RCC_AHB1Periph_DMA1; } else { RCC->AHB1ENR |= RCC_AHB1Periph_DMA2; } platform_gpio_irq_disable( driver->peripheral->pin_rx ); platform_mcu_powersave_disable( ); mico_rtos_set_semaphore( &driver->sem_wakeup ); }
OSStatus host_platform_bus_deinit( void ) { platform_mcu_powersave_disable( ); NVIC_DisableIRQ( platform_flexcom_irq_numbers[wifi_spi.spi_id] ); pdc_disable_transfer( spi_get_pdc_base( wifi_spi.port ), PERIPH_PTCR_RXTDIS | PERIPH_PTCR_TXTDIS ); spi_disable(wifi_spi.port); /* Deinit the SPI lines */ platform_gpio_peripheral_pin_init( wifi_spi.mosi_pin, INPUT_HIGH_IMPEDANCE ); platform_gpio_peripheral_pin_init( wifi_spi.miso_pin, INPUT_HIGH_IMPEDANCE ); platform_gpio_peripheral_pin_init( wifi_spi.clock_pin, INPUT_HIGH_IMPEDANCE ); /* Deinit the interrupt input for WLAN_IRQ */ platform_gpio_init( &wifi_spi_pins[WIFI_PIN_SPI_IRQ], INPUT_HIGH_IMPEDANCE ); platform_gpio_irq_disable( &wifi_spi_pins[WIFI_PIN_SPI_IRQ] ); /* Deinit SPI slave select GPIOs */ platform_gpio_init( &wifi_spi_pins[WIFI_PIN_SPI_CS], INPUT_HIGH_IMPEDANCE ); #if defined ( MICO_WIFI_USE_GPIO_FOR_BOOTSTRAP ) platform_gpio_init( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_0], INPUT_HIGH_IMPEDANCE ); platform_gpio_init( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_1], INPUT_HIGH_IMPEDANCE ); #endif platform_mcu_powersave_enable( ); return kNoErr; }
OSStatus host_platform_bus_deinit( void ) { uint32_t a; platform_mcu_powersave_disable(); /* Disable SPI and SPI DMA */ SPI_Cmd( wifi_spi.port, DISABLE ); SPI_I2S_DeInit( wifi_spi.port ); SPI_I2S_DMACmd( wifi_spi.port, SPI_I2S_DMAReq_Tx | SPI_I2S_DMAReq_Rx, DISABLE ); DMA_DeInit( wifi_spi.tx_dma.stream ); DMA_DeInit( wifi_spi.rx_dma.stream ); #if defined ( MICO_WIFI_USE_GPIO_FOR_BOOTSTRAP ) /* Clear GPIO_B[1:0] */ platform_gpio_init( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_0], INPUT_HIGH_IMPEDANCE ); platform_gpio_init( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_1], INPUT_HIGH_IMPEDANCE ); #endif /* Clear SPI slave select GPIOs */ platform_gpio_init( &wifi_spi_pins[WIFI_PIN_SPI_CS], INPUT_HIGH_IMPEDANCE ); /* Clear the SPI lines */ for ( a = WIFI_PIN_SPI_CLK; a < WIFI_PIN_SPI_MAX; a++ ) { platform_gpio_init( &wifi_spi_pins[ a ], INPUT_HIGH_IMPEDANCE ); } platform_gpio_irq_disable( &wifi_spi_pins[WIFI_PIN_SPI_IRQ] ); platform_gpio_init( &wifi_spi_pins[WIFI_PIN_SPI_IRQ], INPUT_HIGH_IMPEDANCE ); /* Disable SPI_SLAVE Periph clock and DMA1 clock */ (wifi_spi.peripheral_clock_func)( wifi_spi.peripheral_clock_reg, DISABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_SYSCFG, DISABLE ); platform_mcu_powersave_enable(); return kNoErr; }
OSStatus host_platform_bus_deinit( void ) { OSStatus result; uint32_t a; result = mico_rtos_deinit_semaphore( &sdio_transfer_finished_semaphore ); platform_mcu_powersave_disable(); /* Disable SPI and SPI DMA */ sdio_disable_bus_irq( ); SDIO_ClockCmd( DISABLE ); SDIO_SetPowerState( SDIO_PowerState_OFF ); SDIO_DeInit( ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_SDIO, DISABLE ); #ifdef SDIO_1_BIT platform_gpio_deinit( &wifi_sdio_pins[WIFI_PIN_SDIO_IRQ] ); platform_gpio_irq_disable( &wifi_sdio_pins[WIFI_PIN_SDIO_IRQ] ); #endif for ( a = 0; a < WIFI_PIN_SDIO_MAX; a++ ) { platform_gpio_deinit( &wifi_sdio_pins[ a ] ); } #if defined ( MICO_WIFI_USE_GPIO_FOR_BOOTSTRAP ) platform_gpio_deinit( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_0] ); platform_gpio_deinit( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_1] ); #endif /* Turn off SDIO IRQ */ NVIC_DisableIRQ( SDIO_IRQ_CHANNEL ); NVIC_DisableIRQ( DMA2_3_IRQ_CHANNEL ); platform_mcu_powersave_enable(); return result; }
OSStatus MicoGpioDisableIRQ( mico_gpio_t gpio ) { if ( gpio >= MICO_GPIO_NONE ) return kUnsupportedErr; return (OSStatus) platform_gpio_irq_disable( &platform_gpio_pins[gpio] ); }
wwd_result_t host_platform_bus_disable_interrupt( void ) { platform_gpio_irq_disable( &wifi_spi_pins[WWD_PIN_SPI_IRQ] ); return WICED_SUCCESS; }