aboutsummaryrefslogtreecommitdiff
path: root/devices/ps2_ctrl_8042.c
blob: 4157bd8c908e841f173e594ac57d36fceafa773f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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);
}