add lunaix dynamic linker as submodule
[lunaix-os.git] / lunaix-os / includes / lunaix / peripheral / ps2kbd.h
1 #ifndef __LUNAIX_PS2KBD_H
2 #define __LUNAIX_PS2KBD_H
3
4 #include <lunaix/ds/mutex.h>
5 #include <lunaix/keyboard.h>
6
7 #define PS2_PORT_ENC_DATA 0x60
8 #define PS2_PORT_ENC_CMDREG 0x60
9 #define PS2_PORT_CTRL_STATUS 0x64
10 #define PS2_PORT_CTRL_CMDREG 0x64
11
12 #define PS2_STATUS_OFULL 0x1
13 #define PS2_STATUS_IFULL 0x2
14
15 #define PS2_RESULT_ACK 0xfa
16 #define PS2_RESULT_NAK 0xfe // resend
17 #define PS2_RESULT_ECHO 0xee
18 #define PS2_RESULT_TEST_OK 0x55
19
20 // PS/2 keyboard device related commands
21 #define PS2_KBD_CMD_SETLED 0xed
22 #define PS2_KBD_CMD_ECHO 0xee
23 #define PS2_KBD_CMD_SCANCODE_SET 0xf0
24 #define PS2_KBD_CMD_IDENTIFY 0xf2
25 #define PS2_KBD_CMD_SCAN_ENABLE 0xf4
26 #define PS2_KBD_CMD_SCAN_DISABLE 0xf5
27
28 // PS/2 *controller* related commands
29 #define PS2_CMD_PORT1_DISABLE 0xad
30 #define PS2_CMD_PORT1_ENABLE 0xae
31 #define PS2_CMD_PORT2_DISABLE 0xa7
32 #define PS2_CMD_PORT2_ENABLE 0xa8
33 #define PS2_CMD_SELFTEST 0xaa
34 #define PS2_CMD_SELFTEST_PORT1 0xab
35
36 #define PS2_CMD_READ_CFG 0x20
37 #define PS2_CMD_WRITE_CFG 0x60
38
39 #define PS2_CFG_P1INT 0x1
40 #define PS2_CFG_P2INT 0x2
41 #define PS2_CFG_TRANSLATION 0x40
42
43 #define PS2_DELAY 1000
44
45 #define PS2_CMD_QUEUE_SIZE 8
46
47 #define PS2_NO_ARG 0xff00
48
49 struct ps2_cmd
50 {
51     char cmd;
52     char arg;
53 };
54
55 struct ps2_kbd_state
56 {
57     volatile char state;
58     volatile char masked;
59     volatile kbd_kstate_t key_state;
60     kbd_keycode_t* translation_table;
61 };
62
63 struct ps2_cmd_queue
64 {
65     struct ps2_cmd cmd_queue[PS2_CMD_QUEUE_SIZE];
66     int queue_ptr;
67     int queue_len;
68     mutex_t mutex;
69 };
70
71 /**
72  * @brief 向PS/2控制器的控制端口(0x64)发送指令并等待返回代码。
73  * 注意,对于没有返回代码的命令请使用`ps2_post_cmd`,否则会造成死锁。
74  * 通过调用该方法向控制器发送指令,请区别 ps2_issue_dev_cmd
75  *
76  * @param cmd
77  * @param args
78  */
79 static u8_t
80 ps2_issue_cmd(char cmd, u16_t arg);
81
82 /**
83  * @brief 向PS/2控制器的编码器端口(0x60)发送指令并等待返回代码。
84  * 注意,对于没有返回代码的命令请使用`ps2_post_cmd`,否则会造成死锁。
85  * 通过调用该方法向PS/2设备发送指令,请区别 ps2_issue_cmd
86  *
87  * @param cmd
88  * @param args
89  */
90 static u8_t
91 ps2_issue_dev_cmd(char cmd, u16_t arg);
92
93 /**
94  * @brief 向PS/2控制器发送指令,不等待返回代码。
95  *
96  * @param port 端口号
97  * @param cmd
98  * @param args
99  * @return char
100  */
101 static void
102 ps2_post_cmd(u8_t port, char cmd, u16_t arg);
103
104 void
105 ps2_device_post_cmd(char cmd, char arg);
106
107 void
108 ps2_kbd_init();
109
110 void
111 ps2_process_cmd(void* arg);
112
113 #endif /* __LUNAIX_PS2KBD_H */