SD hotswap, SD fixes, SCSI interface fixes, performance improvements.
[SCSI2SD-V6.git] / STM32CubeMX / SCSI2SD-V6 / 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   *
8   * COPYRIGHT(c) 2016 STMicroelectronics
9   *
10   * Redistribution and use in source and binary forms, with or without modification,
11   * are permitted provided that the following conditions are met:
12   *   1. Redistributions of source code must retain the above copyright notice,
13   *      this list of conditions and the following disclaimer.
14   *   2. Redistributions in binary form must reproduce the above copyright notice,
15   *      this list of conditions and the following disclaimer in the documentation
16   *      and/or other materials provided with the distribution.
17   *   3. Neither the name of STMicroelectronics nor the names of its contributors
18   *      may be used to endorse or promote products derived from this software
19   *      without specific prior written permission.
20   *
21   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31   *
32   ******************************************************************************
33   */
34
35 /* Includes ------------------------------------------------------------------*/
36 #include "sdio.h"
37
38 #include "gpio.h"
39
40 /* USER CODE BEGIN 0 */
41
42 /* USER CODE END 0 */
43
44 SD_HandleTypeDef hsd;
45 HAL_SD_CardInfoTypedef SDCardInfo;
46 DMA_HandleTypeDef hdma_sdio_tx;
47 DMA_HandleTypeDef hdma_sdio_rx;
48
49 /* SDIO init function */
50
51 void MX_SDIO_SD_Init(void)
52 {
53
54   hsd.Instance = SDIO;
55   hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
56   hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
57   hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
58   hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
59   hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
60   hsd.Init.ClockDiv = 0;
61
62 }
63
64 void HAL_SD_MspInit(SD_HandleTypeDef* hsd)
65 {
66
67   GPIO_InitTypeDef GPIO_InitStruct;
68   if(hsd->Instance==SDIO)
69   {
70   /* USER CODE BEGIN SDIO_MspInit 0 */
71
72   /* USER CODE END SDIO_MspInit 0 */
73     /* Peripheral clock enable */
74     __SDIO_CLK_ENABLE();
75   
76     /**SDIO GPIO Configuration    
77     PC8     ------> SDIO_D0
78     PC9     ------> SDIO_D1
79     PC10     ------> SDIO_D2
80     PC11     ------> SDIO_D3
81     PC12     ------> SDIO_CK
82     PD2     ------> SDIO_CMD 
83     */
84     GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
85                           |GPIO_PIN_12;
86     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
87     //GPIO_InitStruct.Pull = GPIO_NOPULL;
88     GPIO_InitStruct.Pull = GPIO_PULLUP; // MM
89     GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
90     GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
91     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
92
93     GPIO_InitStruct.Pin = GPIO_PIN_2;
94     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
95     //GPIO_InitStruct.Pull = GPIO_NOPULL;
96     GPIO_InitStruct.Pull = GPIO_PULLUP; // MM
97     GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
98     GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
99     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
100
101     /* Peripheral DMA init*/
102   
103     hdma_sdio_tx.Instance = DMA2_Stream3;
104     hdma_sdio_tx.Init.Channel = DMA_CHANNEL_4;
105     hdma_sdio_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
106     hdma_sdio_tx.Init.PeriphInc = DMA_PINC_DISABLE;
107     hdma_sdio_tx.Init.MemInc = DMA_MINC_ENABLE;
108     hdma_sdio_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
109     hdma_sdio_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
110     hdma_sdio_tx.Init.Mode = DMA_PFCTRL; // TODO MM. This is necessary or SDIO doesn't work
111     hdma_sdio_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH; // TODO MM Prevent underruns
112     hdma_sdio_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
113     hdma_sdio_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
114     hdma_sdio_tx.Init.MemBurst = DMA_MBURST_INC4;
115     hdma_sdio_tx.Init.PeriphBurst = DMA_PBURST_INC4;
116     HAL_DMA_Init(&hdma_sdio_tx);
117
118     __HAL_LINKDMA(hsd,hdmatx,hdma_sdio_tx);
119
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; // TODO MM. This is necessary or SDIO doesn't work
128     hdma_sdio_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; // TODO MM Prevent underruns
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     HAL_DMA_Init(&hdma_sdio_rx);
134
135     __HAL_LINKDMA(hsd,hdmarx,hdma_sdio_rx);
136
137     /* Peripheral interrupt init*/
138     HAL_NVIC_SetPriority(SDIO_IRQn, 0, 0);
139     HAL_NVIC_EnableIRQ(SDIO_IRQn);
140   /* USER CODE BEGIN SDIO_MspInit 1 */
141
142   /* USER CODE END SDIO_MspInit 1 */
143   }
144 }
145
146 void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd)
147 {
148
149   if(hsd->Instance==SDIO)
150   {
151   /* USER CODE BEGIN SDIO_MspDeInit 0 */
152
153   /* USER CODE END SDIO_MspDeInit 0 */
154     /* Peripheral clock disable */
155     __SDIO_CLK_DISABLE();
156   
157     /**SDIO GPIO Configuration    
158     PC8     ------> SDIO_D0
159     PC9     ------> SDIO_D1
160     PC10     ------> SDIO_D2
161     PC11     ------> SDIO_D3
162     PC12     ------> SDIO_CK
163     PD2     ------> SDIO_CMD 
164     */
165     HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
166                           |GPIO_PIN_12);
167
168     HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);
169
170     /* Peripheral DMA DeInit*/
171     HAL_DMA_DeInit(hsd->hdmatx);
172     HAL_DMA_DeInit(hsd->hdmarx);
173
174     /* Peripheral interrupt Deinit*/
175     HAL_NVIC_DisableIRQ(SDIO_IRQn);
176
177   }
178   /* USER CODE BEGIN SDIO_MspDeInit 1 */
179
180   /* USER CODE END SDIO_MspDeInit 1 */
181
182
183 /* USER CODE BEGIN 1 */
184
185 /* USER CODE END 1 */
186
187 /**
188   * @}
189   */
190
191 /**
192   * @}
193   */
194
195 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/