Initial commit
This commit is contained in:
commit
df3bb750a7
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/kernel.elf
|
||||||
|
/kernel.bin
|
18
Makefile
Normal file
18
Makefile
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
CFLAGS=-ffreestanding \
|
||||||
|
-O0
|
||||||
|
LDFLAGS=-nostdlib
|
||||||
|
|
||||||
|
all: kernel.bin
|
||||||
|
|
||||||
|
kernel.bin: kernel.elf
|
||||||
|
$(CROSS_COMPILE)objcopy -O binary $< $@
|
||||||
|
|
||||||
|
kernel.elf: entry.S kernel.c link.ld
|
||||||
|
$(CROSS_COMPILE)gcc $(CFLAGS) $(LDFLAGS) \
|
||||||
|
-o $@ \
|
||||||
|
-Tlink.ld \
|
||||||
|
entry.S \
|
||||||
|
kernel.c
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f kernel.elf kernel.bin
|
15
entry.S
Normal file
15
entry.S
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
.section .text.boot
|
||||||
|
.global _entry
|
||||||
|
.type _entry, %function
|
||||||
|
_entry:
|
||||||
|
adr x1, bsp_stack_top
|
||||||
|
mov sp, x1
|
||||||
|
|
||||||
|
bl kernel_main
|
||||||
|
b .
|
||||||
|
.size _entry, . - _entry
|
||||||
|
|
||||||
|
.section .bss
|
||||||
|
bsp_stack_bottom:
|
||||||
|
.skip 65536
|
||||||
|
bsp_stack_top:
|
46
kernel.c
Normal file
46
kernel.c
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define UART0_BASE 0x05000000
|
||||||
|
#define R_WDOG_BASE 0x07020400
|
||||||
|
|
||||||
|
#define WDOG_CTRL_KEY (0xA57 << 1)
|
||||||
|
#define WDOG_CTRL_RESTART (1 << 0)
|
||||||
|
#define WDOG_CFG_SYS (1 << 0)
|
||||||
|
#define WDOG_MODE_EN (1 << 0)
|
||||||
|
|
||||||
|
struct watchdog {
|
||||||
|
uint32_t irq_en;
|
||||||
|
uint32_t irq_sta;
|
||||||
|
uint32_t res[2];
|
||||||
|
uint32_t ctrl;
|
||||||
|
uint32_t cfg;
|
||||||
|
uint32_t mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
static volatile struct watchdog *const r_wdog = (struct watchdog *) R_WDOG_BASE;
|
||||||
|
|
||||||
|
static inline void delay(uint32_t t) {
|
||||||
|
for (uint32_t i = 0; i < t; ++i) {
|
||||||
|
asm volatile ("nop");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void uart_tx(uint8_t byte) {
|
||||||
|
*((uint8_t *) UART0_BASE) = byte;
|
||||||
|
}
|
||||||
|
|
||||||
|
static _Noreturn void board_reset(void) {
|
||||||
|
r_wdog->cfg = WDOG_CFG_SYS;
|
||||||
|
r_wdog->mode = WDOG_MODE_EN;
|
||||||
|
r_wdog->ctrl = WDOG_CTRL_KEY | WDOG_CTRL_RESTART;
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
_Noreturn void kernel_main(uintptr_t dt_phys_addr) {
|
||||||
|
for (const char *p = "It's alive\r\n"; *p; ++p) {
|
||||||
|
uart_tx(*p);
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
board_reset();
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user