RTC finished !
This commit is contained in:
parent
11792a58f8
commit
0118bfb796
7
Makefile
7
Makefile
|
@ -197,6 +197,13 @@ gdb: all
|
||||||
-ex "symbol-file $(BINDIR)/kaleid" \
|
-ex "symbol-file $(BINDIR)/kaleid" \
|
||||||
-ex "break BtStartKern" \
|
-ex "break BtStartKern" \
|
||||||
|
|
||||||
|
ddd: all
|
||||||
|
@qemu-system-x86_64 -m 64M -hda $(BUILDDIR)/bin/disk.img -no-reboot \
|
||||||
|
-no-shutdown -d cpu_reset,guest_errors,pcall,int -s -S 2> $(BUILDDIR)/qemu.log &
|
||||||
|
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > kaleid64_disasm.asm
|
||||||
|
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > kaleid32_disasm.asm
|
||||||
|
@ddd
|
||||||
|
|
||||||
install_mbr: $(BINDIR)/disk.img $(MBRDIR)/grub.cfg
|
install_mbr: $(BINDIR)/disk.img $(MBRDIR)/grub.cfg
|
||||||
@mkdir -p $(BINDIR)/disk
|
@mkdir -p $(BINDIR)/disk
|
||||||
@echo ${CL2}[$@] ${NC}Installing MBR on image...${CL3}
|
@echo ${CL2}[$@] ${NC}Installing MBR on image...${CL3}
|
||||||
|
|
|
@ -45,10 +45,8 @@ struct IRQList_t
|
||||||
struct entry {
|
struct entry {
|
||||||
void (*isr)(void);
|
void (*isr)(void);
|
||||||
uchar irq;
|
uchar irq;
|
||||||
ulong base;
|
|
||||||
ushort selector;
|
|
||||||
uchar flags;
|
uchar flags;
|
||||||
} entry[225];
|
} entry[224];
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *IsrExceptions[32] = {
|
static char *IsrExceptions[32] = {
|
||||||
|
|
|
@ -43,7 +43,7 @@ void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags)
|
||||||
|
|
||||||
KalAssert(idt[0].flags==0); // IDT uninitialized
|
KalAssert(idt[0].flags==0); // IDT uninitialized
|
||||||
|
|
||||||
if ((n == 225)) // IRQs not filled
|
if ((n == 224)) // IRQs not filled
|
||||||
KeStartPanic("[IdtRegisterIrq] Cannot register IRQ %c function %p !",
|
KeStartPanic("[IdtRegisterIrq] Cannot register IRQ %c function %p !",
|
||||||
irq,
|
irq,
|
||||||
isr
|
isr
|
||||||
|
@ -101,13 +101,15 @@ void IdtSetup(void)
|
||||||
IdtSetGate(28, (ulong)isr28, codeSeg, 0x8E); // INTEL RESERVED
|
IdtSetGate(28, (ulong)isr28, codeSeg, 0x8E); // INTEL RESERVED
|
||||||
IdtSetGate(29, (ulong)isr29, codeSeg, 0x8E); // INTEL RESERVED
|
IdtSetGate(29, (ulong)isr29, codeSeg, 0x8E); // INTEL RESERVED
|
||||||
IdtSetGate(30, (ulong)isr30, codeSeg, 0x8E); // INTEL RESERVED
|
IdtSetGate(30, (ulong)isr30, codeSeg, 0x8E); // INTEL RESERVED
|
||||||
|
IdtSetGate(31, (ulong)isr31, codeSeg, 0x8E); // INTEL RESERVED
|
||||||
|
|
||||||
// Set the IRQ Driver Gates
|
// Set the IRQ Driver Gates
|
||||||
for (int i = 0 ; i < irqList.n ; i++) {
|
for (int i = 0 ; i < irqList.n ; i++) {
|
||||||
IdtSetGate(irqList.entry[irqList.n].irq,
|
IdtSetGate(
|
||||||
(ulong)irqList.entry[irqList.n].isr,
|
irqList.entry[i].irq,
|
||||||
|
(ulong)irqList.entry[i].isr,
|
||||||
codeSeg,
|
codeSeg,
|
||||||
irqList.entry[irqList.n].flags
|
irqList.entry[i].flags
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,10 +168,10 @@ static void EnablePIC(void)
|
||||||
//
|
//
|
||||||
void SendEOItoPIC(uchar isr)
|
void SendEOItoPIC(uchar isr)
|
||||||
{
|
{
|
||||||
if(isr >= 8)
|
if(isr >= 8)
|
||||||
IoWriteByteOnPort(0xa0,0x20);
|
IoWriteByteOnPort(0xa0,0x20);
|
||||||
|
|
||||||
IoWriteByteOnPort(0x20,0x20);
|
IoWriteByteOnPort(0x20,0x20);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -140,5 +140,4 @@ IsrWithoutErrCode 28
|
||||||
IsrWithoutErrCode 29
|
IsrWithoutErrCode 29
|
||||||
IsrWithoutErrCode 30
|
IsrWithoutErrCode 30
|
||||||
IsrWithoutErrCode 31
|
IsrWithoutErrCode 31
|
||||||
IsrWithoutErrCode 32
|
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,13 @@ extern void BtInitBootInfo(multiboot_info_t *mbi, void *codeSeg);
|
||||||
// io/vga.c
|
// io/vga.c
|
||||||
extern error_t IoInitVGABuffer(void);
|
extern error_t IoInitVGABuffer(void);
|
||||||
|
|
||||||
//io/keyb.
|
//io/keyb.c
|
||||||
extern error_t KeybSetup(void);
|
extern void IoSetupKeyb(void);
|
||||||
|
|
||||||
|
//io/rtc.c
|
||||||
|
extern void IoSetupRtc(void);
|
||||||
|
extern void IoEnableRtc(void);
|
||||||
|
extern ulong IoRtcTicks;
|
||||||
|
|
||||||
// cpu/idt.c
|
// cpu/idt.c
|
||||||
extern void IdtSetup(void);
|
extern void IdtSetup(void);
|
||||||
|
@ -50,7 +55,7 @@ extern void divideByZero(void);
|
||||||
|
|
||||||
void test(void)
|
void test(void)
|
||||||
{
|
{
|
||||||
DebugLog("test\n");
|
asm volatile ("hlt");
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -79,11 +84,23 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg)
|
||||||
// Several inits
|
// Several inits
|
||||||
MmInitHeap();
|
MmInitHeap();
|
||||||
PsInitSched();
|
PsInitSched();
|
||||||
KeybSetup();
|
|
||||||
|
// Drivers ISR inits
|
||||||
|
IoSetupRtc();
|
||||||
|
// Interrupts launching
|
||||||
IdtSetup();
|
IdtSetup();
|
||||||
KeEnableIRQs();
|
KeEnableIRQs();
|
||||||
|
// Drivers enabling
|
||||||
|
IoEnableRtc();
|
||||||
|
|
||||||
KernLog("\nGoodbye!");
|
while (1) {
|
||||||
|
asm volatile ("hlt");
|
||||||
|
if (IoRtcTicks > 2000) {
|
||||||
|
KernLog("CC\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
KernLog("\nGoodbye after %d ticks", IoRtcTicks);
|
||||||
|
|
||||||
// End this machine's suffering
|
// End this machine's suffering
|
||||||
BFlushBuf(BStdOut);
|
BFlushBuf(BStdOut);
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
; along with OS/K. If not, see <https://www.gnu.org/licenses/>. ;
|
; along with OS/K. If not, see <https://www.gnu.org/licenses/>. ;
|
||||||
;=----------------------------------------------------------------------------=;
|
;=----------------------------------------------------------------------------=;
|
||||||
|
|
||||||
|
[BITS 64]
|
||||||
|
|
||||||
global KeybIsr
|
global KeybIsr
|
||||||
extern KeybHandler
|
extern KeybHandler
|
||||||
|
|
||||||
|
|
|
@ -22,12 +22,14 @@
|
||||||
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
#include <kernel/base.h>
|
||||||
#include <kernel/iomisc.h>
|
#include <kernel/iomisc.h>
|
||||||
|
|
||||||
extern void KeybIsr(void);
|
extern void KeybIsr(void);
|
||||||
extern IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags);
|
extern void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags);
|
||||||
|
extern void SendEOItoPIC(void);
|
||||||
|
|
||||||
void KeybSetup(void)
|
void IoSetupKeyb(void)
|
||||||
{
|
{
|
||||||
IdtRegisterIrq(KeybIsr, 0x21, 0x8E);
|
IdtRegisterIrq(KeybIsr, 0x21, 0x8E);
|
||||||
}
|
}
|
||||||
|
@ -35,20 +37,20 @@ void KeybSetup(void)
|
||||||
|
|
||||||
uchar KeybHandler(void)
|
uchar KeybHandler(void)
|
||||||
{
|
{
|
||||||
uchar status;
|
char status;
|
||||||
uchar code;
|
char code = 0;
|
||||||
|
|
||||||
// write EOI
|
// write EOI
|
||||||
IoWriteByteOnPort(0x20, 0x20);
|
IoWriteByteOnPort(0x20, 0x20);
|
||||||
|
|
||||||
status = IoReadByteFromPort(KeybStatusPort);
|
status = IoReadByteFromPort(0x64);
|
||||||
|
|
||||||
if (status & 0x01) {
|
if (status & 0x01) {
|
||||||
code = IoReadByteFromPort(KeybDataPort);
|
code = IoReadByteFromPort(0x60);
|
||||||
|
|
||||||
if(code < 0) return 0;
|
if(code < 0) code = 0;
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,3 +22,48 @@
|
||||||
; You should have received a copy of the GNU General Public License ;
|
; You should have received a copy of the GNU General Public License ;
|
||||||
; along with OS/K. If not, see <https://www.gnu.org/licenses/>. ;
|
; along with OS/K. If not, see <https://www.gnu.org/licenses/>. ;
|
||||||
;=----------------------------------------------------------------------------=;
|
;=----------------------------------------------------------------------------=;
|
||||||
|
|
||||||
|
[BITS 64]
|
||||||
|
|
||||||
|
global RtcIsr
|
||||||
|
extern RtcHandler
|
||||||
|
|
||||||
|
%macro pushAll 0
|
||||||
|
push rax
|
||||||
|
push rcx
|
||||||
|
push rdx
|
||||||
|
push rbx
|
||||||
|
push rbp
|
||||||
|
push rsi
|
||||||
|
push rdi
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
%macro popAll 0
|
||||||
|
pop rdi
|
||||||
|
pop rsi
|
||||||
|
pop rbp
|
||||||
|
pop rbx
|
||||||
|
pop rdx
|
||||||
|
pop rcx
|
||||||
|
pop rax
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; Keyboard handler
|
||||||
|
;;
|
||||||
|
RtcIsr:
|
||||||
|
cli
|
||||||
|
pushAll
|
||||||
|
|
||||||
|
xor rax, rax
|
||||||
|
mov ax, ds
|
||||||
|
push rax
|
||||||
|
|
||||||
|
call RtcHandler
|
||||||
|
|
||||||
|
pop rax
|
||||||
|
mov ds, ax
|
||||||
|
|
||||||
|
popAll
|
||||||
|
sti
|
||||||
|
iretq
|
||||||
|
|
|
@ -24,17 +24,60 @@
|
||||||
|
|
||||||
#include <kernel/base.h>
|
#include <kernel/base.h>
|
||||||
#include <kernel/iomisc.h>
|
#include <kernel/iomisc.h>
|
||||||
|
#include <extras/buf.h>
|
||||||
|
|
||||||
void CpuEnableRtc(void)
|
extern void RtcIsr(void);
|
||||||
|
extern void SendEOItoPIC(void);
|
||||||
|
extern void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags);
|
||||||
|
|
||||||
|
ulong IoRtcTicks = 0;
|
||||||
|
|
||||||
|
void IoSetupRtc(void)
|
||||||
|
{
|
||||||
|
IdtRegisterIrq(RtcIsr, 0x28, 0x8E);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IoEnableRtc(void)
|
||||||
{
|
{
|
||||||
ulong flags = KePauseIRQs();
|
ulong flags = KePauseIRQs();
|
||||||
// Setting up the register control
|
char readedInterruptConfig;
|
||||||
IoWriteByteOnPort(0x70, 0x8A); //selects status reg A and DISABLE NMI
|
char readedRegister;
|
||||||
IoWriteByteOnPort(0x71, 0x20);
|
char readedIrqs;
|
||||||
//Enabling the IRQ 8
|
uchar RtcRate;
|
||||||
|
|
||||||
|
// Setting up the register control and interrupt rates
|
||||||
|
RtcRate = 0x05;
|
||||||
|
|
||||||
IoWriteByteOnPort(0x70, 0x8B);
|
IoWriteByteOnPort(0x70, 0x8B);
|
||||||
char read = IoReadByteFromPort(0x71); // Because read causes reset
|
readedRegister = IoReadByteFromPort(0x71);
|
||||||
IoWriteByteOnPort(0x70, 0x8B);
|
IoWriteByteOnPort(0x70, 0x8B); // Because reading flushes
|
||||||
IoWriteByteOnPort(0x71, read | 0x40);
|
IoWriteByteOnPort(0x71, readedRegister | 0x40);
|
||||||
|
|
||||||
|
IoWriteByteOnPort(0x70, 0x8A);
|
||||||
|
readedInterruptConfig = IoReadByteFromPort(0x71);
|
||||||
|
IoWriteByteOnPort(0x70, 0x8A); // Because reading flushes
|
||||||
|
IoWriteByteOnPort(0x71, (readedInterruptConfig & 0xF0) | RtcRate);
|
||||||
|
IoWriteByteOnPort(0x70, 0x0C);
|
||||||
|
IoReadByteFromPort(0x71); // Flush
|
||||||
|
|
||||||
|
// Setting up the IRQs
|
||||||
|
readedIrqs = IoReadByteFromPort(0xA1);
|
||||||
|
IoWriteByteOnPort(0xA1, 0xFE & readedIrqs); // Enables IRQ on PIC 2
|
||||||
|
readedIrqs = IoReadByteFromPort(0x21);
|
||||||
|
IoWriteByteOnPort(0x21, 0xFB & readedIrqs); // Enables IRQ on PIC 1
|
||||||
|
|
||||||
|
// clean-up
|
||||||
|
IoWriteByteOnPort(0x70, 0x0C); // Select status reg C
|
||||||
|
IoReadByteFromPort(0x71); // Flush
|
||||||
KeRestoreIRQs(flags);
|
KeRestoreIRQs(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RtcHandler(void)
|
||||||
|
{
|
||||||
|
//bprintf(BStdOut, " *RTC - ");
|
||||||
|
IoWriteByteOnPort(0x70, 0x0C); // Selects status reg C
|
||||||
|
IoReadByteFromPort(0x71); // Flush
|
||||||
|
IoRtcTicks++;
|
||||||
|
SendEOItoPIC();
|
||||||
|
//bprintf(BStdOut, " - EOI* ");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue