hpm_sdmmc_osal.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. * Copyright (c) 2024 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #include "hpm_sdmmc_osal.h"
  8. #include "hpm_sdmmc_host.h"
  9. #if defined(HPM_SDMMC_USE_CMSIS_OS2) && (HPM_SDMMC_USE_CMSIS_OS2 == 1)
  10. #include "cmsis_os2.h"
  11. ATTR_WEAK void hpm_sdmmc_osal_delay(void *ctx, uint32_t ms)
  12. {
  13. (void) ctx;
  14. uint32_t ticks_per_sec = osKernelGetTickFreq();
  15. uint32_t delay_ticks = (ms * ticks_per_sec + 999UL) / 1000UL;
  16. osDelay(delay_ticks);
  17. }
  18. ATTR_WEAK hpm_sdmmc_osal_event_t hpm_sdmmc_osal_event_create(void *ctx)
  19. {
  20. (void) ctx;
  21. hpm_sdmmc_osal_event_t event = osEventFlagsNew(NULL);
  22. return event;
  23. }
  24. ATTR_WEAK hpm_stat_t hpm_sdmmc_osal_event_delete(void *ctx, hpm_sdmmc_osal_event_t event)
  25. {
  26. uint32_t err = osEventFlagsDelete(event);
  27. return (err == osOK) ? status_success : status_fail;
  28. }
  29. ATTR_WEAK hpm_stat_t hpm_sdmmc_osal_event_wait(void *ctx, hpm_sdmmc_osal_event_t event, uint32_t flags, uint32_t timeout)
  30. {
  31. (void) ctx;
  32. uint32_t ticks_per_sec = osKernelGetTickFreq();
  33. uint32_t timeout_ticks = (timeout * ticks_per_sec + 999UL) / 1000UL;
  34. uint32_t err = osEventFlagsWait(event, flags, osFlagsWaitAny, timeout_ticks);
  35. if (err == osErrorTimeout) {
  36. return status_timeout;
  37. }
  38. return status_success;
  39. }
  40. ATTR_WEAK void hpm_sdmmc_osal_event_set(void *ctx, hpm_sdmmc_osal_event_t event, uint32_t flags)
  41. {
  42. (void) ctx;
  43. osEventFlagsSet(event, flags);
  44. }
  45. ATTR_WEAK void hpm_sdmmc_osal_event_clear(void *ctx, hpm_sdmmc_osal_event_t event, uint32_t flags)
  46. {
  47. (void) ctx;
  48. osEventFlagsClear(event, flags);
  49. }
  50. ATTR_WEAK void hpm_sdmmc_osal_enter_critical(void *ctx)
  51. {
  52. (void) ctx;
  53. osKernelLock();
  54. }
  55. ATTR_WEAK void hpm_sdmmc_osal_exit_critical(void *ctx)
  56. {
  57. (void) ctx;
  58. osKernelUnlock();
  59. }
  60. #else
  61. #include "hpm_clock_drv.h"
  62. #include "hpm_interrupt.h"
  63. #include "hpm_csr_drv.h"
  64. #include <string.h>
  65. #include <stdlib.h>
  66. volatile uint32_t hpm_sdmmc_osal_level;
  67. ATTR_WEAK void hpm_sdmmc_osal_delay(void *ctx, uint32_t ms)
  68. {
  69. sdmmc_host_t *host = (sdmmc_host_t *) ctx;
  70. if ((host != NULL) && (host->host_param.delay_ms != NULL)) {
  71. host->host_param.delay_ms(ms);
  72. }
  73. }
  74. ATTR_WEAK hpm_sdmmc_osal_event_t hpm_sdmmc_osal_event_create(void *ctx)
  75. {
  76. (void) ctx;
  77. hpm_sdmmc_osal_event_t event = (hpm_sdmmc_osal_event_t) malloc(sizeof(uint32_t));
  78. if (event != NULL) {
  79. *event = 0;
  80. }
  81. return event;
  82. }
  83. ATTR_WEAK hpm_stat_t hpm_sdmmc_osal_event_delete(void *ctx, hpm_sdmmc_osal_event_t event)
  84. {
  85. (void) ctx;
  86. if (event != NULL) {
  87. free((void *)event);
  88. }
  89. return status_success;
  90. }
  91. ATTR_WEAK hpm_stat_t hpm_sdmmc_osal_event_wait(void *ctx, hpm_sdmmc_osal_event_t event, uint32_t flags, uint32_t timeout)
  92. {
  93. (void) ctx;
  94. uint32_t matched_flags = 0;
  95. bool wait_forever = (timeout == HPM_SDMMC_OSAL_WAIT_FOREVER);
  96. bool timeout_occurred = false;
  97. uint64_t start_ticks = hpm_csr_get_core_mcycle();
  98. uint32_t ticks_per_ms = clock_get_core_clock_ticks_per_ms();
  99. uint64_t timeout_ticks = start_ticks + timeout * ticks_per_ms;
  100. while ((*event & flags) == 0) {
  101. if (!wait_forever) {
  102. uint64_t current_ticks = hpm_csr_get_core_mcycle();
  103. if (current_ticks > timeout_ticks) {
  104. timeout_occurred = true;
  105. break;
  106. }
  107. }
  108. }
  109. matched_flags = *event & flags;
  110. if (!timeout_occurred) {
  111. *event &= ~matched_flags;
  112. }
  113. return timeout_occurred ? status_timeout : status_success;
  114. }
  115. ATTR_WEAK void hpm_sdmmc_osal_event_set(void *ctx, hpm_sdmmc_osal_event_t event, uint32_t flags)
  116. {
  117. (void) ctx;
  118. *event |= flags;
  119. }
  120. ATTR_WEAK void hpm_sdmmc_osal_event_clear(void *ctx, hpm_sdmmc_osal_event_t event, uint32_t flags)
  121. {
  122. (void) ctx;
  123. *event &= ~flags;
  124. }
  125. ATTR_WEAK void hpm_sdmmc_osal_enter_critical(void *ctx)
  126. {
  127. (void) ctx;
  128. hpm_sdmmc_osal_level = disable_global_irq(CSR_MSTATUS_MIE_MASK);
  129. }
  130. ATTR_WEAK void hpm_sdmmc_osal_exit_critical(void *ctx)
  131. {
  132. (void) ctx;
  133. restore_global_irq(hpm_sdmmc_osal_level);
  134. }
  135. #endif