zephyr/drivers/timer/pulpino_timer.c
Andy Ross fa99ad66d0 sys_clock: Fix up tick announce API
There were three separate "announce ticks" entry points exposed for
use by drivers.  Unify them to just a single z_clock_announce()
function, making the "final" tick announcement the business of the
driver only, not the kernel.

Note the oddness with "_sys_idle_elapsed_ticks": this was a global
variable exposed by the kernel.  But it was never actually used by the
kernel.  It was updated and inspected only within the timer drivers,
and only so that it could be passed back to the kernel as the default
(actually hidden) argument to the announce function.  Break this false
dependency by putting this variable into each timer driver
individually.

Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
2018-10-16 15:03:10 -04:00

75 lines
1.6 KiB
C

/*
* Copyright (c) 2016 Jean-Paul Etienne <fractalclone@gmail.com>
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <kernel.h>
#include <arch/cpu.h>
#include <device.h>
#include <system_timer.h>
#include <board.h>
/* Timer Ctrl Bitfields */
#define TIMER_CTRL_EN (1 << 0) /* Timer Enable Bit */
#define TIMER_CTRL_PRE(x) (((x) & 0x07) << 3) /* Prescaler Value */
typedef struct {
u32_t val;
u32_t ctrl;
u32_t cmp;
} pulpino_timer_t;
static volatile pulpino_timer_t *timer = (pulpino_timer_t *)PULP_TIMER_A_BASE;
static u32_t accumulated_cycle_count;
static void pulpino_timer_irq_handler(void *unused)
{
ARG_UNUSED(unused);
/* Reset counter */
timer->val = 0;
accumulated_cycle_count += sys_clock_hw_cycles_per_tick();
z_clock_announce(1);
}
#ifdef CONFIG_TICKLESS_IDLE
#error "Tickless idle not yet implemented for pulpino timer"
#endif
int _sys_clock_driver_init(struct device *device)
{
ARG_UNUSED(device);
IRQ_CONNECT(PULP_TIMER_A_CMP_IRQ, 0,
pulpino_timer_irq_handler, NULL, 0);
irq_enable(PULP_TIMER_A_CMP_IRQ);
/*
* Initialize timer.
* Reset counter and set timer to generate interrupt
* every sys_clock_hw_cycles_per_tick()
*/
timer->val = 0;
timer->cmp = sys_clock_hw_cycles_per_tick();
timer->ctrl = TIMER_CTRL_EN;
return 0;
}
/**
*
* @brief Read the platform's timer hardware
*
* This routine returns the current time in terms of timer hardware clock
* cycles.
*
* @return up counter of elapsed clock cycles
*/
u32_t _timer_cycle_get_32(void)
{
return accumulated_cycle_count + timer->val;
}