CeDOS - kernel/time.c

kernel/time.c (view raw)

#include "time.h"
#include "assembly.h"

#define RTC_COMMAND  			0x70
#define RTC_DATA 				0x71

#define RTC_READY   			0x80

#define RTC_REGISTER_A			0x0A
#define RTC_REGISTER_B			0x0B
#define RTC_REGISTER_C			0x0C

#define RTC_GET_SECONDS			0x00
#define RTC_GET_MINUTES			0x02
#define RTC_GET_HOURS			0x04

#define RTC_GET_DAY 			0x07
#define RTC_GET_MONTH			0x08
#define RTC_GET_YEAR			0x09

int ticks = 0;

void time_tick(void) {
    ticks++;
}

int time_get_ticks(void) {
    return ticks;
}

static uint8_t rtc_get(uint8_t reg) {
    outb(reg, RTC_COMMAND);
    nop();
    nop();
    nop();
    nop();
    uint8_t res = inb(RTC_DATA);
    return (res >> 4) * 10 + (res & 0x0F);
}

int time_now(datetime_t *buffer) {
    buffer->year = 2000 + rtc_get(RTC_GET_YEAR);
    buffer->month = rtc_get(RTC_GET_MONTH);
    buffer->day = rtc_get(RTC_GET_DAY);

    buffer->hour = rtc_get(RTC_GET_HOURS);
    buffer->minute = rtc_get(RTC_GET_MINUTES);
    buffer->second = rtc_get(RTC_GET_SECONDS);

    return 0;
}