Feat: lab 3 w/o adv 2

This commit is contained in:
2025-03-26 15:30:57 +08:00
parent c5fc7e3102
commit 96cfdc4de2
25 changed files with 618 additions and 113 deletions

View File

@@ -2,16 +2,5 @@
#include <stddef.h>
#define CORE0_TIMER_IRQ_CTRL ((volatile uint32_t *)0x40000040)
#define CORE0_IRQ_SOURCE ((volatile uint32_t *)0x40000060)
enum :uint32_t {
CNTPNSIRQ_INT = ((uint32_t)1 << 1),
GPU_INT = ((uint32_t)1 << 8)
};
void init_interrupt(void);
void irq_handler(void);
void enable_interrupt(void);
void disable_interrupt(void);

View File

@@ -0,0 +1,14 @@
#pragma once
#include <stddef.h>
typedef struct {
size_t size;
size_t cap;
uint8_t *data;
uint8_t *read, *write;
} ringbuffer_t;
ringbuffer_t *make_ringbuffer(size_t size);
int ringbuffer_push(ringbuffer_t *buf, uint8_t val);
uint8_t ringbuffer_bump(ringbuffer_t *buf);

27
kernel/include/timer.h Normal file
View File

@@ -0,0 +1,27 @@
#pragma once
#include <stddef.h>
typedef void (*task_callback_func_t)(uint64_t);
typedef struct {
uint64_t firing_tick;
uint64_t interval;
uint64_t repeat;
task_callback_func_t func;
uint64_t param;
} task_t;
typedef struct timer {
struct timer *_l, *_r;
uint32_t _d;
task_t data;
} timer_t;
void add_task(task_t task);
void timer_irq_handler(void);
extern timer_t *global_timer;

25
kernel/include/uart.h Normal file
View File

@@ -0,0 +1,25 @@
#pragma once
#include <stddef.h>
#include <ringbuffer.h>
#define UART_BUFLEN 0x800
void uart_init(void);
char uart_getc(void);
void uart_puts(const char *s);
void uart_hex(uint64_t d);
void uart_irq_handler(void);
size_t uart_putb_sync(const uint8_t *bytes, size_t len);
size_t uart_getb_sync(uint8_t *bytes, size_t len);
size_t uart_putb_async(const uint8_t *bytes, size_t len);
size_t uart_getb_async(uint8_t *bytes, size_t len);
extern size_t (*uart_putb)(const uint8_t *bytes, size_t len);
extern size_t (*uart_getb)(uint8_t *bytes, size_t len);
extern int is_uart_inited;
extern ringbuffer_t *uart_readbuf;

View File

@@ -45,8 +45,16 @@ void exit(int);
#define W_SYSREG(reg, val) \
asm volatile( \
"msr " #reg ", %[a]" \
"mov x0, %[a]" ENDL \
"msr " #reg ", x0" ENDL \
:: [a] "r" (val) \
: "x0" \
)
#define W_SYSREG_IMM(reg, val) \
asm volatile( \
"msr " #reg ", %[a]" \
:: [a] "i" (val) \
)
#define R_REG(ret, reg) \
@@ -54,3 +62,17 @@ void exit(int);
"mov %[a], " #reg \
: [a] "=r" (ret) \
)
#define W_REG(reg, val) \
asm volatile( \
"mov " #reg ", %[a]" \
:: [a] "r" (val) \
)
#define MMIO_W_HELPER(name, reg, mask, offset) \
static inline void name(uint64_t state) \
{ *reg = (*reg & ~((mask) << (offset))) | ((state & (mask)) << (offset)); }
#define MMIO_R_HELPER(name, reg, mask, offset) \
static inline uint64_t name(void) \
{ return (*reg >> (offset)) & (mask); }