|
79 | 79 |
|
80 | 80 | /* millisecond timer definitions dependent on active ztimer backend */ |
81 | 81 | #if IS_USED(MODULE_ZTIMER_MSEC) |
82 | | -#define _ZTIMER_ACQUIRE() ztimer_acquire(ZTIMER_MSEC) |
83 | | -#define _ZTIMER_RELEASE() ztimer_release(ZTIMER_MSEC) |
84 | | -#define _ZTIMER_NOW() ztimer_now(ZTIMER_MSEC) |
85 | | -#define _ZTIMER_SLEEP_MS(n) ztimer_sleep(ZTIMER_MSEC, n) |
| 82 | +#define _ZTIMER_CLOCK ZTIMER_MSEC |
| 83 | +#define _ZTIMER_TICKS_PER_MS 1 |
| 84 | + |
86 | 85 | #elif IS_USED(MODULE_ZTIMER_USEC) |
87 | | -#define _ZTIMER_ACQUIRE() ztimer_acquire(ZTIMER_USEC) |
88 | | -#define _ZTIMER_RELEASE() ztimer_release(ZTIMER_USEC) |
89 | | -#define _ZTIMER_NOW() ztimer_now(ZTIMER_USEC) / US_PER_MS |
90 | | -#define _ZTIMER_SLEEP_MS(n) ztimer_sleep(ZTIMER_USEC, n * US_PER_MS) |
| 86 | +#define _ZTIMER_CLOCK ZTIMER_USEC |
| 87 | +#define _ZTIMER_TICKS_PER_MS US_PER_MS |
91 | 88 | #else |
92 | 89 | #error "Either module ztimer_msec or ztimer_usec is needed" |
93 | 90 | #endif |
94 | 91 |
|
| 92 | +#define _ZTIMER_ACQUIRE() ztimer_acquire(_ZTIMER_CLOCK) |
| 93 | +#define _ZTIMER_RELEASE() ztimer_release(_ZTIMER_CLOCK) |
| 94 | +#define _ZTIMER_NOW() (ztimer_now(_ZTIMER_CLOCK) / _ZTIMER_TICKS_PER_MS) |
| 95 | +#define _ZTIMER_SLEEP_MS(n) ztimer_sleep(_ZTIMER_CLOCK, n * _ZTIMER_TICKS_PER_MS) |
| 96 | + |
95 | 97 | /* Monitor card insertion and removal */ |
96 | 98 | #define SDHC_NISTR_CARD_DETECT (SDHC_NISTR_CREM | SDHC_NISTR_CINS) |
97 | 99 | #define SDHC_NISTER_CARD_DETECT (SDHC_NISTER_CREM | SDHC_NISTER_CINS) |
98 | 100 | #define SDHC_NISIER_CARD_DETECT (SDHC_NISIER_CREM | SDHC_NISIER_CINS) |
99 | 101 |
|
| 102 | + /* 2s timeout for IRQ wait */ |
| 103 | +#define SDHC_IRQ_TIMEOUT_MS (2000 * _ZTIMER_TICKS_PER_MS) |
| 104 | + |
100 | 105 | #include "board.h" |
101 | 106 |
|
102 | 107 | /* forward declaration of _driver */ |
@@ -743,17 +748,20 @@ static bool _wait_for_event(sdhc_dev_t *sdhc_dev, |
743 | 748 | #if defined(CPU_SAMD5X) || defined(CPU_SAME5X) |
744 | 749 | pm_block(SAM0_PM_IDLE); |
745 | 750 | #endif |
746 | | - mutex_lock(&sdhc_dev->irq_wait); |
| 751 | + bool timeout = ztimer_mutex_lock_timeout(_ZTIMER_CLOCK, &sdhc_dev->irq_wait, SDHC_IRQ_TIMEOUT_MS) < 0; |
747 | 752 | #if defined(CPU_SAMD5X) || defined(CPU_SAME5X) |
748 | 753 | pm_unblock(SAM0_PM_IDLE); |
749 | 754 | #endif |
750 | 755 |
|
751 | 756 | sdhc->NISIER.reg &= ~event; |
752 | 757 | sdhc->EISIER.reg &= ~error_mask; |
753 | 758 |
|
754 | | - if (sdhc_dev->error & error_mask) { |
| 759 | + if (timeout || (sdhc_dev->error & error_mask)) { |
755 | 760 | if (IS_USED(ENABLE_DEBUG)) { |
756 | 761 | DEBUG("[sdmmc] SDHC error: EISTR=%04x, ", sdhc_dev->error); |
| 762 | + if (timeout) { |
| 763 | + DEBUG("[sdmmc] IRQ wait timeout\n"); |
| 764 | + } |
757 | 765 | switch (reset) { |
758 | 766 | case SDHC_SRR_SWRSTCMD: |
759 | 767 | DEBUG("reset CMD\n"); |
@@ -832,7 +840,7 @@ static int _sdhc_to_sdmmc_err_code(uint16_t code) |
832 | 840 | static void _isr(sdhc_dev_t *sdhc_dev) |
833 | 841 | { |
834 | 842 | sdhc_t *sdhc = sdhc_dev->conf->sdhc; |
835 | | - |
| 843 | + DEBUG_PUTS("[sdmmc] IRQ"); |
836 | 844 | if (sdhc->NISTR.reg & SDHC_NISTR_CARD_DETECT) { |
837 | 845 | DEBUG_PUTS("[sdmmc] card presence changed"); |
838 | 846 |
|
|
0 commit comments