PatchworkOS
Loading...
Searching...
No Matches
rtc.c
Go to the documentation of this file.
1#include <kernel/cpu/port.h>
3
5{
7 return port_inb(CMOS_DATA);
8}
9
11{
12 return (bcd >> 4) * 10 + (bcd & 0x0F);
13}
14
15void rtc_read(struct tm* time)
16{
17 if (time == NULL)
18 {
19 return;
20 }
21
22 uint8_t second = bcd_to_bin(cmos_read(0x00));
23 uint8_t minute = bcd_to_bin(cmos_read(0x02));
24 uint8_t hour = bcd_to_bin(cmos_read(0x04));
25 uint8_t day = bcd_to_bin(cmos_read(0x07));
26 uint8_t month = bcd_to_bin(cmos_read(0x08));
27 uint16_t year = bcd_to_bin(cmos_read(0x09)) + 2000;
28
29 *time = (struct tm){
30 .tm_sec = second,
31 .tm_min = minute,
32 .tm_hour = hour,
33 .tm_mday = day,
34 .tm_mon = month - 1,
35 .tm_year = year - 1900,
36 };
37}
static uint8_t port_inb(uint16_t port)
Definition port.h:34
static void port_outb(uint16_t port, uint8_t val)
Definition port.h:29
#define CMOS_DATA
CMOS data port.
Definition rtc.h:25
void rtc_read(struct tm *time)
Reads the current time from the RTC.
Definition rtc.c:15
#define CMOS_ADDRESS
CMOS address port.
Definition rtc.h:20
#define NULL
Pointer error value.
Definition NULL.h:23
static uint8_t bcd_to_bin(uint8_t bcd)
Definition rtc.c:10
static uint8_t cmos_read(uint8_t reg)
Definition rtc.c:4
__UINT8_TYPE__ uint8_t
Definition stdint.h:11
__UINT16_TYPE__ uint16_t
Definition stdint.h:13
Definition time.h:21
_PUBLIC time_t time(time_t *timer)
Definition time.c:5