PIT
This commit is contained in:
@@ -21,8 +21,6 @@ stack_top:
|
||||
.type _start, @function
|
||||
_start:
|
||||
mov $stack_top, %esp
|
||||
call kernel_main
|
||||
|
||||
cli
|
||||
1: hlt
|
||||
call kmain
|
||||
1:
|
||||
jmp 1b
|
||||
6
kernel/common_stubs.S
Normal file
6
kernel/common_stubs.S
Normal file
@@ -0,0 +1,6 @@
|
||||
.code32
|
||||
|
||||
.global enable_interrupts
|
||||
enable_interrupts:
|
||||
sti
|
||||
ret
|
||||
0
kernel/drivers/pic/pic.c
Normal file
0
kernel/drivers/pic/pic.c
Normal file
7
kernel/drivers/pic/pic.h
Normal file
7
kernel/drivers/pic/pic.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#define PIC1_ADDR 0x20
|
||||
#define PIC2_ADDR 0xA0
|
||||
#define PIC1_COMMAND PIC1_ADDR
|
||||
#define PIC1_DATA (PIC1_ADDR+1)
|
||||
#define PIC2_COMMAND PIC2_ADDR
|
||||
#define PIC2_DATA (PIC2_ADDR+1)
|
||||
#define PIC_EOI 0x20
|
||||
51
kernel/drivers/pic/pic_stubs.S
Normal file
51
kernel/drivers/pic/pic_stubs.S
Normal file
@@ -0,0 +1,51 @@
|
||||
#include "drivers/pic/pic.h"
|
||||
|
||||
.code32
|
||||
.global init_pic
|
||||
init_pic:
|
||||
# init command
|
||||
mov $0x11, %al
|
||||
outb %al, $PIC1_COMMAND
|
||||
outb %al, $PIC2_COMMAND
|
||||
|
||||
# vector offsets
|
||||
mov $0x20, %al
|
||||
outb %al, $PIC1_DATA
|
||||
mov $0x28, %al
|
||||
outb %al, $PIC2_DATA
|
||||
|
||||
# cascade
|
||||
mov $0x04, %al
|
||||
outb %al, $PIC1_DATA
|
||||
mov $0x02, %al
|
||||
outb %al, $PIC2_DATA
|
||||
|
||||
# env
|
||||
mov $0x01, %al
|
||||
outb %al, $PIC1_DATA
|
||||
outb %al, $PIC2_DATA
|
||||
|
||||
# mask all
|
||||
mov $0xFC, %al
|
||||
outb %al, $PIC1_DATA
|
||||
mov $0xFF, %al
|
||||
outb %al, $PIC2_DATA
|
||||
|
||||
ret
|
||||
|
||||
.global io_wait
|
||||
io_wait:
|
||||
ret
|
||||
|
||||
.global send_eoi_master
|
||||
send_eoi_master:
|
||||
mov $0x20, %al
|
||||
outb %al, $PIC1_COMMAND
|
||||
ret
|
||||
|
||||
.global send_eoi_slave
|
||||
send_eoi_slave:
|
||||
mov $0x20, %al
|
||||
outb %al, $PIC2_COMMAND
|
||||
call send_eoi_master
|
||||
ret
|
||||
0
kernel/drivers/pit/pit.h
Normal file
0
kernel/drivers/pit/pit.h
Normal file
16
kernel/drivers/pit/pit_stubs.S
Normal file
16
kernel/drivers/pit/pit_stubs.S
Normal file
@@ -0,0 +1,16 @@
|
||||
#include "drivers/pit/pit.h"
|
||||
|
||||
.code32
|
||||
|
||||
.global init_pit
|
||||
init_pit: # tickrate: 1193182/1000 = 0x04A9 (1000hz) (1ms)
|
||||
movb $0x36, %al
|
||||
outb %al, $0x43
|
||||
|
||||
movb $0xA9, %al
|
||||
outb %al, $0x40
|
||||
|
||||
movb $0x04, %al
|
||||
outb %al, $0x40
|
||||
|
||||
ret
|
||||
@@ -1,7 +1,8 @@
|
||||
#include "lib/print.h"
|
||||
#include <stdint.h>
|
||||
|
||||
extern void master_eoi(void);
|
||||
extern void send_eoi_master(void);
|
||||
extern void send_eoi_slave(void);
|
||||
|
||||
struct registers {
|
||||
uint32_t edi, esi, ebp, esp_dummy, ebx, edx, ecx, eax;
|
||||
@@ -32,12 +33,12 @@ void common_interrupt_handler(struct registers *regs) {
|
||||
kprint("\n");
|
||||
break;
|
||||
case 32:
|
||||
// wake the PIC timer driver
|
||||
master_eoi();
|
||||
// wake the PIT timer driver
|
||||
send_eoi_master();
|
||||
break;
|
||||
case 33:
|
||||
// wake the keyboard driver
|
||||
master_eoi();
|
||||
kprint("keypress detected\n");
|
||||
send_eoi_master();
|
||||
break;
|
||||
default:
|
||||
kprint("Received unhandled interrupt\n");
|
||||
|
||||
@@ -7,8 +7,11 @@
|
||||
|
||||
extern void init_idt();
|
||||
extern void init_gdt();
|
||||
extern void init_pic();
|
||||
extern void init_pit();
|
||||
extern void enable_interrupts();
|
||||
|
||||
void kernel_main(void)
|
||||
void kmain(void)
|
||||
{
|
||||
extern print_stream_t vga_print_stream;
|
||||
extern print_stream_t* kout;
|
||||
@@ -22,4 +25,15 @@ void kernel_main(void)
|
||||
|
||||
init_idt();
|
||||
kprint("IDT set\n");
|
||||
|
||||
init_pic();
|
||||
kprint("PIC initialized\n");
|
||||
|
||||
init_pit();
|
||||
kprint("PIT initialized\n");
|
||||
|
||||
enable_interrupts();
|
||||
kprint("Interrupts enabled\n");
|
||||
|
||||
while(1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user