diff options
Diffstat (limited to 'kernel/drivers/clock.c')
-rw-r--r-- | kernel/drivers/clock.c | 150 |
1 files changed, 27 insertions, 123 deletions
diff --git a/kernel/drivers/clock.c b/kernel/drivers/clock.c index dd229dc..fadd938 100644 --- a/kernel/drivers/clock.c +++ b/kernel/drivers/clock.c @@ -1,6 +1,6 @@ #include <lib.h> -#include <time.h> #include <comus/asm.h> +#include <comus/time.h> #include <comus/drivers/clock.h> #define CMOS_WRITE_PORT 0x70 @@ -15,18 +15,6 @@ #define CMOS_REG_YEAR 0x09 #define CMOS_REG_CEN 0x32 -// Live buffers to work on data -static time_t time; -static time_t localtime; - -// Front buffers so interupts dont request data that is half done -static time_t curr_time; -static time_t curr_localtime; - -// Current set time Zone -static timezone_t curr_timezone = TZ_UTC; -static timezone_t last_timezone = TZ_UTC; - static uint8_t cmos_read(uint8_t reg) { uint8_t hex, ret; @@ -43,124 +31,40 @@ static uint8_t cmos_read(uint8_t reg) static int mday_offset[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; -static int month_days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - -static void update_localtime(void) -{ - int change, max; - - // set localtime - localtime = time; - - // if tz is UTC, we dont need to do anythin - if (last_timezone == TZ_UTC) - return; - - localtime.hour += last_timezone; - - // check if day rolled over - change = localtime.hour < 0 ? -1 : localtime.hour >= 24 ? 1 : 0; - if (!change) - return; - - // roll over day - localtime.hour = (localtime.hour + 24) % 24; - localtime.wday = (localtime.wday + change + 7) % 7; - localtime.mday += change; - localtime.yday += change; - - // check if month rolled over - max = month_days[localtime.mon]; - if (localtime.leap && localtime.mon == 1) - max++; - change = localtime.mday < 0 ? -1 : localtime.mday >= max ? 1 : 0; - if (!change) - return; - - // roll over month - localtime.mon = (localtime.mon + change + 12) % 12; - - // check if year rolled over - max = localtime.leap ? 366 : 365; - change = localtime.yday < 0 ? -1 : localtime.yday >= max ? 1 : 0; - if (!change) - return; - - // roll over year - localtime.yn += change; - - // check if cen rolled over - change = localtime.yn < 0 ? -1 : localtime.yn >= 100 ? 1 : 0; - if (!change) - goto year; - - // roll over cen - localtime.cen += change; - -year: - - localtime.year = localtime.yn + localtime.cen * 100; - localtime.leap = localtime.year % 4 == 0 && localtime.year % 100 != 0; - - if (localtime.leap && localtime.yday == -1) - localtime.yday = 365; - else if (localtime.yday == -1) - localtime.yday = 364; - else - localtime.yday = 0; - - localtime.year -= 1900; -} - -void clock_update(void) +void gettime(struct time *time) { - time.sec = cmos_read(CMOS_REG_SEC); - time.min = cmos_read(CMOS_REG_MIN); - time.hour = cmos_read(CMOS_REG_HOUR); - time.wday = cmos_read(CMOS_REG_WDAY) - 1; - time.mday = cmos_read(CMOS_REG_MDAY); - time.mon = cmos_read(CMOS_REG_MON) - 1; - time.yn = cmos_read(CMOS_REG_YEAR); - time.cen = 20; - - time.year = time.yn + time.cen * 100; - - time.leap = time.year % 4 == 0 && time.year % 100 != 0; + time->sec = cmos_read(CMOS_REG_SEC); + time->min = cmos_read(CMOS_REG_MIN); + time->hour = cmos_read(CMOS_REG_HOUR); + time->wday = cmos_read(CMOS_REG_WDAY) - 1; + time->mday = cmos_read(CMOS_REG_MDAY); + time->mon = cmos_read(CMOS_REG_MON) - 1; + time->yn = cmos_read(CMOS_REG_YEAR); + time->cen = 20; - time.yday = mday_offset[time.mon] + time.mday; + time->year = time->yn + time->cen * 100; - if (time.leap && time.mon > 2) - time.yday++; + time->leap = time->year % 4 == 0 && time->year % 100 != 0; - time.year -= 1900; + time->yday = mday_offset[time->mon] + time->mday; - update_localtime(); + if (time->leap && time->mon > 2) + time->yday++; - curr_time = time; - curr_localtime = localtime; + time->year -= 1900; } -void set_timezone(timezone_t tz) +uint64_t unixtime(void) { - curr_timezone = tz; -} - -time_t get_utctime(void) -{ - return curr_time; -} + struct time time; + gettime(&time); -time_t get_localtime(void) -{ - if (curr_timezone != last_timezone) { - last_timezone = curr_timezone; - update_localtime(); - curr_localtime = localtime; - } - return curr_localtime; -} - -size_t get_systemtime(void) -{ - return 0; + // FIXME: probably wrong + uint64_t unix = 0; + unix += time.sec; + unix += time.min * 60; + unix += time.hour * 60 * 60; + unix += time.yday * 60 * 60 * 24; + unix += time.year * 60 * 60 * 24 * 365; + return unix; } |