File indexing completed on 2025-05-11 08:23:02
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef _FSL_USDHC_H_
0009 #define _FSL_USDHC_H_
0010
0011 #include "fsl_common.h"
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #define FSL_USDHC_DRIVER_VERSION (MAKE_VERSION(2U, 8U, 2U))
0026
0027
0028
0029 #define USDHC_MAX_BLOCK_COUNT (USDHC_BLK_ATT_BLKCNT_MASK >> USDHC_BLK_ATT_BLKCNT_SHIFT)
0030
0031
0032 #ifndef FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER
0033 #define FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER 0U
0034 #endif
0035
0036
0037 enum
0038 {
0039 kStatus_USDHC_BusyTransferring = MAKE_STATUS(kStatusGroup_USDHC, 0U),
0040 kStatus_USDHC_PrepareAdmaDescriptorFailed = MAKE_STATUS(kStatusGroup_USDHC, 1U),
0041 kStatus_USDHC_SendCommandFailed = MAKE_STATUS(kStatusGroup_USDHC, 2U),
0042 kStatus_USDHC_TransferDataFailed = MAKE_STATUS(kStatusGroup_USDHC, 3U),
0043 kStatus_USDHC_DMADataAddrNotAlign = MAKE_STATUS(kStatusGroup_USDHC, 4U),
0044 kStatus_USDHC_ReTuningRequest = MAKE_STATUS(kStatusGroup_USDHC, 5U),
0045 kStatus_USDHC_TuningError = MAKE_STATUS(kStatusGroup_USDHC, 6U),
0046 kStatus_USDHC_NotSupport = MAKE_STATUS(kStatusGroup_USDHC, 7U),
0047 kStatus_USDHC_TransferDataComplete = MAKE_STATUS(kStatusGroup_USDHC, 8U),
0048 kStatus_USDHC_SendCommandSuccess = MAKE_STATUS(kStatusGroup_USDHC, 9U),
0049 kStatus_USDHC_TransferDMAComplete = MAKE_STATUS(kStatusGroup_USDHC, 10U),
0050 };
0051
0052
0053
0054
0055 enum
0056 {
0057 kUSDHC_SupportAdmaFlag = USDHC_HOST_CTRL_CAP_ADMAS_MASK,
0058 kUSDHC_SupportHighSpeedFlag = USDHC_HOST_CTRL_CAP_HSS_MASK,
0059 kUSDHC_SupportDmaFlag = USDHC_HOST_CTRL_CAP_DMAS_MASK,
0060 kUSDHC_SupportSuspendResumeFlag = USDHC_HOST_CTRL_CAP_SRS_MASK,
0061 kUSDHC_SupportV330Flag = USDHC_HOST_CTRL_CAP_VS33_MASK,
0062 kUSDHC_SupportV300Flag = USDHC_HOST_CTRL_CAP_VS30_MASK,
0063 kUSDHC_SupportV180Flag = USDHC_HOST_CTRL_CAP_VS18_MASK,
0064 kUSDHC_Support4BitFlag = (USDHC_HOST_CTRL_CAP_MBL_SHIFT << 0U),
0065
0066 kUSDHC_Support8BitFlag = (USDHC_HOST_CTRL_CAP_MBL_SHIFT << 1U),
0067
0068 kUSDHC_SupportDDR50Flag = USDHC_HOST_CTRL_CAP_DDR50_SUPPORT_MASK,
0069
0070
0071 #if defined(FSL_FEATURE_USDHC_HAS_SDR104_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR104_MODE)
0072 kUSDHC_SupportSDR104Flag = 0,
0073 #else
0074 kUSDHC_SupportSDR104Flag = USDHC_HOST_CTRL_CAP_SDR104_SUPPORT_MASK,
0075 #endif
0076 #if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE)
0077 kUSDHC_SupportSDR50Flag = 0U,
0078 #else
0079 kUSDHC_SupportSDR50Flag = USDHC_HOST_CTRL_CAP_SDR50_SUPPORT_MASK,
0080 #endif
0081 };
0082
0083
0084
0085
0086 enum
0087 {
0088 kUSDHC_WakeupEventOnCardInt = USDHC_PROT_CTRL_WECINT_MASK,
0089 kUSDHC_WakeupEventOnCardInsert = USDHC_PROT_CTRL_WECINS_MASK,
0090 kUSDHC_WakeupEventOnCardRemove = USDHC_PROT_CTRL_WECRM_MASK,
0091 kUSDHC_WakeupEventsAll =
0092 (kUSDHC_WakeupEventOnCardInt | kUSDHC_WakeupEventOnCardInsert | kUSDHC_WakeupEventOnCardRemove),
0093
0094 };
0095
0096
0097
0098
0099 enum
0100 {
0101 kUSDHC_ResetAll = USDHC_SYS_CTRL_RSTA_MASK,
0102 kUSDHC_ResetCommand = USDHC_SYS_CTRL_RSTC_MASK,
0103 kUSDHC_ResetData = USDHC_SYS_CTRL_RSTD_MASK,
0104
0105 #if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE)
0106 kUSDHC_ResetTuning = 0U,
0107 #else
0108 kUSDHC_ResetTuning = USDHC_SYS_CTRL_RSTT_MASK,
0109 #endif
0110
0111 kUSDHC_ResetsAll = (kUSDHC_ResetAll | kUSDHC_ResetCommand | kUSDHC_ResetData | kUSDHC_ResetTuning),
0112
0113 };
0114
0115
0116 enum
0117 {
0118 kUSDHC_EnableDmaFlag = USDHC_MIX_CTRL_DMAEN_MASK,
0119
0120 kUSDHC_CommandTypeSuspendFlag = USDHC_CMD_XFR_TYP_CMDTYP(1U),
0121 kUSDHC_CommandTypeResumeFlag = USDHC_CMD_XFR_TYP_CMDTYP(2U),
0122 kUSDHC_CommandTypeAbortFlag = USDHC_CMD_XFR_TYP_CMDTYP(3U),
0123
0124 kUSDHC_EnableBlockCountFlag = USDHC_MIX_CTRL_BCEN_MASK,
0125 kUSDHC_EnableAutoCommand12Flag = USDHC_MIX_CTRL_AC12EN_MASK,
0126 kUSDHC_DataReadFlag = USDHC_MIX_CTRL_DTDSEL_MASK,
0127 kUSDHC_MultipleBlockFlag = USDHC_MIX_CTRL_MSBSEL_MASK,
0128 kUSDHC_EnableAutoCommand23Flag = USDHC_MIX_CTRL_AC23EN_MASK,
0129
0130 kUSDHC_ResponseLength136Flag = USDHC_CMD_XFR_TYP_RSPTYP(1U),
0131 kUSDHC_ResponseLength48Flag = USDHC_CMD_XFR_TYP_RSPTYP(2U),
0132 kUSDHC_ResponseLength48BusyFlag = USDHC_CMD_XFR_TYP_RSPTYP(3U),
0133
0134 kUSDHC_EnableCrcCheckFlag = USDHC_CMD_XFR_TYP_CCCEN_MASK,
0135 kUSDHC_EnableIndexCheckFlag = USDHC_CMD_XFR_TYP_CICEN_MASK,
0136 kUSDHC_DataPresentFlag = USDHC_CMD_XFR_TYP_DPSEL_MASK,
0137 };
0138
0139
0140
0141
0142 enum
0143 {
0144 kUSDHC_CommandInhibitFlag = USDHC_PRES_STATE_CIHB_MASK,
0145 kUSDHC_DataInhibitFlag = USDHC_PRES_STATE_CDIHB_MASK,
0146 kUSDHC_DataLineActiveFlag = USDHC_PRES_STATE_DLA_MASK,
0147 kUSDHC_SdClockStableFlag = USDHC_PRES_STATE_SDSTB_MASK,
0148 kUSDHC_WriteTransferActiveFlag = USDHC_PRES_STATE_WTA_MASK,
0149 kUSDHC_ReadTransferActiveFlag = USDHC_PRES_STATE_RTA_MASK,
0150 kUSDHC_BufferWriteEnableFlag = USDHC_PRES_STATE_BWEN_MASK,
0151 kUSDHC_BufferReadEnableFlag = USDHC_PRES_STATE_BREN_MASK,
0152
0153 #if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE)
0154 kUSDHC_DelaySettingFinishedFlag = 0U,
0155 kUSDHC_ReTuningRequestFlag = 0U,
0156 #else
0157 kUSDHC_ReTuningRequestFlag = USDHC_PRES_STATE_RTR_MASK,
0158 kUSDHC_DelaySettingFinishedFlag = USDHC_PRES_STATE_TSCD_MASK,
0159 #endif
0160
0161 kUSDHC_CardInsertedFlag = USDHC_PRES_STATE_CINST_MASK,
0162 kUSDHC_CommandLineLevelFlag = USDHC_PRES_STATE_CLSL_MASK,
0163
0164 kUSDHC_Data0LineLevelFlag = 1U << USDHC_PRES_STATE_DLSL_SHIFT,
0165 kUSDHC_Data1LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 1U),
0166 kUSDHC_Data2LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 2U),
0167 kUSDHC_Data3LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 3U),
0168 kUSDHC_Data4LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 4U),
0169 kUSDHC_Data5LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 5U),
0170 kUSDHC_Data6LineLevelFlag = 1U << (USDHC_PRES_STATE_DLSL_SHIFT + 6U),
0171 kUSDHC_Data7LineLevelFlag = (int)(1U << (USDHC_PRES_STATE_DLSL_SHIFT + 7U)),
0172 };
0173
0174
0175
0176
0177 enum
0178 {
0179 kUSDHC_CommandCompleteFlag = USDHC_INT_STATUS_CC_MASK,
0180 kUSDHC_DataCompleteFlag = USDHC_INT_STATUS_TC_MASK,
0181 kUSDHC_BlockGapEventFlag = USDHC_INT_STATUS_BGE_MASK,
0182 kUSDHC_DmaCompleteFlag = USDHC_INT_STATUS_DINT_MASK,
0183 kUSDHC_BufferWriteReadyFlag = USDHC_INT_STATUS_BWR_MASK,
0184 kUSDHC_BufferReadReadyFlag = USDHC_INT_STATUS_BRR_MASK,
0185 kUSDHC_CardInsertionFlag = USDHC_INT_STATUS_CINS_MASK,
0186 kUSDHC_CardRemovalFlag = USDHC_INT_STATUS_CRM_MASK,
0187 kUSDHC_CardInterruptFlag = USDHC_INT_STATUS_CINT_MASK,
0188
0189 #if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE)
0190 kUSDHC_ReTuningEventFlag = 0U,
0191 kUSDHC_TuningPassFlag = 0U,
0192 kUSDHC_TuningErrorFlag = 0U,
0193 #else
0194 kUSDHC_ReTuningEventFlag = USDHC_INT_STATUS_RTE_MASK,
0195 kUSDHC_TuningPassFlag = USDHC_INT_STATUS_TP_MASK,
0196 kUSDHC_TuningErrorFlag = USDHC_INT_STATUS_TNE_MASK,
0197 #endif
0198
0199 kUSDHC_CommandTimeoutFlag = USDHC_INT_STATUS_CTOE_MASK,
0200 kUSDHC_CommandCrcErrorFlag = USDHC_INT_STATUS_CCE_MASK,
0201 kUSDHC_CommandEndBitErrorFlag = USDHC_INT_STATUS_CEBE_MASK,
0202 kUSDHC_CommandIndexErrorFlag = USDHC_INT_STATUS_CIE_MASK,
0203 kUSDHC_DataTimeoutFlag = USDHC_INT_STATUS_DTOE_MASK,
0204 kUSDHC_DataCrcErrorFlag = USDHC_INT_STATUS_DCE_MASK,
0205 kUSDHC_DataEndBitErrorFlag = USDHC_INT_STATUS_DEBE_MASK,
0206 kUSDHC_AutoCommand12ErrorFlag = USDHC_INT_STATUS_AC12E_MASK,
0207 kUSDHC_DmaErrorFlag = USDHC_INT_STATUS_DMAE_MASK,
0208
0209 kUSDHC_CommandErrorFlag = (kUSDHC_CommandTimeoutFlag | kUSDHC_CommandCrcErrorFlag | kUSDHC_CommandEndBitErrorFlag |
0210 kUSDHC_CommandIndexErrorFlag),
0211 kUSDHC_DataErrorFlag = (kUSDHC_DataTimeoutFlag | kUSDHC_DataCrcErrorFlag | kUSDHC_DataEndBitErrorFlag |
0212 kUSDHC_AutoCommand12ErrorFlag),
0213 kUSDHC_ErrorFlag = (kUSDHC_CommandErrorFlag | kUSDHC_DataErrorFlag | kUSDHC_DmaErrorFlag),
0214
0215 kUSDHC_DataFlag = (kUSDHC_DataCompleteFlag | kUSDHC_BufferWriteReadyFlag | kUSDHC_BufferReadReadyFlag |
0216 kUSDHC_DataErrorFlag),
0217
0218 kUSDHC_DataDMAFlag = (kUSDHC_DataCompleteFlag | kUSDHC_DataErrorFlag | kUSDHC_DmaErrorFlag),
0219
0220 kUSDHC_CommandFlag = (kUSDHC_CommandErrorFlag | kUSDHC_CommandCompleteFlag),
0221 kUSDHC_CardDetectFlag = (kUSDHC_CardInsertionFlag | kUSDHC_CardRemovalFlag),
0222 kUSDHC_SDR104TuningFlag = (kUSDHC_TuningErrorFlag | kUSDHC_TuningPassFlag | kUSDHC_ReTuningEventFlag),
0223
0224 kUSDHC_AllInterruptFlags =
0225 (kUSDHC_BlockGapEventFlag | kUSDHC_CardInterruptFlag | kUSDHC_CommandFlag | kUSDHC_DataFlag | kUSDHC_ErrorFlag |
0226 kUSDHC_SDR104TuningFlag | kUSDHC_DmaCompleteFlag),
0227 };
0228
0229
0230
0231
0232 enum
0233 {
0234 kUSDHC_AutoCommand12NotExecutedFlag = USDHC_AUTOCMD12_ERR_STATUS_AC12NE_MASK,
0235 kUSDHC_AutoCommand12TimeoutFlag = USDHC_AUTOCMD12_ERR_STATUS_AC12TOE_MASK,
0236 kUSDHC_AutoCommand12EndBitErrorFlag = USDHC_AUTOCMD12_ERR_STATUS_AC12EBE_MASK,
0237 kUSDHC_AutoCommand12CrcErrorFlag = USDHC_AUTOCMD12_ERR_STATUS_AC12CE_MASK,
0238 kUSDHC_AutoCommand12IndexErrorFlag = USDHC_AUTOCMD12_ERR_STATUS_AC12IE_MASK,
0239 kUSDHC_AutoCommand12NotIssuedFlag = USDHC_AUTOCMD12_ERR_STATUS_CNIBAC12E_MASK,
0240 };
0241
0242
0243 enum
0244 {
0245 #if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE)
0246 kUSDHC_ExecuteTuning = 0U,
0247 kUSDHC_TuningSampleClockSel = 0U,
0248 #else
0249 kUSDHC_ExecuteTuning = USDHC_AUTOCMD12_ERR_STATUS_EXECUTE_TUNING_MASK,
0250 kUSDHC_TuningSampleClockSel =
0251 USDHC_AUTOCMD12_ERR_STATUS_SMP_CLK_SEL_MASK,
0252
0253 #endif
0254 };
0255
0256
0257
0258
0259 enum
0260 {
0261 kUSDHC_AdmaLenghMismatchFlag = USDHC_ADMA_ERR_STATUS_ADMALME_MASK,
0262 kUSDHC_AdmaDescriptorErrorFlag = USDHC_ADMA_ERR_STATUS_ADMADCE_MASK,
0263 };
0264
0265
0266
0267
0268
0269
0270 enum
0271 {
0272 kUSDHC_AdmaErrorStateStopDma = 0x00U,
0273
0274 kUSDHC_AdmaErrorStateFetchDescriptor = 0x01U,
0275
0276 kUSDHC_AdmaErrorStateChangeAddress = 0x02U,
0277 kUSDHC_AdmaErrorStateTransferData = 0x03U,
0278
0279 kUSDHC_AdmaErrorStateInvalidLength = 0x04U,
0280 kUSDHC_AdmaErrorStateInvalidDescriptor = 0x08U,
0281
0282 kUSDHC_AdmaErrorState = kUSDHC_AdmaErrorStateInvalidLength | kUSDHC_AdmaErrorStateInvalidDescriptor |
0283 kUSDHC_AdmaErrorStateFetchDescriptor,
0284 };
0285
0286
0287
0288
0289 enum
0290 {
0291 kUSDHC_ForceEventAutoCommand12NotExecuted =
0292 USDHC_FORCE_EVENT_FEVTAC12NE_MASK,
0293 kUSDHC_ForceEventAutoCommand12Timeout = USDHC_FORCE_EVENT_FEVTAC12TOE_MASK,
0294 kUSDHC_ForceEventAutoCommand12CrcError = USDHC_FORCE_EVENT_FEVTAC12CE_MASK,
0295 kUSDHC_ForceEventEndBitError = USDHC_FORCE_EVENT_FEVTAC12EBE_MASK,
0296 kUSDHC_ForceEventAutoCommand12IndexError = USDHC_FORCE_EVENT_FEVTAC12IE_MASK,
0297 kUSDHC_ForceEventAutoCommand12NotIssued = USDHC_FORCE_EVENT_FEVTCNIBAC12E_MASK,
0298 kUSDHC_ForceEventCommandTimeout = USDHC_FORCE_EVENT_FEVTCTOE_MASK,
0299 kUSDHC_ForceEventCommandCrcError = USDHC_FORCE_EVENT_FEVTCCE_MASK,
0300 kUSDHC_ForceEventCommandEndBitError = USDHC_FORCE_EVENT_FEVTCEBE_MASK,
0301 kUSDHC_ForceEventCommandIndexError = USDHC_FORCE_EVENT_FEVTCIE_MASK,
0302 kUSDHC_ForceEventDataTimeout = USDHC_FORCE_EVENT_FEVTDTOE_MASK,
0303 kUSDHC_ForceEventDataCrcError = USDHC_FORCE_EVENT_FEVTDCE_MASK,
0304 kUSDHC_ForceEventDataEndBitError = USDHC_FORCE_EVENT_FEVTDEBE_MASK,
0305 kUSDHC_ForceEventAutoCommand12Error = USDHC_FORCE_EVENT_FEVTAC12E_MASK,
0306 kUSDHC_ForceEventCardInt = (int)USDHC_FORCE_EVENT_FEVTCINT_MASK,
0307 kUSDHC_ForceEventDmaError = USDHC_FORCE_EVENT_FEVTDMAE_MASK,
0308 #if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (!FSL_FEATURE_USDHC_HAS_SDR50_MODE)
0309 kUSDHC_ForceEventTuningError = 0U,
0310 #else
0311 kUSDHC_ForceEventTuningError = USDHC_FORCE_EVENT_FEVTTNE_MASK,
0312 #endif
0313
0314 kUSDHC_ForceEventsAll =
0315 (int)(USDHC_FORCE_EVENT_FEVTAC12NE_MASK | USDHC_FORCE_EVENT_FEVTAC12TOE_MASK |
0316 USDHC_FORCE_EVENT_FEVTAC12CE_MASK | USDHC_FORCE_EVENT_FEVTAC12EBE_MASK |
0317 USDHC_FORCE_EVENT_FEVTAC12IE_MASK | USDHC_FORCE_EVENT_FEVTCNIBAC12E_MASK |
0318 USDHC_FORCE_EVENT_FEVTCTOE_MASK | USDHC_FORCE_EVENT_FEVTCCE_MASK | USDHC_FORCE_EVENT_FEVTCEBE_MASK |
0319 USDHC_FORCE_EVENT_FEVTCIE_MASK | USDHC_FORCE_EVENT_FEVTDTOE_MASK | USDHC_FORCE_EVENT_FEVTDCE_MASK |
0320 USDHC_FORCE_EVENT_FEVTDEBE_MASK | USDHC_FORCE_EVENT_FEVTAC12E_MASK | USDHC_FORCE_EVENT_FEVTCINT_MASK |
0321 USDHC_FORCE_EVENT_FEVTDMAE_MASK | kUSDHC_ForceEventTuningError),
0322 };
0323
0324
0325 typedef enum _usdhc_transfer_direction
0326 {
0327 kUSDHC_TransferDirectionReceive = 1U,
0328 kUSDHC_TransferDirectionSend = 0U,
0329 } usdhc_transfer_direction_t;
0330
0331
0332 typedef enum _usdhc_data_bus_width
0333 {
0334 kUSDHC_DataBusWidth1Bit = 0U,
0335 kUSDHC_DataBusWidth4Bit = 1U,
0336 kUSDHC_DataBusWidth8Bit = 2U,
0337 } usdhc_data_bus_width_t;
0338
0339
0340 typedef enum _usdhc_endian_mode
0341 {
0342 kUSDHC_EndianModeBig = 0U,
0343 kUSDHC_EndianModeHalfWordBig = 1U,
0344 kUSDHC_EndianModeLittle = 2U,
0345 } usdhc_endian_mode_t;
0346
0347
0348 typedef enum _usdhc_dma_mode
0349 {
0350 kUSDHC_DmaModeSimple = 0U,
0351 kUSDHC_DmaModeAdma1 = 1U,
0352 kUSDHC_DmaModeAdma2 = 2U,
0353 kUSDHC_ExternalDMA = 3U,
0354 } usdhc_dma_mode_t;
0355
0356
0357
0358
0359 enum
0360 {
0361 kUSDHC_StopAtBlockGapFlag = USDHC_PROT_CTRL_SABGREQ_MASK,
0362 kUSDHC_ReadWaitControlFlag = USDHC_PROT_CTRL_RWCTL_MASK,
0363 kUSDHC_InterruptAtBlockGapFlag = USDHC_PROT_CTRL_IABG_MASK,
0364 kUSDHC_ReadDoneNo8CLK = USDHC_PROT_CTRL_RD_DONE_NO_8CLK_MASK,
0365 kUSDHC_ExactBlockNumberReadFlag = USDHC_PROT_CTRL_NON_EXACT_BLK_RD_MASK,
0366 };
0367
0368
0369 typedef enum _usdhc_boot_mode
0370 {
0371 kUSDHC_BootModeNormal = 0U,
0372 kUSDHC_BootModeAlternative = 1U,
0373 } usdhc_boot_mode_t;
0374
0375
0376 typedef enum _usdhc_card_command_type
0377 {
0378 kCARD_CommandTypeNormal = 0U,
0379 kCARD_CommandTypeSuspend = 1U,
0380 kCARD_CommandTypeResume = 2U,
0381 kCARD_CommandTypeAbort = 3U,
0382 kCARD_CommandTypeEmpty = 4U,
0383 } usdhc_card_command_type_t;
0384
0385
0386
0387
0388
0389
0390 typedef enum _usdhc_card_response_type
0391 {
0392 kCARD_ResponseTypeNone = 0U,
0393 kCARD_ResponseTypeR1 = 1U,
0394 kCARD_ResponseTypeR1b = 2U,
0395 kCARD_ResponseTypeR2 = 3U,
0396 kCARD_ResponseTypeR3 = 4U,
0397 kCARD_ResponseTypeR4 = 5U,
0398 kCARD_ResponseTypeR5 = 6U,
0399 kCARD_ResponseTypeR5b = 7U,
0400 kCARD_ResponseTypeR6 = 8U,
0401 kCARD_ResponseTypeR7 = 9U,
0402 } usdhc_card_response_type_t;
0403
0404
0405 #define USDHC_ADMA1_ADDRESS_ALIGN (4096U)
0406
0407 #define USDHC_ADMA1_LENGTH_ALIGN (4096U)
0408
0409 #define USDHC_ADMA2_ADDRESS_ALIGN (4U)
0410
0411 #define USDHC_ADMA2_LENGTH_ALIGN (4U)
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453 #define USDHC_ADMA1_DESCRIPTOR_ADDRESS_SHIFT (12U)
0454
0455 #define USDHC_ADMA1_DESCRIPTOR_ADDRESS_MASK (0xFFFFFU)
0456
0457 #define USDHC_ADMA1_DESCRIPTOR_LENGTH_SHIFT (12U)
0458
0459 #define USDHC_ADMA1_DESCRIPTOR_LENGTH_MASK (0xFFFFU)
0460
0461
0462
0463
0464
0465
0466 #define USDHC_ADMA1_DESCRIPTOR_MAX_LENGTH_PER_ENTRY (USDHC_ADMA1_DESCRIPTOR_LENGTH_MASK + 1U - 4096U)
0467
0468
0469 enum
0470 {
0471 kUSDHC_Adma1DescriptorValidFlag = (1U << 0U),
0472 kUSDHC_Adma1DescriptorEndFlag = (1U << 1U),
0473 kUSDHC_Adma1DescriptorInterrupFlag = (1U << 2U),
0474 kUSDHC_Adma1DescriptorActivity1Flag = (1U << 4U),
0475 kUSDHC_Adma1DescriptorActivity2Flag = (1U << 5U),
0476 kUSDHC_Adma1DescriptorTypeNop = (kUSDHC_Adma1DescriptorValidFlag),
0477 kUSDHC_Adma1DescriptorTypeTransfer = (kUSDHC_Adma1DescriptorActivity2Flag | kUSDHC_Adma1DescriptorValidFlag),
0478
0479 kUSDHC_Adma1DescriptorTypeLink = (kUSDHC_Adma1DescriptorActivity1Flag | kUSDHC_Adma1DescriptorActivity2Flag |
0480 kUSDHC_Adma1DescriptorValidFlag),
0481 kUSDHC_Adma1DescriptorTypeSetLength = (kUSDHC_Adma1DescriptorActivity1Flag | kUSDHC_Adma1DescriptorValidFlag),
0482
0483 };
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525 #define USDHC_ADMA2_DESCRIPTOR_LENGTH_SHIFT (16U)
0526
0527 #define USDHC_ADMA2_DESCRIPTOR_LENGTH_MASK (0xFFFFU)
0528
0529 #define USDHC_ADMA2_DESCRIPTOR_MAX_LENGTH_PER_ENTRY (USDHC_ADMA2_DESCRIPTOR_LENGTH_MASK - 3U)
0530
0531
0532 enum
0533 {
0534 kUSDHC_Adma2DescriptorValidFlag = (1U << 0U),
0535 kUSDHC_Adma2DescriptorEndFlag = (1U << 1U),
0536 kUSDHC_Adma2DescriptorInterruptFlag = (1U << 2U),
0537 kUSDHC_Adma2DescriptorActivity1Flag = (1U << 4U),
0538 kUSDHC_Adma2DescriptorActivity2Flag = (1U << 5U),
0539
0540 kUSDHC_Adma2DescriptorTypeNop = (kUSDHC_Adma2DescriptorValidFlag),
0541 kUSDHC_Adma2DescriptorTypeReserved = (kUSDHC_Adma2DescriptorActivity1Flag | kUSDHC_Adma2DescriptorValidFlag),
0542
0543 kUSDHC_Adma2DescriptorTypeTransfer = (kUSDHC_Adma2DescriptorActivity2Flag | kUSDHC_Adma2DescriptorValidFlag),
0544
0545 kUSDHC_Adma2DescriptorTypeLink = (kUSDHC_Adma2DescriptorActivity1Flag | kUSDHC_Adma2DescriptorActivity2Flag |
0546 kUSDHC_Adma2DescriptorValidFlag),
0547 };
0548
0549
0550
0551
0552 enum
0553 {
0554 kUSDHC_AdmaDescriptorSingleFlag = 0U,
0555
0556
0557 kUSDHC_AdmaDescriptorMultipleFlag =
0558 1U,
0559
0560
0561
0562 };
0563
0564
0565 typedef enum _usdhc_burst_len
0566 {
0567 kUSDHC_EnBurstLenForINCR = 0x01U,
0568 kUSDHC_EnBurstLenForINCR4816 = 0x02U,
0569 kUSDHC_EnBurstLenForINCR4816WRAP = 0x04U,
0570 } usdhc_burst_len_t;
0571
0572
0573 enum
0574 {
0575 kUSDHC_TransferDataNormal = 0U,
0576 kUSDHC_TransferDataTuning = 1U,
0577 kUSDHC_TransferDataBoot = 2U,
0578 kUSDHC_TransferDataBootcontinous = 3U,
0579 };
0580
0581
0582 typedef uint32_t usdhc_adma1_descriptor_t;
0583
0584
0585 typedef struct _usdhc_adma2_descriptor
0586 {
0587 uint32_t attribute;
0588 const uint32_t *address;
0589 } usdhc_adma2_descriptor_t;
0590
0591
0592
0593
0594
0595
0596 typedef struct _usdhc_capability
0597 {
0598 uint32_t sdVersion;
0599 uint32_t mmcVersion;
0600 uint32_t maxBlockLength;
0601 uint32_t maxBlockCount;
0602 uint32_t flags;
0603 } usdhc_capability_t;
0604
0605
0606 typedef struct _usdhc_boot_config
0607 {
0608 uint32_t ackTimeoutCount;
0609 usdhc_boot_mode_t bootMode;
0610 uint32_t blockCount;
0611 size_t blockSize;
0612 bool enableBootAck;
0613 bool enableAutoStopAtBlockGap;
0614 } usdhc_boot_config_t;
0615
0616
0617 typedef struct _usdhc_config
0618 {
0619 uint32_t dataTimeout;
0620 usdhc_endian_mode_t endianMode;
0621 uint8_t readWatermarkLevel;
0622 uint8_t writeWatermarkLevel;
0623 #if !(defined(FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) && FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN)
0624 uint8_t readBurstLen;
0625 uint8_t writeBurstLen;
0626 #endif
0627 } usdhc_config_t;
0628
0629
0630
0631
0632
0633
0634 typedef struct _usdhc_command
0635 {
0636 uint32_t index;
0637 uint32_t argument;
0638 usdhc_card_command_type_t type;
0639 usdhc_card_response_type_t responseType;
0640 uint32_t response[4U];
0641 uint32_t responseErrorFlags;
0642
0643 uint32_t flags;
0644 } usdhc_command_t;
0645
0646
0647 typedef struct _usdhc_adma_config
0648 {
0649 usdhc_dma_mode_t dmaMode;
0650 #if !(defined(FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) && FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN)
0651 usdhc_burst_len_t burstLen;
0652 #endif
0653 uint32_t *admaTable;
0654 uint32_t admaTableWords;
0655 } usdhc_adma_config_t;
0656
0657
0658
0659
0660
0661
0662 typedef struct _usdhc_scatter_gather_data_list
0663 {
0664 uint32_t *dataAddr;
0665 uint32_t dataSize;
0666 struct _usdhc_scatter_gather_data_list *dataList;
0667 } usdhc_scatter_gather_data_list_t;
0668
0669
0670
0671
0672
0673
0674
0675
0676 typedef struct _usdhc_scatter_gather_data
0677 {
0678 bool enableAutoCommand12;
0679 bool enableAutoCommand23;
0680 bool enableIgnoreError;
0681
0682 usdhc_transfer_direction_t dataDirection;
0683 uint8_t dataType;
0684 size_t blockSize;
0685
0686 usdhc_scatter_gather_data_list_t sgData;
0687 } usdhc_scatter_gather_data_t;
0688
0689
0690 typedef struct _usdhc_scatter_gather_transfer
0691 {
0692 usdhc_scatter_gather_data_t *data;
0693 usdhc_command_t *command;
0694 } usdhc_scatter_gather_transfer_t;
0695
0696
0697
0698
0699
0700
0701
0702
0703 typedef struct _usdhc_data
0704 {
0705 bool enableAutoCommand12;
0706 bool enableAutoCommand23;
0707 bool enableIgnoreError;
0708 uint8_t dataType;
0709 size_t blockSize;
0710 uint32_t blockCount;
0711 uint32_t *rxData;
0712 const uint32_t *txData;
0713 } usdhc_data_t;
0714
0715
0716 typedef struct _usdhc_transfer
0717 {
0718 usdhc_data_t *data;
0719 usdhc_command_t *command;
0720 } usdhc_transfer_t;
0721
0722
0723 typedef struct _usdhc_handle usdhc_handle_t;
0724
0725
0726 typedef struct _usdhc_transfer_callback
0727 {
0728 void (*CardInserted)(USDHC_Type *base,
0729 void *userData);
0730 void (*CardRemoved)(USDHC_Type *base, void *userData);
0731 void (*SdioInterrupt)(USDHC_Type *base, void *userData);
0732 void (*BlockGap)(USDHC_Type *base, void *userData);
0733 void (*TransferComplete)(USDHC_Type *base,
0734 usdhc_handle_t *handle,
0735 status_t status,
0736 void *userData);
0737 void (*ReTuning)(USDHC_Type *base, void *userData);
0738 } usdhc_transfer_callback_t;
0739
0740
0741
0742
0743
0744
0745
0746
0747 struct _usdhc_handle
0748 {
0749 #if (defined FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER) && FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER
0750 usdhc_scatter_gather_data_t *volatile data;
0751 #else
0752 usdhc_data_t *volatile data;
0753 #endif
0754 usdhc_command_t *volatile command;
0755
0756 volatile uint32_t transferredWords;
0757
0758 usdhc_transfer_callback_t callback;
0759 void *userData;
0760 };
0761
0762
0763 typedef status_t (*usdhc_transfer_function_t)(USDHC_Type *base, usdhc_transfer_t *content);
0764
0765
0766 typedef struct _usdhc_host
0767 {
0768 USDHC_Type *base;
0769 uint32_t sourceClock_Hz;
0770 usdhc_config_t config;
0771 usdhc_capability_t capability;
0772 usdhc_transfer_function_t transfer;
0773 } usdhc_host_t;
0774
0775
0776
0777
0778 #if defined(__cplusplus)
0779 extern "C" {
0780 #endif
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807 void USDHC_Init(USDHC_Type *base, const usdhc_config_t *config);
0808
0809
0810
0811
0812
0813
0814 void USDHC_Deinit(USDHC_Type *base);
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825 bool USDHC_Reset(USDHC_Type *base, uint32_t mask, uint32_t timeout);
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845 status_t USDHC_SetAdmaTableConfig(USDHC_Type *base,
0846 usdhc_adma_config_t *dmaConfig,
0847 usdhc_data_t *dataConfig,
0848 uint32_t flags);
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861 status_t USDHC_SetInternalDmaConfig(USDHC_Type *base,
0862 usdhc_adma_config_t *dmaConfig,
0863 const uint32_t *dataAddr,
0864 bool enAutoCmd23);
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878 status_t USDHC_SetADMA2Descriptor(
0879 uint32_t *admaTable, uint32_t admaTableWords, const uint32_t *dataBufferAddr, uint32_t dataBytes, uint32_t flags);
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893 status_t USDHC_SetADMA1Descriptor(
0894 uint32_t *admaTable, uint32_t admaTableWords, const uint32_t *dataBufferAddr, uint32_t dataBytes, uint32_t flags);
0895
0896
0897
0898
0899
0900
0901
0902 static inline void USDHC_EnableInternalDMA(USDHC_Type *base, bool enable)
0903 {
0904 if (enable)
0905 {
0906 base->MIX_CTRL |= USDHC_MIX_CTRL_DMAEN_MASK;
0907 }
0908 else
0909 {
0910 base->MIX_CTRL &= ~USDHC_MIX_CTRL_DMAEN_MASK;
0911 base->PROT_CTRL &= ~USDHC_PROT_CTRL_DMASEL_MASK;
0912 }
0913 }
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928 static inline void USDHC_EnableInterruptStatus(USDHC_Type *base, uint32_t mask)
0929 {
0930 base->INT_STATUS_EN |= mask;
0931 }
0932
0933
0934
0935
0936
0937
0938
0939 static inline void USDHC_DisableInterruptStatus(USDHC_Type *base, uint32_t mask)
0940 {
0941 base->INT_STATUS_EN &= ~mask;
0942 }
0943
0944
0945
0946
0947
0948
0949
0950 static inline void USDHC_EnableInterruptSignal(USDHC_Type *base, uint32_t mask)
0951 {
0952 base->INT_SIGNAL_EN |= mask;
0953 }
0954
0955
0956
0957
0958
0959
0960
0961 static inline void USDHC_DisableInterruptSignal(USDHC_Type *base, uint32_t mask)
0962 {
0963 base->INT_SIGNAL_EN &= ~mask;
0964 }
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979 static inline uint32_t USDHC_GetEnabledInterruptStatusFlags(USDHC_Type *base)
0980 {
0981 uint32_t intStatus = base->INT_STATUS;
0982
0983 return intStatus & base->INT_SIGNAL_EN;
0984 }
0985
0986
0987
0988
0989
0990
0991
0992 static inline uint32_t USDHC_GetInterruptStatusFlags(USDHC_Type *base)
0993 {
0994 return base->INT_STATUS;
0995 }
0996
0997
0998
0999
1000
1001
1002
1003 static inline void USDHC_ClearInterruptStatusFlags(USDHC_Type *base, uint32_t mask)
1004 {
1005 base->INT_STATUS = mask;
1006 }
1007
1008
1009
1010
1011
1012
1013
1014 static inline uint32_t USDHC_GetAutoCommand12ErrorStatusFlags(USDHC_Type *base)
1015 {
1016 return base->AUTOCMD12_ERR_STATUS;
1017 }
1018
1019
1020
1021
1022
1023
1024
1025 static inline uint32_t USDHC_GetAdmaErrorStatusFlags(USDHC_Type *base)
1026 {
1027 return base->ADMA_ERR_STATUS & 0xFUL;
1028 }
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038 static inline uint32_t USDHC_GetPresentStatusFlags(USDHC_Type *base)
1039 {
1040 return base->PRES_STATE;
1041 }
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056 void USDHC_GetCapability(USDHC_Type *base, usdhc_capability_t *capability);
1057
1058
1059
1060
1061
1062
1063
1064 static inline void USDHC_ForceClockOn(USDHC_Type *base, bool enable)
1065 {
1066 if (enable)
1067 {
1068 base->VEND_SPEC |= USDHC_VEND_SPEC_FRC_SDCLK_ON_MASK;
1069 }
1070 else
1071 {
1072 base->VEND_SPEC &= ~USDHC_VEND_SPEC_FRC_SDCLK_ON_MASK;
1073 }
1074 }
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085 uint32_t USDHC_SetSdClock(USDHC_Type *base, uint32_t srcClock_Hz, uint32_t busClock_Hz);
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098 bool USDHC_SetCardActive(USDHC_Type *base, uint32_t timeout);
1099
1100
1101
1102
1103
1104
1105
1106 static inline void USDHC_AssertHardwareReset(USDHC_Type *base, bool high)
1107 {
1108 if (high)
1109 {
1110 base->SYS_CTRL |= USDHC_SYS_CTRL_IPP_RST_N_MASK;
1111 }
1112 else
1113 {
1114 base->SYS_CTRL &= ~USDHC_SYS_CTRL_IPP_RST_N_MASK;
1115 }
1116 }
1117
1118
1119
1120
1121
1122
1123
1124 static inline void USDHC_SetDataBusWidth(USDHC_Type *base, usdhc_data_bus_width_t width)
1125 {
1126 base->PROT_CTRL = ((base->PROT_CTRL & ~USDHC_PROT_CTRL_DTW_MASK) | USDHC_PROT_CTRL_DTW(width));
1127 }
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137 static inline void USDHC_WriteData(USDHC_Type *base, uint32_t data)
1138 {
1139 base->DATA_BUFF_ACC_PORT = data;
1140 }
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150 static inline uint32_t USDHC_ReadData(USDHC_Type *base)
1151 {
1152 return base->DATA_BUFF_ACC_PORT;
1153 }
1154
1155
1156
1157
1158
1159
1160
1161 void USDHC_SendCommand(USDHC_Type *base, usdhc_command_t *command);
1162
1163
1164
1165
1166
1167
1168
1169
1170 static inline void USDHC_EnableWakeupEvent(USDHC_Type *base, uint32_t mask, bool enable)
1171 {
1172 if (enable)
1173 {
1174 base->PROT_CTRL |= mask;
1175 }
1176 else
1177 {
1178 base->PROT_CTRL &= ~mask;
1179 }
1180 }
1181
1182
1183
1184
1185
1186
1187
1188 static inline void USDHC_CardDetectByData3(USDHC_Type *base, bool enable)
1189 {
1190 if (enable)
1191 {
1192 base->PROT_CTRL |= USDHC_PROT_CTRL_D3CD_MASK;
1193 }
1194 else
1195 {
1196 base->PROT_CTRL &= ~USDHC_PROT_CTRL_D3CD_MASK;
1197 }
1198 }
1199
1200
1201
1202
1203
1204
1205 static inline bool USDHC_DetectCardInsert(USDHC_Type *base)
1206 {
1207 return ((base->PRES_STATE & (uint32_t)kUSDHC_CardInsertedFlag) != 0UL) ? true : false;
1208 }
1209
1210
1211
1212
1213
1214
1215
1216
1217 static inline void USDHC_EnableSdioControl(USDHC_Type *base, uint32_t mask, bool enable)
1218 {
1219 if (enable)
1220 {
1221 base->PROT_CTRL |= mask;
1222 }
1223 else
1224 {
1225 base->PROT_CTRL &= ~mask;
1226 }
1227 }
1228
1229
1230
1231
1232
1233
1234 static inline void USDHC_SetContinueRequest(USDHC_Type *base)
1235 {
1236 base->PROT_CTRL |= USDHC_PROT_CTRL_CREQ_MASK;
1237 }
1238
1239
1240
1241
1242
1243
1244
1245 static inline void USDHC_RequestStopAtBlockGap(USDHC_Type *base, bool enable)
1246 {
1247 if (enable)
1248 {
1249 base->PROT_CTRL |= USDHC_PROT_CTRL_SABGREQ_MASK;
1250 }
1251 else
1252 {
1253 base->PROT_CTRL &= ~USDHC_PROT_CTRL_SABGREQ_MASK;
1254 }
1255 }
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275 void USDHC_SetMmcBootConfig(USDHC_Type *base, const usdhc_boot_config_t *config);
1276
1277
1278
1279
1280
1281
1282
1283 static inline void USDHC_EnableMmcBoot(USDHC_Type *base, bool enable)
1284 {
1285 if (enable)
1286 {
1287 base->MMC_BOOT |= USDHC_MMC_BOOT_BOOT_EN_MASK;
1288 }
1289 else
1290 {
1291 base->MMC_BOOT &= ~USDHC_MMC_BOOT_BOOT_EN_MASK;
1292 }
1293 }
1294
1295
1296
1297
1298
1299
1300
1301 static inline void USDHC_SetForceEvent(USDHC_Type *base, uint32_t mask)
1302 {
1303 base->FORCE_EVENT = mask;
1304 }
1305
1306 #if !(defined(FSL_FEATURE_USDHC_HAS_NO_VOLTAGE_SELECT) && (FSL_FEATURE_USDHC_HAS_NO_VOLTAGE_SELECT))
1307
1308
1309
1310
1311
1312
1313 static inline void UDSHC_SelectVoltage(USDHC_Type *base, bool en18v)
1314 {
1315 if (en18v)
1316 {
1317 base->VEND_SPEC |= USDHC_VEND_SPEC_VSELECT_MASK;
1318 }
1319 else
1320 {
1321 base->VEND_SPEC &= ~USDHC_VEND_SPEC_VSELECT_MASK;
1322 }
1323 }
1324 #endif
1325
1326 #if defined(FSL_FEATURE_USDHC_HAS_SDR50_MODE) && (FSL_FEATURE_USDHC_HAS_SDR50_MODE)
1327
1328
1329
1330
1331
1332 static inline bool USDHC_RequestTuningForSDR50(USDHC_Type *base)
1333 {
1334 return ((base->HOST_CTRL_CAP & USDHC_HOST_CTRL_CAP_USE_TUNING_SDR50_MASK) != 0UL) ? true : false;
1335 }
1336
1337
1338
1339
1340
1341
1342 static inline bool USDHC_RequestReTuning(USDHC_Type *base)
1343 {
1344 return ((base->PRES_STATE & USDHC_PRES_STATE_RTR_MASK) != 0UL) ? true : false;
1345 }
1346
1347
1348
1349
1350
1351
1352
1353
1354 static inline void USDHC_EnableAutoTuning(USDHC_Type *base, bool enable)
1355 {
1356 if (enable)
1357 {
1358 base->MIX_CTRL |= USDHC_MIX_CTRL_AUTO_TUNE_EN_MASK;
1359 }
1360 else
1361 {
1362 base->MIX_CTRL &= ~USDHC_MIX_CTRL_AUTO_TUNE_EN_MASK;
1363 }
1364 }
1365
1366 #if !(defined(FSL_FEATURE_USDHC_REGISTER_HOST_CTRL_CAP_HAS_NO_RETUNING_TIME_COUNTER) && \
1367 FSL_FEATURE_USDHC_REGISTER_HOST_CTRL_CAP_HAS_NO_RETUNING_TIME_COUNTER)
1368
1369
1370
1371
1372
1373
1374 static inline void USDHC_SetRetuningTimer(USDHC_Type *base, uint32_t counter)
1375 {
1376 base->HOST_CTRL_CAP &= ~USDHC_HOST_CTRL_CAP_TIME_COUNT_RETUNING_MASK;
1377 base->HOST_CTRL_CAP |= USDHC_HOST_CTRL_CAP_TIME_COUNT_RETUNING(counter);
1378 }
1379 #endif
1380
1381
1382
1383
1384
1385
1386 void USDHC_EnableAutoTuningForCmdAndData(USDHC_Type *base);
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396 void USDHC_EnableManualTuning(USDHC_Type *base, bool enable);
1397
1398
1399
1400
1401
1402
1403
1404 static inline uint32_t USDHC_GetTuningDelayStatus(USDHC_Type *base)
1405 {
1406 return base->CLK_TUNE_CTRL_STATUS >> 16U;
1407 }
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419 status_t USDHC_SetTuningDelay(USDHC_Type *base, uint32_t preDelay, uint32_t outDelay, uint32_t postDelay);
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429 status_t USDHC_AdjustDelayForManualTuning(USDHC_Type *base, uint32_t delay);
1430
1431
1432
1433
1434
1435
1436
1437
1438 static inline void USDHC_SetStandardTuningCounter(USDHC_Type *base, uint8_t counter)
1439 {
1440 base->TUNING_CTRL =
1441 (base->TUNING_CTRL & (~USDHC_TUNING_CTRL_TUNING_COUNTER_MASK)) | USDHC_TUNING_CTRL_TUNING_COUNTER(counter);
1442 }
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454 void USDHC_EnableStandardTuning(USDHC_Type *base, uint32_t tuningStartTap, uint32_t step, bool enable);
1455
1456
1457
1458
1459
1460
1461 static inline uint32_t USDHC_GetExecuteStdTuningStatus(USDHC_Type *base)
1462 {
1463 return (base->AUTOCMD12_ERR_STATUS & USDHC_AUTOCMD12_ERR_STATUS_EXECUTE_TUNING_MASK);
1464 }
1465
1466
1467
1468
1469
1470
1471 static inline uint32_t USDHC_CheckStdTuningResult(USDHC_Type *base)
1472 {
1473 return (base->AUTOCMD12_ERR_STATUS & USDHC_AUTOCMD12_ERR_STATUS_SMP_CLK_SEL_MASK);
1474 }
1475
1476
1477
1478
1479
1480
1481 static inline uint32_t USDHC_CheckTuningError(USDHC_Type *base)
1482 {
1483 return (base->CLK_TUNE_CTRL_STATUS &
1484 (USDHC_CLK_TUNE_CTRL_STATUS_NXT_ERR_MASK | USDHC_CLK_TUNE_CTRL_STATUS_PRE_ERR_MASK));
1485 }
1486
1487 #endif
1488
1489
1490
1491
1492
1493
1494
1495 void USDHC_EnableDDRMode(USDHC_Type *base, bool enable, uint32_t nibblePos);
1496
1497 #if FSL_FEATURE_USDHC_HAS_HS400_MODE
1498
1499
1500
1501
1502
1503
1504 static inline void USDHC_EnableHS400Mode(USDHC_Type *base, bool enable)
1505 {
1506 if (enable)
1507 {
1508 base->MIX_CTRL |= USDHC_MIX_CTRL_HS400_MODE_MASK;
1509 }
1510 else
1511 {
1512 base->MIX_CTRL &= ~USDHC_MIX_CTRL_HS400_MODE_MASK;
1513 }
1514 }
1515
1516
1517
1518
1519
1520
1521 static inline void USDHC_ResetStrobeDLL(USDHC_Type *base)
1522 {
1523 base->STROBE_DLL_CTRL |= USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_RESET_MASK;
1524 }
1525
1526
1527
1528
1529
1530
1531
1532 static inline void USDHC_EnableStrobeDLL(USDHC_Type *base, bool enable)
1533 {
1534 if (enable)
1535 {
1536 base->STROBE_DLL_CTRL |= USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_ENABLE_MASK;
1537 }
1538 else
1539 {
1540 base->STROBE_DLL_CTRL &= ~USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_ENABLE_MASK;
1541 }
1542 }
1543
1544
1545
1546
1547
1548
1549
1550
1551 void USDHC_ConfigStrobeDLL(USDHC_Type *base, uint32_t delayTarget, uint32_t updateInterval);
1552
1553
1554
1555
1556
1557
1558
1559
1560 static inline void USDHC_SetStrobeDllOverride(USDHC_Type *base, uint32_t delayTaps)
1561 {
1562 base->STROBE_DLL_CTRL &= (USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_ENABLE_MASK |
1563 USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_SLV_OVERRIDE_VAL_MASK);
1564
1565 base->STROBE_DLL_CTRL |= USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_SLV_OVERRIDE_MASK |
1566 USDHC_STROBE_DLL_CTRL_STROBE_DLL_CTRL_SLV_OVERRIDE_VAL(delayTaps);
1567 }
1568
1569
1570
1571
1572
1573
1574 static inline uint32_t USDHC_GetStrobeDLLStatus(USDHC_Type *base)
1575 {
1576 return base->STROBE_DLL_STATUS;
1577 }
1578
1579 #endif
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590 void USDHC_SetDataConfig(USDHC_Type *base,
1591 usdhc_transfer_direction_t dataDirection,
1592 uint32_t blockCount,
1593 uint32_t blockSize);
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609 void USDHC_TransferCreateHandle(USDHC_Type *base,
1610 usdhc_handle_t *handle,
1611 const usdhc_transfer_callback_t *callback,
1612 void *userData);
1613
1614 #if (defined FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER) && FSL_USDHC_ENABLE_SCATTER_GATHER_TRANSFER
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636 status_t USDHC_TransferScatterGatherADMANonBlocking(USDHC_Type *base,
1637 usdhc_handle_t *handle,
1638 usdhc_adma_config_t *dmaConfig,
1639 usdhc_scatter_gather_transfer_t *transfer);
1640 #else
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659 status_t USDHC_TransferNonBlocking(USDHC_Type *base,
1660 usdhc_handle_t *handle,
1661 usdhc_adma_config_t *dmaConfig,
1662 usdhc_transfer_t *transfer);
1663 #endif
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684 status_t USDHC_TransferBlocking(USDHC_Type *base, usdhc_adma_config_t *dmaConfig, usdhc_transfer_t *transfer);
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694 void USDHC_TransferHandleIRQ(USDHC_Type *base, usdhc_handle_t *handle);
1695
1696
1697
1698 #if defined(__cplusplus)
1699 }
1700 #endif
1701
1702
1703 #endif