1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

cpu/sam0/periph: remove bitfield usage in timer driver

Signed-off-by: Dylan Laduranty <dylan.laduranty@mesotic.com>
This commit is contained in:
Dylan Laduranty 2024-06-11 19:51:36 +02:00
parent 925e98b115
commit 6ccaca1e76

View File

@ -125,7 +125,9 @@ static inline void _set_mfrq(tim_t tim)
#ifdef TC_WAVE_WAVEGEN_MFRQ #ifdef TC_WAVE_WAVEGEN_MFRQ
dev(tim)->WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; dev(tim)->WAVE.reg = TC_WAVE_WAVEGEN_MFRQ;
#else #else
dev(tim)->CTRLA.bit.WAVEGEN = TC_CTRLA_WAVEGEN_MFRQ_Val; uint32_t reg = dev(tim)->CTRLA.reg;
dev(tim)->CTRLA.reg = ((reg & ~TC_CTRLA_WAVEGEN_Msk) |
TC_CTRLA_WAVEGEN(TC_CTRLA_WAVEGEN_MFRQ_Val));
#endif #endif
} }
@ -135,7 +137,9 @@ static inline void _set_nfrq(tim_t tim)
#ifdef TC_WAVE_WAVEGEN_NFRQ #ifdef TC_WAVE_WAVEGEN_NFRQ
dev(tim)->WAVE.reg = TC_WAVE_WAVEGEN_NFRQ; dev(tim)->WAVE.reg = TC_WAVE_WAVEGEN_NFRQ;
#else #else
dev(tim)->CTRLA.bit.WAVEGEN = TC_CTRLA_WAVEGEN_NFRQ_Val; uint32_t reg = dev(tim)->CTRLA.reg;
dev(tim)->CTRLA.reg = ((reg & ~TC_CTRLA_WAVEGEN_Msk) |
TC_CTRLA_WAVEGEN(TC_CTRLA_WAVEGEN_NFRQ_Val));
#endif #endif
} }
@ -188,8 +192,8 @@ int timer_init(tim_t tim, uint32_t freq, timer_cb_t cb, void *arg)
timer_stop(tim); timer_stop(tim);
/* reset the timer */ /* reset the timer */
dev(tim)->CTRLA.bit.SWRST = 1; dev(tim)->CTRLA.reg |= TC_CTRLA_SWRST;
while (dev(tim)->CTRLA.bit.SWRST) {} while (dev(tim)->CTRLA.reg & TC_CTRLA_SWRST) {}
dev(tim)->CTRLA.reg = cfg->flags dev(tim)->CTRLA.reg = cfg->flags
#ifdef TC_CTRLA_WAVEGEN_NFRQ #ifdef TC_CTRLA_WAVEGEN_NFRQ
@ -332,12 +336,13 @@ int timer_clear(tim_t tim, int channel)
unsigned int timer_read(tim_t tim) unsigned int timer_read(tim_t tim)
{ {
/* WORKAROUND to prevent being stuck there if timer not init */ /* WORKAROUND to prevent being stuck there if timer not init */
if (!dev(tim)->CTRLA.bit.ENABLE) { if (!(dev(tim)->CTRLA.reg & TC_CTRLA_ENABLE)) {
return 0; return 0;
} }
/* request synchronisation */ /* request synchronisation */
#ifdef TC_CTRLBSET_CMD_READSYNC_Val #ifdef TC_CTRLBSET_CMD_READSYNC_Val
uint32_t cmd;
dev(tim)->CTRLBSET.reg = TC_CTRLBSET_CMD_READSYNC; dev(tim)->CTRLBSET.reg = TC_CTRLBSET_CMD_READSYNC;
/* work around a possible hardware bug where it takes some /* work around a possible hardware bug where it takes some
cycles for the timer peripheral to set the SYNCBUSY/READSYNC bit cycles for the timer peripheral to set the SYNCBUSY/READSYNC bit
@ -345,7 +350,10 @@ unsigned int timer_read(tim_t tim)
The problem was observed on SAME54. The problem was observed on SAME54.
*/ */
while(dev(tim)->CTRLBSET.bit.CMD == TC_CTRLBSET_CMD_READSYNC_Val) {} do {
cmd = ((dev(tim)->CTRLBSET.reg & TC_CTRLBSET_CMD_Msk) >> TC_CTRLBSET_CMD_Pos);
} while(cmd == TC_CTRLBSET_CMD_READSYNC_Val);
#else #else
dev(tim)->READREQ.reg = TC_READREQ_RREQ | TC_READREQ_ADDR(TC_COUNT32_COUNT_OFFSET); dev(tim)->READREQ.reg = TC_READREQ_RREQ | TC_READREQ_ADDR(TC_COUNT32_COUNT_OFFSET);
#endif #endif
@ -359,13 +367,13 @@ void timer_stop(tim_t tim)
{ {
#if IS_ACTIVE(MODULE_PM_LAYERED) && defined(SAM0_TIMER_PM_BLOCK) #if IS_ACTIVE(MODULE_PM_LAYERED) && defined(SAM0_TIMER_PM_BLOCK)
/* unblock power mode if the timer is running */ /* unblock power mode if the timer is running */
if (dev(tim)->CTRLA.bit.ENABLE) { if (dev(tim)->CTRLA.reg & TC_CTRLA_ENABLE) {
DEBUG("[timer %d] pm_unblock\n", tim); DEBUG("[timer %d] pm_unblock\n", tim);
pm_unblock(SAM0_TIMER_PM_BLOCK); pm_unblock(SAM0_TIMER_PM_BLOCK);
} }
#endif #endif
dev(tim)->CTRLA.bit.ENABLE = 0; dev(tim)->CTRLA.reg &= ~TC_CTRLA_ENABLE;
wait_synchronization(tim); wait_synchronization(tim);
} }
@ -375,13 +383,13 @@ void timer_start(tim_t tim)
#if IS_ACTIVE(MODULE_PM_LAYERED) && defined(SAM0_TIMER_PM_BLOCK) #if IS_ACTIVE(MODULE_PM_LAYERED) && defined(SAM0_TIMER_PM_BLOCK)
/* block power mode if the timer is not running, yet */ /* block power mode if the timer is not running, yet */
if (!dev(tim)->CTRLA.bit.ENABLE) { if (!(dev(tim)->CTRLA.reg & TC_CTRLA_ENABLE)) {
DEBUG("[timer %d] pm_block\n", tim); DEBUG("[timer %d] pm_block\n", tim);
pm_block(SAM0_TIMER_PM_BLOCK); pm_block(SAM0_TIMER_PM_BLOCK);
} }
#endif #endif
dev(tim)->CTRLA.bit.ENABLE = 1; dev(tim)->CTRLA.reg |= TC_CTRLA_ENABLE;
} }
static inline void timer_isr(tim_t tim) static inline void timer_isr(tim_t tim)
@ -392,7 +400,7 @@ static inline void timer_isr(tim_t tim)
/* Acknowledge all interrupts */ /* Acknowledge all interrupts */
tc->INTFLAG.reg = status; tc->INTFLAG.reg = status;
if ((status & TC_INTFLAG_MC0) && tc->INTENSET.bit.MC0) { if ((status & TC_INTFLAG_MC0) && (tc->INTENSET.reg & TC_INTENSET_MC0)) {
if (is_oneshot(tim, 0)) { if (is_oneshot(tim, 0)) {
tc->INTENCLR.reg = TC_INTENCLR_MC0; tc->INTENCLR.reg = TC_INTENCLR_MC0;
@ -403,7 +411,7 @@ static inline void timer_isr(tim_t tim)
} }
} }
if ((status & TC_INTFLAG_MC1) && tc->INTENSET.bit.MC1) { if ((status & TC_INTFLAG_MC1) && (tc->INTENSET.reg & TC_INTENSET_MC1)) {
if (is_oneshot(tim, 1)) { if (is_oneshot(tim, 1)) {
tc->INTENCLR.reg = TC_INTENCLR_MC1; tc->INTENCLR.reg = TC_INTENCLR_MC1;