From 00d700481569c50f05259183f899422793b6be9a Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Thu, 8 Nov 2018 21:37:38 +0100 Subject: [PATCH] PIT/Serial irq refactoring Serial IRQ still wip --- core/interrupt.h | 1 + core/irq_handler.c | 2 +- core/main.c | 1 - drivers/pit.c | 2 ++ drivers/serial.c | 15 ++++++++------- drivers/serial.h | 4 ++-- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/core/interrupt.h b/core/interrupt.h index 7edd0bb..9e90171 100644 --- a/core/interrupt.h +++ b/core/interrupt.h @@ -9,3 +9,4 @@ void print_handler(struct interrupt_frame *frame, ulong error_code); //IRQ void keyboard_handler(struct interrupt_frame *frame); void timer_handler(struct interrupt_frame *frame); +void serial_handler(struct interrupt_frame *frame); diff --git a/core/irq_handler.c b/core/irq_handler.c index 2d8dda4..1bd1297 100644 --- a/core/irq_handler.c +++ b/core/irq_handler.c @@ -25,5 +25,5 @@ __attribute__((interrupt)) void timer_handler(struct interrupt_frame *frame) __attribute__((interrupt)) void serial_handler(struct interrupt_frame *frame) { EOIIrq(IRQ_COM1); - serial_do_irq((int)frame); + serial_do_irq(frame); } diff --git a/core/main.c b/core/main.c index 131c35f..789309e 100644 --- a/core/main.c +++ b/core/main.c @@ -57,7 +57,6 @@ void kmain(unsigned long magic, unsigned long addr) printf("Setting up IRQ handlers\n"); irqSetRoutine(IRQ_KEYBOARD, keyboard_handler); - irqSetRoutine(IRQ_TIMER, timer_handler); printf("Enabling HW interrupts\n"); exceptionSetRoutine(EXCEPTION_DOUBLE_FAULT, print_handler); // Enabling the HW interrupts diff --git a/drivers/pit.c b/drivers/pit.c index f6592a8..d53f301 100644 --- a/drivers/pit.c +++ b/drivers/pit.c @@ -1,5 +1,6 @@ #include "pit.h" #include "io.h" +#include "irq.h" int initPit(unsigned int freq) { @@ -10,5 +11,6 @@ int initPit(unsigned int freq) outb(PIT_CHAN_0, divisor & 0xFF); outb(PIT_CHAN_0, divisor >> 8u); + irqSetRoutine(IRQ_TIMER, timer_handler); return 0; } diff --git a/drivers/serial.c b/drivers/serial.c index b398b71..a564b9c 100644 --- a/drivers/serial.c +++ b/drivers/serial.c @@ -1,6 +1,7 @@ #include "serial.h" #include "io.h" #include "irq.h" +#include "vga.h" #define PORT 0x3f8 /* COM1 */ #define SERIAL_MAX_SPEED 115200 @@ -31,11 +32,12 @@ void initSerial(int speed) UART_NO_PARITY | UART_8BITS_WORD | UART_1_STOP_BIT); // 8 bits, no parity, one stop bit outb(PORT + 2, 0xC7); // Enable FIFO, clear them, with 14-byte threshold outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set + irqSetRoutine(IRQ_COM1, serial_handler); } int isTransmitEmpty() { - return inb(PORT + 5) & 0x20; + return (inb(PORT + 5) & 0x20); } void writeSerial(char a) @@ -46,10 +48,9 @@ void writeSerial(char a) outb(PORT, a); } -void serial_do_irq(int level){ - if(level == IRQ_COM1){ - char c = inb(PORT + 5) & 1; - writeSerial(c); - } - return; +void serial_do_irq(struct interrupt_frame *level) +{ + (void)level; + char c = inb(PORT); + writeSerial(c); } diff --git a/drivers/serial.h b/drivers/serial.h index 0389b71..8b94ad9 100644 --- a/drivers/serial.h +++ b/drivers/serial.h @@ -1,6 +1,6 @@ #pragma once - +#include "irq.h" void initSerial(int speed); void writeSerial(char a); -void serial_do_irq(int level); +void serial_do_irq(struct interrupt_frame *frame);