fsl_sdmmc_host.h 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. /*
  2. * Copyright (c) 2015, Freescale Semiconductor, Inc.
  3. * Copyright 2016-2018 NXP
  4. * All rights reserved.
  5. *
  6. * SPDX-License-Identifier: BSD-3-Clause
  7. */
  8. #ifndef _FSL_SDMMC_HOST_H
  9. #define _FSL_SDMMC_HOST_H
  10. #include "fsl_common.h"
  11. #include "board.h"
  12. #if defined(FSL_FEATURE_SOC_SDHC_COUNT) && FSL_FEATURE_SOC_SDHC_COUNT > 0U
  13. #include "fsl_sdhc.h"
  14. #elif defined(FSL_FEATURE_SOC_SDIF_COUNT) && FSL_FEATURE_SOC_SDIF_COUNT > 0U
  15. #include "fsl_sdif.h"
  16. #elif defined(FSL_FEATURE_SOC_USDHC_COUNT) && FSL_FEATURE_SOC_USDHC_COUNT > 0U
  17. #include "fsl_usdhc.h"
  18. #endif
  19. /*!
  20. * @addtogroup SDMMCHOST
  21. * @{
  22. */
  23. /*******************************************************************************
  24. * Definitions
  25. ******************************************************************************/
  26. /* Common definition for support and not support macro */
  27. #define SDMMCHOST_NOT_SUPPORT 0U /*!< use this define to indicate the host not support feature*/
  28. #define SDMMCHOST_SUPPORT 1U /*!< use this define to indicate the host support feature*/
  29. /* Common definition for board support SDR104/HS200/HS400 frequency */
  30. /* SDR104 mode freq */
  31. #if defined BOARD_SD_HOST_SUPPORT_SDR104_FREQ
  32. #define SDMMCHOST_SUPPORT_SDR104_FREQ BOARD_SD_HOST_SUPPORT_SDR104_FREQ
  33. #else
  34. #define SDMMCHOST_SUPPORT_SDR104_FREQ SD_CLOCK_208MHZ
  35. #endif
  36. /* HS200 mode freq */
  37. #if defined BOARD_SD_HOST_SUPPORT_HS200_FREQ
  38. #define SDMMCHOST_SUPPORT_HS200_FREQ BOARD_SD_HOST_SUPPORT_HS200_FREQ
  39. #else
  40. #define SDMMCHOST_SUPPORT_HS200_FREQ MMC_CLOCK_HS200
  41. #endif
  42. /* HS400 mode freq */
  43. #if defined BOARD_SD_HOST_SUPPORT_HS400_FREQ
  44. #define SDMMCHOST_SUPPORT_HS400_FREQ BOARD_SD_HOST_SUPPORT_HS400_FREQ
  45. #else
  46. #define SDMMCHOST_SUPPORT_HS400_FREQ MMC_CLOCK_HS400
  47. #endif
  48. /* Common definition for SDMMCHOST transfer complete timeout */
  49. #define SDMMCHOST_TRANSFER_COMPLETE_TIMEOUT (500U)
  50. /* Common definition for card detect timeout */
  51. #define SDMMCHOST_CARD_DETECT_TIMEOUT (~0U)
  52. /* Common definition for IRQ */
  53. #if defined(__CORTEX_M)
  54. #define SDMMCHOST_SET_IRQ_PRIORITY(id, priority) (NVIC_SetPriority(id, priority))
  55. #else
  56. #define SDMMCHOST_SET_IRQ_PRIORITY(id, priority) (GIC_SetPriority(id, priority))
  57. #endif
  58. #define SDMMCHOST_ENABLE_IRQ(id) (EnableIRQ(id))
  59. /*********************************************************SDHC**********************************************************/
  60. #if (defined(FSL_FEATURE_SOC_SDHC_COUNT) && (FSL_FEATURE_SOC_SDHC_COUNT > 0U))
  61. /*define host baseaddr ,clk freq, IRQ number*/
  62. #define MMC_HOST_BASEADDR BOARD_SDHC_BASEADDR
  63. #define MMC_HOST_CLK_FREQ BOARD_SDHC_CLK_FREQ
  64. #define MMC_HOST_IRQ BOARD_SDHC_IRQ
  65. #define SD_HOST_BASEADDR BOARD_SDHC_BASEADDR
  66. #define SD_HOST_CLK_FREQ BOARD_SDHC_CLK_FREQ
  67. #define SD_HOST_IRQ BOARD_SDHC_IRQ
  68. /* define for card bus speed/strength cnofig */
  69. #define CARD_BUS_FREQ_50MHZ (0U)
  70. #define CARD_BUS_FREQ_100MHZ0 (0U)
  71. #define CARD_BUS_FREQ_100MHZ1 (0U)
  72. #define CARD_BUS_FREQ_200MHZ (0U)
  73. #define CARD_BUS_STRENGTH_0 (0U)
  74. #define CARD_BUS_STRENGTH_1 (0U)
  75. #define CARD_BUS_STRENGTH_2 (0U)
  76. #define CARD_BUS_STRENGTH_3 (0U)
  77. #define CARD_BUS_STRENGTH_4 (0U)
  78. #define CARD_BUS_STRENGTH_5 (0U)
  79. #define CARD_BUS_STRENGTH_6 (0U)
  80. #define CARD_BUS_STRENGTH_7 (0U)
  81. #define SDMMCHOST_TYPE SDHC_Type
  82. #define SDMMCHOST_CONFIG sdhc_host_t
  83. #define SDMMCHOST_TRANSFER sdhc_transfer_t
  84. #define SDMMCHOST_COMMAND sdhc_command_t
  85. #define SDMMCHOST_DATA sdhc_data_t
  86. #define SDMMCHOST_BUS_WIDTH_TYPE sdhc_data_bus_width_t
  87. #define SDMMCHOST_CAPABILITY sdhc_capability_t
  88. #define SDMMCHOST_BOOT_CONFIG sdhc_boot_config_t
  89. #define CARD_DATA0_STATUS_MASK (kSDHC_Data0LineLevelFlag)
  90. #define CARD_DATA0_NOT_BUSY (kSDHC_Data0LineLevelFlag)
  91. #define CARD_DATA1_STATUS_MASK (kSDHC_Data1LineLevelFlag)
  92. #define CARD_DATA2_STATUS_MASK (kSDHC_Data2LineLevelFlag)
  93. #define CARD_DATA3_STATUS_MASK (kSDHC_Data3LineLevelFlag)
  94. #define kSDMMCHOST_DATABUSWIDTH1BIT kSDHC_DataBusWidth1Bit /*!< 1-bit mode */
  95. #define kSDMMCHOST_DATABUSWIDTH4BIT kSDHC_DataBusWidth4Bit /*!< 4-bit mode */
  96. #define kSDMMCHOST_DATABUSWIDTH8BIT kSDHC_DataBusWidth8Bit /*!< 8-bit mode */
  97. #define SDMMCHOST_STANDARD_TUNING_START (0U) /*!< standard tuning start point */
  98. #define SDMMCHOST_TUINIG_STEP (1U) /*!< standard tuning step */
  99. #define SDMMCHOST_RETUNING_TIMER_COUNT (4U) /*!< Re-tuning timer */
  100. #define SDMMCHOST_TUNING_DELAY_MAX (0x7FU)
  101. #define SDMMCHOST_RETUNING_REQUEST (1U)
  102. #define SDMMCHOST_TUNING_ERROR (2U)
  103. /* function pointer define */
  104. #define SDMMCHOST_TRANSFER_FUNCTION sdhc_transfer_function_t
  105. #define GET_SDMMCHOST_CAPABILITY(base, capability) (SDHC_GetCapability(base, capability))
  106. #define GET_SDMMCHOST_STATUS(base) (SDHC_GetPresentStatusFlags(base))
  107. #define SDMMCHOST_SET_CARD_CLOCK(base, sourceClock_HZ, busClock_HZ) (SDHC_SetSdClock(base, sourceClock_HZ, busClock_HZ))
  108. #define SDMMCHOST_SET_CARD_BUS_WIDTH(base, busWidth) (SDHC_SetDataBusWidth(base, busWidth))
  109. #define SDMMCHOST_SEND_CARD_ACTIVE(base, timeout) (SDHC_SetCardActive(base, timeout))
  110. #define SDMMCHOST_SWITCH_VOLTAGE180V(base, enable18v)
  111. #define SDMMCHOST_SWITCH_VOLTAGE120V(base, enable12v)
  112. #define SDMMCHOST_CONFIG_IO_STRENGTH(speed, strength)
  113. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_ENABLE(base, flag)
  114. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_STATUS(base) (0U)
  115. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_RESULT(base) (1U)
  116. #define SDMMCHOST_CONFIG_SD_IO(speed, strength)
  117. #define SDMMCHOST_CONFIG_MMC_IO(speed, strength)
  118. #define SDMMCHOST_ENABLE_DDR_MODE(base, flag, nibblePos)
  119. #define SDMMCHOST_FORCE_SDCLOCK_ON(base, enable)
  120. #define SDMMCHOST_EXECUTE_MANUAL_TUNING_ENABLE(base, flag)
  121. #define SDMMCHOST_ADJUST_MANUAL_TUNING_DELAY(base, delay)
  122. #define SDMMCHOST_AUTO_MANUAL_TUNING_ENABLE(base, flag)
  123. #define SDMMCHOST_ENABLE_CARD_CLOCK(base, enable) (SDHC_EnableSdClock(base, enable))
  124. #define SDMMCHOST_RESET_TUNING(base, timeout)
  125. #define SDMMCHOST_CHECK_TUNING_ERROR(base) (0U)
  126. #define SDMMCHOST_ADJUST_TUNING_DELAY(base, delay)
  127. #define SDMMCHOST_AUTO_STANDARD_RETUNING_TIMER(base)
  128. #define SDMMCHOST_TRANSFER_DATA_ERROR kStatus_SDHC_TransferDataFailed
  129. #define SDMMCHOST_TRANSFER_CMD_ERROR kStatus_SDHC_SendCommandFailed
  130. #define SDMMCHOST_ENABLE_HS400_MODE(base, flag)
  131. #define SDMMCHOST_RESET_STROBE_DLL(base)
  132. #define SDMMCHOST_ENABLE_STROBE_DLL(base, flag)
  133. #define SDMMCHOST_CONFIG_STROBE_DLL(base, delay, updateInterval)
  134. #define SDMMCHOST_GET_STROBE_DLL_STATUS(base)
  135. /* sd card power */
  136. #define SDMMCHOST_INIT_SD_POWER()
  137. #define SDMMCHOST_ENABLE_SD_POWER(enable)
  138. #define SDMMCHOST_SWITCH_VCC_TO_180V()
  139. #define SDMMCHOST_SWITCH_VCC_TO_330V()
  140. /* mmc card power */
  141. #define SDMMCHOST_INIT_MMC_POWER()
  142. #define SDMMCHOST_ENABLE_MMC_POWER(enable)
  143. #define SDMMCHOST_ENABLE_TUNING_FLAG(data)
  144. #define SDMMCHOST_ENABLE_BOOT_FLAG(data)
  145. #define SDMMCHOST_ENABLE_BOOT_CONTINOUS_FLAG(data)
  146. #define SDMMCHOST_GET_HOST_CONFIG_BLOCK_SIZE(config) (0U)
  147. #define SDMMCHOST_GET_HOST_CONFIG_BLOCK_COUNT(config) (0U)
  148. #define SDMMCHOST_GET_HOST_CONFIG_BOOT_MODE(config) (0U)
  149. #define SDMMCHOST_EMPTY_CMD_FLAG(command)
  150. #define SDMMCHOST_CARD_DETECT_GPIO_INTERRUPT_HANDLER BOARD_SDHC_CD_PORT_IRQ_HANDLER
  151. #define SDMMCHOST_CARD_DETECT_IRQ BOARD_SDHC_CD_PORT_IRQ
  152. /* sd card detect through host CD */
  153. #define SDMMCHOST_CARD_DETECT_INSERT_ENABLE(base) (SDHC_EnableInterruptStatus(base, kSDHC_CardInsertionFlag))
  154. #define SDMMCHOST_CARD_DETECT_REMOVE_ENABLE(base) (SDHC_EnableInterruptStatus(base, kSDHC_CardRemovalFlag))
  155. #define SDMMCHOST_CARD_DETECT_INSERT_STATUS(base) (SDHC_GetInterruptStatusFlags(base) & kSDHC_CardInsertionFlag)
  156. #define SDMMCHOST_CARD_DETECT_REMOVE_STATUS(base) (SDHC_GetInterruptStatusFlags(base, kSDHC_CardRemovalFlag))
  157. #define SDMMCHOST_CARD_DETECT_INSERT_INTERRUPT_ENABLE(base) (SDHC_EnableInterruptSignal(base, kSDHC_CardInsertionFlag))
  158. #define SDMMCHOST_CARD_DETECT_INSERT_INTERRUPT_DISABLE(base) \
  159. (SDHC_DisableInterruptSignal(base, kSDHC_CardInsertionFlag))
  160. #define SDMMCHOST_CARD_DETECT_REMOVE_INTERRUPT_ENABLE(base) (SDHC_EnableInterruptSignal(base, kSDHC_CardRemovalFlag))
  161. #define SDMMCHOST_CARD_DETECT_DATA3_ENABLE(base, flag) (SDHC_CardDetectByData3(base, flag))
  162. #define SDMMCHOST_ENABLE_MMC_BOOT(base, flag)
  163. #define SDMMCHOST_SETMMCBOOTCONFIG(base, config) (SDHC_SetMmcBootConfig(base, config))
  164. /* define card detect pin voltage level when card inserted */
  165. #if defined BOARD_SDHC_CARD_INSERT_CD_LEVEL
  166. #define SDMMCHOST_CARD_INSERT_CD_LEVEL BOARD_SDHC_CARD_INSERT_CD_LEVEL
  167. #else
  168. #define SDMMCHOST_CARD_INSERT_CD_LEVEL (0U)
  169. #endif
  170. #define SDMMCHOST_AUTO_TUNING_ENABLE(base, flag)
  171. #define SDMMCHOST_ENABLE_SDIO_INT(base) \
  172. SDHC_EnableInterruptStatus(base, kSDHC_CardInterruptFlag); \
  173. SDHC_EnableInterruptSignal(base, kSDHC_CardInterruptFlag)
  174. #define SDMMCHOST_DISABLE_SDIO_INT(base) \
  175. SDHC_DisableInterruptStatus(base, kSDHC_CardInterruptFlag); \
  176. SDHC_DisableInterruptSignal(base, kSDHC_CardInterruptFlag)
  177. /*! @brief SDHC host capability*/
  178. enum _host_capability
  179. {
  180. kSDMMCHOST_SupportAdma = kSDHC_SupportAdmaFlag,
  181. kSDMMCHOST_SupportHighSpeed = kSDHC_SupportHighSpeedFlag,
  182. kSDMMCHOST_SupportDma = kSDHC_SupportDmaFlag,
  183. kSDMMCHOST_SupportSuspendResume = kSDHC_SupportSuspendResumeFlag,
  184. kSDMMCHOST_SupportV330 = kSDHC_SupportV330Flag,
  185. kSDMMCHOST_SupportV300 = SDMMCHOST_NOT_SUPPORT,
  186. kSDMMCHOST_SupportV180 = SDMMCHOST_NOT_SUPPORT,
  187. kSDMMCHOST_SupportV120 = SDMMCHOST_NOT_SUPPORT,
  188. kSDMMCHOST_Support4BitBusWidth = kSDHC_Support4BitFlag,
  189. kSDMMCHOST_Support8BitBusWidth = kSDHC_Support8BitFlag,
  190. kSDMMCHOST_SupportDDR50 = SDMMCHOST_NOT_SUPPORT,
  191. kSDMMCHOST_SupportSDR104 = SDMMCHOST_NOT_SUPPORT,
  192. kSDMMCHOST_SupportSDR50 = SDMMCHOST_NOT_SUPPORT,
  193. kSDMMCHOST_SupportHS200 = SDMMCHOST_NOT_SUPPORT,
  194. kSDMMCHOST_SupportHS400 = SDMMCHOST_NOT_SUPPORT,
  195. };
  196. /* Endian mode. */
  197. #define SDHC_ENDIAN_MODE kSDHC_EndianModeLittle
  198. /* DMA mode */
  199. #define SDHC_DMA_MODE kSDHC_DmaModeAdma2
  200. /* address align */
  201. #define SDMMCHOST_DMA_BUFFER_ADDR_ALIGN (SDHC_ADMA2_ADDRESS_ALIGN)
  202. /* Read/write watermark level. The bigger value indicates DMA has higher read/write performance. */
  203. #define SDHC_READ_WATERMARK_LEVEL (0x80U)
  204. #define SDHC_WRITE_WATERMARK_LEVEL (0x80U)
  205. /* ADMA table length united as word.
  206. *
  207. * SD card driver can't support ADMA1 transfer mode currently.
  208. * One ADMA2 table item occupy two words which can transfer maximum 0xFFFFU bytes one time.
  209. * The more data to be transferred in one time, the bigger value of SDHC_ADMA_TABLE_WORDS need to be set.
  210. */
  211. #define SDHC_ADMA_TABLE_WORDS (8U)
  212. /*********************************************************SDIF**********************************************************/
  213. #elif (defined(FSL_FEATURE_SOC_SDIF_COUNT) && (FSL_FEATURE_SOC_SDIF_COUNT > 0U))
  214. /*define host baseaddr ,clk freq, IRQ number*/
  215. #define MMC_HOST_BASEADDR BOARD_SDIF_BASEADDR
  216. #define MMC_HOST_CLK_FREQ BOARD_SDIF_CLK_FREQ
  217. #define MMC_HOST_IRQ BOARD_SDIF_IRQ
  218. #define SD_HOST_BASEADDR BOARD_SDIF_BASEADDR
  219. #define SD_HOST_CLK_FREQ BOARD_SDIF_CLK_FREQ
  220. #define SD_HOST_IRQ BOARD_SDIF_IRQ
  221. /* define for card bus speed/strength cnofig */
  222. #define CARD_BUS_FREQ_50MHZ (0U)
  223. #define CARD_BUS_FREQ_100MHZ0 (0U)
  224. #define CARD_BUS_FREQ_100MHZ1 (0U)
  225. #define CARD_BUS_FREQ_200MHZ (0U)
  226. #define CARD_BUS_STRENGTH_0 (0U)
  227. #define CARD_BUS_STRENGTH_1 (0U)
  228. #define CARD_BUS_STRENGTH_2 (0U)
  229. #define CARD_BUS_STRENGTH_3 (0U)
  230. #define CARD_BUS_STRENGTH_4 (0U)
  231. #define CARD_BUS_STRENGTH_5 (0U)
  232. #define CARD_BUS_STRENGTH_6 (0U)
  233. #define CARD_BUS_STRENGTH_7 (0U)
  234. #define SDMMCHOST_TYPE SDIF_Type
  235. #define SDMMCHOST_CONFIG sdif_host_t
  236. #define SDMMCHOST_TRANSFER sdif_transfer_t
  237. #define SDMMCHOST_COMMAND sdif_command_t
  238. #define SDMMCHOST_DATA sdif_data_t
  239. #define SDMMCHOST_BUS_WIDTH_TYPE sdif_bus_width_t
  240. #define SDMMCHOST_CAPABILITY sdif_capability_t
  241. #define SDMMCHOST_BOOT_CONFIG void
  242. #define CARD_DATA0_STATUS_MASK SDIF_STATUS_DATA_BUSY_MASK
  243. #define CARD_DATA0_NOT_BUSY 0U
  244. #define CARD_DATA1_STATUS_MASK (0U)
  245. #define CARD_DATA2_STATUS_MASK (0U)
  246. #define CARD_DATA3_STATUS_MASK (0U)
  247. #define kSDMMCHOST_DATABUSWIDTH1BIT kSDIF_Bus1BitWidth /*!< 1-bit mode */
  248. #define kSDMMCHOST_DATABUSWIDTH4BIT kSDIF_Bus4BitWidth /*!< 4-bit mode */
  249. #define kSDMMCHOST_DATABUSWIDTH8BIT kSDIF_Bus8BitWidth /*!< 8-bit mode */
  250. #define SDMMCHOST_STANDARD_TUNING_START (0U) /*!< standard tuning start point */
  251. #define SDMMCHOST_TUINIG_STEP (1U) /*!< standard tuning step */
  252. #define SDMMCHOST_RETUNING_TIMER_COUNT (4U) /*!< Re-tuning timer */
  253. #define SDMMCHOST_TUNING_DELAY_MAX (0x7FU)
  254. #define SDMMCHOST_RETUNING_REQUEST (1U)
  255. #define SDMMCHOST_TUNING_ERROR (2U)
  256. /* function pointer define */
  257. #define SDMMCHOST_TRANSFER_FUNCTION sdif_transfer_function_t
  258. #define GET_SDMMCHOST_CAPABILITY(base, capability) (SDIF_GetCapability(base, capability))
  259. #define GET_SDMMCHOST_STATUS(base) (SDIF_GetControllerStatus(base))
  260. #define SDMMCHOST_SET_CARD_CLOCK(base, sourceClock_HZ, busClock_HZ) \
  261. (SDIF_SetCardClock(base, sourceClock_HZ, busClock_HZ))
  262. #define SDMMCHOST_SET_CARD_BUS_WIDTH(base, busWidth) (SDIF_SetCardBusWidth(base, busWidth))
  263. #define SDMMCHOST_SEND_CARD_ACTIVE(base, timeout) (SDIF_SendCardActive(base, timeout))
  264. #define SDMMCHOST_SWITCH_VOLTAGE180V(base, enable18v)
  265. #define SDMMCHOST_SWITCH_VOLTAGE120V(base, enable12v)
  266. #define SDMMCHOST_CONFIG_IO_STRENGTH(speed, strength)
  267. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_ENABLE(base, flag)
  268. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_STATUS(base) (0U)
  269. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_RESULT(base) (1U)
  270. #define SDMMCHOST_CONFIG_SD_IO(speed, strength)
  271. #define SDMMCHOST_CONFIG_MMC_IO(speed, strength)
  272. #define SDMMCHOST_ENABLE_DDR_MODE(base, flag, nibblePos)
  273. #define SDMMCHOST_FORCE_SDCLOCK_ON(base, enable)
  274. #define SDMMCHOST_EXECUTE_MANUAL_TUNING_ENABLE(base, flag)
  275. #define SDMMCHOST_ADJUST_MANUAL_TUNING_DELAY(base, delay)
  276. #define SDMMCHOST_AUTO_MANUAL_TUNING_ENABLE(base, flag)
  277. #define SDMMCHOST_ENABLE_CARD_CLOCK(base, enable) (SDIF_EnableCardClock(base, enable))
  278. #define SDMMCHOST_RESET_TUNING(base, timeout)
  279. #define SDMMCHOST_CHECK_TUNING_ERROR(base) (0U)
  280. #define SDMMCHOST_ADJUST_TUNING_DELAY(base, delay)
  281. #define SDMMCHOST_AUTO_STANDARD_RETUNING_TIMER(base)
  282. #define SDMMCHOST_ENABLE_HS400_MODE(base, flag)
  283. #define SDMMCHOST_RESET_STROBE_DLL(base)
  284. #define SDMMCHOST_ENABLE_STROBE_DLL(base, flag)
  285. #define SDMMCHOST_CONFIG_STROBE_DLL(base, delay, updateInterval)
  286. #define SDMMCHOST_GET_STROBE_DLL_STATUS(base)
  287. /* sd card power */
  288. #define SDMMCHOST_INIT_SD_POWER()
  289. #define SDMMCHOST_ENABLE_SD_POWER(enable)
  290. #define SDMMCHOST_SWITCH_VCC_TO_180V()
  291. #define SDMMCHOST_SWITCH_VCC_TO_330V()
  292. /* mmc card power */
  293. #define SDMMCHOST_INIT_MMC_POWER()
  294. #define SDMMCHOST_ENABLE_MMC_POWER(enable)
  295. #define SDMMCHOST_ENABLE_TUNING_FLAG(data)
  296. #define SDMMCHOST_ENABLE_MMC_BOOT(base, flag)
  297. #define SDMMCHOST_SETMMCBOOTCONFIG(base, config)
  298. #define SDMMCHOST_ENABLE_BOOT_FLAG(data)
  299. #define SDMMCHOST_ENABLE_BOOT_CONTINOUS_FLAG(data)
  300. #define SDMMCHOST_GET_HOST_CONFIG_BLOCK_SIZE(config) (0U)
  301. #define SDMMCHOST_GET_HOST_CONFIG_BLOCK_COUNT(config) (0U)
  302. #define SDMMCHOST_GET_HOST_CONFIG_BOOT_MODE(config) (0U)
  303. #define SDMMCHOST_EMPTY_CMD_FLAG(command)
  304. #define SDMMCHOST_CARD_DETECT_STATUS() BOARD_SDIF_CD_STATUS()
  305. #define SDMMCHOST_CARD_DETECT_INIT() BOARD_SDIF_CD_GPIO_INIT()
  306. #define SDMMCHOST_CARD_DETECT_INTERRUPT_STATUS() BOARD_SDIF_CD_INTERRUPT_STATUS()
  307. #define SDMMCHOST_CARD_DETECT_INTERRUPT_CLEAR(flag) BOARD_SDIF_CD_CLEAR_INTERRUPT(flag)
  308. #define SDMMCHOST_CARD_DETECT_GPIO_INTERRUPT_HANDLER BOARD_SDIF_CD_PORT_IRQ_HANDLER
  309. #define SDMMCHOST_CARD_DETECT_IRQ BOARD_SDIF_CD_PORT_IRQ
  310. #define SDMMCHOST_TRANSFER_DATA_ERROR kStatus_SDIF_DataTransferFail
  311. #define SDMMCHOST_TRANSFER_CMD_ERROR kStatus_SDIF_SendCmdFail
  312. /* define card detect pin voltage level when card inserted */
  313. #if defined BOARD_SDIF_CARD_INSERT_CD_LEVEL
  314. #define SDMMCHOST_CARD_INSERT_CD_LEVEL BOARD_SDIF_CARD_INSERT_CD_LEVEL
  315. #else
  316. #define SDMMCHOST_CARD_INSERT_CD_LEVEL (0U)
  317. #endif
  318. #define SDMMCHOST_AUTO_TUNING_ENABLE(base, flag)
  319. /* sd card detect through host CD */
  320. #define SDMMCHOST_CARD_DETECT_INSERT_ENABLE(base) (SDIF_EnableInterrupt(base, kSDIF_CardDetect))
  321. #define SDMMCHOST_CARD_DETECT_INSERT_STATUS(base, data3) (SDIF_DetectCardInsert(base, data3))
  322. #define SDMMCHOST_ENABLE_SDIO_INT(base)
  323. #define SDMMCHOST_DISABLE_SDIO_INT(base)
  324. /*! @brief SDIF host capability*/
  325. enum _host_capability
  326. {
  327. kSDMMCHOST_SupportHighSpeed = kSDIF_SupportHighSpeedFlag,
  328. kSDMMCHOST_SupportDma = kSDIF_SupportDmaFlag,
  329. kSDMMCHOST_SupportSuspendResume = kSDIF_SupportSuspendResumeFlag,
  330. kSDMMCHOST_SupportV330 = kSDIF_SupportV330Flag,
  331. kSDMMCHOST_SupportV300 = SDMMCHOST_NOT_SUPPORT,
  332. kSDMMCHOST_SupportV180 = SDMMCHOST_NOT_SUPPORT,
  333. kSDMMCHOST_SupportV120 = SDMMCHOST_NOT_SUPPORT,
  334. kSDMMCHOST_Support4BitBusWidth = kSDIF_Support4BitFlag,
  335. kSDMMCHOST_Support8BitBusWidth =
  336. SDMMCHOST_NOT_SUPPORT, /* mask the 8 bit here,user can change depend on your board */
  337. kSDMMCHOST_SupportDDR50 = SDMMCHOST_NOT_SUPPORT,
  338. kSDMMCHOST_SupportSDR104 = SDMMCHOST_NOT_SUPPORT,
  339. kSDMMCHOST_SupportSDR50 = SDMMCHOST_NOT_SUPPORT,
  340. kSDMMCHOST_SupportHS200 = SDMMCHOST_NOT_SUPPORT,
  341. kSDMMCHOST_SupportHS400 = SDMMCHOST_NOT_SUPPORT,
  342. };
  343. /*! @brief DMA table length united as word
  344. * One dma table item occupy four words which can transfer maximum 2*8188 bytes in dual DMA mode
  345. * and 8188 bytes in chain mode
  346. * The more data to be transferred in one time, the bigger value of SDHC_ADMA_TABLE_WORDS need to be set.
  347. * user need check the DMA descriptor table lenght if bigger enough.
  348. */
  349. #define SDIF_DMA_TABLE_WORDS (0x40U)
  350. /* address align */
  351. #define SDMMCHOST_DMA_BUFFER_ADDR_ALIGN (4U)
  352. /*********************************************************USDHC**********************************************************/
  353. #elif (defined(FSL_FEATURE_SOC_USDHC_COUNT) && (FSL_FEATURE_SOC_USDHC_COUNT > 0U))
  354. /*define host baseaddr ,clk freq, IRQ number*/
  355. #define MMC_HOST_BASEADDR BOARD_MMC_HOST_BASEADDR
  356. #define MMC_HOST_CLK_FREQ BOARD_MMC_HOST_CLK_FREQ
  357. #define MMC_HOST_IRQ BOARD_MMC_HOST_IRQ
  358. #define SD_HOST_BASEADDR BOARD_SD_HOST_BASEADDR
  359. #define SD_HOST_CLK_FREQ BOARD_SD_HOST_CLK_FREQ
  360. #define SD_HOST_IRQ BOARD_SD_HOST_IRQ
  361. #define SDMMCHOST_TYPE USDHC_Type
  362. #define SDMMCHOST_CONFIG usdhc_host_t
  363. #define SDMMCHOST_TRANSFER usdhc_transfer_t
  364. #define SDMMCHOST_COMMAND usdhc_command_t
  365. #define SDMMCHOST_DATA usdhc_data_t
  366. #define SDMMCHOST_BOOT_CONFIG usdhc_boot_config_t
  367. #define CARD_DATA0_STATUS_MASK (kUSDHC_Data0LineLevelFlag)
  368. #define CARD_DATA1_STATUS_MASK (kUSDHC_Data1LineLevelFlag)
  369. #define CARD_DATA2_STATUS_MASK (kUSDHC_Data2LineLevelFlag)
  370. #define CARD_DATA3_STATUS_MASK (kUSDHC_Data3LineLevelFlag)
  371. #define CARD_DATA0_NOT_BUSY (kUSDHC_Data0LineLevelFlag)
  372. #define SDMMCHOST_BUS_WIDTH_TYPE usdhc_data_bus_width_t
  373. #define SDMMCHOST_CAPABILITY usdhc_capability_t
  374. #define kSDMMCHOST_DATABUSWIDTH1BIT kUSDHC_DataBusWidth1Bit /*!< 1-bit mode */
  375. #define kSDMMCHOST_DATABUSWIDTH4BIT kUSDHC_DataBusWidth4Bit /*!< 4-bit mode */
  376. #define kSDMMCHOST_DATABUSWIDTH8BIT kUSDHC_DataBusWidth8Bit /*!< 8-bit mode */
  377. #define SDMMCHOST_STANDARD_TUNING_START (10U) /*!< standard tuning start point */
  378. #define SDMMCHOST_TUINIG_STEP (2U) /*!< standard tuning step */
  379. #define SDMMCHOST_RETUNING_TIMER_COUNT (0U) /*!< Re-tuning timer */
  380. #define SDMMCHOST_TUNING_DELAY_MAX (0x7FU)
  381. #define SDMMCHOST_RETUNING_REQUEST kStatus_USDHC_ReTuningRequest
  382. #define SDMMCHOST_TUNING_ERROR kStatus_USDHC_TuningError
  383. #define SDMMCHOST_TRANSFER_DATA_ERROR kStatus_USDHC_TransferDataFailed
  384. #define SDMMCHOST_TRANSFER_CMD_ERROR kStatus_USDHC_SendCommandFailed
  385. /* define for card bus speed/strength cnofig */
  386. #define CARD_BUS_FREQ_50MHZ (0U)
  387. #define CARD_BUS_FREQ_100MHZ0 (1U)
  388. #define CARD_BUS_FREQ_100MHZ1 (2U)
  389. #define CARD_BUS_FREQ_200MHZ (3U)
  390. #define CARD_BUS_STRENGTH_0 (0U)
  391. #define CARD_BUS_STRENGTH_1 (1U)
  392. #define CARD_BUS_STRENGTH_2 (2U)
  393. #define CARD_BUS_STRENGTH_3 (3U)
  394. #define CARD_BUS_STRENGTH_4 (4U)
  395. #define CARD_BUS_STRENGTH_5 (5U)
  396. #define CARD_BUS_STRENGTH_6 (6U)
  397. #define CARD_BUS_STRENGTH_7 (7U)
  398. #define SDMMCHOST_STROBE_DLL_DELAY_TARGET (7U)
  399. #define SDMMCHOST_STROBE_DLL_DELAY_UPDATE_INTERVAL (4U)
  400. /* function pointer define */
  401. #define SDMMCHOST_TRANSFER_FUNCTION usdhc_transfer_function_t
  402. #define GET_SDMMCHOST_CAPABILITY(base, capability) (USDHC_GetCapability(base, capability))
  403. #define GET_SDMMCHOST_STATUS(base) (USDHC_GetPresentStatusFlags(base))
  404. #define SDMMCHOST_SET_CARD_CLOCK(base, sourceClock_HZ, busClock_HZ) \
  405. (USDHC_SetSdClock(base, sourceClock_HZ, busClock_HZ))
  406. #define SDMMCHOST_ENABLE_CARD_CLOCK(base, enable)
  407. #define SDMMCHOST_FORCE_SDCLOCK_ON(base, enable) (USDHC_ForceClockOn(base, enable))
  408. #define SDMMCHOST_SET_CARD_BUS_WIDTH(base, busWidth) (USDHC_SetDataBusWidth(base, busWidth))
  409. #define SDMMCHOST_SEND_CARD_ACTIVE(base, timeout) (USDHC_SetCardActive(base, timeout))
  410. #define SDMMCHOST_SWITCH_VOLTAGE180V(base, enable18v) (UDSHC_SelectVoltage(base, enable18v))
  411. #define SDMMCHOST_SWITCH_VOLTAGE120V(base, enable12v)
  412. #define SDMMCHOST_CONFIG_SD_IO(speed, strength) BOARD_SD_Pin_Config(speed, strength)
  413. #define SDMMCHOST_CONFIG_MMC_IO(speed, strength) BOARD_MMC_Pin_Config(speed, strength)
  414. #define SDMMCHOST_SWITCH_VCC_TO_180V()
  415. #define SDMMCHOST_SWITCH_VCC_TO_330V()
  416. #if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE)
  417. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_STATUS(base) (0U)
  418. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_RESULT(base) (1U)
  419. #define SDMMCHOST_AUTO_STANDARD_RETUNING_TIMER(base)
  420. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_ENABLE(base, flag)
  421. #define SDMMCHOST_CHECK_TUNING_ERROR(base) (0U)
  422. #define SDMMCHOST_ADJUST_TUNING_DELAY(base, delay)
  423. #else
  424. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_ENABLE(base, flag) \
  425. (USDHC_EnableStandardTuning(base, SDMMCHOST_STANDARD_TUNING_START, SDMMCHOST_TUINIG_STEP, flag))
  426. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_STATUS(base) (USDHC_GetExecuteStdTuningStatus(base))
  427. #define SDMMCHOST_EXECUTE_STANDARD_TUNING_RESULT(base) (USDHC_CheckStdTuningResult(base))
  428. #define SDMMCHOST_AUTO_STANDARD_RETUNING_TIMER(base) (USDHC_SetRetuningTimer(base, SDMMCHOST_RETUNING_TIMER_COUNT))
  429. #define SDMMCHOST_EXECUTE_MANUAL_TUNING_ENABLE(base, flag) (USDHC_EnableManualTuning(base, flag))
  430. #define SDMMCHOST_ADJUST_TUNING_DELAY(base, delay) (USDHC_AdjustDelayForManualTuning(base, delay))
  431. #define SDMMCHOST_AUTO_TUNING_ENABLE(base, flag) (USDHC_EnableAutoTuning(base, flag))
  432. #define SDMMCHOST_CHECK_TUNING_ERROR(base) (USDHC_CheckTuningError(base))
  433. #endif
  434. #define SDMMCHOST_AUTO_TUNING_CONFIG(base) (USDHC_EnableAutoTuningForCmdAndData(base))
  435. #define SDMMCHOST_RESET_TUNING(base, timeout) \
  436. { \
  437. (USDHC_Reset(base, kUSDHC_ResetTuning | kUSDHC_ResetData | kUSDHC_ResetCommand, timeout)); \
  438. }
  439. #define SDMMCHOST_ENABLE_DDR_MODE(base, flag, nibblePos) (USDHC_EnableDDRMode(base, flag, nibblePos))
  440. #if FSL_FEATURE_USDHC_HAS_HS400_MODE
  441. #define SDMMCHOST_ENABLE_HS400_MODE(base, flag) (USDHC_EnableHS400Mode(base, flag))
  442. #define SDMMCHOST_RESET_STROBE_DLL(base) (USDHC_ResetStrobeDLL(base))
  443. #define SDMMCHOST_ENABLE_STROBE_DLL(base, flag) (USDHC_EnableStrobeDLL(base, flag))
  444. #define SDMMCHOST_CONFIG_STROBE_DLL(base, delay, updateInterval) (USDHC_ConfigStrobeDLL(base, delay, updateInterval))
  445. #define SDMMCHOST_GET_STROBE_DLL_STATUS (base)(USDHC_GetStrobeDLLStatus(base))
  446. #else
  447. #define SDMMCHOST_ENABLE_HS400_MODE(base, flag)
  448. #define SDMMCHOST_RESET_STROBE_DLL(base)
  449. #define SDMMCHOST_ENABLE_STROBE_DLL(base, flag)
  450. #define SDMMCHOST_CONFIG_STROBE_DLL(base, delay, updateInterval)
  451. #define SDMMCHOST_GET_STROBE_DLL_STATUS(base)
  452. #endif
  453. #define SDMMCHOST_ENABLE_MMC_BOOT(base, flag) (USDHC_EnableMmcBoot(base, flag))
  454. #define SDMMCHOST_SETMMCBOOTCONFIG(base, config) (USDHC_SetMmcBootConfig(base, config))
  455. /* sd card power */
  456. #define SDMMCHOST_INIT_SD_POWER() BOARD_USDHC_SDCARD_POWER_CONTROL_INIT()
  457. #define SDMMCHOST_ENABLE_SD_POWER(enable) BOARD_USDHC_SDCARD_POWER_CONTROL(enable)
  458. /* mmc card power */
  459. #define SDMMCHOST_INIT_MMC_POWER() BOARD_USDHC_MMCCARD_POWER_CONTROL_INIT()
  460. #define SDMMCHOST_ENABLE_MMC_POWER(enable) BOARD_USDHC_MMCCARD_POWER_CONTROL(enable)
  461. /* sd card detect through gpio */
  462. #define SDMMCHOST_CARD_DETECT_GPIO_STATUS() BOARD_USDHC_CD_STATUS()
  463. #define SDMMCHOST_CARD_DETECT_GPIO_INIT() BOARD_USDHC_CD_GPIO_INIT()
  464. #define SDMMCHOST_CARD_DETECT_GPIO_INTERRUPT_STATUS() BOARD_USDHC_CD_INTERRUPT_STATUS()
  465. #define SDMMCHOST_CARD_DETECT_GPIO_INTERRUPT_STATUS_CLEAR(flag) BOARD_USDHC_CD_CLEAR_INTERRUPT(flag)
  466. #define SDMMCHOST_CARD_DETECT_GPIO_INTERRUPT_HANDLER BOARD_USDHC_CD_PORT_IRQ_HANDLER
  467. #define SDMMCHOST_CARD_DETECT_GPIO_IRQ BOARD_USDHC_CD_PORT_IRQ
  468. /* sd card detect through host CD */
  469. #define SDMMCHOST_CARD_DETECT_INSERT_ENABLE(base) (USDHC_EnableInterruptStatus(base, kUSDHC_CardInsertionFlag))
  470. #define SDMMCHOST_CARD_DETECT_REMOVE_ENABLE(base) (USDHC_EnableInterruptStatus(base, kUSDHC_CardRemovalFlag))
  471. #define SDMMCHOST_CARD_DETECT_INSERT_STATUS(base) (USDHC_DetectCardInsert(base))
  472. #define SDMMCHOST_CARD_DETECT_REMOVE_STATUS(base) (USDHC_GetInterruptStatusFlags(base, kUSDHC_CardRemovalFlag))
  473. #define SDMMCHOST_CARD_DETECT_INSERT_INTERRUPT_ENABLE(base) \
  474. (USDHC_EnableInterruptSignal(base, kUSDHC_CardInsertionFlag))
  475. #define SDMMCHOST_CARD_DETECT_REMOVE_INTERRUPT_ENABLE(base) (USDHC_EnableInterruptSignal(base, kUSDHC_CardRemovalFlag))
  476. #define SDMMCHOST_CARD_DETECT_DATA3_ENABLE(base, flag) (USDHC_CardDetectByData3(base, flag))
  477. /* define card detect pin voltage level when card inserted */
  478. #if defined BOARD_USDHC_CARD_INSERT_CD_LEVEL
  479. #define SDMMCHOST_CARD_INSERT_CD_LEVEL BOARD_USDHC_CARD_INSERT_CD_LEVEL
  480. #else
  481. #define SDMMCHOST_CARD_INSERT_CD_LEVEL (0U)
  482. #endif
  483. #define SDMMCHOST_ENABLE_TUNING_FLAG(data) (data.dataType = kUSDHC_TransferDataTuning)
  484. #define SDMMCHOST_ENABLE_BOOT_FLAG(data) (data.dataType = kUSDHC_TransferDataBoot)
  485. #define SDMMCHOST_ENABLE_BOOT_CONTINOUS_FLAG(data) (data.dataType = kUSDHC_TransferDataBootcontinous)
  486. #define SDMMCHOST_GET_HOST_CONFIG_BLOCK_SIZE(config) (config->blockSize)
  487. #define SDMMCHOST_GET_HOST_CONFIG_BLOCK_COUNT(config) (config->blockCount)
  488. #define SDMMCHOST_GET_HOST_CONFIG_BOOT_MODE(config) (config->bootMode)
  489. #define SDMMCHOST_EMPTY_CMD_FLAG(command) (command.type = kCARD_CommandTypeEmpty)
  490. #define SDMMCHOST_ENABLE_SDIO_INT(base) \
  491. USDHC_EnableInterruptStatus(base, kUSDHC_CardInterruptFlag); \
  492. USDHC_EnableInterruptSignal(base, kUSDHC_CardInterruptFlag)
  493. #define SDMMCHOST_DISABLE_SDIO_INT(base) \
  494. USDHC_DisableInterruptStatus(base, kUSDHC_CardInterruptFlag); \
  495. USDHC_DisableInterruptSignal(base, kUSDHC_CardInterruptFlag)
  496. /*! @brief USDHC host capability*/
  497. enum _host_capability
  498. {
  499. kSDMMCHOST_SupportAdma = kUSDHC_SupportAdmaFlag,
  500. kSDMMCHOST_SupportHighSpeed = kUSDHC_SupportHighSpeedFlag,
  501. kSDMMCHOST_SupportDma = kUSDHC_SupportDmaFlag,
  502. kSDMMCHOST_SupportSuspendResume = kUSDHC_SupportSuspendResumeFlag,
  503. kSDMMCHOST_SupportV330 = kUSDHC_SupportV330Flag, /* this define should depend on your board config */
  504. kSDMMCHOST_SupportV300 = kUSDHC_SupportV300Flag, /* this define should depend on your board config */
  505. #if defined(BOARD_SD_SUPPORT_180V) && !BOARD_SD_SUPPORT_180V
  506. kSDMMCHOST_SupportV180 = SDMMCHOST_NOT_SUPPORT, /* this define should depend on you board config */
  507. #else
  508. kSDMMCHOST_SupportV180 = kUSDHC_SupportV180Flag, /* this define should depend on you board config */
  509. #endif
  510. kSDMMCHOST_SupportV120 = SDMMCHOST_NOT_SUPPORT,
  511. kSDMMCHOST_Support4BitBusWidth = kUSDHC_Support4BitFlag,
  512. #if defined(BOARD_MMC_SUPPORT_8BIT_BUS)
  513. #if BOARD_MMC_SUPPORT_8BIT_BUS
  514. kSDMMCHOST_Support8BitBusWidth = kUSDHC_Support8BitFlag,
  515. #else
  516. kSDMMCHOST_Support8BitBusWidth = SDMMCHOST_NOT_SUPPORT,
  517. #endif
  518. #else
  519. kSDMMCHOST_Support8BitBusWidth = kUSDHC_Support8BitFlag,
  520. #endif
  521. kSDMMCHOST_SupportDDR50 = kUSDHC_SupportDDR50Flag,
  522. kSDMMCHOST_SupportSDR104 = kUSDHC_SupportSDR104Flag,
  523. kSDMMCHOST_SupportSDR50 = kUSDHC_SupportSDR50Flag,
  524. kSDMMCHOST_SupportHS200 = kUSDHC_SupportSDR104Flag,
  525. #if FSL_FEATURE_USDHC_HAS_HS400_MODE
  526. kSDMMCHOST_SupportHS400 = SDMMCHOST_SUPPORT
  527. #else
  528. kSDMMCHOST_SupportHS400 = SDMMCHOST_NOT_SUPPORT,
  529. #endif
  530. };
  531. /* Endian mode. */
  532. #define USDHC_ENDIAN_MODE kUSDHC_EndianModeLittle
  533. /* DMA mode */
  534. #define USDHC_DMA_MODE kUSDHC_DmaModeAdma2
  535. /* address align */
  536. #define SDMMCHOST_DMA_BUFFER_ADDR_ALIGN (USDHC_ADMA2_ADDRESS_ALIGN)
  537. /* Read/write watermark level. The bigger value indicates DMA has higher read/write performance. */
  538. #define USDHC_READ_WATERMARK_LEVEL (0x80U)
  539. #define USDHC_WRITE_WATERMARK_LEVEL (0x80U)
  540. /* ADMA table length united as word.
  541. *
  542. * One ADMA2 table item occupy two words which can transfer maximum 0xFFFFU bytes one time.
  543. * The more data to be transferred in one time, the bigger value of SDHC_ADMA_TABLE_WORDS need to be set.
  544. */
  545. #define USDHC_ADMA_TABLE_WORDS (8U) /* define the ADMA descriptor table length */
  546. #define USDHC_ADMA2_ADDR_ALIGN (4U) /* define the ADMA2 descriptor table addr align size */
  547. #define USDHC_READ_BURST_LEN (8U) /*!< number of words USDHC read in a single burst */
  548. #define USDHC_WRITE_BURST_LEN (8U) /*!< number of words USDHC write in a single burst */
  549. #define USDHC_DATA_TIMEOUT (0xFU) /*!< data timeout counter value */
  550. #endif /* (defined(FSL_FEATURE_SOC_SDHC_COUNT) && (FSL_FEATURE_SOC_SDHC_COUNT > 0U)) */
  551. /*! @brief card detect callback definition */
  552. typedef void (*sdmmchost_cd_callback_t)(bool isInserted, void *userData);
  553. /*! @brief host Endian mode
  554. * corresponding to driver define
  555. */
  556. enum _sdmmchost_endian_mode
  557. {
  558. kSDMMCHOST_EndianModeBig = 0U, /*!< Big endian mode */
  559. kSDMMCHOST_EndianModeHalfWordBig = 1U, /*!< Half word big endian mode */
  560. kSDMMCHOST_EndianModeLittle = 2U, /*!< Little endian mode */
  561. };
  562. /*! @brief sd card detect type */
  563. typedef enum _sdmmchost_detect_card_type
  564. {
  565. kSDMMCHOST_DetectCardByGpioCD, /*!< sd card detect by CD pin through GPIO */
  566. kSDMMCHOST_DetectCardByHostCD, /*!< sd card detect by CD pin through host */
  567. kSDMMCHOST_DetectCardByHostDATA3, /*!< sd card detect by DAT3 pin through host */
  568. } sdmmchost_detect_card_type_t;
  569. /*! @brief sd card detect */
  570. typedef struct _sdmmchost_detect_card
  571. {
  572. sdmmchost_detect_card_type_t cdType; /*!< card detect type */
  573. uint32_t cdTimeOut_ms; /*!< card detect timeout which allow 0 - 0xFFFFFFF, value 0 will return immediately, value
  574. 0xFFFFFFFF will block until card is insert */
  575. sdmmchost_cd_callback_t cardInserted; /*!< card inserted callback which is meaningful for interrupt case */
  576. sdmmchost_cd_callback_t cardRemoved; /*!< card removed callback which is meaningful for interrupt case */
  577. void *userData; /*!< user data */
  578. } sdmmchost_detect_card_t;
  579. /*! @brief card power control function pointer */
  580. typedef void (*sdmmchost_pwr_t)(void);
  581. /*! @brief card power control */
  582. typedef struct _sdmmchost_pwr_card
  583. {
  584. sdmmchost_pwr_t powerOn; /*!< power on function pointer */
  585. uint32_t powerOnDelay_ms; /*!< power on delay */
  586. sdmmchost_pwr_t powerOff; /*!< power off function pointer */
  587. uint32_t powerOffDelay_ms; /*!< power off delay */
  588. } sdmmchost_pwr_card_t;
  589. /*! @brief card interrupt function pointer */
  590. typedef void (*sdmmchost_card_int_callback_t)(void *userData);
  591. /*! @brief card interrupt application callback */
  592. typedef struct _sdmmchost_card_int
  593. {
  594. void *userData; /*!< user data */
  595. sdmmchost_card_int_callback_t cardInterrupt; /*!< card int call back */
  596. } sdmmchost_card_int_t;
  597. /*! @brief card switch voltage function pointer */
  598. typedef void (*sdmmchost_card_switch_voltage_t)(void);
  599. /*! @brief card switch voltage function collection */
  600. typedef struct _sdmmchost_card_switch_voltage_func
  601. {
  602. sdmmchost_card_switch_voltage_t cardSignalLine1V8; /*!< switch to 1.8v function pointer */
  603. sdmmchost_card_switch_voltage_t cardSignalLine3V3; /*!<switch to 3.3V function pointer */
  604. } sdmmchost_card_switch_voltage_func_t;
  605. /*! @brief card user parameter, user can define the parameter according the board, card capability */
  606. typedef struct _sdmmhostcard_usr_param
  607. {
  608. const sdmmchost_detect_card_t *cd; /*!< card detect type */
  609. const sdmmchost_pwr_card_t *pwr; /*!< power control configuration */
  610. const sdmmchost_card_int_t *cardInt; /*!< call back function for card interrupt */
  611. const sdmmchost_card_switch_voltage_func_t *cardVoltage; /*!< card voltage switch function */
  612. } sdmmhostcard_usr_param_t;
  613. /*! @ brief specifiy card user parameter name*/
  614. typedef sdmmhostcard_usr_param_t sdcard_usr_param_t;
  615. typedef sdmmhostcard_usr_param_t sdiocard_usr_param_t;
  616. typedef sdmmhostcard_usr_param_t mmccard_usr_param_t;
  617. /*******************************************************************************
  618. * API
  619. ******************************************************************************/
  620. #if defined(__cplusplus)
  621. extern "C" {
  622. #endif
  623. /*!
  624. * @name adaptor function
  625. * @{
  626. */
  627. /*!
  628. * @brief host not support function, this function is used for host not support feature
  629. * @param void parameter ,used to avoid build warning
  630. * @retval kStatus_Fail ,host do not suppport
  631. */
  632. static inline status_t SDMMCHOST_NotSupport(void *parameter)
  633. {
  634. parameter = parameter;
  635. return kStatus_Success;
  636. }
  637. /*!
  638. * @brief Detect card insert, only need for SD cases.
  639. * @param base the pointer to host base address
  640. * @param cd card detect configuration
  641. * @param waitCardStatus status which user want to wait
  642. * @retval kStatus_Success detect card insert
  643. * @retval kStatus_Fail card insert event fail
  644. */
  645. status_t SDMMCHOST_WaitCardDetectStatus(SDMMCHOST_TYPE *hostBase,
  646. const sdmmchost_detect_card_t *cd,
  647. bool waitCardStatus);
  648. /*!
  649. * @brief check card is present or not.
  650. * @retval true card is present
  651. * @retval false card is not present
  652. */
  653. bool SDMMCHOST_IsCardPresent(void);
  654. /*!
  655. * @brief Init host controller.
  656. * @param host the pointer to host structure in card structure.
  657. * @param userData specific user data
  658. * @retval kStatus_Success host init success
  659. * @retval kStatus_Fail event fail
  660. */
  661. status_t SDMMCHOST_Init(SDMMCHOST_CONFIG *host, void *userData);
  662. /*!
  663. * @brief reset host controller.
  664. * @param host base address.
  665. */
  666. void SDMMCHOST_Reset(SDMMCHOST_TYPE *base);
  667. /*!
  668. * @brief host controller error recovery.
  669. * @param host base address.
  670. */
  671. void SDMMCHOST_ErrorRecovery(SDMMCHOST_TYPE *base);
  672. /*!
  673. * @brief Deinit host controller.
  674. * @param host the pointer to host structure in card structure.
  675. */
  676. void SDMMCHOST_Deinit(void *host);
  677. /*!
  678. * @brief host power off card function.
  679. * @param base host base address.
  680. * @param pwr depend on user define power configuration.
  681. */
  682. void SDMMCHOST_PowerOffCard(SDMMCHOST_TYPE *base, const sdmmchost_pwr_card_t *pwr);
  683. /*!
  684. * @brief host power on card function.
  685. * @param base host base address.
  686. * @param pwr depend on user define power configuration.
  687. */
  688. void SDMMCHOST_PowerOnCard(SDMMCHOST_TYPE *base, const sdmmchost_pwr_card_t *pwr);
  689. /*!
  690. * @brief SDMMC host delay function.
  691. * @param milliseconds delay counter.
  692. */
  693. void SDMMCHOST_Delay(uint32_t milliseconds);
  694. /* @} */
  695. #if defined(__cplusplus)
  696. }
  697. #endif
  698. /* @} */
  699. #endif /* _FSL_SDMMC_HOST_H */