-
Notifications
You must be signed in to change notification settings - Fork 2
/
KBC.c
74 lines (60 loc) · 2.46 KB
/
KBC.c
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
#include "KBC.h"
int (read_KBC_status)(uint8_t* status) {
return util_sys_inb(KBC_STATUS_REG, status);
}
int read_KBC_output(uint8_t port, uint8_t *output, uint8_t mouse) {
uint8_t status;
uint8_t attemps = 10;
while (attemps) {
if (read_KBC_status(&status) != 0) { // lê o status
printf("Error: Status not available!\n");
return 1;
}
if ((status & BIT(0)) != 0) { // o output buffer está cheio, posso ler
if(util_sys_inb(port, output) != 0){ // leitura do buffer de saída
printf("Error: Could not read output!\n");
return 1;
}
if((status & BIT(7)) != 0){ // verifica erro de paridade
printf("Error: Parity error!\n"); // se existir, descarta
return 1;
}
if((status & BIT(6)) != 0){ // verifica erro de timeout
printf("Error: Timeout error!\n"); // se existir, descarta
return 1;
}
if (mouse && !(status & BIT(5))) { // está à espera do output do rato
printf("Error: Mouse output not found\n"); // mas o output não é do rato
return 1;
}
if (!mouse && (status & BIT(5))) { // está à espera do output do teclado
printf("Error: Keyboard output not found\n"); // mas o output não é do teclado
return 1;
}
return 0; // sucesso: output correto lido sem erros de timeout ou de paridade
}
tickdelay(micros_to_ticks(20000));
attemps--;
}
return 1; // se ultrapassar o número de tentativas lança um erro
}
int (write_KBC_command)(uint8_t port, uint8_t commandByte) {
uint8_t status;
uint8_t attemps = MAX_ATTEMPS;
while (attemps) {
if (read_KBC_status(&status) != 0){
printf("Error: Status not available!\n");
return 1;
}
if ((status & FULL_IN_BUFFER) == 0){
if(sys_outb(port, commandByte) != 0){
printf("Error: Could not write commandByte!\n");
return 1;
}
return 0;
}
tickdelay(micros_to_ticks(WAIT_KBC));
attemps--;
}
return 1;
}