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