Below is a suggested update for gptimer_tlib_reset().
OK otherwise.
On 2023-07-05 13:18, Sebastian Huber wrote:
---
bsps/shared/grlib/btimer/gptimer.c | 177 +++++++++++++--------------
bsps/sparc/leon3/btimer/btimer.c | 13 +-
bsps/sparc/leon3/btimer/watchdog.c | 27 ++--
bsps/sparc/leon3/clock/ckinit.c | 33 ++---
bsps/sparc/leon3/include/bsp/leon3.h | 44 ++++++-
bsps/sparc/leon3/include/leon.h | 24 ----
bsps/sparc/leon3/start/amba.c | 9 +-
bsps/sparc/leon3/start/bspdelay.c | 8 +-
bsps/sparc/leon3/start/cpucounter.c | 20 +--
9 files changed, 188 insertions(+), 167 deletions(-)
diff --git a/bsps/shared/grlib/btimer/gptimer.c
b/bsps/shared/grlib/btimer/gptimer.c
index f31b7c052f..ca87780d2c 100644
--- a/bsps/shared/grlib/btimer/gptimer.c
+++ b/bsps/shared/grlib/btimer/gptimer.c
/* GPTIMER timer private */
-struct gptimer_timer {
+struct gptimer_timer_priv {
struct tlib_dev tdev; /* Must be first in struct */
- struct gptimer_timer_regs *tregs;
+ gptimer_timer *tregs;
char index; /* Timer Index in this driver */
char tindex; /* Timer Index In Hardware */
- unsigned char irq_ack_mask;
+ uint32_t irq_ack_mask;
};
OK, irq_ack_mask is now wider.
@@ -406,12 +379,14 @@ void gptimer_isr(void *data)
static void gptimer_tlib_reset(struct tlib_dev *hand)
{
- struct gptimer_timer *timer = (struct gptimer_timer *)hand;
-
- timer->tregs->ctrl = (timer->tregs->ctrl & timer->irq_ack_mask) &
- GPTIMER_CTRL_IP;
- timer->tregs->reload = 0xffffffff;
- timer->tregs->ctrl = GPTIMER_CTRL_LD;
+ struct gptimer_timer_priv *timer = (struct gptimer_timer_priv *)hand;
+ uint32_t tctrl;
+
+ tctrl = grlib_load_32(&timer->tregs->tctrl);
+ tctrl &= timer->irq_ack_mask | GPTIMER_TCTRL_IP;
+ grlib_store_32(&timer->tregs->tctrl, tctrl);
+ grlib_store_32(&timer->tregs->trldval, 0xffffffff);
+ grlib_store_32(&timer->tregs->tctrl, GPTIMER_TCTRL_LD);
}
This transformation of the trctrl calculation does not look quite right.
I think the final tctrl assignment should be like this instead:
tctrl &= timer->irq_ack_mask & GPTIMER_TCTRL_IP;
The desired side effect is to stop the subtimer, disable its interrupt
generation and unpend a possibly pending interrupt indication.
--
Best regards,
Martin Åberg
Software Engineer
Frontgrade Gaisler
martin.ab...@gaisler.com
Frontgrade Gaisler AB, Kungsgatan 12, SE-411 19 GÖTEBORG, Sweden.
+46 (0) 31 775 8650, www.gaisler.com
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel