增加键盘监听回调函数
This commit is contained in:
parent
66e698432e
commit
e982d72613
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user