Feat: lab 3 w/o adv 2
This commit is contained in:
@@ -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);
|
||||
|
||||
14
kernel/include/ringbuffer.h
Normal file
14
kernel/include/ringbuffer.h
Normal 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
27
kernel/include/timer.h
Normal 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
25
kernel/include/uart.h
Normal 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;
|
||||
@@ -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); }
|
||||
|
||||
Reference in New Issue
Block a user