#ifndef __LUNAIX_HWTIMER_H
#define __LUNAIX_HWTIMER_H
+#include <lunaix/device.h>
#include <lunaix/time.h>
#include <lunaix/types.h>
typedef void (*timer_tick_cb)();
-struct hwtimer_context
+#define HWTIMER_MIN_PRECEDENCE 0
+#define HWTIMER_MAX_PRECEDENCE 15
+
+struct hwtimer_pot;
+struct hwtimer_pot_ops
{
- char* name;
- void* data;
+ void (*calibrate)(struct hwtimer_pot*, u32_t hertz);
+};
- int (*supported)(struct hwtimer_context*);
- void (*init)(struct hwtimer_context*, u32_t hertz, timer_tick_cb);
- ticks_t (*systicks)();
+struct hwtimer_pot
+{
+ POTENS_META;
+
+ struct llist_header timers;
+
+ int precedence;
+ timer_tick_cb callback;
ticks_t base_freq;
ticks_t running_freq;
-};
+ volatile ticks_t systick_raw;
-extern struct hwtimer_context* current_timer;
+ struct hwtimer_pot_ops* ops;
+};
void
hwtimer_init(u32_t hertz, void* tick_callback);
-struct hwtimer_context*
-hwtimer_choose();
-
-ticks_t
-hwtimer_base_frequency();
-
ticks_t
hwtimer_current_systicks();
ticks_t
hwtimer_to_ticks(u32_t value, int unit);
+struct hwtimer_pot*
+hwtimer_attach_potens(struct device* dev, int precedence,
+ struct hwtimer_pot_ops* ops);
+
+
#endif /* __LUNAIX_HWTIMER_H */