📄 drv_keyboard.c
字号:
/************************************************************ Copyright (C), 2007,DTK Computer. FileName: kern_irq.c Author: yangjinghua Version : 1.1.0 Date:2008.06.06 Description: 键盘驱动。给应用层发送事件D_EVENT_KEY,D_EVENT_KEYDOWN, D_EVENT_KEYUP。 Version: DTK-EMMI-1.0.0 Function List: History: <author> <time> <version > <desc> yangjinghua 2008/06/06 1.1.0 build this moudle ***********************************************************/#include <malloc.h>#include <string.h>#include <stdio.h>#include "../../frame/frm_hd_device.h"#include "../../public/pub_event.h"#include "../../frame/frm_event_queue.h"#include "../../public/pub_event_type.h"#include "../../service/comm_protocol/srv_gsm_attable.h"//#include "../../kernel/kern_irq.h"#include "drv_keyboard.h"extern void frm_printf(D_UINT8 *);extern d_event_queue win_event_queue;extern D_UINT8 frm_event_enqueue(d_event_queue* queue, d_event* e);//static D_UINT8 keyboard_buff[BUFF_LEN];static D_UINT8 recv_len= 0;static D_UINT8 data[BUFF_LEN];static D_UINT8 key_up=0, shift = 0, extent = 0;//Key_UP是键松开标识,Shift是Shift键按下标识static D_UINT8 keycod[32][3] = { //KEY_A, 'a', 'A', //KEY_B, 'b', 'B', KEY_C, 'c', 'C', //KEY_D, 'd', 'D', //KEY_E, 'e', 'E', //KEY_F, 'f', 'F', //KEY_G, 'g', 'G', //KEY_H, 'h', 'H', //KEY_I, 'i', 'I', //KEY_J, 'j', 'J', //KEY_K, 'k', 'K', //KEY_L, 'l', 'L', //KEY_M, 'm', 'M', // KEY_N, 'n', 'N', // KEY_O, 'o', 'O', //KEY_P, 'p', 'P', KEY_Q, 'q', 'Q', //KEY_R, 'r', 'R', //KEY_S, 's', 'S', //KEY_T, 't', 'T', //KEY_U, 'u', 'U', KEY_V, 'v', 'V', //KEY_W, 'w', 'W', //KEY_X, 'x', 'X', //KEY_Y, 'y', 'Y', KEY_Z, 'z', 'Z', KEY_0, '0', ')', KEY_1, '1', '!', KEY_2, '2', '@', KEY_3, '3', '#', KEY_4, '4', '$', KEY_5, '5', '%', KEY_6, '6', '^', KEY_7, '7', '&', KEY_8, '8', '*', KEY_9, '9', '(', //KEY_GRAVE, '`', '~', //KEY_MINUS, '-', '_', //KEY_EQUAL, '=', '+', //KEY_BACKSLASH, '\\', '|', //KEY_SPACE, ' ', ' ', //KEY_LBRACE, '[', '{', //KEY_RBRACE, ']', '}', //KEY_SEMICOLON, ';', ':', //KEY_APOSTROPHE, '\'', '"', //KEY_COMMA, ',', '<', //KEY_DOT, '.', '>', //KEY_SLASH, '/', '?', //0x4A, '/', '?', //KEY_KPDOT, '.', 16, KEY_KP0, '0', '0', KEY_KP1, '1', '1', KEY_KP2, '2', '2', KEY_KP3, '3', '3', KEY_KP4, '4', '4', KEY_KP5, '5', '5', KEY_KP6, '6', '6', KEY_KP7, '7', '7', KEY_KP8, '8', '8', KEY_KP9, '9', '9', //KEY_ESC, 27, 27, KEY_ENTER, 255, 255, KEY_F1, 240, 240, KEY_F2, 241, 241, KEY_F3, 242, 242, KEY_F9, 245, 245, KEY_F10, 246, 246, KEY_F11, 239, 239, KEY_F12, 238, 238,};static D_UINT8 keycode_extent[6][2] = { KEY_UP, 252, KEY_DOWN, 253, KEY_LEFT, 251, KEY_RIGHT, 250, KEY_DELETE, 254, KEY_KPENTER,255,};void delay(int i){ int j; while(i) { for(j=0;j<1000;j++); i--; } }static D_INT32 keyboard_irq_handler(D_INT32 irq, void *dev_id, struct leonbare_pt_regs *regs){ D_UINT32 kkeycode=0; d_event* pack=NULL; D_UINT32 key_val=0; D_INT32 i; #ifdef EMMI_SPARC kern_disable_irq(KEYBOARD_IRQ);#endif if( KEYBOARD_STATUS & 0x00000006 ) { recv_len= 0; #ifdef EMMI_SPARC kern_enable_irq(KEYBOARD_IRQ); #endif //printf("ha error\n"); return 0; } while( KEYBOARD_STATUS & 0x00000001 ) { kkeycode = KEYBOARD_DATA & 0x000000FF; if ( key_up ==0)//按下时 { switch (kkeycode) { case 0xE0 : extent = 1; break; case 0xF0 :// 当收到0xF0,key_up置1表示断码开始 key_up = 1; break; case 0x12 :// 左 SHIFT //if(!extent) //print screen shift = 1; break; case 0x59 :// 右 SHIFT shift = 1; break; default: data[recv_len]= kkeycode; recv_len++; break; } } else //当键盘松开时 { key_up = 0; switch (kkeycode) //当键松开时处理判码,如G 34H F0H 34H 那么第二个34H会被处理 { case 0x12 :// 左 SHIFT break; case 0x59 :// 右 SHIFT break; default: { if(recv_len==BUFF_LEN) { recv_len=0; extent=0; shift=0; return -1; } data[recv_len] = kkeycode; if ( data[recv_len -1]==data[recv_len]) { if (!extent) { if (!shift)//如果SHIFT没按下 { for (i = 0;i<32; i++)//查表显示 { if (data[recv_len] == keycod[i][0]) { key_val = keycod[i][1]; break; } } } else //按下SHIFT { for (i = 0;i<32; i++)//查表显示 { if (data[recv_len] == keycod[i][0]) { key_val = keycod[i][2]; shift = 0; break; } } } } else { for (i = 0;i<6; i++)//查表显示 { if (data[recv_len] == keycode_extent[i][0]) { key_val = keycode_extent[i][1]; extent = 0; break; } } } pack = malloc(sizeof(d_event)); if( pack == NULL ) continue; memset(pack, 0, sizeof(d_event)); pack->param_len = 4; pack->event_id = D_EVENT_KEY; pack->param = malloc(pack->param_len); memcpy(pack->param, &key_val, 4); frm_event_enqueue(&win_event_queue,pack); //printf("key_val=%d\n",key_val); recv_len = 0; key_val = 0; } break; } } } } #ifdef EMMI_SPARC kern_enable_irq(KEYBOARD_IRQ); #endif return 0;}D_BOOL drv_keyboard_init(d_device *dev){ D_UINT32 test = 0; if( !dev ) return FALSE; kern_disable_irq(KEYBOARD_IRQ); KEYBOARD_CTRL |= 0x00000007; delay(60); if(test == 0x000000aa) { frm_printf("init error\n"); } delay(40); KEYBOARD_DATA = 0x000000ed; delay(50); while(KEYBOARD_STATUS&0x00000001) { test = KEYBOARD_DATA&0x000000ff; printf("the keycode10 is:0x%x\n",test); } KEYBOARD_DATA = 0x000000f0; delay(40); test = KEYBOARD_DATA&0x000000ff; KEYBOARD_DATA = 0x02; delay(50); test = KEYBOARD_DATA&0x000000ff; delay(100); KEYBOARD_DATA = 0x000000f3; delay(100); test = KEYBOARD_DATA&0x000000ff; // printf("the keycode101 is:0x%x\n",test); KEYBOARD_DATA = 0x02; delay(40); if(KEYBOARD_STATUS&0x01) { test = KEYBOARD_DATA&0xff; // printf("the keycode102 is:0x%x\n",test); if(!(test==0xfa)) return 0; KEYBOARD_DATA = 0x1b; //delay 500ms;tyrate 10.9cps } KEYBOARD_DATA = 0x000000f4; delay(100); test = KEYBOARD_DATA&0x000000ff; //printf("the keycode103 is:0x%x\n",test); KEYBOARD_CTRL = 0x00000005; test = KEYBOARD_CTRL&0x000000ff; if( kern_request_irq(KEYBOARD_IRQ, keyboard_irq_handler, NULL, 0) )//0x00010060 frm_printf("keyboard : fail\n"); else frm_printf("keyboard : OK\n"); kern_enable_irq(KEYBOARD_IRQ); return TRUE;}D_BOOL drv_keyboard_exit(void){ return TRUE;}D_INT32 drv_keyboard_read(D_UINT8* buff, D_UINT32 psize){ return 0;}D_BOOL drv_keyboard_write(D_UINT32 size, D_INT8* buff){ return TRUE;}D_INT8 drv_keyboard_open(){ return 0;}D_INT8 drv_keyboard_close(){ return 0;}d_device device_keyboard = {0x01,0x60,drv_keyboard_init,drv_keyboard_exit,drv_keyboard_read,drv_keyboard_write,NULL,drv_keyboard_open,NULL,0};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -