Mercurial > public > ostc4
comparison Common/Drivers/STM32F4xx_HAL_DRIVER_v120/Src/stm32f4xx_ll_sdmmc.c @ 38:5f11787b4f42
include in ostc4 repository
author | heinrichsweikamp |
---|---|
date | Sat, 28 Apr 2018 11:52:34 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
37:ccc45c0e1ea2 | 38:5f11787b4f42 |
---|---|
1 /** | |
2 ****************************************************************************** | |
3 * @file stm32f4xx_ll_sdmmc.c | |
4 * @author MCD Application Team | |
5 * @version V1.2.0 | |
6 * @date 26-December-2014 | |
7 * @brief SDMMC Low Layer HAL module driver. | |
8 * | |
9 * This file provides firmware functions to manage the following | |
10 * functionalities of the SDMMC peripheral: | |
11 * + Initialization/de-initialization functions | |
12 * + I/O operation functions | |
13 * + Peripheral Control functions | |
14 * + Peripheral State functions | |
15 * | |
16 @verbatim | |
17 ============================================================================== | |
18 ##### SDMMC peripheral features ##### | |
19 ============================================================================== | |
20 [..] The SD/SDIO MMC card host interface (SDIO) provides an interface between the APB2 | |
21 peripheral bus and MultiMedia cards (MMCs), SD memory cards, SDIO cards and CE-ATA | |
22 devices. | |
23 | |
24 [..] The SDIO features include the following: | |
25 (+) Full compliance with MultiMedia Card System Specification Version 4.2. Card support | |
26 for three different databus modes: 1-bit (default), 4-bit and 8-bit | |
27 (+) Full compatibility with previous versions of MultiMedia Cards (forward compatibility) | |
28 (+) Full compliance with SD Memory Card Specifications Version 2.0 | |
29 (+) Full compliance with SD I/O Card Specification Version 2.0: card support for two | |
30 different data bus modes: 1-bit (default) and 4-bit | |
31 (+) Full support of the CE-ATA features (full compliance with CE-ATA digital protocol | |
32 Rev1.1) | |
33 (+) Data transfer up to 48 MHz for the 8 bit mode | |
34 (+) Data and command output enable signals to control external bidirectional drivers. | |
35 | |
36 | |
37 ##### How to use this driver ##### | |
38 ============================================================================== | |
39 [..] | |
40 This driver is a considered as a driver of service for external devices drivers | |
41 that interfaces with the SDIO peripheral. | |
42 According to the device used (SD card/ MMC card / SDIO card ...), a set of APIs | |
43 is used in the device's driver to perform SDIO operations and functionalities. | |
44 | |
45 This driver is almost transparent for the final user, it is only used to implement other | |
46 functionalities of the external device. | |
47 | |
48 [..] | |
49 (+) The SDIO clock (SDIOCLK = 48 MHz) is coming from a specific output of PLL | |
50 (PLL48CLK). Before start working with SDIO peripheral make sure that the | |
51 PLL is well configured. | |
52 The SDIO peripheral uses two clock signals: | |
53 (++) SDIO adapter clock (SDIOCLK = 48 MHz) | |
54 (++) APB2 bus clock (PCLK2) | |
55 | |
56 -@@- PCLK2 and SDIO_CK clock frequencies must respect the following condition: | |
57 Frequency(PCLK2) >= (3 / 8 x Frequency(SDIO_CK)) | |
58 | |
59 (+) Enable/Disable peripheral clock using RCC peripheral macros related to SDIO | |
60 peripheral. | |
61 | |
62 (+) Enable the Power ON State using the SDIO_PowerState_ON(SDIOx) | |
63 function and disable it using the function SDIO_PowerState_OFF(SDIOx). | |
64 | |
65 (+) Enable/Disable the clock using the __SDIO_ENABLE()/__SDIO_DISABLE() macros. | |
66 | |
67 (+) Enable/Disable the peripheral interrupts using the macros __SDIO_ENABLE_IT(hsdio, IT) | |
68 and __SDIO_DISABLE_IT(hsdio, IT) if you need to use interrupt mode. | |
69 | |
70 (+) When using the DMA mode | |
71 (++) Configure the DMA in the MSP layer of the external device | |
72 (++) Active the needed channel Request | |
73 (++) Enable the DMA using __SDIO_DMA_ENABLE() macro or Disable it using the macro | |
74 __SDIO_DMA_DISABLE(). | |
75 | |
76 (+) To control the CPSM (Command Path State Machine) and send | |
77 commands to the card use the SDIO_SendCommand(SDIOx), | |
78 SDIO_GetCommandResponse() and SDIO_GetResponse() functions. First, user has | |
79 to fill the command structure (pointer to SDIO_CmdInitTypeDef) according | |
80 to the selected command to be sent. | |
81 The parameters that should be filled are: | |
82 (++) Command Argument | |
83 (++) Command Index | |
84 (++) Command Response type | |
85 (++) Command Wait | |
86 (++) CPSM Status (Enable or Disable). | |
87 | |
88 -@@- To check if the command is well received, read the SDIO_CMDRESP | |
89 register using the SDIO_GetCommandResponse(). | |
90 The SDIO responses registers (SDIO_RESP1 to SDIO_RESP2), use the | |
91 SDIO_GetResponse() function. | |
92 | |
93 (+) To control the DPSM (Data Path State Machine) and send/receive | |
94 data to/from the card use the SDIO_DataConfig(), SDIO_GetDataCounter(), | |
95 SDIO_ReadFIFO(), DIO_WriteFIFO() and SDIO_GetFIFOCount() functions. | |
96 | |
97 *** Read Operations *** | |
98 ======================= | |
99 [..] | |
100 (#) First, user has to fill the data structure (pointer to | |
101 SDIO_DataInitTypeDef) according to the selected data type to be received. | |
102 The parameters that should be filled are: | |
103 (++) Data Timeout | |
104 (++) Data Length | |
105 (++) Data Block size | |
106 (++) Data Transfer direction: should be from card (To SDIO) | |
107 (++) Data Transfer mode | |
108 (++) DPSM Status (Enable or Disable) | |
109 | |
110 (#) Configure the SDIO resources to receive the data from the card | |
111 according to selected transfer mode (Refer to Step 8, 9 and 10). | |
112 | |
113 (#) Send the selected Read command (refer to step 11). | |
114 | |
115 (#) Use the SDIO flags/interrupts to check the transfer status. | |
116 | |
117 *** Write Operations *** | |
118 ======================== | |
119 [..] | |
120 (#) First, user has to fill the data structure (pointer to | |
121 SDIO_DataInitTypeDef) according to the selected data type to be received. | |
122 The parameters that should be filled are: | |
123 (++) Data Timeout | |
124 (++) Data Length | |
125 (++) Data Block size | |
126 (++) Data Transfer direction: should be to card (To CARD) | |
127 (++) Data Transfer mode | |
128 (++) DPSM Status (Enable or Disable) | |
129 | |
130 (#) Configure the SDIO resources to send the data to the card according to | |
131 selected transfer mode. | |
132 | |
133 (#) Send the selected Write command. | |
134 | |
135 (#) Use the SDIO flags/interrupts to check the transfer status. | |
136 | |
137 @endverbatim | |
138 ****************************************************************************** | |
139 * @attention | |
140 * | |
141 * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> | |
142 * | |
143 * Redistribution and use in source and binary forms, with or without modification, | |
144 * are permitted provided that the following conditions are met: | |
145 * 1. Redistributions of source code must retain the above copyright notice, | |
146 * this list of conditions and the following disclaimer. | |
147 * 2. Redistributions in binary form must reproduce the above copyright notice, | |
148 * this list of conditions and the following disclaimer in the documentation | |
149 * and/or other materials provided with the distribution. | |
150 * 3. Neither the name of STMicroelectronics nor the names of its contributors | |
151 * may be used to endorse or promote products derived from this software | |
152 * without specific prior written permission. | |
153 * | |
154 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
155 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
156 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
157 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
158 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
159 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
160 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
161 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
162 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
163 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
164 * | |
165 ****************************************************************************** | |
166 */ | |
167 | |
168 /* Includes ------------------------------------------------------------------*/ | |
169 #include "stm32f4xx_hal.h" | |
170 | |
171 /** @addtogroup STM32F4xx_HAL_Driver | |
172 * @{ | |
173 */ | |
174 | |
175 /** @defgroup SDMMC_LL SDMMC Low Layer | |
176 * @brief Low layer module for SD and MMC driver | |
177 * @{ | |
178 */ | |
179 | |
180 #if defined (HAL_SD_MODULE_ENABLED) || defined(HAL_MMC_MODULE_ENABLED) | |
181 | |
182 /* Private typedef -----------------------------------------------------------*/ | |
183 /* Private define ------------------------------------------------------------*/ | |
184 /* Private macro -------------------------------------------------------------*/ | |
185 /* Private variables ---------------------------------------------------------*/ | |
186 /* Private function prototypes -----------------------------------------------*/ | |
187 /* Private functions ---------------------------------------------------------*/ | |
188 | |
189 /** @defgroup SDMMC_LL_Exported_Functions SDMMC_LL Exported Functions | |
190 * @{ | |
191 */ | |
192 | |
193 /** @defgroup HAL_SDMMC_LL_Group1 Initialization/de-initialization functions | |
194 * @brief Initialization and Configuration functions | |
195 * | |
196 @verbatim | |
197 =============================================================================== | |
198 ##### Initialization/de-initialization functions ##### | |
199 =============================================================================== | |
200 [..] This section provides functions allowing to: | |
201 | |
202 @endverbatim | |
203 * @{ | |
204 */ | |
205 | |
206 /** | |
207 * @brief Initializes the SDIO according to the specified | |
208 * parameters in the SDIO_InitTypeDef and create the associated handle. | |
209 * @param SDIOx: Pointer to SDIO register base | |
210 * @param Init: SDIO initialization structure | |
211 * @retval HAL status | |
212 */ | |
213 HAL_StatusTypeDef SDIO_Init(SDIO_TypeDef *SDIOx, SDIO_InitTypeDef Init) | |
214 { | |
215 uint32_t tmpreg = 0; | |
216 | |
217 /* Check the parameters */ | |
218 assert_param(IS_SDIO_ALL_INSTANCE(SDIOx)); | |
219 assert_param(IS_SDIO_CLOCK_EDGE(Init.ClockEdge)); | |
220 assert_param(IS_SDIO_CLOCK_BYPASS(Init.ClockBypass)); | |
221 assert_param(IS_SDIO_CLOCK_POWER_SAVE(Init.ClockPowerSave)); | |
222 assert_param(IS_SDIO_BUS_WIDE(Init.BusWide)); | |
223 assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(Init.HardwareFlowControl)); | |
224 assert_param(IS_SDIO_CLKDIV(Init.ClockDiv)); | |
225 | |
226 /* Set SDIO configuration parameters */ | |
227 tmpreg |= (Init.ClockEdge |\ | |
228 Init.ClockBypass |\ | |
229 Init.ClockPowerSave |\ | |
230 Init.BusWide |\ | |
231 Init.HardwareFlowControl |\ | |
232 Init.ClockDiv | |
233 ); | |
234 | |
235 /* Write to SDIO CLKCR */ | |
236 MODIFY_REG(SDIOx->CLKCR, CLKCR_CLEAR_MASK, tmpreg); | |
237 | |
238 return HAL_OK; | |
239 } | |
240 | |
241 /** | |
242 * @} | |
243 */ | |
244 | |
245 /** @defgroup HAL_SDMMC_LL_Group2 I/O operation functions | |
246 * @brief Data transfers functions | |
247 * | |
248 @verbatim | |
249 =============================================================================== | |
250 ##### I/O operation functions ##### | |
251 =============================================================================== | |
252 [..] | |
253 This subsection provides a set of functions allowing to manage the SDIO data | |
254 transfers. | |
255 | |
256 @endverbatim | |
257 * @{ | |
258 */ | |
259 | |
260 /** | |
261 * @brief Read data (word) from Rx FIFO in blocking mode (polling) | |
262 * @param SDIOx: Pointer to SDIO register base | |
263 * @retval HAL status | |
264 */ | |
265 uint32_t SDIO_ReadFIFO(SDIO_TypeDef *SDIOx) | |
266 { | |
267 /* Read data from Rx FIFO */ | |
268 return (SDIOx->FIFO); | |
269 } | |
270 | |
271 /** | |
272 * @brief Write data (word) to Tx FIFO in blocking mode (polling) | |
273 * @param SDIOx: Pointer to SDIO register base | |
274 * @param pWriteData: pointer to data to write | |
275 * @retval HAL status | |
276 */ | |
277 HAL_StatusTypeDef SDIO_WriteFIFO(SDIO_TypeDef *SDIOx, uint32_t *pWriteData) | |
278 { | |
279 /* Write data to FIFO */ | |
280 SDIOx->FIFO = *pWriteData; | |
281 | |
282 return HAL_OK; | |
283 } | |
284 | |
285 /** | |
286 * @} | |
287 */ | |
288 | |
289 /** @defgroup HAL_SDMMC_LL_Group3 Peripheral Control functions | |
290 * @brief management functions | |
291 * | |
292 @verbatim | |
293 =============================================================================== | |
294 ##### Peripheral Control functions ##### | |
295 =============================================================================== | |
296 [..] | |
297 This subsection provides a set of functions allowing to control the SDIO data | |
298 transfers. | |
299 | |
300 @endverbatim | |
301 * @{ | |
302 */ | |
303 | |
304 /** | |
305 * @brief Set SDIO Power state to ON. | |
306 * @param SDIOx: Pointer to SDIO register base | |
307 * @retval HAL status | |
308 */ | |
309 HAL_StatusTypeDef SDIO_PowerState_ON(SDIO_TypeDef *SDIOx) | |
310 { | |
311 /* Set power state to ON */ | |
312 SDIOx->POWER = SDIO_POWER_PWRCTRL; | |
313 | |
314 return HAL_OK; | |
315 } | |
316 | |
317 /** | |
318 * @brief Set SDIO Power state to OFF. | |
319 * @param SDIOx: Pointer to SDIO register base | |
320 * @retval HAL status | |
321 */ | |
322 HAL_StatusTypeDef SDIO_PowerState_OFF(SDIO_TypeDef *SDIOx) | |
323 { | |
324 /* Set power state to OFF */ | |
325 SDIOx->POWER = (uint32_t)0x00000000; | |
326 | |
327 return HAL_OK; | |
328 } | |
329 | |
330 /** | |
331 * @brief Get SDIO Power state. | |
332 * @param SDIOx: Pointer to SDIO register base | |
333 * @retval Power status of the controller. The returned value can be one of the | |
334 * following values: | |
335 * - 0x00: Power OFF | |
336 * - 0x02: Power UP | |
337 * - 0x03: Power ON | |
338 */ | |
339 uint32_t SDIO_GetPowerState(SDIO_TypeDef *SDIOx) | |
340 { | |
341 return (SDIOx->POWER & SDIO_POWER_PWRCTRL); | |
342 } | |
343 | |
344 /** | |
345 * @brief Configure the SDIO command path according to the specified parameters in | |
346 * SDIO_CmdInitTypeDef structure and send the command | |
347 * @param SDIOx: Pointer to SDIO register base | |
348 * @param SDIO_CmdInitStruct: pointer to a SDIO_CmdInitTypeDef structure that contains | |
349 * the configuration information for the SDIO command | |
350 * @retval HAL status | |
351 */ | |
352 HAL_StatusTypeDef SDIO_SendCommand(SDIO_TypeDef *SDIOx, SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) | |
353 { | |
354 uint32_t tmpreg = 0; | |
355 | |
356 /* Check the parameters */ | |
357 assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->CmdIndex)); | |
358 assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->Response)); | |
359 assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->WaitForInterrupt)); | |
360 assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->CPSM)); | |
361 | |
362 /* Set the SDIO Argument value */ | |
363 SDIOx->ARG = SDIO_CmdInitStruct->Argument; | |
364 | |
365 /* Set SDIO command parameters */ | |
366 tmpreg |= (uint32_t)(SDIO_CmdInitStruct->CmdIndex |\ | |
367 SDIO_CmdInitStruct->Response |\ | |
368 SDIO_CmdInitStruct->WaitForInterrupt |\ | |
369 SDIO_CmdInitStruct->CPSM); | |
370 | |
371 /* Write to SDIO CMD register */ | |
372 MODIFY_REG(SDIOx->CMD, CMD_CLEAR_MASK, tmpreg); | |
373 | |
374 return HAL_OK; | |
375 } | |
376 | |
377 /** | |
378 * @brief Return the command index of last command for which response received | |
379 * @param SDIOx: Pointer to SDIO register base | |
380 * @retval Command index of the last command response received | |
381 */ | |
382 uint8_t SDIO_GetCommandResponse(SDIO_TypeDef *SDIOx) | |
383 { | |
384 return (uint8_t)(SDIOx->RESPCMD); | |
385 } | |
386 | |
387 | |
388 /** | |
389 * @brief Return the response received from the card for the last command | |
390 * @param SDIO_RESP: Specifies the SDIO response register. | |
391 * This parameter can be one of the following values: | |
392 * @arg SDIO_RESP1: Response Register 1 | |
393 * @arg SDIO_RESP2: Response Register 2 | |
394 * @arg SDIO_RESP3: Response Register 3 | |
395 * @arg SDIO_RESP4: Response Register 4 | |
396 * @retval The Corresponding response register value | |
397 */ | |
398 uint32_t SDIO_GetResponse(uint32_t SDIO_RESP) | |
399 { | |
400 __IO uint32_t tmp = 0; | |
401 | |
402 /* Check the parameters */ | |
403 assert_param(IS_SDIO_RESP(SDIO_RESP)); | |
404 | |
405 /* Get the response */ | |
406 tmp = SDIO_RESP_ADDR + SDIO_RESP; | |
407 | |
408 return (*(__IO uint32_t *) tmp); | |
409 } | |
410 | |
411 /** | |
412 * @brief Configure the SDIO data path according to the specified | |
413 * parameters in the SDIO_DataInitTypeDef. | |
414 * @param SDIOx: Pointer to SDIO register base | |
415 * @param SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef structure | |
416 * that contains the configuration information for the SDIO command. | |
417 * @retval HAL status | |
418 */ | |
419 HAL_StatusTypeDef SDIO_DataConfig(SDIO_TypeDef *SDIOx, SDIO_DataInitTypeDef* SDIO_DataInitStruct) | |
420 { | |
421 uint32_t tmpreg = 0; | |
422 | |
423 /* Check the parameters */ | |
424 assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->DataLength)); | |
425 assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->DataBlockSize)); | |
426 assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->TransferDir)); | |
427 assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->TransferMode)); | |
428 assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->DPSM)); | |
429 | |
430 /* Set the SDIO Data Timeout value */ | |
431 SDIOx->DTIMER = SDIO_DataInitStruct->DataTimeOut; | |
432 | |
433 /* Set the SDIO DataLength value */ | |
434 SDIOx->DLEN = SDIO_DataInitStruct->DataLength; | |
435 | |
436 /* Set the SDIO data configuration parameters */ | |
437 tmpreg |= (uint32_t)(SDIO_DataInitStruct->DataBlockSize |\ | |
438 SDIO_DataInitStruct->TransferDir |\ | |
439 SDIO_DataInitStruct->TransferMode |\ | |
440 SDIO_DataInitStruct->DPSM); | |
441 | |
442 /* Write to SDIO DCTRL */ | |
443 MODIFY_REG(SDIOx->DCTRL, DCTRL_CLEAR_MASK, tmpreg); | |
444 | |
445 return HAL_OK; | |
446 | |
447 } | |
448 | |
449 /** | |
450 * @brief Returns number of remaining data bytes to be transferred. | |
451 * @param SDIOx: Pointer to SDIO register base | |
452 * @retval Number of remaining data bytes to be transferred | |
453 */ | |
454 uint32_t SDIO_GetDataCounter(SDIO_TypeDef *SDIOx) | |
455 { | |
456 return (SDIOx->DCOUNT); | |
457 } | |
458 | |
459 /** | |
460 * @brief Get the FIFO data | |
461 * @param SDIOx: Pointer to SDIO register base | |
462 * @retval Data received | |
463 */ | |
464 uint32_t SDIO_GetFIFOCount(SDIO_TypeDef *SDIOx) | |
465 { | |
466 return (SDIOx->FIFO); | |
467 } | |
468 | |
469 | |
470 /** | |
471 * @brief Sets one of the two options of inserting read wait interval. | |
472 * @param SDIO_ReadWaitMode: SD I/O Read Wait operation mode. | |
473 * This parameter can be: | |
474 * @arg SDIO_READ_WAIT_MODE_CLK: Read Wait control by stopping SDIOCLK | |
475 * @arg SDIO_READ_WAIT_MODE_DATA2: Read Wait control using SDIO_DATA2 | |
476 * @retval None | |
477 */ | |
478 HAL_StatusTypeDef SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode) | |
479 { | |
480 /* Check the parameters */ | |
481 assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode)); | |
482 | |
483 *(__IO uint32_t *)DCTRL_RWMOD_BB = SDIO_ReadWaitMode; | |
484 | |
485 return HAL_OK; | |
486 } | |
487 | |
488 /** | |
489 * @} | |
490 */ | |
491 | |
492 /** | |
493 * @} | |
494 */ | |
495 | |
496 #endif /* (HAL_SD_MODULE_ENABLED) || (HAL_MMC_MODULE_ENABLED) */ | |
497 /** | |
498 * @} | |
499 */ | |
500 | |
501 /** | |
502 * @} | |
503 */ | |
504 | |
505 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |