]> git.sur5r.net Git - freertos/blob - Demo/Common/drivers/ST/STM32F10xFWLib/src/stm32f10x_sdio.c
Add new STM32 driver files.
[freertos] / Demo / Common / drivers / ST / STM32F10xFWLib / src / stm32f10x_sdio.c
1 /**\r
2   ******************************************************************************\r
3   * @file  stm32f10x_sdio.c\r
4   * @author  MCD Application Team\r
5   * @version  V3.0.0\r
6   * @date  04/06/2009\r
7   * @brief  This file provides all the SDIO firmware functions.\r
8   ******************************************************************************\r
9   * @copy\r
10   *\r
11   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
12   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
13   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
14   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
15   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
16   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
17   *\r
18   * <h2><center>&copy; COPYRIGHT 2009 STMicroelectronics</center></h2>\r
19   */ \r
20 \r
21 /* Includes ------------------------------------------------------------------*/\r
22 #include "stm32f10x_sdio.h"\r
23 #include "stm32f10x_rcc.h"\r
24 \r
25 /** @addtogroup StdPeriph_Driver\r
26   * @{\r
27   */\r
28 \r
29 /** @defgroup SDIO \r
30   * @brief SDIO driver modules\r
31   * @{\r
32   */ \r
33 \r
34 /** @defgroup SDIO_Private_TypesDefinitions\r
35   * @{\r
36   */ \r
37 \r
38 /* ------------ SDIO registers bit address in the alias region ----------- */\r
39 #define SDIO_OFFSET                (SDIO_BASE - PERIPH_BASE)\r
40 \r
41 /* --- CLKCR Register ---*/\r
42 \r
43 /* Alias word address of CLKEN bit */\r
44 #define CLKCR_OFFSET              (SDIO_OFFSET + 0x04)\r
45 #define CLKEN_BitNumber           0x08\r
46 #define CLKCR_CLKEN_BB            (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BitNumber * 4))\r
47 \r
48 /* --- CMD Register ---*/\r
49 \r
50 /* Alias word address of SDIOSUSPEND bit */\r
51 #define CMD_OFFSET                (SDIO_OFFSET + 0x0C)\r
52 #define SDIOSUSPEND_BitNumber     0x0B\r
53 #define CMD_SDIOSUSPEND_BB        (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSUSPEND_BitNumber * 4))\r
54 \r
55 /* Alias word address of ENCMDCOMPL bit */\r
56 #define ENCMDCOMPL_BitNumber      0x0C\r
57 #define CMD_ENCMDCOMPL_BB         (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ENCMDCOMPL_BitNumber * 4))\r
58 \r
59 /* Alias word address of NIEN bit */\r
60 #define NIEN_BitNumber            0x0D\r
61 #define CMD_NIEN_BB               (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (NIEN_BitNumber * 4))\r
62 \r
63 /* Alias word address of ATACMD bit */\r
64 #define ATACMD_BitNumber          0x0E\r
65 #define CMD_ATACMD_BB             (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4))\r
66 \r
67 /* --- DCTRL Register ---*/\r
68 \r
69 /* Alias word address of DMAEN bit */\r
70 #define DCTRL_OFFSET              (SDIO_OFFSET + 0x2C)\r
71 #define DMAEN_BitNumber           0x03\r
72 #define DCTRL_DMAEN_BB            (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4))\r
73 \r
74 /* Alias word address of RWSTART bit */\r
75 #define RWSTART_BitNumber         0x08\r
76 #define DCTRL_RWSTART_BB          (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTART_BitNumber * 4))\r
77 \r
78 /* Alias word address of RWSTOP bit */\r
79 #define RWSTOP_BitNumber          0x09\r
80 #define DCTRL_RWSTOP_BB           (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4))\r
81 \r
82 /* Alias word address of RWMOD bit */\r
83 #define RWMOD_BitNumber           0x0A\r
84 #define DCTRL_RWMOD_BB            (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWMOD_BitNumber * 4))\r
85 \r
86 /* Alias word address of SDIOEN bit */\r
87 #define SDIOEN_BitNumber          0x0B\r
88 #define DCTRL_SDIOEN_BB           (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOEN_BitNumber * 4))\r
89 \r
90 /* ---------------------- SDIO registers bit mask ------------------------ */\r
91 \r
92 /* --- CLKCR Register ---*/\r
93 \r
94 /* CLKCR register clear mask */\r
95 #define CLKCR_CLEAR_MASK         ((uint32_t)0xFFFF8100) \r
96 \r
97 /* --- PWRCTRL Register ---*/\r
98 \r
99 /* SDIO PWRCTRL Mask */\r
100 #define PWR_PWRCTRL_MASK         ((uint32_t)0xFFFFFFFC)\r
101 \r
102 /* --- DCTRL Register ---*/\r
103 \r
104 /* SDIO DCTRL Clear Mask */\r
105 #define DCTRL_CLEAR_MASK         ((uint32_t)0xFFFFFF08)\r
106 \r
107 /* --- CMD Register ---*/\r
108 \r
109 /* CMD Register clear mask */\r
110 #define CMD_CLEAR_MASK           ((uint32_t)0xFFFFF800)\r
111 \r
112 /* SDIO RESP Registers Address */\r
113 #define SDIO_RESP_ADDR           ((uint32_t)(SDIO_BASE + 0x14))\r
114 \r
115 /**\r
116   * @}\r
117   */\r
118 \r
119 /** @defgroup SDIO_Private_Defines\r
120   * @{\r
121   */\r
122 \r
123 /**\r
124   * @}\r
125   */\r
126 \r
127 /** @defgroup SDIO_Private_Macros\r
128   * @{\r
129   */\r
130 \r
131 /**\r
132   * @}\r
133   */\r
134 \r
135 /** @defgroup SDIO_Private_Variables\r
136   * @{\r
137   */\r
138 \r
139 /**\r
140   * @}\r
141   */\r
142 \r
143 /** @defgroup SDIO_Private_FunctionPrototypes\r
144   * @{\r
145   */\r
146 \r
147 /**\r
148   * @}\r
149   */\r
150 \r
151 /** @defgroup SDIO_Private_Functions\r
152   * @{\r
153   */\r
154 \r
155 /**\r
156   * @brief  Deinitializes the SDIO peripheral registers to their default\r
157   *   reset values.\r
158   * @param  None\r
159   * @retval : None\r
160   */\r
161 void SDIO_DeInit(void)\r
162 {\r
163   SDIO->POWER = 0x00000000;\r
164   SDIO->CLKCR = 0x00000000;\r
165   SDIO->ARG = 0x00000000;\r
166   SDIO->CMD = 0x00000000;\r
167   SDIO->DTIMER = 0x00000000;\r
168   SDIO->DLEN = 0x00000000;\r
169   SDIO->DCTRL = 0x00000000;\r
170   SDIO->ICR = 0x00C007FF;\r
171   SDIO->MASK = 0x00000000;\r
172 }\r
173 \r
174 /**\r
175   * @brief  Initializes the SDIO peripheral according to the specified \r
176   *   parameters in the SDIO_InitStruct.\r
177   * @param SDIO_InitStruct : pointer to a SDIO_InitTypeDef structure \r
178   *   that contains the configuration information for the SDIO \r
179   *   peripheral.\r
180   * @retval : None\r
181   */\r
182 void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct)\r
183 {\r
184   uint32_t tmpreg = 0;\r
185     \r
186   /* Check the parameters */\r
187   assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge));\r
188   assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass));\r
189   assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave));\r
190   assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide));\r
191   assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl)); \r
192    \r
193 /*---------------------------- SDIO CLKCR Configuration ------------------------*/  \r
194   /* Get the SDIO CLKCR value */\r
195   tmpreg = SDIO->CLKCR;\r
196   \r
197   /* Clear CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN bits */\r
198   tmpreg &= CLKCR_CLEAR_MASK;\r
199   \r
200   /* Set CLKDIV bits according to SDIO_ClockDiv value */\r
201   /* Set PWRSAV bit according to SDIO_ClockPowerSave value */\r
202   /* Set BYPASS bit according to SDIO_ClockBypass value */\r
203   /* Set WIDBUS bits according to SDIO_BusWide value */\r
204   /* Set NEGEDGE bits according to SDIO_ClockEdge value */\r
205   /* Set HWFC_EN bits according to SDIO_HardwareFlowControl value */\r
206   tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv  | SDIO_InitStruct->SDIO_ClockPowerSave |\r
207              SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide |\r
208              SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl); \r
209   \r
210   /* Write to SDIO CLKCR */\r
211   SDIO->CLKCR = tmpreg;\r
212 }\r
213 \r
214 /**\r
215   * @brief  Fills each SDIO_InitStruct member with its default value.\r
216   * @param SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which \r
217   *   will be initialized.\r
218   * @retval : None\r
219   */\r
220 void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct)\r
221 {\r
222   /* SDIO_InitStruct members default value */\r
223   SDIO_InitStruct->SDIO_ClockDiv = 0x00;\r
224   SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising;\r
225   SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable;\r
226   SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;\r
227   SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b;\r
228   SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;\r
229 }\r
230 \r
231 /**\r
232   * @brief  Enables or disables the SDIO Clock.\r
233   * @param NewState: new state of the SDIO Clock.\r
234   *   This parameter can be: ENABLE or DISABLE.\r
235   * @retval : None\r
236   */\r
237 void SDIO_ClockCmd(FunctionalState NewState)\r
238 {\r
239   /* Check the parameters */\r
240   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
241   \r
242   *(__IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState;\r
243 }\r
244 \r
245 /**\r
246   * @brief  Sets the power status of the controller.\r
247   * @param SDIO_PowerState: new state of the Power state. \r
248   *   This parameter can be one of the following values:\r
249   * @arg SDIO_PowerState_OFF\r
250   * @arg SDIO_PowerState_ON\r
251   * @retval : None\r
252   */\r
253 void SDIO_SetPowerState(uint32_t SDIO_PowerState)\r
254 {\r
255   /* Check the parameters */\r
256   assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState));\r
257   \r
258   SDIO->POWER &= PWR_PWRCTRL_MASK;\r
259   SDIO->POWER |= SDIO_PowerState;\r
260 }\r
261 \r
262 /**\r
263   * @brief  Gets the power status of the controller.\r
264   * @param  None\r
265   * @retval : Power status of the controller. The returned value can\r
266   *   be one of the following:\r
267   * - 0x00: Power OFF\r
268   * - 0x02: Power UP\r
269   * - 0x03: Power ON \r
270   */\r
271 uint32_t SDIO_GetPowerState(void)\r
272 {\r
273   return (SDIO->POWER & (~PWR_PWRCTRL_MASK));\r
274 }\r
275 \r
276 /**\r
277   * @brief  Enables or disables the SDIO interrupts.\r
278   * @param SDIO_IT: specifies the SDIO interrupt sources to be \r
279   *   enabled or disabled.\r
280   *   This parameter can be one or a combination of the following values:\r
281   * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt\r
282   * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt\r
283   * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt\r
284   * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt\r
285   * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt\r
286   * @arg SDIO_IT_RXOVERR:  Received FIFO overrun error interrupt\r
287   * @arg SDIO_IT_CMDREND:  Command response received (CRC check passed) interrupt\r
288   * @arg SDIO_IT_CMDSENT:  Command sent (no response required) interrupt\r
289   * @arg SDIO_IT_DATAEND:  Data end (data counter, SDIDCOUNT, is zero) interrupt\r
290   * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide \r
291   *                        bus mode interrupt\r
292   * @arg SDIO_IT_DBCKEND:  Data block sent/received (CRC check passed) interrupt\r
293   * @arg SDIO_IT_CMDACT:   Command transfer in progress interrupt\r
294   * @arg SDIO_IT_TXACT:    Data transmit in progress interrupt\r
295   * @arg SDIO_IT_RXACT:    Data receive in progress interrupt\r
296   * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt\r
297   * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt\r
298   * @arg SDIO_IT_TXFIFOF:  Transmit FIFO full interrupt\r
299   * @arg SDIO_IT_RXFIFOF:  Receive FIFO full interrupt\r
300   * @arg SDIO_IT_TXFIFOE:  Transmit FIFO empty interrupt\r
301   * @arg SDIO_IT_RXFIFOE:  Receive FIFO empty interrupt\r
302   * @arg SDIO_IT_TXDAVL:   Data available in transmit FIFO interrupt\r
303   * @arg SDIO_IT_RXDAVL:   Data available in receive FIFO interrupt\r
304   * @arg SDIO_IT_SDIOIT:   SD I/O interrupt received interrupt\r
305   * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 \r
306   *                        interrupt\r
307   * @param NewState: new state of the specified SDIO interrupts.\r
308   *   This parameter can be: ENABLE or DISABLE.\r
309   * @retval : None \r
310   */\r
311 void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState)\r
312 {\r
313   /* Check the parameters */\r
314   assert_param(IS_SDIO_IT(SDIO_IT));\r
315   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
316   \r
317   if (NewState != DISABLE)\r
318   {\r
319     /* Enable the SDIO interrupts */\r
320     SDIO->MASK |= SDIO_IT;\r
321   }\r
322   else\r
323   {\r
324     /* Disable the SDIO interrupts */\r
325     SDIO->MASK &= ~SDIO_IT;\r
326   } \r
327 }\r
328 \r
329 /**\r
330   * @brief  Enables or disables the SDIO DMA request.\r
331   * @param NewState: new state of the selected SDIO DMA request.\r
332   *   This parameter can be: ENABLE or DISABLE.\r
333   * @retval : None\r
334   */\r
335 void SDIO_DMACmd(FunctionalState NewState)\r
336 {\r
337   /* Check the parameters */\r
338   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
339   \r
340   *(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)NewState;\r
341 }\r
342 \r
343 /**\r
344   * @brief  Initializes the SDIO Command according to the specified \r
345   *   parameters in the SDIO_CmdInitStruct and send the command.\r
346   * @param SDIO_CmdInitStruct : pointer to a SDIO_CmdInitTypeDef \r
347   *   structure that contains the configuration information \r
348   *   for the SDIO command.\r
349   * @retval : None\r
350   */\r
351 void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct)\r
352 {\r
353   uint32_t tmpreg = 0;\r
354   \r
355   /* Check the parameters */\r
356   assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex));\r
357   assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response));\r
358   assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait));\r
359   assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM));\r
360   \r
361 /*---------------------------- SDIO ARG Configuration ------------------------*/\r
362   /* Set the SDIO Argument value */\r
363   SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument;\r
364   \r
365 /*---------------------------- SDIO CMD Configuration ------------------------*/  \r
366   /* Get the SDIO CMD value */\r
367   tmpreg = SDIO->CMD;\r
368   /* Clear CMDINDEX, WAITRESP, WAITINT, WAITPEND, CPSMEN bits */\r
369   tmpreg &= CMD_CLEAR_MASK;\r
370   /* Set CMDINDEX bits according to SDIO_CmdIndex value */\r
371   /* Set WAITRESP bits according to SDIO_Response value */\r
372   /* Set WAITINT and WAITPEND bits according to SDIO_Wait value */\r
373   /* Set CPSMEN bits according to SDIO_CPSM value */\r
374   tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response\r
375            | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM;\r
376   \r
377   /* Write to SDIO CMD */\r
378   SDIO->CMD = tmpreg;\r
379 }\r
380 \r
381 /**\r
382   * @brief  Fills each SDIO_CmdInitStruct member with its default value.\r
383   * @param SDIO_CmdInitStruct: pointer to an SDIO_CmdInitTypeDef \r
384   *   structure which will be initialized.\r
385   * @retval : None\r
386   */\r
387 void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct)\r
388 {\r
389   /* SDIO_CmdInitStruct members default value */\r
390   SDIO_CmdInitStruct->SDIO_Argument = 0x00;\r
391   SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00;\r
392   SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No;\r
393   SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No;\r
394   SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable;\r
395 }\r
396 \r
397 /**\r
398   * @brief  Returns command index of last command for which response \r
399   *   received.\r
400   * @param  None\r
401   * @retval : Returns the command index of the last command response received.\r
402   */\r
403 uint8_t SDIO_GetCommandResponse(void)\r
404 {\r
405   return (uint8_t)(SDIO->RESPCMD);\r
406 }\r
407 \r
408 /**\r
409   * @brief  Returns response received from the card for the last command.\r
410   * @param SDIO_RESP: Specifies the SDIO response register. \r
411   *   This parameter can be one of the following values:\r
412   * @arg SDIO_RESP1: Response Register 1\r
413   * @arg SDIO_RESP2: Response Register 2\r
414   * @arg SDIO_RESP3: Response Register 3\r
415   * @arg SDIO_RESP4: Response Register 4\r
416   * @retval : The Corresponding response register value.\r
417   */\r
418 uint32_t SDIO_GetResponse(uint32_t SDIO_RESP)\r
419 {\r
420   /* Check the parameters */\r
421   assert_param(IS_SDIO_RESP(SDIO_RESP));\r
422   \r
423   return (*(__IO uint32_t *)(SDIO_RESP_ADDR + SDIO_RESP)); \r
424 }\r
425 \r
426 /**\r
427   * @brief  Initializes the SDIO data path according to the specified \r
428   *   parameters in the SDIO_DataInitStruct.\r
429   * @param SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef \r
430   *   structure that contains the configuration information \r
431   *   for the SDIO command.\r
432   * @retval : None\r
433   */\r
434 void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct)\r
435 {\r
436   uint32_t tmpreg = 0;\r
437   \r
438   /* Check the parameters */\r
439   assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength));\r
440   assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSize));\r
441   assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferDir));\r
442   assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_TransferMode));\r
443   assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM));\r
444 \r
445 /*---------------------------- SDIO DTIMER Configuration ---------------------*/\r
446   /* Set the SDIO Data TimeOut value */\r
447   SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut;\r
448 \r
449 /*---------------------------- SDIO DLEN Configuration -----------------------*/\r
450   /* Set the SDIO DataLength value */\r
451   SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength;\r
452 \r
453 /*---------------------------- SDIO DCTRL Configuration ----------------------*/  \r
454   /* Get the SDIO DCTRL value */\r
455   tmpreg = SDIO->DCTRL;\r
456   /* Clear DEN, DTMODE, DTDIR and DBCKSIZE bits */\r
457   tmpreg &= DCTRL_CLEAR_MASK;\r
458   /* Set DEN bit according to SDIO_DPSM value */\r
459   /* Set DTMODE bit according to SDIO_TransferMode value */\r
460   /* Set DTDIR bit according to SDIO_TransferDir value */\r
461   /* Set DBCKSIZE bits according to SDIO_DataBlockSize value */\r
462   tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir\r
463            | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM;\r
464 \r
465   /* Write to SDIO DCTRL */\r
466   SDIO->DCTRL = tmpreg;\r
467 }\r
468 \r
469 /**\r
470   * @brief  Fills each SDIO_DataInitStruct member with its default value.\r
471   * @param SDIO_DataInitStruct: pointer to an SDIO_DataInitTypeDef \r
472   *   structure which will be initialized.\r
473   * @retval : None\r
474   */\r
475 void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct)\r
476 {\r
477   /* SDIO_DataInitStruct members default value */\r
478   SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF;\r
479   SDIO_DataInitStruct->SDIO_DataLength = 0x00;\r
480   SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b;\r
481   SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard;\r
482   SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block;  \r
483   SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable;\r
484 }\r
485 \r
486 /**\r
487   * @brief  Returns number of remaining data bytes to be transferred.\r
488   * @param  None\r
489   * @retval : Number of remaining data bytes to be transferred\r
490   */\r
491 uint32_t SDIO_GetDataCounter(void)\r
492\r
493   return SDIO->DCOUNT;\r
494 }\r
495 \r
496 /**\r
497   * @brief  Read one data word from Rx FIFO.\r
498   * @param  None\r
499   * @retval : Data received\r
500   */\r
501 uint32_t SDIO_ReadData(void)\r
502\r
503   return SDIO->FIFO;\r
504 }\r
505 \r
506 /**\r
507   * @brief  Write one data word to Tx FIFO.\r
508   * @param Data: 32-bit data word to write.\r
509   * @retval : None\r
510   */\r
511 void SDIO_WriteData(uint32_t Data)\r
512\r
513   SDIO->FIFO = Data;\r
514 }\r
515 \r
516 /**\r
517   * @brief  Returns the number of words left to be written to or read\r
518   *   from FIFO.        \r
519   * @param  None\r
520   * @retval : Remaining number of words.\r
521   */\r
522 uint32_t SDIO_GetFIFOCount(void)\r
523\r
524   return SDIO->FIFOCNT;\r
525 }\r
526 \r
527 /**\r
528   * @brief  Starts the SD I/O Read Wait operation.      \r
529   * @param NewState: new state of the Start SDIO Read Wait operation. \r
530   *   This parameter can be: ENABLE or DISABLE.\r
531   * @retval : None\r
532   */\r
533 void SDIO_StartSDIOReadWait(FunctionalState NewState)\r
534\r
535   /* Check the parameters */\r
536   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
537   \r
538   *(__IO uint32_t *) DCTRL_RWSTART_BB = (uint32_t) NewState;\r
539 }\r
540 \r
541 /**\r
542   * @brief  Stops the SD I/O Read Wait operation.       \r
543   * @param NewState: new state of the Stop SDIO Read Wait operation. \r
544   *   This parameter can be: ENABLE or DISABLE.\r
545   * @retval : None\r
546   */\r
547 void SDIO_StopSDIOReadWait(FunctionalState NewState)\r
548\r
549   /* Check the parameters */\r
550   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
551   \r
552   *(__IO uint32_t *) DCTRL_RWSTOP_BB = (uint32_t) NewState;\r
553 }\r
554 \r
555 /**\r
556   * @brief  Sets one of the two options of inserting read wait interval.\r
557   * @param SDIO_ReadWaitMode: SD I/O Read Wait operation mode.\r
558   *   This parametre can be:\r
559   * @arg SDIO_ReadWaitMode_CLK: Read Wait control by stopping SDIOCLK\r
560   * @arg SDIO_ReadWaitMode_DATA2: Read Wait control using SDIO_DATA2\r
561   * @retval : None\r
562   */\r
563 void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode)\r
564 {\r
565   /* Check the parameters */\r
566   assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode));\r
567   \r
568   *(__IO uint32_t *) DCTRL_RWMOD_BB = SDIO_ReadWaitMode;\r
569 }\r
570 \r
571 /**\r
572   * @brief  Enables or disables the SD I/O Mode Operation.\r
573   * @param NewState: new state of SDIO specific operation. \r
574   *   This parameter can be: ENABLE or DISABLE.\r
575   * @retval : None\r
576   */\r
577 void SDIO_SetSDIOOperation(FunctionalState NewState)\r
578\r
579   /* Check the parameters */\r
580   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
581   \r
582   *(__IO uint32_t *) DCTRL_SDIOEN_BB = (uint32_t)NewState;\r
583 }\r
584 \r
585 /**\r
586   * @brief  Enables or disables the SD I/O Mode suspend command sending.\r
587   * @param NewState: new state of the SD I/O Mode suspend command.\r
588   *   This parameter can be: ENABLE or DISABLE.\r
589   * @retval : None\r
590   */\r
591 void SDIO_SendSDIOSuspendCmd(FunctionalState NewState)\r
592\r
593   /* Check the parameters */\r
594   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
595   \r
596   *(__IO uint32_t *) CMD_SDIOSUSPEND_BB = (uint32_t)NewState;\r
597 }\r
598 \r
599 /**\r
600   * @brief  Enables or disables the command completion signal.\r
601   * @param NewState: new state of command completion signal. \r
602   *   This parameter can be: ENABLE or DISABLE.\r
603   * @retval : None\r
604   */\r
605 void SDIO_CommandCompletionCmd(FunctionalState NewState)\r
606\r
607   /* Check the parameters */\r
608   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
609   \r
610   *(__IO uint32_t *) CMD_ENCMDCOMPL_BB = (uint32_t)NewState;\r
611 }\r
612 \r
613 /**\r
614   * @brief  Enables or disables the CE-ATA interrupt.\r
615   * @param NewState: new state of CE-ATA interrupt. \r
616   *   This parameter can be: ENABLE or DISABLE.\r
617   * @retval : None\r
618   */\r
619 void SDIO_CEATAITCmd(FunctionalState NewState)\r
620\r
621   /* Check the parameters */\r
622   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
623   \r
624   *(__IO uint32_t *) CMD_NIEN_BB = (uint32_t)((~((uint32_t)NewState)) & ((uint32_t)0x1));\r
625 }\r
626 \r
627 /**\r
628   * @brief  Sends CE-ATA command (CMD61).\r
629   * @param NewState: new state of CE-ATA command. \r
630   *   This parameter can be: ENABLE or DISABLE.\r
631   * @retval : None\r
632   */\r
633 void SDIO_SendCEATACmd(FunctionalState NewState)\r
634\r
635   /* Check the parameters */\r
636   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
637   \r
638   *(__IO uint32_t *) CMD_ATACMD_BB = (uint32_t)NewState;\r
639 }\r
640 \r
641 /**\r
642   * @brief  Checks whether the specified SDIO flag is set or not.\r
643   * @param SDIO_FLAG: specifies the flag to check. \r
644   *   This parameter can be one of the following values:\r
645   * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed)\r
646   * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed)\r
647   * @arg SDIO_FLAG_CTIMEOUT: Command response timeout\r
648   * @arg SDIO_FLAG_DTIMEOUT: Data timeout\r
649   * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error\r
650   * @arg SDIO_FLAG_RXOVERR:  Received FIFO overrun error\r
651   * @arg SDIO_FLAG_CMDREND:  Command response received (CRC check passed)\r
652   * @arg SDIO_FLAG_CMDSENT:  Command sent (no response required)\r
653   * @arg SDIO_FLAG_DATAEND:  Data end (data counter, SDIDCOUNT, is zero)\r
654   * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide \r
655   *                          bus mode.\r
656   * @arg SDIO_FLAG_DBCKEND:  Data block sent/received (CRC check passed)\r
657   * @arg SDIO_FLAG_CMDACT:   Command transfer in progress\r
658   * @arg SDIO_FLAG_TXACT:    Data transmit in progress\r
659   * @arg SDIO_FLAG_RXACT:    Data receive in progress\r
660   * @arg SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty\r
661   * @arg SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full\r
662   * @arg SDIO_FLAG_TXFIFOF:  Transmit FIFO full\r
663   * @arg SDIO_FLAG_RXFIFOF:  Receive FIFO full\r
664   * @arg SDIO_FLAG_TXFIFOE:  Transmit FIFO empty\r
665   * @arg SDIO_FLAG_RXFIFOE:  Receive FIFO empty\r
666   * @arg SDIO_FLAG_TXDAVL:   Data available in transmit FIFO\r
667   * @arg SDIO_FLAG_RXDAVL:   Data available in receive FIFO\r
668   * @arg SDIO_FLAG_SDIOIT:   SD I/O interrupt received\r
669   * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61\r
670   * @retval : The new state of SDIO_FLAG (SET or RESET).\r
671   */\r
672 FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG)\r
673\r
674   FlagStatus bitstatus = RESET;\r
675   \r
676   /* Check the parameters */\r
677   assert_param(IS_SDIO_FLAG(SDIO_FLAG));\r
678   \r
679   if ((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET)\r
680   {\r
681     bitstatus = SET;\r
682   }\r
683   else\r
684   {\r
685     bitstatus = RESET;\r
686   }\r
687   return bitstatus;\r
688 }\r
689 \r
690 /**\r
691   * @brief  Clears the SDIO's pending flags.\r
692   * @param SDIO_FLAG: specifies the flag to clear.  \r
693   *   This parameter can be one or a combination of the following values:\r
694   * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed)\r
695   * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed)\r
696   * @arg SDIO_FLAG_CTIMEOUT: Command response timeout\r
697   * @arg SDIO_FLAG_DTIMEOUT: Data timeout\r
698   * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error\r
699   * @arg SDIO_FLAG_RXOVERR:  Received FIFO overrun error\r
700   * @arg SDIO_FLAG_CMDREND:  Command response received (CRC check passed)\r
701   * @arg SDIO_FLAG_CMDSENT:  Command sent (no response required)\r
702   * @arg SDIO_FLAG_DATAEND:  Data end (data counter, SDIDCOUNT, is zero)\r
703   * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide \r
704   *                          bus mode\r
705   * @arg SDIO_FLAG_DBCKEND:  Data block sent/received (CRC check passed)\r
706   * @arg SDIO_FLAG_SDIOIT:   SD I/O interrupt received\r
707   * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61\r
708   * @retval : None\r
709   */\r
710 void SDIO_ClearFlag(uint32_t SDIO_FLAG)\r
711\r
712   /* Check the parameters */\r
713   assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG));\r
714    \r
715   SDIO->ICR = SDIO_FLAG;\r
716 }\r
717 \r
718 /**\r
719   * @brief  Checks whether the specified SDIO interrupt has occurred or not.\r
720   * @param SDIO_IT: specifies the SDIO interrupt source to check. \r
721   *   This parameter can be one of the following values:\r
722   * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt\r
723   * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt\r
724   * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt\r
725   * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt\r
726   * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt\r
727   * @arg SDIO_IT_RXOVERR:  Received FIFO overrun error interrupt\r
728   * @arg SDIO_IT_CMDREND:  Command response received (CRC check passed) interrupt\r
729   * @arg SDIO_IT_CMDSENT:  Command sent (no response required) interrupt\r
730   * @arg SDIO_IT_DATAEND:  Data end (data counter, SDIDCOUNT, is zero) interrupt\r
731   * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide \r
732   *                        bus mode interrupt\r
733   * @arg SDIO_IT_DBCKEND:  Data block sent/received (CRC check passed) interrupt\r
734   * @arg SDIO_IT_CMDACT:   Command transfer in progress interrupt\r
735   * @arg SDIO_IT_TXACT:    Data transmit in progress interrupt\r
736   * @arg SDIO_IT_RXACT:    Data receive in progress interrupt\r
737   * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt\r
738   * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt\r
739   * @arg SDIO_IT_TXFIFOF:  Transmit FIFO full interrupt\r
740   * @arg SDIO_IT_RXFIFOF:  Receive FIFO full interrupt\r
741   * @arg SDIO_IT_TXFIFOE:  Transmit FIFO empty interrupt\r
742   * @arg SDIO_IT_RXFIFOE:  Receive FIFO empty interrupt\r
743   * @arg SDIO_IT_TXDAVL:   Data available in transmit FIFO interrupt\r
744   * @arg SDIO_IT_RXDAVL:   Data available in receive FIFO interrupt\r
745   * @arg SDIO_IT_SDIOIT:   SD I/O interrupt received interrupt\r
746   * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 \r
747   *                        interrupt\r
748   * @retval : The new state of SDIO_IT (SET or RESET).\r
749   */\r
750 ITStatus SDIO_GetITStatus(uint32_t SDIO_IT)\r
751\r
752   ITStatus bitstatus = RESET;\r
753   \r
754   /* Check the parameters */\r
755   assert_param(IS_SDIO_GET_IT(SDIO_IT));\r
756   if ((SDIO->STA & SDIO_IT) != (uint32_t)RESET)  \r
757   {\r
758     bitstatus = SET;\r
759   }\r
760   else\r
761   {\r
762     bitstatus = RESET;\r
763   }\r
764   return bitstatus;\r
765 }\r
766 \r
767 /**\r
768   * @brief  Clears the SDIO\92s interrupt pending bits.\r
769   * @param SDIO_IT: specifies the interrupt pending bit to clear. \r
770   *   This parameter can be one or a combination of the following values:\r
771   * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt\r
772   * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt\r
773   * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt\r
774   * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt\r
775   * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt\r
776   * @arg SDIO_IT_RXOVERR:  Received FIFO overrun error interrupt\r
777   * @arg SDIO_IT_CMDREND:  Command response received (CRC check passed) interrupt\r
778   * @arg SDIO_IT_CMDSENT:  Command sent (no response required) interrupt\r
779   * @arg SDIO_IT_DATAEND:  Data end (data counter, SDIDCOUNT, is zero) interrupt\r
780   * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide \r
781   *                        bus mode interrupt\r
782   * @arg SDIO_IT_SDIOIT:   SD I/O interrupt received interrupt\r
783   * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61\r
784   * @retval : None\r
785   */\r
786 void SDIO_ClearITPendingBit(uint32_t SDIO_IT)\r
787\r
788   /* Check the parameters */\r
789   assert_param(IS_SDIO_CLEAR_IT(SDIO_IT));\r
790    \r
791   SDIO->ICR = SDIO_IT;\r
792 }\r
793 \r
794 /**\r
795   * @}\r
796   */\r
797 \r
798 /**\r
799   * @}\r
800   */\r
801 \r
802 /**\r
803   * @}\r
804   */\r
805 \r
806 /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/\r