/** * @brief DeInitializes the SDIO interface. * @param None * @retval None */ void SD_LowLevel_DeInit(void) { GPIO_InitTypeDef GPIO_InitStructure; /*!< Disable SDIO Clock */ SDIO_ClockCmd(DISABLE); /*!< Set Power State to OFF */ SDIO_SetPowerState(SDIO_PowerState_OFF); /*!< DeInitializes the SDIO peripheral */ SDIO_DeInit(); /*!< Disable the SDIO AHB Clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO, DISABLE); /*!< Configure PC.08, PC.09, PC.10, PC.11, PC.12 pin: D0, D1, D2, D3, CLK pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStructure); /*!< Configure PD.02 CMD line */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOD, &GPIO_InitStructure); }
/** * @brief DeInitializes the SDIO interface. * @param None * @retval None */ void SD_LowLevel_DeInit(void) { GPIO_InitTypeDef GPIO_InitStructure; /*!< Disable SDIO Clock */ SDIO_ClockCmd(DISABLE); /*!< Set Power State to OFF */ SDIO_SetPowerState(SDIO_PowerState_OFF); /*!< DeInitializes the SDIO peripheral */ SDIO_DeInit(); /* Disable the SDIO APB2 Clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, DISABLE); GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_MCO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_MCO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_MCO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_MCO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_MCO); GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_MCO); /* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configure PD.02 CMD line */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOD, &GPIO_InitStructure); /* Configure PC.12 pin: CLK pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_Init(GPIOC, &GPIO_InitStructure); }
void SD_LowLevel_DeInit(void){ GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; NVIC_Init(&NVIC_InitStructure); // Disable SDIO Clock SDIO_ClockCmd(DISABLE); // Set Power State to OFF SDIO_SetPowerState(SDIO_PowerState_OFF); // DeInitializes the SDIO peripheral SDIO_DeInit(); // Disable the SDIO APB2 Clock RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO, DISABLE); // Configure PC.08, PC.09, PC.10, PC.11, PC.12 pins: D0, D1, D2, D3, CLK GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStructure); // Configure PD.02 CMD line GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOD, &GPIO_InitStructure); }
/** * @brief DeInitializes the SDIO interface. * @param None * @retval None */ void SD_LowLevel_DeInit(void) { GPIO_InitTypeDef GPIO_InitStructure; /*!< Disable SDIO Clock */ SDIO_ClockCmd(DISABLE); /*!< Set Power State to OFF */ SDIO_SetPowerState(SDIO_PowerState_OFF); /*!< DeInitializes the SDIO peripheral */ SDIO_DeInit(); /* Disable the SDIO APB2 Clock */ CLEAR_BIT(RCC->APB2ENR,RCC_APB2ENR_SDIOEN); // Set GPIOC 8-12 alt funciton as MCO = 0 ie set to zero Alt Function (from 12) GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_MCO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_MCO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_MCO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_MCO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_MCO); // set GPIOD.2 as MCO GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_MCO); /* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configure PD.02 CMD line */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOD, &GPIO_InitStructure); /* Configure PC.12 pin: CLK pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_Init(GPIOC, &GPIO_InitStructure); }
void host_platform_enable_high_speed_sdio( void ) { SDIO_InitTypeDef sdio_init_structure; sdio_init_structure.SDIO_ClockDiv = (uint8_t) 0; /* 0 = 24MHz if SDIO clock = 48MHz */ sdio_init_structure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; sdio_init_structure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; sdio_init_structure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; #ifndef SDIO_1_BIT sdio_init_structure.SDIO_BusWide = SDIO_BusWide_4b; #else sdio_init_structure.SDIO_BusWide = SDIO_BusWide_1b; #endif sdio_init_structure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; SDIO_DeInit( ); SDIO_Init( &sdio_init_structure ); SDIO_SetPowerState( SDIO_PowerState_ON ); SDIO_ClockCmd( ENABLE ); sdio_enable_bus_irq( ); }
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; }
/************************************************************************* * Function Name: _SdInit * Parameters: none * Return: none * * Description: Init MCI module and Cart Present and Write Protect pins * *************************************************************************/ static void _SdInit (void) { GPIO_InitTypeDef GPIO_InitStructure; // GPIO enable clock #if (defined STM32_H407 || defined STM32_E407) // SPP RCC_AHB1PeriphClockCmd(SD_CP_CLK | SD_CMD_CLK | SD_CLK_CLK | \ SD_D0_CLK | SD_D1_CLK | SD_D2_CLK | SD_D3_CLK, ENABLE); #else // original RCC_AHB1PeriphClockCmd(SD_CP_CLK | SD_WP_CLK | SD_CMD_CLK | SD_CLK_CLK | \ SD_D0_CLK | SD_D1_CLK | SD_D2_CLK | SD_D3_CLK, ENABLE); #endif // Init CP pin GPIO_InitStructure.GPIO_Pin = SD_CP_PIN; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SD_CP_PORT, &GPIO_InitStructure); #if (defined STM32_H407 || defined STM32_E407) // SPP #else // Init WP pin GPIO_InitStructure.GPIO_Pin = SD_WP_PIN; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SD_WP_PORT, &GPIO_InitStructure); #endif // Configure PC.08, PC.09, PC.10, PC.11, PC.12 pin: D0, D1, D2, D3, CLK pin GPIO_InitStructure.GPIO_Pin = SD_D0_PIN | SD_D1_PIN | SD_D2_PIN | \ SD_D3_PIN | SD_CLK_PIN; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); // Configure PD.02 CMD line GPIO_InitStructure.GPIO_Pin = SD_CMD_PIN; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SD_CMD_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(SD_CMD_PORT, SD_CMD_SOURCE, GPIO_AF_SDIO); GPIO_PinAFConfig(SD_CLK_PORT, SD_CLK_SOURCE, GPIO_AF_SDIO); GPIO_PinAFConfig(SD_D0_PORT, SD_D0_SOURCE, GPIO_AF_SDIO); GPIO_PinAFConfig(SD_D1_PORT, SD_D1_SOURCE, GPIO_AF_SDIO); GPIO_PinAFConfig(SD_D2_PORT, SD_D2_SOURCE, GPIO_AF_SDIO); GPIO_PinAFConfig(SD_D3_PORT, SD_D3_SOURCE, GPIO_AF_SDIO); /* Enable the SDIO AHB Clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE); // Enable the DMA2 Clock RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); SDIO_DeInit(); }
OSStatus host_platform_bus_init( void ) { SDIO_InitTypeDef sdio_init_structure; OSStatus result; uint8_t a; platform_mcu_powersave_disable(); result = mico_rtos_init_semaphore( &sdio_transfer_finished_semaphore, 1 ); if ( result != kNoErr ) { return result; } /* Turn on SDIO IRQ */ SDIO->ICR = (uint32_t) 0xffffffff; /* Must be lower priority than the value of configMAX_SYSCALL_INTERRUPT_PRIORITY */ /* otherwise FreeRTOS will not be able to mask the interrupt */ /* keep in mind that ARMCM3 interrupt priority logic is inverted, the highest value */ /* is the lowest priority */ NVIC_EnableIRQ( SDIO_IRQ_CHANNEL ); NVIC_EnableIRQ( DMA2_3_IRQ_CHANNEL ); /* Set GPIO_B[1:0] to 00 to put WLAN module into SDIO mode */ #if defined ( MICO_WIFI_USE_GPIO_FOR_BOOTSTRAP ) platform_gpio_init( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_0], OUTPUT_PUSH_PULL ); platform_gpio_output_low( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_0] ); platform_gpio_init( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_1], OUTPUT_PUSH_PULL ); platform_gpio_output_low( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_1] ); #endif /* Setup GPIO pins for SDIO data & clock */ for ( a = WIFI_PIN_SDIO_CLK; a < WIFI_PIN_SDIO_MAX; a++ ) { platform_gpio_set_alternate_function( wifi_sdio_pins[ a ].port, wifi_sdio_pins[ a ].pin_number, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_SDIO ); } #ifdef SDIO_1_BIT platform_gpio_init( &wifi_sdio_pins[WIFI_PIN_SDIO_IRQ], INPUT_PULL_UP ); platform_gpio_irq_enable( &wifi_sdio_pins[WIFI_PIN_SDIO_IRQ], IRQ_TRIGGER_FALLING_EDGE, sdio_int_pin_irq_handler, 0 ); #endif /*!< Enable the SDIO AHB Clock and the DMA2 Clock */ RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_DMA2, ENABLE ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_SDIO, ENABLE ); SDIO_DeInit( ); sdio_init_structure.SDIO_ClockDiv = (uint8_t) 120; /* 0x78, clock is taken from the high speed APB bus ; */ /* About 400KHz */ sdio_init_structure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; sdio_init_structure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; sdio_init_structure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Enable; sdio_init_structure.SDIO_BusWide = SDIO_BusWide_1b; sdio_init_structure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; SDIO_Init( &sdio_init_structure ); SDIO_SetPowerState( SDIO_PowerState_ON ); SDIO_SetSDIOReadWaitMode( SDIO_ReadWaitMode_CLK ); SDIO_ClockCmd( ENABLE ); platform_mcu_powersave_enable(); return kNoErr; }