helos1/driver/irq/pic/rtc/rtc.c

35 lines
899 B
C

#include "rtc.h"
#include "internal.h"
#include "../pic.h"
#include "../internal.h"
#include "../../../../main.h"
#include "../../../../runtime/panic_assert.h"
#include "../../../../interrupt/interrupt.h"
bool pic_rtc_Enabled;
void pic_rtc_Init() {
assert(irq_pic_Enabled && "pic/rtc requires pic to be enabled");
if (pic_rtc_Enabled)
return;
INTERRUPT_DISABLE;
outb(0x70, 0x8b); // select register B, and disable NMI
uint8_t prev = inb(0x71); // read the current value of register B
outb(0x70, 0x8B); // set the index again (a read will reset the index to register D)
outb(0x71, prev | 0x40); // write the previous value ORed with 0x40. This turns on bit 6 of register B
irq_pic_IRQHandlerRaw[8] = __pic_rtc_IRQ8;
irq_pic_Mask(8, false);
pic_rtc_Enabled = true;
INTERRUPT_RESTORE;
}
void pic_rtc_SetHandler(void *handler) {
__pic_rtc_IRQHandler = handler;
}