NJU-ProjectN/abstract-machine 3348db971fd860be5cb28e21c18f9d0e65d0c96a Merge pull request #8 from Jasonyanyusong/master
32 lines
979 B
C
32 lines
979 B
C
#include <am.h>
|
|
#include <klib-macros.h>
|
|
|
|
void __am_timer_init();
|
|
|
|
void __am_timer_rtc(AM_TIMER_RTC_T *);
|
|
void __am_timer_uptime(AM_TIMER_UPTIME_T *);
|
|
void __am_input_keybrd(AM_INPUT_KEYBRD_T *);
|
|
|
|
static void __am_timer_config(AM_TIMER_CONFIG_T *cfg) { cfg->present = true; cfg->has_rtc = true; }
|
|
static void __am_input_config(AM_INPUT_CONFIG_T *cfg) { cfg->present = true; }
|
|
|
|
typedef void (*handler_t)(void *buf);
|
|
static void *lut[128] = {
|
|
[AM_TIMER_CONFIG] = __am_timer_config,
|
|
[AM_TIMER_RTC ] = __am_timer_rtc,
|
|
[AM_TIMER_UPTIME] = __am_timer_uptime,
|
|
[AM_INPUT_CONFIG] = __am_input_config,
|
|
[AM_INPUT_KEYBRD] = __am_input_keybrd,
|
|
};
|
|
|
|
static void fail(void *buf) { panic("access nonexist register"); }
|
|
|
|
bool ioe_init() {
|
|
for (int i = 0; i < LENGTH(lut); i++)
|
|
if (!lut[i]) lut[i] = fail;
|
|
__am_timer_init();
|
|
return true;
|
|
}
|
|
|
|
void ioe_read (int reg, void *buf) { ((handler_t)lut[reg])(buf); }
|
|
void ioe_write(int reg, void *buf) { ((handler_t)lut[reg])(buf); }
|