aboutsummaryrefslogtreecommitdiff
path: root/devices/i8042.c
diff options
context:
space:
mode:
Diffstat (limited to 'devices/i8042.c')
-rw-r--r--devices/i8042.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/devices/i8042.c b/devices/i8042.c
index cf8c6ec..c612e6d 100644
--- a/devices/i8042.c
+++ b/devices/i8042.c
@@ -12,12 +12,16 @@
// w command register
#define comm_port 0x64
#define comm_enable_first_ps2 0xae
+#define comm_enable_second_ps2 0xa8
#define comm_read_ctrl_config 0x20
#define comm_write_ctrl_config 0x60
#define data_port 0x60
#define data_enable_scanning 0xf4
+// 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
ps2_ctrl_init()
{
@@ -38,16 +42,46 @@ ps2_ctrl_init()
// printf("8042: init keyboard\n");
outb(comm_enable_first_ps2, comm_port);
+ outb(comm_enable_second_ps2, comm_port);
+
+ // resets the cpu
+ // outb(0xfe, 0x64);
+
+ outb(0xf2, 0x60);
+ printf("i8042: id port1: ");
+ while ((inb(0x64) & 0x01) == 0) {}
+ for (int i = 0; i < 3; ++i) printf("%x ", inb(0x60));
+ printf("\n");
+
+ outb(0xd4, 0x64);
+ outb(0xf2, 0x60);
+ printf("i8042: id port2: ");
+ while ((inb(0x64) & 0x01) == 0) {}
+ for (int i = 0; i < 3; ++i) printf("%x ", inb(0x60));
+ printf("\n");
+
outb(comm_read_ctrl_config, comm_port);
- const uint8_t conf = (inb(data_port) | 1) & ~0x10;
+ uint8_t conf = (inb(data_port) | 1) & ~0x10;
+ conf |= 0x22; // mouse
outb(comm_write_ctrl_config, comm_port);
outb(conf, data_port);
outb(data_enable_scanning, data_port);
+
+ outb(0xd4, 0x64);
+ outb(0xf4, 0x60);
}
unsigned char
-kbd_read_next()
+ps2_read_port1()
{
return inb(data_port);
}
+
+unsigned char
+ps2_read_port2()
+{
+
+ outb(0xd4, 0x64);
+ return inb(0x60);
+}