1*16b195c8SJean-Christophe PLAGNIOL-VILLARD /*********************************************************************** 2*16b195c8SJean-Christophe PLAGNIOL-VILLARD * 3*16b195c8SJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2004 4*16b195c8SJean-Christophe PLAGNIOL-VILLARD * DENX Software Engineering 5*16b195c8SJean-Christophe PLAGNIOL-VILLARD * Wolfgang Denk, wd@denx.de 6*16b195c8SJean-Christophe PLAGNIOL-VILLARD * All rights reserved. 7*16b195c8SJean-Christophe PLAGNIOL-VILLARD * 8*16b195c8SJean-Christophe PLAGNIOL-VILLARD * Keyboard driver 9*16b195c8SJean-Christophe PLAGNIOL-VILLARD * 10*16b195c8SJean-Christophe PLAGNIOL-VILLARD ***********************************************************************/ 11*16b195c8SJean-Christophe PLAGNIOL-VILLARD 12*16b195c8SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 13*16b195c8SJean-Christophe PLAGNIOL-VILLARD 14*16b195c8SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_PS2KBD 15*16b195c8SJean-Christophe PLAGNIOL-VILLARD 16*16b195c8SJean-Christophe PLAGNIOL-VILLARD #include <devices.h> 17*16b195c8SJean-Christophe PLAGNIOL-VILLARD #include <keyboard.h> 18*16b195c8SJean-Christophe PLAGNIOL-VILLARD 19*16b195c8SJean-Christophe PLAGNIOL-VILLARD #undef KBG_DEBUG 20*16b195c8SJean-Christophe PLAGNIOL-VILLARD 21*16b195c8SJean-Christophe PLAGNIOL-VILLARD #ifdef KBG_DEBUG 22*16b195c8SJean-Christophe PLAGNIOL-VILLARD #define PRINTF(fmt,args...) printf (fmt ,##args) 23*16b195c8SJean-Christophe PLAGNIOL-VILLARD #else 24*16b195c8SJean-Christophe PLAGNIOL-VILLARD #define PRINTF(fmt,args...) 25*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 26*16b195c8SJean-Christophe PLAGNIOL-VILLARD 27*16b195c8SJean-Christophe PLAGNIOL-VILLARD 28*16b195c8SJean-Christophe PLAGNIOL-VILLARD #define DEVNAME "kbd" 29*16b195c8SJean-Christophe PLAGNIOL-VILLARD 30*16b195c8SJean-Christophe PLAGNIOL-VILLARD #define LED_SCR 0x01 /* scroll lock led */ 31*16b195c8SJean-Christophe PLAGNIOL-VILLARD #define LED_CAP 0x04 /* caps lock led */ 32*16b195c8SJean-Christophe PLAGNIOL-VILLARD #define LED_NUM 0x02 /* num lock led */ 33*16b195c8SJean-Christophe PLAGNIOL-VILLARD 34*16b195c8SJean-Christophe PLAGNIOL-VILLARD #define KBD_BUFFER_LEN 0x20 /* size of the keyboardbuffer */ 35*16b195c8SJean-Christophe PLAGNIOL-VILLARD 36*16b195c8SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_MPC5xxx) || defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || defined(CONFIG_MPC8555) 37*16b195c8SJean-Christophe PLAGNIOL-VILLARD int ps2ser_check(void); 38*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 39*16b195c8SJean-Christophe PLAGNIOL-VILLARD 40*16b195c8SJean-Christophe PLAGNIOL-VILLARD static volatile char kbd_buffer[KBD_BUFFER_LEN]; 41*16b195c8SJean-Christophe PLAGNIOL-VILLARD static volatile int in_pointer = 0; 42*16b195c8SJean-Christophe PLAGNIOL-VILLARD static volatile int out_pointer = 0; 43*16b195c8SJean-Christophe PLAGNIOL-VILLARD 44*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char leds = 0; 45*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char num_lock = 0; 46*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char caps_lock = 0; 47*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char scroll_lock = 0; 48*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char shift = 0; 49*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char ctrl = 0; 50*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char alt = 0; 51*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char e0 = 0; 52*16b195c8SJean-Christophe PLAGNIOL-VILLARD 53*16b195c8SJean-Christophe PLAGNIOL-VILLARD /****************************************************************** 54*16b195c8SJean-Christophe PLAGNIOL-VILLARD * Queue handling 55*16b195c8SJean-Christophe PLAGNIOL-VILLARD ******************************************************************/ 56*16b195c8SJean-Christophe PLAGNIOL-VILLARD 57*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* puts character in the queue and sets up the in and out pointer */ 58*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_put_queue(char data) 59*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 60*16b195c8SJean-Christophe PLAGNIOL-VILLARD if((in_pointer+1)==KBD_BUFFER_LEN) { 61*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(out_pointer==0) { 62*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* buffer full */ 63*16b195c8SJean-Christophe PLAGNIOL-VILLARD } else{ 64*16b195c8SJean-Christophe PLAGNIOL-VILLARD in_pointer=0; 65*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 66*16b195c8SJean-Christophe PLAGNIOL-VILLARD } else { 67*16b195c8SJean-Christophe PLAGNIOL-VILLARD if((in_pointer+1)==out_pointer) 68*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* buffer full */ 69*16b195c8SJean-Christophe PLAGNIOL-VILLARD in_pointer++; 70*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 71*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_buffer[in_pointer]=data; 72*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 73*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 74*16b195c8SJean-Christophe PLAGNIOL-VILLARD 75*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* test if a character is in the queue */ 76*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int kbd_testc(void) 77*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 78*16b195c8SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_MPC5xxx) || defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || defined(CONFIG_MPC8555) 79*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* no ISR is used, so received chars must be polled */ 80*16b195c8SJean-Christophe PLAGNIOL-VILLARD ps2ser_check(); 81*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 82*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(in_pointer==out_pointer) 83*16b195c8SJean-Christophe PLAGNIOL-VILLARD return(0); /* no data */ 84*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 85*16b195c8SJean-Christophe PLAGNIOL-VILLARD return(1); 86*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 87*16b195c8SJean-Christophe PLAGNIOL-VILLARD 88*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* gets the character from the queue */ 89*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int kbd_getc(void) 90*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 91*16b195c8SJean-Christophe PLAGNIOL-VILLARD char c; 92*16b195c8SJean-Christophe PLAGNIOL-VILLARD while(in_pointer==out_pointer) { 93*16b195c8SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_MPC5xxx) || defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || defined(CONFIG_MPC8555) 94*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* no ISR is used, so received chars must be polled */ 95*16b195c8SJean-Christophe PLAGNIOL-VILLARD ps2ser_check(); 96*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 97*16b195c8SJean-Christophe PLAGNIOL-VILLARD ;} 98*16b195c8SJean-Christophe PLAGNIOL-VILLARD if((out_pointer+1)==KBD_BUFFER_LEN) 99*16b195c8SJean-Christophe PLAGNIOL-VILLARD out_pointer=0; 100*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 101*16b195c8SJean-Christophe PLAGNIOL-VILLARD out_pointer++; 102*16b195c8SJean-Christophe PLAGNIOL-VILLARD c=kbd_buffer[out_pointer]; 103*16b195c8SJean-Christophe PLAGNIOL-VILLARD return (int)c; 104*16b195c8SJean-Christophe PLAGNIOL-VILLARD 105*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 106*16b195c8SJean-Christophe PLAGNIOL-VILLARD 107*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* Simple translation table for the keys */ 108*16b195c8SJean-Christophe PLAGNIOL-VILLARD 109*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char kbd_plain_xlate[] = { 110*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0x1b, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=','\b','\t', /* 0x00 - 0x0f */ 111*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']','\r',0xff, 'a', 's', /* 0x10 - 0x1f */ 112*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';','\'', '`',0xff,'\\', 'z', 'x', 'c', 'v', /* 0x20 - 0x2f */ 113*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'b', 'n', 'm', ',', '.', '/',0xff,0xff,0xff, ' ',0xff,0xff,0xff,0xff,0xff,0xff, /* 0x30 - 0x3f */ 114*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0xff,0xff,0xff,0xff,0xff,0xff, '7', '8', '9', '-', '4', '5', '6', '+', '1', /* 0x40 - 0x4f */ 115*16b195c8SJean-Christophe PLAGNIOL-VILLARD '2', '3', '0', '.',0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 0x50 - 0x5F */ 116*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\r',0xff,0xff 117*16b195c8SJean-Christophe PLAGNIOL-VILLARD }; 118*16b195c8SJean-Christophe PLAGNIOL-VILLARD 119*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char kbd_shift_xlate[] = { 120*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0x1b, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+','\b','\t', /* 0x00 - 0x0f */ 121*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}','\r',0xff, 'A', 'S', /* 0x10 - 0x1f */ 122*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '~',0xff, '|', 'Z', 'X', 'C', 'V', /* 0x20 - 0x2f */ 123*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'B', 'N', 'M', '<', '>', '?',0xff,0xff,0xff, ' ',0xff,0xff,0xff,0xff,0xff,0xff, /* 0x30 - 0x3f */ 124*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0xff,0xff,0xff,0xff,0xff,0xff, '7', '8', '9', '-', '4', '5', '6', '+', '1', /* 0x40 - 0x4f */ 125*16b195c8SJean-Christophe PLAGNIOL-VILLARD '2', '3', '0', '.',0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 0x50 - 0x5F */ 126*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\r',0xff,0xff 127*16b195c8SJean-Christophe PLAGNIOL-VILLARD }; 128*16b195c8SJean-Christophe PLAGNIOL-VILLARD 129*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char kbd_ctrl_xlate[] = { 130*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0x1b, '1',0x00, '3', '4', '5',0x1E, '7', '8', '9', '0',0x1F, '=','\b','\t', /* 0x00 - 0x0f */ 131*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x11,0x17,0x05,0x12,0x14,0x18,0x15,0x09,0x0f,0x10,0x1b,0x1d,'\n',0xff,0x01,0x13, /* 0x10 - 0x1f */ 132*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x04,0x06,0x08,0x09,0x0a,0x0b,0x0c, ';','\'', '~',0x00,0x1c,0x1a,0x18,0x03,0x16, /* 0x20 - 0x2f */ 133*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x02,0x0e,0x0d, '<', '>', '?',0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff, /* 0x30 - 0x3f */ 134*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0xff,0xff,0xff,0xff,0xff,0xff, '7', '8', '9', '-', '4', '5', '6', '+', '1', /* 0x40 - 0x4f */ 135*16b195c8SJean-Christophe PLAGNIOL-VILLARD '2', '3', '0', '.',0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 0x50 - 0x5F */ 136*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\r',0xff,0xff 137*16b195c8SJean-Christophe PLAGNIOL-VILLARD }; 138*16b195c8SJean-Christophe PLAGNIOL-VILLARD 139*16b195c8SJean-Christophe PLAGNIOL-VILLARD 140*16b195c8SJean-Christophe PLAGNIOL-VILLARD void handle_scancode(unsigned char scancode) 141*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 142*16b195c8SJean-Christophe PLAGNIOL-VILLARD unsigned char keycode; 143*16b195c8SJean-Christophe PLAGNIOL-VILLARD 144*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* Convert scancode to keycode */ 145*16b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("scancode %x\n",scancode); 146*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(scancode==0xe0) { 147*16b195c8SJean-Christophe PLAGNIOL-VILLARD e0=1; /* special charakters */ 148*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 149*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 150*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(e0==1) { 151*16b195c8SJean-Christophe PLAGNIOL-VILLARD e0=0; /* delete flag */ 152*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(!( ((scancode&0x7F)==0x38)|| /* the right ctrl key */ 153*16b195c8SJean-Christophe PLAGNIOL-VILLARD ((scancode&0x7F)==0x1D)|| /* the right alt key */ 154*16b195c8SJean-Christophe PLAGNIOL-VILLARD ((scancode&0x7F)==0x35)|| /* the right '/' key */ 155*16b195c8SJean-Christophe PLAGNIOL-VILLARD ((scancode&0x7F)==0x1C) )) /* the right enter key */ 156*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* we swallow unknown e0 codes */ 157*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 158*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 159*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* special cntrl keys */ 160*16b195c8SJean-Christophe PLAGNIOL-VILLARD switch(scancode) { 161*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x2A: 162*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x36: /* shift pressed */ 163*16b195c8SJean-Christophe PLAGNIOL-VILLARD shift=1; 164*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 165*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xAA: 166*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xB6: /* shift released */ 167*16b195c8SJean-Christophe PLAGNIOL-VILLARD shift=0; 168*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 169*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x38: /* alt pressed */ 170*16b195c8SJean-Christophe PLAGNIOL-VILLARD alt=1; 171*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 172*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xB8: /* alt released */ 173*16b195c8SJean-Christophe PLAGNIOL-VILLARD alt=0; 174*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 175*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x1d: /* ctrl pressed */ 176*16b195c8SJean-Christophe PLAGNIOL-VILLARD ctrl=1; 177*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 178*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x9d: /* ctrl released */ 179*16b195c8SJean-Christophe PLAGNIOL-VILLARD ctrl=0; 180*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 181*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x46: /* scrollock pressed */ 182*16b195c8SJean-Christophe PLAGNIOL-VILLARD scroll_lock=~scroll_lock; 183*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(scroll_lock==0) 184*16b195c8SJean-Christophe PLAGNIOL-VILLARD leds&=~LED_SCR; /* switch LED off */ 185*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 186*16b195c8SJean-Christophe PLAGNIOL-VILLARD leds|=LED_SCR; /* switch on LED */ 187*16b195c8SJean-Christophe PLAGNIOL-VILLARD pckbd_leds(leds); 188*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 189*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x3A: /* capslock pressed */ 190*16b195c8SJean-Christophe PLAGNIOL-VILLARD caps_lock=~caps_lock; 191*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(caps_lock==0) 192*16b195c8SJean-Christophe PLAGNIOL-VILLARD leds&=~LED_CAP; /* switch caps_lock off */ 193*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 194*16b195c8SJean-Christophe PLAGNIOL-VILLARD leds|=LED_CAP; /* switch on LED */ 195*16b195c8SJean-Christophe PLAGNIOL-VILLARD pckbd_leds(leds); 196*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 197*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x45: /* numlock pressed */ 198*16b195c8SJean-Christophe PLAGNIOL-VILLARD num_lock=~num_lock; 199*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(num_lock==0) 200*16b195c8SJean-Christophe PLAGNIOL-VILLARD leds&=~LED_NUM; /* switch LED off */ 201*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 202*16b195c8SJean-Christophe PLAGNIOL-VILLARD leds|=LED_NUM; /* switch on LED */ 203*16b195c8SJean-Christophe PLAGNIOL-VILLARD pckbd_leds(leds); 204*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 205*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xC6: /* scroll lock released */ 206*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xC5: /* num lock released */ 207*16b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xBA: /* caps lock released */ 208*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* just swallow */ 209*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 210*16b195c8SJean-Christophe PLAGNIOL-VILLARD #if 1 211*16b195c8SJean-Christophe PLAGNIOL-VILLARD if((scancode&0x80)==0x80) /* key released */ 212*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 213*16b195c8SJean-Christophe PLAGNIOL-VILLARD #else 214*16b195c8SJean-Christophe PLAGNIOL-VILLARD if((scancode&0x80)==0x00) /* key pressed */ 215*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 216*16b195c8SJean-Christophe PLAGNIOL-VILLARD scancode &= ~0x80; 217*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 218*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* now, decide which table we need */ 219*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(scancode > (sizeof(kbd_plain_xlate)/sizeof(kbd_plain_xlate[0]))) { /* scancode not in list */ 220*16b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("unkown scancode %X\n",scancode); 221*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* swallow it */ 222*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 223*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* setup plain code first */ 224*16b195c8SJean-Christophe PLAGNIOL-VILLARD keycode=kbd_plain_xlate[scancode]; 225*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(caps_lock==1) { /* caps_lock is pressed, overwrite plain code */ 226*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(scancode > (sizeof(kbd_shift_xlate)/sizeof(kbd_shift_xlate[0]))) { /* scancode not in list */ 227*16b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("unkown caps-locked scancode %X\n",scancode); 228*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* swallow it */ 229*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 230*16b195c8SJean-Christophe PLAGNIOL-VILLARD keycode=kbd_shift_xlate[scancode]; 231*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(keycode<'A') { /* we only want the alphas capital */ 232*16b195c8SJean-Christophe PLAGNIOL-VILLARD keycode=kbd_plain_xlate[scancode]; 233*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 234*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 235*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(shift==1) { /* shift overwrites caps_lock */ 236*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(scancode > (sizeof(kbd_shift_xlate)/sizeof(kbd_shift_xlate[0]))) { /* scancode not in list */ 237*16b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("unkown shifted scancode %X\n",scancode); 238*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* swallow it */ 239*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 240*16b195c8SJean-Christophe PLAGNIOL-VILLARD keycode=kbd_shift_xlate[scancode]; 241*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 242*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(ctrl==1) { /* ctrl overwrites caps_lock and shift */ 243*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(scancode > (sizeof(kbd_ctrl_xlate)/sizeof(kbd_ctrl_xlate[0]))) { /* scancode not in list */ 244*16b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("unkown ctrl scancode %X\n",scancode); 245*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* swallow it */ 246*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 247*16b195c8SJean-Christophe PLAGNIOL-VILLARD keycode=kbd_ctrl_xlate[scancode]; 248*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 249*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* check if valid keycode */ 250*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(keycode==0xff) { 251*16b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("unkown scancode %X\n",scancode); 252*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* swallow unknown codes */ 253*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 254*16b195c8SJean-Christophe PLAGNIOL-VILLARD 255*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_put_queue(keycode); 256*16b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("%x\n",keycode); 257*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 258*16b195c8SJean-Christophe PLAGNIOL-VILLARD 259*16b195c8SJean-Christophe PLAGNIOL-VILLARD /****************************************************************** 260*16b195c8SJean-Christophe PLAGNIOL-VILLARD * Init 261*16b195c8SJean-Christophe PLAGNIOL-VILLARD ******************************************************************/ 262*16b195c8SJean-Christophe PLAGNIOL-VILLARD 263*16b195c8SJean-Christophe PLAGNIOL-VILLARD #ifdef CFG_CONSOLE_OVERWRITE_ROUTINE 264*16b195c8SJean-Christophe PLAGNIOL-VILLARD extern int overwrite_console (void); 265*16b195c8SJean-Christophe PLAGNIOL-VILLARD #define OVERWRITE_CONSOLE overwrite_console () 266*16b195c8SJean-Christophe PLAGNIOL-VILLARD #else 267*16b195c8SJean-Christophe PLAGNIOL-VILLARD #define OVERWRITE_CONSOLE 0 268*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif /* CFG_CONSOLE_OVERWRITE_ROUTINE */ 269*16b195c8SJean-Christophe PLAGNIOL-VILLARD 270*16b195c8SJean-Christophe PLAGNIOL-VILLARD int kbd_init (void) 271*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 272*16b195c8SJean-Christophe PLAGNIOL-VILLARD int error; 273*16b195c8SJean-Christophe PLAGNIOL-VILLARD device_t kbddev ; 274*16b195c8SJean-Christophe PLAGNIOL-VILLARD char *stdinname = getenv ("stdin"); 275*16b195c8SJean-Christophe PLAGNIOL-VILLARD 276*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(kbd_init_hw()==-1) 277*16b195c8SJean-Christophe PLAGNIOL-VILLARD return -1; 278*16b195c8SJean-Christophe PLAGNIOL-VILLARD memset (&kbddev, 0, sizeof(kbddev)); 279*16b195c8SJean-Christophe PLAGNIOL-VILLARD strcpy(kbddev.name, DEVNAME); 280*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbddev.flags = DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM; 281*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbddev.putc = NULL ; 282*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbddev.puts = NULL ; 283*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbddev.getc = kbd_getc ; 284*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbddev.tstc = kbd_testc ; 285*16b195c8SJean-Christophe PLAGNIOL-VILLARD 286*16b195c8SJean-Christophe PLAGNIOL-VILLARD error = device_register (&kbddev); 287*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(error==0) { 288*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* check if this is the standard input device */ 289*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(strcmp(stdinname,DEVNAME)==0) { 290*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* reassign the console */ 291*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(OVERWRITE_CONSOLE) { 292*16b195c8SJean-Christophe PLAGNIOL-VILLARD return 1; 293*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 294*16b195c8SJean-Christophe PLAGNIOL-VILLARD error=console_assign(stdin,DEVNAME); 295*16b195c8SJean-Christophe PLAGNIOL-VILLARD if(error==0) 296*16b195c8SJean-Christophe PLAGNIOL-VILLARD return 1; 297*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 298*16b195c8SJean-Christophe PLAGNIOL-VILLARD return error; 299*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 300*16b195c8SJean-Christophe PLAGNIOL-VILLARD return 1; 301*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 302*16b195c8SJean-Christophe PLAGNIOL-VILLARD return error; 303*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 304*16b195c8SJean-Christophe PLAGNIOL-VILLARD 305*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_PS2KBD */ 306