增加键盘监听回调函数

This commit is contained in:
xiaoyi1212 2024-04-15 22:53:46 +08:00
parent 66e698432e
commit e982d72613
2 changed files with 49 additions and 15 deletions

View File

@ -6,6 +6,7 @@
static KEY_STATUS *key_status;
Queue *key_char_queue;
struct key_listener* head_listener;
unsigned char keyboard_map[128] =
{
@ -87,21 +88,7 @@ unsigned char shift_keyboard_map[128] =
0, /* All other keys are undefined */
};
void init_keyboard(){
key_status = (KEY_STATUS*) alloc(sizeof(KEY_STATUS));
key_status->is_shift = 0;
key_char_queue = create_queue();
register_interrupt_handler(0x21,handle_keyboard_input);
}
int handle_keyboard_input(){
unsigned char status = read_port(KEYBOARD_STATUS_PORT);
uint32_t key = read_port(KEYBOARD_DATA_PORT);
int release = key & 0xb10000000;
char c = key_status->is_shift ? shift_keyboard_map[(unsigned char )key] : keyboard_map[(unsigned char )key];
static void default_handle(uint32_t key,int release,char c){
if(!release) {
if(c == -1) {
key_status->is_shift = 1;
@ -126,6 +113,45 @@ int handle_keyboard_input(){
return 0;
}
}
}
void init_keyboard(){
key_status = (KEY_STATUS*) alloc(sizeof(KEY_STATUS));
key_status->is_shift = 0;
key_char_queue = create_queue();
head_listener = (struct key_listener*) kmalloc(sizeof(struct key_listener));
head_listener->func = default_handle;
register_interrupt_handler(0x21,handle_keyboard_input);
}
int handle_keyboard_input(){
unsigned char status = read_port(KEYBOARD_STATUS_PORT);
uint32_t key = read_port(KEYBOARD_DATA_PORT);
int release = key & 0xb10000000;
char c = key_status->is_shift ? shift_keyboard_map[(unsigned char )key] : keyboard_map[(unsigned char )key];
struct key_listener* h = head_listener;
while (1){
h->func(key,release,c);
h = h->next;
if(h == NULL) break;
}
return 0;
}
void add_listener(struct key_listener* listener){
if(listener == NULL) return;
struct key_listener* h = head_listener,*buf = NULL;
while (1){
buf = h;
h = h->next;
if(h == NULL){
buf->next = listener;
break;
}
}
}

View File

@ -4,6 +4,8 @@
#define KEYBOARD_DATA_PORT 0x60
#define KEYBOARD_STATUS_PORT 0x64
#include <stdint.h>
typedef struct {
int is_shift;
int is_ctrl;
@ -15,7 +17,13 @@ typedef struct {
unsigned char *shift_keyboard_map[128];
}KEY_MAP;
typedef struct key_listener{
void (*func)(uint32_t key,int release,char c);
struct key_listener *next;
}kl_t;
void init_keyboard();
int handle_keyboard_input();
void add_listener(struct key_listener* listener);
#endif //CRASHPOWEROS_KEYBOARD_H