CeDOS - Commit a5bc1637

time: Added syscall for current time
Celina Sophie Kalus
Sun, 10 Dec 2023 18:30:02 +0100
6 files changed, 82 insertions(+), 1 deletions(-)
M kernel/syscall.ckernel/syscall.c

@@ -26,7 +26,8 @@ file_tell,

time_get_ticks, mem_usage, sched_kill, - sched_sleep + sched_sleep, + time_now }; extern void syscall_interrupt(void);
M kernel/time.ckernel/time.c

@@ -1,4 +1,22 @@

#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;

@@ -8,4 +26,26 @@ }

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; }
M kernel/time.hkernel/time.h

@@ -1,8 +1,20 @@

#ifndef __TIME_H #define __TIME_H +typedef struct { + int year; + int month; + int day; + + int hour; + int minute; + int second; +} datetime_t; + void time_tick(void); int time_get_ticks(void); + +int time_now(datetime_t *buffer); #endif
M libcedos/cedos.clibcedos/cedos.c

@@ -105,3 +105,8 @@ void sleep(int ticks) {

volatile uint32_t res = 0; interrupt(0x30, res, 15, ticks, 0, 0); } + +int time_now(datetime_t *buffer) { + volatile uint32_t res = 0; + interrupt(0x30, res, 16, buffer, 0, 0); +}
M libcedos/cedos.hlibcedos/cedos.h

@@ -5,6 +5,16 @@ #include "assembly.h"

#include <stdint.h> +typedef struct { + int year; + int month; + int day; + + int hour; + int minute; + int second; +} datetime_t; + int sysprint(const char *fmt, int arg1, int arg2); int yield(); void sleep(int ticks);

@@ -28,6 +38,8 @@ int dir_next(int fd, int index, char *fname_buffer);

int sc_time_get_ticks(void); uint32_t sc_mem_usage(void); + +int time_now(datetime_t *buffer); #endif
A shell/date.c

@@ -0,0 +1,11 @@

+#include "cedos.h" +#include "stdio.h" + +#include <stdint.h> + +void main(char *args) { + datetime_t now; + time_now(&now); + printf("%i-%i-%i %i:%i:%i\n", now.year, now.month, now.day, now.hour, now.minute, now.second); + +}