|
27 | 27 | #define CYC_PER_TICK (sys_clock_hw_cycles_per_sec() / CONFIG_SYS_CLOCK_TICKS_PER_SEC)
|
28 | 28 | #define MAX_TICKS ((k_ticks_t)(COUNTER_MAX / CYC_PER_TICK) - 1)
|
29 | 29 | #define MAX_CYCLES (MAX_TICKS * CYC_PER_TICK)
|
30 |
| -#if defined(CONFIG_SOC_SERIES_APOLLO3X) |
| 30 | +#if defined(CONFIG_SOC_SERIES_APOLLO3X) || defined(CONFIG_SOC_SERIES_APOLLO5X) |
31 | 31 | #define MIN_DELAY 1
|
32 |
| -#elif defined(CONFIG_SOC_SERIES_APOLLO4X) |
| 32 | +#else |
33 | 33 | #define MIN_DELAY 4
|
34 | 34 | #endif
|
35 | 35 |
|
| 36 | +#if defined(CONFIG_SOC_SERIES_APOLLO5X) |
| 37 | +#define COMPARE_INTERRUPT AM_HAL_STIMER_INT_COMPAREA |
| 38 | +#else |
| 39 | +/* A Possible clock glitch could rarely cause the Stimer interrupt to be lost. |
| 40 | + * Set up a backup comparator to handle this case |
| 41 | + */ |
36 | 42 | #define COMPARE_INTERRUPT (AM_HAL_STIMER_INT_COMPAREA | AM_HAL_STIMER_INT_COMPAREB)
|
| 43 | +#endif |
37 | 44 |
|
38 | 45 | #define COMPAREA_IRQ (DT_INST_IRQN(0))
|
39 | 46 | #define COMPAREB_IRQ (COMPAREA_IRQ + 1)
|
@@ -82,7 +89,9 @@ static void update_tick_counter(void)
|
82 | 89 | static void ambiq_stimer_delta_set(uint32_t ui32Delta)
|
83 | 90 | {
|
84 | 91 | am_hal_stimer_compare_delta_set(0, ui32Delta);
|
| 92 | +#if !defined(CONFIG_SOC_SERIES_APOLLO5X) |
85 | 93 | am_hal_stimer_compare_delta_set(1, ui32Delta + 1);
|
| 94 | +#endif |
86 | 95 | }
|
87 | 96 |
|
88 | 97 | static void stimer_isr(const void *arg)
|
@@ -201,23 +210,28 @@ static int stimer_init(void)
|
201 | 210 | am_hal_stimer_config((oldCfg & ~(AM_HAL_STIMER_CFG_FREEZE | CTIMER_STCFG_CLKSEL_Msk)) |
|
202 | 211 | TIMER_CLKSRC | AM_HAL_STIMER_CFG_COMPARE_A_ENABLE |
|
203 | 212 | AM_HAL_STIMER_CFG_COMPARE_B_ENABLE);
|
204 |
| -#else |
| 213 | +#elif defined(CONFIG_SOC_SERIES_APOLLO4X) |
205 | 214 | am_hal_stimer_config((oldCfg & ~(AM_HAL_STIMER_CFG_FREEZE | STIMER_STCFG_CLKSEL_Msk)) |
|
206 | 215 | TIMER_CLKSRC | AM_HAL_STIMER_CFG_COMPARE_A_ENABLE |
|
207 | 216 | AM_HAL_STIMER_CFG_COMPARE_B_ENABLE);
|
| 217 | +#elif defined(CONFIG_SOC_SERIES_APOLLO5X) |
| 218 | + /* No need for backup comparator any more */ |
| 219 | + am_hal_stimer_config((oldCfg & ~(AM_HAL_STIMER_CFG_FREEZE | STIMER_STCFG_CLKSEL_Msk)) | |
| 220 | + TIMER_CLKSRC | AM_HAL_STIMER_CFG_COMPARE_A_ENABLE); |
208 | 221 | #endif
|
209 | 222 | g_last_time_stamp = am_hal_stimer_counter_get();
|
210 | 223 |
|
211 | 224 | /* A Possible clock glitch could rarely cause the Stimer interrupt to be lost.
|
212 | 225 | * Set up a backup comparator to handle this case
|
213 | 226 | */
|
214 | 227 | NVIC_ClearPendingIRQ(COMPAREA_IRQ);
|
215 |
| - NVIC_ClearPendingIRQ(COMPAREB_IRQ); |
216 | 228 | IRQ_CONNECT(COMPAREA_IRQ, 0, stimer_isr, 0, 0);
|
217 |
| - IRQ_CONNECT(COMPAREB_IRQ, 0, stimer_isr, 0, 0); |
218 | 229 | irq_enable(COMPAREA_IRQ);
|
| 230 | +#if !defined(CONFIG_SOC_SERIES_APOLLO5X) |
| 231 | + NVIC_ClearPendingIRQ(COMPAREB_IRQ); |
| 232 | + IRQ_CONNECT(COMPAREB_IRQ, 0, stimer_isr, 0, 0); |
219 | 233 | irq_enable(COMPAREB_IRQ);
|
220 |
| - |
| 234 | +#endif |
221 | 235 | am_hal_stimer_int_enable(COMPARE_INTERRUPT);
|
222 | 236 | /* Start timer with period CYC_PER_TICK if tickless is not enabled */
|
223 | 237 | if (!IS_ENABLED(CONFIG_TICKLESS_KERNEL)) {
|
|
0 commit comments