f2a0b7cea656aacaff8ba3ef7a84289b011298b1
[SCSI2SD-V6.git] / STM32CubeMX / revF / Src / sdio.c
1 /**
2   ******************************************************************************
3   * File Name          : SDIO.c
4   * Description        : This file provides code for the configuration
5   *                      of the SDIO instances.
6   ******************************************************************************
7   * @attention
8   *
9   * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
10   * All rights reserved.</center></h2>
11   *
12   * This software component is licensed by ST under Ultimate Liberty license
13   * SLA0044, the "License"; You may not use this file except in compliance with
14   * the License. You may obtain a copy of the License at:
15   *                             www.st.com/SLA0044
16   *
17   ******************************************************************************
18   */
19
20 /* Includes ------------------------------------------------------------------*/
21 #include "sdio.h"
22
23 /* USER CODE BEGIN 0 */
24
25 /* USER CODE END 0 */
26
27 SD_HandleTypeDef hsd;
28 DMA_HandleTypeDef hdma_sdio_tx;
29 DMA_HandleTypeDef hdma_sdio_rx;
30
31 /* SDIO init function */
32
33 void MX_SDIO_SD_Init(void)
34 {
35
36   hsd.Instance = SDIO;
37   hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
38   hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
39   hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
40   hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
41   hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
42   hsd.Init.ClockDiv = 0;
43   if (HAL_SD_Init(&hsd) != HAL_OK)
44   {
45     Error_Handler();
46   }
47   if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK)
48   {
49     Error_Handler();
50   }
51
52 }
53
54 void HAL_SD_MspInit(SD_HandleTypeDef* sdHandle)
55 {
56
57   GPIO_InitTypeDef GPIO_InitStruct = {0};
58   if(sdHandle->Instance==SDIO)
59   {
60   /* USER CODE BEGIN SDIO_MspInit 0 */
61
62   /* USER CODE END SDIO_MspInit 0 */
63     /* SDIO clock enable */
64     __HAL_RCC_SDIO_CLK_ENABLE();
65   
66     __HAL_RCC_GPIOC_CLK_ENABLE();
67     __HAL_RCC_GPIOD_CLK_ENABLE();
68     /**SDIO GPIO Configuration    
69     PC8     ------> SDIO_D0
70     PC9     ------> SDIO_D1
71     PC10     ------> SDIO_D2
72     PC11     ------> SDIO_D3
73     PC12     ------> SDIO_CK
74     PD2     ------> SDIO_CMD 
75     */
76     GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11;
77     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
78     GPIO_InitStruct.Pull = GPIO_PULLUP;
79     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
80     GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
81     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
82
83     GPIO_InitStruct.Pin = GPIO_PIN_12;
84     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
85     GPIO_InitStruct.Pull = GPIO_NOPULL;
86     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
87     GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
88     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
89
90     GPIO_InitStruct.Pin = GPIO_PIN_2;
91     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
92     GPIO_InitStruct.Pull = GPIO_PULLUP;
93     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
94     GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
95     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
96
97     /* SDIO DMA Init */
98     /* SDIO_TX Init */
99     hdma_sdio_tx.Instance = DMA2_Stream3;
100     hdma_sdio_tx.Init.Channel = DMA_CHANNEL_4;
101     hdma_sdio_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
102     hdma_sdio_tx.Init.PeriphInc = DMA_PINC_DISABLE;
103     hdma_sdio_tx.Init.MemInc = DMA_MINC_ENABLE;
104     hdma_sdio_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
105     hdma_sdio_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
106     hdma_sdio_tx.Init.Mode = DMA_PFCTRL;
107     hdma_sdio_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
108     hdma_sdio_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
109     hdma_sdio_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
110     hdma_sdio_tx.Init.MemBurst = DMA_MBURST_INC4;
111     hdma_sdio_tx.Init.PeriphBurst = DMA_PBURST_INC4;
112     if (HAL_DMA_Init(&hdma_sdio_tx) != HAL_OK)
113     {
114       Error_Handler();
115     }
116
117     __HAL_LINKDMA(sdHandle,hdmatx,hdma_sdio_tx);
118
119     /* SDIO_RX Init */
120     hdma_sdio_rx.Instance = DMA2_Stream6;
121     hdma_sdio_rx.Init.Channel = DMA_CHANNEL_4;
122     hdma_sdio_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
123     hdma_sdio_rx.Init.PeriphInc = DMA_PINC_DISABLE;
124     hdma_sdio_rx.Init.MemInc = DMA_MINC_ENABLE;
125     hdma_sdio_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
126     hdma_sdio_rx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
127     hdma_sdio_rx.Init.Mode = DMA_PFCTRL;
128     hdma_sdio_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
129     hdma_sdio_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
130     hdma_sdio_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
131     hdma_sdio_rx.Init.MemBurst = DMA_MBURST_INC4;
132     hdma_sdio_rx.Init.PeriphBurst = DMA_PBURST_INC4;
133     if (HAL_DMA_Init(&hdma_sdio_rx) != HAL_OK)
134     {
135       Error_Handler();
136     }
137
138     __HAL_LINKDMA(sdHandle,hdmarx,hdma_sdio_rx);
139
140     /* SDIO interrupt Init */
141     HAL_NVIC_SetPriority(SDIO_IRQn, 2, 0);
142     HAL_NVIC_EnableIRQ(SDIO_IRQn);
143   /* USER CODE BEGIN SDIO_MspInit 1 */
144
145   /* USER CODE END SDIO_MspInit 1 */
146   }
147 }
148
149 void HAL_SD_MspDeInit(SD_HandleTypeDef* sdHandle)
150 {
151
152   if(sdHandle->Instance==SDIO)
153   {
154   /* USER CODE BEGIN SDIO_MspDeInit 0 */
155
156   /* USER CODE END SDIO_MspDeInit 0 */
157     /* Peripheral clock disable */
158     __HAL_RCC_SDIO_CLK_DISABLE();
159   
160     /**SDIO GPIO Configuration    
161     PC8     ------> SDIO_D0
162     PC9     ------> SDIO_D1
163     PC10     ------> SDIO_D2
164     PC11     ------> SDIO_D3
165     PC12     ------> SDIO_CK
166     PD2     ------> SDIO_CMD 
167     */
168     HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
169                           |GPIO_PIN_12);
170
171     HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);
172
173     /* SDIO DMA DeInit */
174     HAL_DMA_DeInit(sdHandle->hdmatx);
175     HAL_DMA_DeInit(sdHandle->hdmarx);
176
177     /* SDIO interrupt Deinit */
178     HAL_NVIC_DisableIRQ(SDIO_IRQn);
179   /* USER CODE BEGIN SDIO_MspDeInit 1 */
180
181   /* USER CODE END SDIO_MspDeInit 1 */
182   }
183
184
185 /* USER CODE BEGIN 1 */
186
187 /* USER CODE END 1 */
188
189 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/