RTC finished !

This commit is contained in:
Adrien Bourmault 2019-04-24 21:08:44 +02:00
parent 11792a58f8
commit 0118bfb796
9 changed files with 148 additions and 33 deletions

View File

@ -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}

View File

@ -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] = {

View File

@ -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);
} }
// //

View File

@ -140,5 +140,4 @@ IsrWithoutErrCode 28
IsrWithoutErrCode 29 IsrWithoutErrCode 29
IsrWithoutErrCode 30 IsrWithoutErrCode 30
IsrWithoutErrCode 31 IsrWithoutErrCode 31
IsrWithoutErrCode 32

View File

@ -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);

View File

@ -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

View File

@ -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;
} }

View File

@ -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

View File

@ -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* ");
}