diff options
author | aqua <aqua@iserlohn-fortress.net> | 2022-11-02 09:34:31 +0200 |
---|---|---|
committer | aqua <aqua@iserlohn-fortress.net> | 2022-11-02 09:34:31 +0200 |
commit | ccaf2737f82968816c5ec962f936a593686cfb72 (patch) | |
tree | 6aa87c45c05e147c56fc4f330780386a608c33c7 | |
parent | Enable interrupts after enabling the PIC (diff) | |
download | kernel-ccaf2737f82968816c5ec962f936a593686cfb72.tar.xz |
Add ps2_ctrl_8042
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | devices/Makefile | 2 | ||||
-rw-r--r-- | devices/keyboard.h (renamed from devices/ps2_keyboard.h) | 0 | ||||
-rw-r--r-- | devices/mouse.c | 30 | ||||
-rw-r--r-- | devices/mouse.h | 3 | ||||
-rw-r--r-- | devices/pckbd.c (renamed from devices/ps2_keyboard.c) | 23 | ||||
-rw-r--r-- | devices/pic_8259.c | 12 | ||||
-rw-r--r-- | devices/ps2_ctrl.h | 4 | ||||
-rw-r--r-- | devices/ps2_ctrl_8042.c | 43 | ||||
-rw-r--r-- | devices/vga.c | 79 | ||||
-rw-r--r-- | devices/vga.h | 4 | ||||
-rw-r--r-- | i686/idt.h | 1 | ||||
-rw-r--r-- | i686/isr.c | 9 | ||||
-rw-r--r-- | i686/lidt.c | 3 | ||||
-rw-r--r-- | src/kernel.c | 7 |
15 files changed, 155 insertions, 67 deletions
@@ -28,7 +28,7 @@ all: @${MAKE} ARCH=${ARCH} -C src all run: glitch.iso - qemu-system-i386 -cdrom glitch.iso -accel kvm -d cpu_reset -display gtk,zoom-to-fit=on + qemu-system-i386 -cdrom glitch.iso -cpu pentium3 -d cpu_reset -display gtk,zoom-to-fit=on clean: @${MAKE} ARCH=${ARCH} -C lib clean diff --git a/devices/Makefile b/devices/Makefile index 30935c5..4ee04ca 100644 --- a/devices/Makefile +++ b/devices/Makefile @@ -2,7 +2,7 @@ include ../Makefile.config CCFLAGS += -I. -I../${ARCH} -I../lib -devs,SRCS = pic_8259.c uart_16550.c vga.c ps2_keyboard.c +devs,SRCS = pic_8259.c uart_16550.c vga.c ps2_ctrl_8042.c pckbd.c mouse.c include ../rules.mk diff --git a/devices/ps2_keyboard.h b/devices/keyboard.h index 5f4fcc2..5f4fcc2 100644 --- a/devices/ps2_keyboard.h +++ b/devices/keyboard.h diff --git a/devices/mouse.c b/devices/mouse.c new file mode 100644 index 0000000..92f3f08 --- /dev/null +++ b/devices/mouse.c @@ -0,0 +1,30 @@ +#include "mouse.h" +#include <stdint.h> +#include <stdio.h> +#include <sys/io.h> + +// TODO: All output to port 0x60 or 0x64 must be preceded by waiting for bit 1 (value=2) of port 0x64 to become clear. +// TODO: Similarly, bytes cannot be read from port 0x60 until bit 0 (value=1) of port 0x64 is set. + +void +mouse_init() +{ + // Sending a command or data byte to the mouse (to port 0x60) must be preceded by sending a 0xD4 byte to port 0x64 + // (with appropriate waits on port 0x64, bit 1, before sending each output byte). Note: this 0xD4 byte does not + // generate any ACK, from either the keyboard or mouse. + + // enable second ps/2 + // outb(0x64, 0xa8); + + // outb(0x64, 0xd4); + // outb(0x60, 0xf4); + // printf("mouse_init: enable streaming(0xf4): %x\n", inb(0x60)); + + /* + outb(0x64, 0xd4); + while (inb(0x64) & 0x1) + ; + outb(0x60, 0xf2); + printf("mouse_init: mouse_id(0xf2 %x): %x\n", inb(0x60), inb(0x60)); + */ +} diff --git a/devices/mouse.h b/devices/mouse.h new file mode 100644 index 0000000..a34ecb4 --- /dev/null +++ b/devices/mouse.h @@ -0,0 +1,3 @@ +#pragma once + +void mouse_init(); diff --git a/devices/ps2_keyboard.c b/devices/pckbd.c index 4ebcc65..f3dcb6c 100644 --- a/devices/ps2_keyboard.c +++ b/devices/pckbd.c @@ -1,23 +1,16 @@ -#include "ps2_keyboard.h" +#include "keyboard.h" +#include "ps2_ctrl.h" #include "vga.h" #include <stdint.h> #include <stdio.h> #include <sys/io.h> -const uint8_t comm_port = 0x64; // r status register - // w command register -const uint8_t comm_enable_first_ps2 = 0xae; -const uint8_t comm_read_ctrl_config = 0x20; -const uint8_t comm_write_ctrl_config = 0x60; -const uint8_t data_port = 0x60; // rw -const uint8_t data_enable_scanning = 0xf4; - const char scancodes[2][68] = {{'E', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', 'T', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', 'C', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', 'L', '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 'R', 'P', 'A', ' ', 'C', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}, - {'E', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', 'T', 'Q', 'W', + {'E', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\b', 'T', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', 'C', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '~', 'L', '|', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', 'R', 'P', 'A', ' ', 'C', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}}; @@ -26,20 +19,12 @@ int shift_case = 0; void ps2_keyboard_init() { - // eat all previous keystrikes - while (inb(comm_port) & 0x1) inb(data_port); - outb(comm_port, comm_enable_first_ps2); - outb(comm_port, comm_read_ctrl_config); - const uint8_t conf = (inb(data_port) | 1) & ~0x10; - outb(comm_port, comm_write_ctrl_config); - outb(data_port, conf); - outb(data_port, data_enable_scanning); } void ps2_keyboard_irq_handler() { - const uint8_t key = inb(data_port); + const uint8_t key = ps2_ctrl_read(); switch (key) { case 0x2a: // left shift down diff --git a/devices/pic_8259.c b/devices/pic_8259.c index 62164d3..d3a2f6a 100644 --- a/devices/pic_8259.c +++ b/devices/pic_8259.c @@ -36,9 +36,15 @@ pic_init() void pic_enable() { - // PIC masks - outb(0xfc, PIC1 + DATA); - outb(0xff, PIC2 + DATA); + unsigned char mask1 = 0xff; + mask1 &= ~(1 << 0); // irq0 timer + mask1 &= ~(1 << 1); // irq1 keyboard + // mask1 &= ~(1 << 2); // irq1 cascade + outb(mask1, PIC1 + DATA); + + unsigned char mask2 = 0xff; + // mask2 &= ~(1 << 4); // irq12 mouse + outb(mask2, PIC2 + DATA); enable_interrupts(); } diff --git a/devices/ps2_ctrl.h b/devices/ps2_ctrl.h new file mode 100644 index 0000000..9bed4f2 --- /dev/null +++ b/devices/ps2_ctrl.h @@ -0,0 +1,4 @@ +#pragma once + +void ps2_ctrl_init(); +unsigned char ps2_ctrl_read(); diff --git a/devices/ps2_ctrl_8042.c b/devices/ps2_ctrl_8042.c new file mode 100644 index 0000000..4157bd8 --- /dev/null +++ b/devices/ps2_ctrl_8042.c @@ -0,0 +1,43 @@ +#include "ps2_ctrl.h" +#include <stdint.h> +#include <stdio.h> +#include <sys/io.h> + +const uint8_t comm_port = 0x64; // r status register + // w command register +const uint8_t comm_enable_first_ps2 = 0xae; +const uint8_t comm_read_ctrl_config = 0x20; +const uint8_t comm_write_ctrl_config = 0x60; + +const uint8_t data_port = 0x60; // rw +const uint8_t data_enable_scanning = 0xf4; + +void +ps2_ctrl_init() +{ + // eat all previous keystrikes + while (inb(comm_port) & 0x1) inb(data_port); + + outb(0x64, 0xaa); + printf("8042: self test 0xaa: %x\n", inb(0x60)); + outb(0x64, 0xab); + printf("8042: port1 test 0xab: %x\n", inb(0x60)); + outb(0x64, 0xa9); + printf("8042: port2 test 0xa9: %x\n", inb(0x60)); + + // printf("8042: init keyboard\n"); + + outb(comm_port, comm_enable_first_ps2); + outb(comm_port, comm_read_ctrl_config); + const uint8_t conf = (inb(data_port) | 1) & ~0x10; + outb(comm_port, comm_write_ctrl_config); + outb(data_port, conf); + outb(data_port, data_enable_scanning); + +} + +unsigned char +ps2_ctrl_read() +{ + return inb(0x60); +} diff --git a/devices/vga.c b/devices/vga.c index 93231ea..aeda483 100644 --- a/devices/vga.c +++ b/devices/vga.c @@ -2,6 +2,15 @@ #include <stdint.h> #include <sys/io.h> +const uint16_t cga_idx_port = 0x3d4; +const uint16_t cga_dat_port = 0x3d5; + +const uint8_t cursor_start = 0xa; +const uint8_t cursor_end = 0xb; +const uint8_t cursor_addr_h = 0xe; +const uint8_t cursor_addr_l = 0xf; +const uint8_t cursor_hide = 0x20; + struct __attribute__((packed)) VGAEntry { unsigned char text; uint8_t foreground : 4; @@ -16,6 +25,37 @@ struct VGAEntry *buffer; int col = 0; int row = 0; +// *** Cursor *** +void +vga_enable_cursor(unsigned char start, unsigned char end) +{ + outb(cga_idx_port, cursor_start); + outb(cga_dat_port, (inb(cga_dat_port) & 0xc0) | start); + + outb(cga_idx_port, cursor_end); + outb(cga_dat_port, (inb(cga_dat_port) & 0xe0) | end); +} + +void +vga_disable_cursor() +{ + outb(cga_idx_port, cursor_start); + outb(cga_dat_port, cursor_hide); +} + +void +vga_update_cursor() +{ + const uint16_t pos = row * width + col; + + outb(cga_idx_port, cursor_addr_l); + outb(cga_dat_port, pos & 0xff); + + outb(cga_idx_port, cursor_addr_h); + outb(cga_dat_port, (pos >> 8) & 0xff); +} + +// *** Text Mode *** void vga_init() { @@ -90,42 +130,3 @@ vga_puts(const char *string, int len) else for (int i = 0; i < len; ++i) { vga_putc(string[i]); } } - -// Cursor -const uint16_t cga_idx_port = 0x3d4; -const uint16_t cga_dat_port = 0x3d5; - -const uint8_t cursor_start = 0xa; -const uint8_t cursor_end = 0xb; -const uint8_t cursor_addr_h = 0xe; -const uint8_t cursor_addr_l = 0xf; -const uint8_t cursor_hide = 0x20; - -void -vga_enable_cursor(unsigned char start, unsigned char end) -{ - outb(cga_idx_port, cursor_start); - outb(cga_dat_port, (inb(cga_dat_port) & 0xc0) | start); - - outb(cga_idx_port, cursor_end); - outb(cga_dat_port, (inb(cga_dat_port) & 0xe0) | end); -} - -void -vga_disable_cursor() -{ - outb(cga_idx_port, cursor_start); - outb(cga_dat_port, cursor_hide); -} - -void -vga_update_cursor() -{ - const uint16_t pos = row * width + col; - - outb(cga_idx_port, cursor_addr_l); - outb(cga_dat_port, pos & 0xff); - - outb(cga_idx_port, cursor_addr_h); - outb(cga_dat_port, (pos >> 8) & 0xff); -} diff --git a/devices/vga.h b/devices/vga.h index 63de309..7a295a2 100644 --- a/devices/vga.h +++ b/devices/vga.h @@ -26,6 +26,6 @@ void vga_clear(enum vga_color foreground, enum vga_color background); void vga_putc(char a); void vga_puts(const char *string, int len); -void vga_enable_cursor(unsigned char start, unsigned char end); -void vga_disable_cursor(); +// void vga_enable_cursor(unsigned char start, unsigned char end); +// void vga_disable_cursor(); void vga_update_cursor(); @@ -17,6 +17,7 @@ void abort_handler(struct interrupt_frame *frame); void syscall_handler(struct interrupt_frame *frame); void irq0x00(struct interrupt_frame *frame); // timer interrupt void irq0x01(struct interrupt_frame *frame); // keyboard interrupt +void irq0x0c(struct interrupt_frame *frame); // mouse interrupt /* lidt.c */ void idt_install(); @@ -36,5 +36,12 @@ __attribute__((interrupt)) void irq0x01(struct interrupt_frame *) { ps2_keyboard_irq_handler(); - pic_clear(0x00); + pic_clear(0x01); +} + +__attribute__((interrupt)) void +irq0x0c(struct interrupt_frame *) +{ + printf("irq 0x0c\n"); + pic_clear(0x0c); } diff --git a/i686/lidt.c b/i686/lidt.c index 5cb66b6..8a70bf3 100644 --- a/i686/lidt.c +++ b/i686/lidt.c @@ -41,9 +41,10 @@ idt_install() for (int i = 0; i <= 0x13; ++i) Gate(&interrupt_table[i], &abort_handler, 0x10); // irq 0x20~0x2f + for (int i = 0x22; i <= 0x2f; ++i) Gate(&interrupt_table[i], &abort_handler, 0x10); Gate(&interrupt_table[0x20], &irq0x00, 0x10); Gate(&interrupt_table[0x21], &irq0x01, 0x10); - for (int i = 0x22; i <= 0x2f; ++i) Gate(&interrupt_table[i], &abort_handler, 0x10); + Gate(&interrupt_table[0x2c], &irq0x0c, 0x10); // syscall 0x80 Gate(&interrupt_table[0x80], &abort_handler, 0x10); diff --git a/src/kernel.c b/src/kernel.c index 4698d7a..5305b12 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -4,7 +4,10 @@ // description: kernel entry point //===================================================================== +#include "devices/keyboard.h" +#include "devices/mouse.h" #include "devices/pic.h" +#include "devices/ps2_ctrl.h" #include "devices/uart_16550.h" #include "devices/vga.h" #include "mem.h" @@ -30,6 +33,10 @@ void kmain() { pic_enable(); printf("interrupts enabled\n"); + ps2_ctrl_init(); + ps2_keyboard_init(); + // mouse_init(); + /* alloc4M(); char *c = (char *)0xc0700000; |