diff --git a/Makefile b/Makefile index 6ccc8e0..26e7f98 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ OUTPUT_DIR = output # Flags # Added -O0 for easier debugging and -g for symbols -CFLAGS = -Wall -Wextra -ffreestanding -nostdlib -mcmodel=medany -Iinclude -O0 -g +CFLAGS = -Wall -Wextra -ffreestanding -nostdlib -mcmodel=medany -Iinclude -Isrc -O0 -g LDFLAGS = -T linker.ld # 1. Find sources diff --git a/src/drivers/uart.c b/src/drivers/uart.c new file mode 100644 index 0000000..4706db0 --- /dev/null +++ b/src/drivers/uart.c @@ -0,0 +1,27 @@ +#include +#include +#include + +void uart_put(size_t base_addr, uint8_t data) { + *(volatile uint8_t *)base_addr = data; +} + +int kputchar(int ch) { + uart_put(UART_ADDRESS, ch); + return ch; +} + +void kprint(const char *str) { + while (*str) { + kputchar(*str++); + } +} + +void knewline(void) { + kputchar('\n'); +} + +void kputs(const char *str) { + kprint(str); + knewline(); +} \ No newline at end of file diff --git a/src/drivers/uart.h b/src/drivers/uart.h new file mode 100644 index 0000000..51e2587 --- /dev/null +++ b/src/drivers/uart.h @@ -0,0 +1,9 @@ +#ifndef UART_H +#define UART_H + +#define UART_ADDRESS 0x10000000 +void uart_put(size_t base_addr, uint8_t data); +int kputchar(int ch); +void kputs(const char *str); +void kprint(const char *str); +#endif \ No newline at end of file diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 6ce9346..2807836 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -1,11 +1,9 @@ #include #include +#include +#include void kmain() { - char *uart = (char *)0x10000000; - char *msg = "Hello, OS World!\n"; - - for (int i = 0; msg[i] != '\0'; i++) { - *uart = msg[i]; // Write each character to the UART - } + kprint("Hello, OS World!\n"); + poweroff(); } diff --git a/src/syscon/syscon.c b/src/syscon/syscon.c new file mode 100644 index 0000000..603f5b1 --- /dev/null +++ b/src/syscon/syscon.c @@ -0,0 +1,14 @@ +#include +#include +#include "syscon.h" +#include "drivers/uart.h" + +void poweroff(void) { + kputs("Poweroff requested"); + *(uint32_t *)SYSCON_ADDR = 0x5555; +} + +void reboot(void) { + kputs("Reboot requested"); + *(uint32_t *)SYSCON_ADDR = 0x7777; +} \ No newline at end of file diff --git a/src/syscon/syscon.h b/src/syscon/syscon.h new file mode 100644 index 0000000..f842ff7 --- /dev/null +++ b/src/syscon/syscon.h @@ -0,0 +1,11 @@ +#ifndef SYSCON_H +#define SYSCON_H + +// "test" syscon-compatible device is at memory-mapped address 0x100000 +// according to our device tree +#define SYSCON_ADDR 0x100000 + +void poweroff(void); +void reboot(void); + +#endif \ No newline at end of file