Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
rtc.c
Go to the documentation of this file.
1#include "libk/serial.h"
2#include <hal/timer/rtc.h>
3#include <libk/io.h>
4
5#define CMOS_ADDR 0x70
6#define CMOS_DATA 0x71
7
10 return inb(CMOS_DATA);
11}
12
13static bool rtc_is_updating() {
14 outb(CMOS_ADDR, 0x0A);
15 return inb(CMOS_DATA) & 0x80;
16}
17
27
28static void rtc_read_time(date_time* dt) {
29 while (rtc_is_updating())
30 ; // tunggu UIP clear
31 uint8_t sec = cmos_read(0x00);
32 uint8_t min = cmos_read(0x02);
33 uint8_t hour = cmos_read(0x04);
34 uint8_t day = cmos_read(0x07);
35 uint8_t month = cmos_read(0x08);
36 uint8_t year = cmos_read(0x09);
37
38 // BCD ke binary
39 uint8_t regB = cmos_read(0x0B);
40 if (!(regB & 0x04)) {
41 sec = ((sec & 0x0F) + ((sec / 16) * 10));
42 min = ((min & 0x0F) + ((min / 16) * 10));
43 hour = ((hour & 0x0F) + (((hour / 16) * 10)));
44 day = ((day & 0x0F) + ((day / 16) * 10));
45 month = ((month & 0x0F) + ((month / 16) * 10));
46 year = ((year & 0x0F) + ((year / 16) * 10));
47 }
48
49 // Format 12h ke 24h jika perlu
50 if (!(regB & 0x02) && (hour & 0x80)) {
51 hour = ((hour & 0x7F) + 12) % 24;
52 }
53 dt->second = sec;
54 dt->minute = min;
55 dt->hour = hour;
56 dt->day = day;
57 dt->month = month;
58 dt->year = year;
59}
60
61// static void rtc_enable_periodic_interrupt() {
62// outb(CMOS_ADDR, 0x8A);
63// uint8_t prevA = inb(CMOS_DATA);
64// outb(CMOS_ADDR, 0x8A);
65// outb(CMOS_DATA, (prevA & 0xF0) | 0x06); // 1024 Hz misalnya
66
67// outb(CMOS_ADDR, 0x8B);
68// uint8_t prevB = inb(CMOS_DATA);
69// outb(CMOS_ADDR, 0x8B);
70// outb(CMOS_DATA, prevB | 0x40); // Set PIE
71// }
72
73// void rtc_isr() {
74// outb(CMOS_ADDR, 0x0C);
75// inb(CMOS_DATA); // wajib dibaca untuk clear IRQ
76// // ... lakukan hal lain seperti update jam global ...
77// }
78
79void rtc_initialize(void) {
80 date_time dt;
81 rtc_read_time(&dt);
82 LOG_INFO("RTC", "sekarang hari %d/%d/%d jam %d:%d:%d", dt.day, dt.month,
83 dt.year, dt.hour, dt.minute, dt.second);
84}
cpu_register_t reg
Definition thread.h:14
static uint8_t inb(uint16_t port)
Definition io.h:11
static void outb(uint16_t port, uint8_t value)
Definition io.h:6
uint64_t min(uint64_t a, uint64_t b)
Definition math.c:21
#define CMOS_ADDR
Definition rtc.c:5
#define CMOS_DATA
Definition rtc.c:6
void rtc_initialize(void)
Definition rtc.c:79
static void rtc_read_time(date_time *dt)
Definition rtc.c:28
static bool rtc_is_updating()
Definition rtc.c:13
static uint8_t cmos_read(uint8_t reg)
Definition rtc.c:8
#define LOG_INFO(mod, fmt,...)
Definition serial.h:20
uint8_t year
Definition rtc.c:24
uint8_t minute
Definition rtc.c:20
uint8_t day
Definition rtc.c:22
uint8_t month
Definition rtc.c:23
uint8_t hour
Definition rtc.c:21
uint8_t second
Definition rtc.c:19
unsigned char uint8_t
Definition type.h:7