From: Lucjan Bryndza <lbryndza....@icloud.com> The current implementation of timers does not work properly even in basic functionality. A counter configured to report an interrupt every 10ms reports the first interrupts after a few seconds. There are also no properly implemented count up an count down modes. This commit fixes bugs with interrupt reporting and implements the basic modes of the counter's time-base block.
Timer read function modified Signed-off-by: Lucjan Bryndza <lbryndza....@icloud.com> --- hw/timer/stm32f2xx_timer.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c index 20ca762601..07d82b841a 100644 --- a/hw/timer/stm32f2xx_timer.c +++ b/hw/timer/stm32f2xx_timer.c @@ -159,15 +159,18 @@ static uint64_t stm32f2xx_timer_read(void *opaque, hwaddr offset, case TIM_CR1: return s->tim_cr1; case TIM_CR2: - return s->tim_cr2; + qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: CR2 not supported"); + return 0; case TIM_SMCR: - return s->tim_smcr; + qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: SMCR not supported"); + return 0; case TIM_DIER: return s->tim_dier; case TIM_SR: return s->tim_sr; case TIM_EGR: - return s->tim_egr; + qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: EGR write only"); + return 0; case TIM_CCMR1: return s->tim_ccmr1; case TIM_CCMR2: @@ -175,8 +178,7 @@ static uint64_t stm32f2xx_timer_read(void *opaque, hwaddr offset, case TIM_CCER: return s->tim_ccer; case TIM_CNT: - return stm32f2xx_ns_to_ticks(s, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)) - - s->tick_offset; + return stm32f2xx_timer_get_count(s); case TIM_PSC: return s->tim_psc; case TIM_ARR: @@ -190,16 +192,17 @@ static uint64_t stm32f2xx_timer_read(void *opaque, hwaddr offset, case TIM_CCR4: return s->tim_ccr4; case TIM_DCR: - return s->tim_dcr; + qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: DCR not supported"); + return 0; case TIM_DMAR: - return s->tim_dmar; + qemu_log_mask(LOG_GUEST_ERROR, "stm32_timer: CR2 not supported"); + return 0; case TIM_OR: return s->tim_or; default: qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%"HWADDR_PRIx"\n", __func__, offset); } - return 0; } -- 2.38.5