fsl_host.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. * Copyright (c) 2016, Freescale Semiconductor, Inc.
  3. * Copyright 2016-2017 NXP
  4. * All rights reserved.
  5. *
  6. * SPDX-License-Identifier: BSD-3-Clause
  7. */
  8. #include "fsl_host.h"
  9. #include "board.h"
  10. #include "fsl_gpio.h"
  11. #ifdef BOARD_USDHC_CD_PORT_BASE
  12. #include "fsl_port.h"
  13. #endif
  14. /*******************************************************************************
  15. * Definitions
  16. ******************************************************************************/
  17. /*******************************************************************************
  18. * Prototypes
  19. ******************************************************************************/
  20. /*!
  21. * @brief host controller error recovery.
  22. * @param host base address.
  23. */
  24. static void Host_ErrorRecovery(HOST_TYPE *hostBase);
  25. /*******************************************************************************
  26. * Variables
  27. ******************************************************************************/
  28. /* DMA descriptor should allocate at non-cached memory */
  29. AT_NONCACHEABLE_SECTION_ALIGN(uint32_t g_usdhcAdma2Table[USDHC_ADMA_TABLE_WORDS], USDHC_ADMA2_ADDR_ALIGN);
  30. extern volatile uint32_t g_timeMilliseconds;
  31. static volatile bool g_sdInsertedFlag;
  32. /*******************************************************************************
  33. * Code
  34. ******************************************************************************/
  35. /* Card detect. */
  36. status_t CardInsertDetect(HOST_TYPE *hostBase)
  37. {
  38. return kStatus_Success;
  39. }
  40. /* User defined transfer function. */
  41. static status_t USDHC_TransferFunction(USDHC_Type *base, usdhc_transfer_t *content)
  42. {
  43. status_t error = kStatus_Success;
  44. usdhc_adma_config_t dmaConfig;
  45. if (content != NULL && content->data != NULL)
  46. {
  47. memset(&dmaConfig, 0, sizeof(usdhc_adma_config_t));
  48. /* config adma */
  49. dmaConfig.dmaMode = USDHC_DMA_MODE;
  50. dmaConfig.burstLen = kUSDHC_EnBurstLenForINCR;
  51. dmaConfig.admaTable = g_usdhcAdma2Table;
  52. dmaConfig.admaTableWords = USDHC_ADMA_TABLE_WORDS;
  53. }
  54. error = USDHC_TransferBlocking(base, &dmaConfig, content);
  55. if (error == kStatus_Fail)
  56. {
  57. /* host error recovery */
  58. Host_ErrorRecovery(base);
  59. }
  60. return error;
  61. }
  62. static void Host_ErrorRecovery(HOST_TYPE *hostBase)
  63. {
  64. uint32_t status = 0U;
  65. /* get host present status */
  66. status = USDHC_GetPresentStatusFlags(hostBase);
  67. /* check command inhibit status flag */
  68. if ((status & kUSDHC_CommandInhibitFlag) != 0U)
  69. {
  70. /* reset command line */
  71. USDHC_Reset(hostBase, kUSDHC_ResetCommand, 100U);
  72. }
  73. /* check data inhibit status flag */
  74. if ((status & kUSDHC_DataInhibitFlag) != 0U)
  75. {
  76. /* reset data line */
  77. USDHC_Reset(hostBase, kUSDHC_ResetData, 100U);
  78. }
  79. }
  80. status_t HOST_Init(void *host)
  81. {
  82. usdhc_host_t *usdhcHost = (usdhc_host_t *)host;
  83. /* init card power control */
  84. HOST_INIT_SD_POWER();
  85. HOST_INIT_MMC_POWER();
  86. /* Initializes USDHC. */
  87. usdhcHost->config.dataTimeout = USDHC_DATA_TIMEOUT;
  88. usdhcHost->config.endianMode = USDHC_ENDIAN_MODE;
  89. usdhcHost->config.readWatermarkLevel = USDHC_READ_WATERMARK_LEVEL;
  90. usdhcHost->config.writeWatermarkLevel = USDHC_WRITE_WATERMARK_LEVEL;
  91. usdhcHost->config.readBurstLen = USDHC_READ_BURST_LEN;
  92. usdhcHost->config.writeBurstLen = USDHC_WRITE_BURST_LEN;
  93. USDHC_Init(usdhcHost->base, &(usdhcHost->config));
  94. /* Define transfer function. */
  95. usdhcHost->transfer = USDHC_TransferFunction;
  96. return kStatus_Success;
  97. }
  98. void HOST_Reset(HOST_TYPE *hostBase)
  99. {
  100. /* voltage switch to normal but not 1.8V */
  101. HOST_SWITCH_VOLTAGE180V(hostBase, false);
  102. /* Disable DDR mode */
  103. HOST_ENABLE_DDR_MODE(hostBase, false);
  104. /* disable tuning */
  105. HOST_EXECUTE_STANDARD_TUNING_ENABLE(hostBase, false);
  106. /* Disable HS400 mode */
  107. HOST_ENABLE_HS400_MODE(hostBase, false);
  108. /* Disable DLL */
  109. HOST_ENABLE_STROBE_DLL(hostBase, false);
  110. }
  111. void HOST_Deinit(void *host)
  112. {
  113. usdhc_host_t *usdhcHost = (usdhc_host_t *)host;
  114. USDHC_Deinit(usdhcHost->base);
  115. }