⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drv_keyboard.c

📁 sparc硬件平台上的键盘驱动
💻 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 + -