35 lines
899 B
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;
|
||
|
}
|