X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/1fe5f5eb5378a47bf0f3451762743c162e40faad..f044ca812256b421e793c4335ce1ffed74710a70:/lunaix-os/hal/timer/hwtimer.c?ds=inline diff --git a/lunaix-os/hal/timer/hwtimer.c b/lunaix-os/hal/timer/hwtimer.c index 9c864c7..1a994f7 100644 --- a/lunaix-os/hal/timer/hwtimer.c +++ b/lunaix-os/hal/timer/hwtimer.c @@ -1,40 +1,64 @@ #include #include -struct hwtimer_context* sys_hwtctx; +#include -void -hwtimer_init(u32_t hertz, void* tick_callback) -{ - struct hwtimer_context* hwt_ctx = hwtimer_choose(); - - hwt_ctx->init(hwt_ctx, hertz, tick_callback); - hwt_ctx->running_freq = hertz; - - sys_hwtctx = hwt_ctx; -} +struct hwtimer* current_timer; ticks_t hwtimer_base_frequency() { - return sys_hwtctx->base_freq; + assert(current_timer); + return current_timer->base_freq; } ticks_t hwtimer_current_systicks() { - return sys_hwtctx->systicks(); + assert(current_timer); + return current_timer->systicks(); } ticks_t hwtimer_to_ticks(u32_t value, int unit) { + assert(current_timer); // in case system frequency is less than 1000Hz if (unit != TIME_MS) { - return sys_hwtctx->running_freq * unit * value; + return current_timer->running_freq * unit * value; } - ticks_t freq_ms = sys_hwtctx->running_freq / 1000; + ticks_t freq_ms = current_timer->running_freq / 1000; return freq_ms * value; +} + +static int +__hwtimer_ioctl(struct device* dev, u32_t req, va_list args) +{ + struct hwtimer* hwt = (struct hwtimer*)dev->underlay; + switch (req) { + case TIMERIO_GETINFO: + // TODO + break; + + default: + break; + } + return 0; +} + +void +hwtimer_init(u32_t hertz, void* tick_callback) +{ + struct hwtimer* hwt_ctx = hwtimer_choose(); + + hwt_ctx->init(hwt_ctx, hertz, tick_callback); + hwt_ctx->running_freq = hertz; + + current_timer = hwt_ctx; + + struct device* timerdev = device_addsys(NULL, hwt_ctx, hwt_ctx->name); + + timerdev->ops.exec_cmd = __hwtimer_ioctl; } \ No newline at end of file