blob: 1616cd66c1bc2dec96f44d0a69ca9a8245c5c90b (
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#include <panic.h>
#include <stdbool.h>
#include <string.h>
#include <sys.h>
#include "print.h"
#include "ps2mouse.h"
#include "drivers/ps2ctrl.h"
#include "interrupt/pic.h"
static bool is_init = false;
static struct MouseEvent last_event;
static uint8_t first_b, second_b, third_b;
void ps2mouse_init(void) {
is_init = false;
pic_mask(12);
uint8_t result;
ps2ctrl_set_port2();
ps2ctrl_out_data(0xFF);
result = ps2ctrl_in();
if (result != 0xFA) {
panic("Failed to reset PS/2 mouse: expected 0xFA, got 0x%X", result);
return;
}
result = ps2ctrl_in();
if (result != 0xAA) {
panic("Failed to reset PS/2 mouse: expected 0xAA, got 0x%X", result);
return;
}
ps2ctrl_set_port2();
ps2ctrl_out_data(0xF4);
pic_unmask(12);
is_init = true;
}
static uint8_t packet_num = 0;
void ps2mouse_recv(void) {
if (!ps2ctrl_is_init() || !is_init) {
inb(0x60);
return;
}
uint8_t packet = ps2ctrl_in();
switch (packet_num) {
case 0:
first_b = packet;
break;
case 1:
second_b = packet;
break;
case 2: {
third_b = packet;
int state, d;
state = first_b;
d = second_b;
last_event.relx = d - ((state << 4) & 0x100);
d = third_b;
last_event.rely = d - ((state << 3) & 0x100);
last_event.lmb = first_b & 0x01;
last_event.rmb = first_b & 0x02;
last_event.mmb = first_b & 0x04;
last_event.updated = true;
break;
}
}
packet_num += 1;
packet_num %= 3;
}
struct MouseEvent ps2mouse_get(void) {
struct MouseEvent event = last_event;
last_event.updated = false;
return event;
}
|