embox

Форк
0
58 строк · 1.2 Кб
1
/*
2
 * @file
3
 *
4
 * @date   10.04.2020
5
 * @author Alexander Kalmuk
6
 */
7

8
#include <embox/unit.h>
9
#include <drivers/i8042.h>
10

11
EMBOX_UNIT_INIT(i8042_init);
12

13
int i8042_read_mode(void) {
14
	i8042_wait_write();
15
	outb(I8042_CMD_READ_MODE, I8042_CMD_PORT);
16
	i8042_wait_read();
17
	return inb(I8042_DATA_PORT);
18
}
19

20
void i8042_write_mode(uint8_t val) {
21
	i8042_wait_write();
22
	outb(I8042_CMD_WRITE_MODE, I8042_CMD_PORT);
23
	i8042_wait_write();
24
	outb(val, I8042_DATA_PORT);
25
}
26

27
void i8042_write_aux(uint8_t val) {
28
	i8042_wait_write();
29
	outb(I8042_CMD_WRITE_MOUSE, I8042_CMD_PORT);
30
	i8042_wait_write();
31
	outb(val, I8042_DATA_PORT);
32
}
33

34
static int i8042_init(void) {
35
	uint8_t mode;
36

37
	/* Disable mouse */
38
	i8042_write_aux(I8042_AUX_DISABLE_DEV);
39
	outb(I8042_AUX_DISABLE_DEV, I8042_CMD_PORT);
40

41
	/* Disable keyboard. */
42
	i8042_wait_write();
43
	outb(I8042_CMD_PORT_DIS, I8042_CMD_PORT);
44
	i8042_wait_write();
45
	outb(I8042_KBD_RESET_DISABLE, I8042_DATA_PORT);
46

47
	/* Disable mouse and keyboard interrupts. */
48
	mode = i8042_read_mode();
49
	mode &= ~(I8042_MODE_INTERRUPT | I8042_MODE_MOUSE_INT);
50
	i8042_write_mode(mode);
51

52
	/* Flush keyboard and mouse FIFOs (to clear interrupts if any). */
53
	while (inb(I8042_STS_PORT) & I8042_STS_OBF) {
54
		inb(I8042_DATA_PORT);
55
	}
56

57
	return 0;
58
}
59

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.