réplica de
https://github.com/Arnau478/quark.git
synced 2024-11-23 21:08:07 +01:00
Implemented PIC
This commit is contained in:
pare
7bb5e0d16c
commit
d5a18de997
S'han modificat 4 arxius amb 44 adicions i 0 eliminacions
|
@ -3,6 +3,7 @@
|
||||||
#include "../../stdio.h"
|
#include "../../stdio.h"
|
||||||
#include "idt.h"
|
#include "idt.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
|
#include "pic.h"
|
||||||
|
|
||||||
static isr_handler g_isr_handlers[256];
|
static isr_handler g_isr_handlers[256];
|
||||||
|
|
||||||
|
@ -46,6 +47,8 @@ void i686_isr_initialize_gates();
|
||||||
void i686_isr_initialize(){
|
void i686_isr_initialize(){
|
||||||
i686_isr_initialize_gates();
|
i686_isr_initialize_gates();
|
||||||
|
|
||||||
|
i686_pic_initialize();
|
||||||
|
|
||||||
for(int i = 0; i < 256; i++){
|
for(int i = 0; i < 256; i++){
|
||||||
i686_idt_enable_gate(i);
|
i686_idt_enable_gate(i);
|
||||||
}
|
}
|
||||||
|
|
31
src/kernel/arch/i686/pic.c
Normal file
31
src/kernel/arch/i686/pic.c
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#include "pic.h"
|
||||||
|
#include "io.h"
|
||||||
|
|
||||||
|
void i686_pic_initialize(){
|
||||||
|
uint8_t pic1_mask;
|
||||||
|
uint8_t pic2_mask;
|
||||||
|
|
||||||
|
// Save PIC masks
|
||||||
|
pic1_mask = i686_inb(PIC1_DATA_PORT);
|
||||||
|
pic2_mask = i686_inb(PIC2_DATA_PORT);
|
||||||
|
|
||||||
|
// ICW1: Initialize/reset PICs
|
||||||
|
i686_outb(PIC1_CMD_PORT, 0x11); // PIC1
|
||||||
|
i686_outb(PIC2_CMD_PORT, 0x11); // PIC2
|
||||||
|
|
||||||
|
// ICW2: Remap IRQs
|
||||||
|
i686_outb(PIC1_DATA_PORT, 0x20); // PIC1 remapped to 0x20 (32)
|
||||||
|
i686_outb(PIC2_DATA_PORT, 0x28); // PIC2 remapped to 0x28 (40)
|
||||||
|
|
||||||
|
// ICW3: Cascade settings
|
||||||
|
i686_outb(PIC1_DATA_PORT, 0x04); // PIC1 is told that slave PIC is at IRQ2
|
||||||
|
i686_outb(PIC2_DATA_PORT, 0x02); // PIC2 has cascade identity 2
|
||||||
|
|
||||||
|
// ICW4: Env info
|
||||||
|
i686_outb(PIC1_DATA_PORT, 0x01); // PIC1 on 8086/88 mode
|
||||||
|
i686_outb(PIC2_DATA_PORT, 0x01); // PIC2 on 8086/88 mode
|
||||||
|
|
||||||
|
// Restore PIC masks
|
||||||
|
i686_outb(PIC1_DATA_PORT, pic1_mask);
|
||||||
|
i686_outb(PIC2_DATA_PORT, pic2_mask);
|
||||||
|
}
|
8
src/kernel/arch/i686/pic.h
Normal file
8
src/kernel/arch/i686/pic.h
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define PIC1_CMD_PORT 0x20
|
||||||
|
#define PIC1_DATA_PORT 0x21
|
||||||
|
#define PIC2_CMD_PORT 0xA0
|
||||||
|
#define PIC2_DATA_PORT 0xA1
|
||||||
|
|
||||||
|
void i686_pic_initialize();
|
|
@ -23,6 +23,8 @@ mboot:
|
||||||
dd MULTIBOOT_CHECKSUM
|
dd MULTIBOOT_CHECKSUM
|
||||||
|
|
||||||
call_kmain:
|
call_kmain:
|
||||||
|
; Enable interrupts
|
||||||
|
sti
|
||||||
; Call kernel
|
; Call kernel
|
||||||
call kmain
|
call kmain
|
||||||
; If on qemu, shutdown
|
; If on qemu, shutdown
|
||||||
|
|
Loading…
Referencia en una nova incidència