116b195c8SJean-Christophe PLAGNIOL-VILLARD /*********************************************************************** 216b195c8SJean-Christophe PLAGNIOL-VILLARD * 316b195c8SJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2004 416b195c8SJean-Christophe PLAGNIOL-VILLARD * DENX Software Engineering 516b195c8SJean-Christophe PLAGNIOL-VILLARD * Wolfgang Denk, wd@denx.de 616b195c8SJean-Christophe PLAGNIOL-VILLARD * 716b195c8SJean-Christophe PLAGNIOL-VILLARD * Keyboard driver 816b195c8SJean-Christophe PLAGNIOL-VILLARD * 916b195c8SJean-Christophe PLAGNIOL-VILLARD ***********************************************************************/ 1016b195c8SJean-Christophe PLAGNIOL-VILLARD 1116b195c8SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 1216b195c8SJean-Christophe PLAGNIOL-VILLARD 1352cb4d4fSJean-Christophe PLAGNIOL-VILLARD #include <stdio_dev.h> 1416b195c8SJean-Christophe PLAGNIOL-VILLARD #include <keyboard.h> 1516b195c8SJean-Christophe PLAGNIOL-VILLARD 1616b195c8SJean-Christophe PLAGNIOL-VILLARD #undef KBG_DEBUG 1716b195c8SJean-Christophe PLAGNIOL-VILLARD 1816b195c8SJean-Christophe PLAGNIOL-VILLARD #ifdef KBG_DEBUG 1916b195c8SJean-Christophe PLAGNIOL-VILLARD #define PRINTF(fmt,args...) printf (fmt ,##args) 2016b195c8SJean-Christophe PLAGNIOL-VILLARD #else 2116b195c8SJean-Christophe PLAGNIOL-VILLARD #define PRINTF(fmt,args...) 2216b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 2316b195c8SJean-Christophe PLAGNIOL-VILLARD 2416b195c8SJean-Christophe PLAGNIOL-VILLARD 2516b195c8SJean-Christophe PLAGNIOL-VILLARD #define DEVNAME "kbd" 2616b195c8SJean-Christophe PLAGNIOL-VILLARD 2716b195c8SJean-Christophe PLAGNIOL-VILLARD #define LED_SCR 0x01 /* scroll lock led */ 2816b195c8SJean-Christophe PLAGNIOL-VILLARD #define LED_CAP 0x04 /* caps lock led */ 2916b195c8SJean-Christophe PLAGNIOL-VILLARD #define LED_NUM 0x02 /* num lock led */ 3016b195c8SJean-Christophe PLAGNIOL-VILLARD 3116b195c8SJean-Christophe PLAGNIOL-VILLARD #define KBD_BUFFER_LEN 0x20 /* size of the keyboardbuffer */ 3216b195c8SJean-Christophe PLAGNIOL-VILLARD 3316b195c8SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_MPC5xxx) || defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || defined(CONFIG_MPC8555) 3416b195c8SJean-Christophe PLAGNIOL-VILLARD int ps2ser_check(void); 3516b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 3616b195c8SJean-Christophe PLAGNIOL-VILLARD 3716b195c8SJean-Christophe PLAGNIOL-VILLARD static volatile char kbd_buffer[KBD_BUFFER_LEN]; 3816b195c8SJean-Christophe PLAGNIOL-VILLARD static volatile int in_pointer = 0; 3916b195c8SJean-Christophe PLAGNIOL-VILLARD static volatile int out_pointer = 0; 4016b195c8SJean-Christophe PLAGNIOL-VILLARD 4116b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char leds = 0; 4216b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char num_lock = 0; 4316b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char caps_lock = 0; 4416b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char scroll_lock = 0; 4516b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char shift = 0; 4616b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char ctrl = 0; 4716b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char alt = 0; 4816b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char e0 = 0; 4916b195c8SJean-Christophe PLAGNIOL-VILLARD 5016b195c8SJean-Christophe PLAGNIOL-VILLARD /****************************************************************** 5116b195c8SJean-Christophe PLAGNIOL-VILLARD * Queue handling 5216b195c8SJean-Christophe PLAGNIOL-VILLARD ******************************************************************/ 5316b195c8SJean-Christophe PLAGNIOL-VILLARD 5416b195c8SJean-Christophe PLAGNIOL-VILLARD /* puts character in the queue and sets up the in and out pointer */ 5516b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_put_queue(char data) 5616b195c8SJean-Christophe PLAGNIOL-VILLARD { 5716b195c8SJean-Christophe PLAGNIOL-VILLARD if((in_pointer+1)==KBD_BUFFER_LEN) { 5816b195c8SJean-Christophe PLAGNIOL-VILLARD if(out_pointer==0) { 5916b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* buffer full */ 6016b195c8SJean-Christophe PLAGNIOL-VILLARD } else{ 6116b195c8SJean-Christophe PLAGNIOL-VILLARD in_pointer=0; 6216b195c8SJean-Christophe PLAGNIOL-VILLARD } 6316b195c8SJean-Christophe PLAGNIOL-VILLARD } else { 6416b195c8SJean-Christophe PLAGNIOL-VILLARD if((in_pointer+1)==out_pointer) 6516b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* buffer full */ 6616b195c8SJean-Christophe PLAGNIOL-VILLARD in_pointer++; 6716b195c8SJean-Christophe PLAGNIOL-VILLARD } 6816b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_buffer[in_pointer]=data; 6916b195c8SJean-Christophe PLAGNIOL-VILLARD return; 7016b195c8SJean-Christophe PLAGNIOL-VILLARD } 7116b195c8SJean-Christophe PLAGNIOL-VILLARD 7216b195c8SJean-Christophe PLAGNIOL-VILLARD /* test if a character is in the queue */ 73*709ea543SSimon Glass static int kbd_testc(struct stdio_dev *dev) 7416b195c8SJean-Christophe PLAGNIOL-VILLARD { 7516b195c8SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_MPC5xxx) || defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || defined(CONFIG_MPC8555) 7616b195c8SJean-Christophe PLAGNIOL-VILLARD /* no ISR is used, so received chars must be polled */ 7716b195c8SJean-Christophe PLAGNIOL-VILLARD ps2ser_check(); 7816b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 7916b195c8SJean-Christophe PLAGNIOL-VILLARD if(in_pointer==out_pointer) 8016b195c8SJean-Christophe PLAGNIOL-VILLARD return(0); /* no data */ 8116b195c8SJean-Christophe PLAGNIOL-VILLARD else 8216b195c8SJean-Christophe PLAGNIOL-VILLARD return(1); 8316b195c8SJean-Christophe PLAGNIOL-VILLARD } 8416b195c8SJean-Christophe PLAGNIOL-VILLARD 8516b195c8SJean-Christophe PLAGNIOL-VILLARD /* gets the character from the queue */ 86*709ea543SSimon Glass static int kbd_getc(struct stdio_dev *dev) 8716b195c8SJean-Christophe PLAGNIOL-VILLARD { 8816b195c8SJean-Christophe PLAGNIOL-VILLARD char c; 8916b195c8SJean-Christophe PLAGNIOL-VILLARD while(in_pointer==out_pointer) { 9016b195c8SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_MPC5xxx) || defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || defined(CONFIG_MPC8555) 9116b195c8SJean-Christophe PLAGNIOL-VILLARD /* no ISR is used, so received chars must be polled */ 9216b195c8SJean-Christophe PLAGNIOL-VILLARD ps2ser_check(); 9316b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 9416b195c8SJean-Christophe PLAGNIOL-VILLARD ;} 9516b195c8SJean-Christophe PLAGNIOL-VILLARD if((out_pointer+1)==KBD_BUFFER_LEN) 9616b195c8SJean-Christophe PLAGNIOL-VILLARD out_pointer=0; 9716b195c8SJean-Christophe PLAGNIOL-VILLARD else 9816b195c8SJean-Christophe PLAGNIOL-VILLARD out_pointer++; 9916b195c8SJean-Christophe PLAGNIOL-VILLARD c=kbd_buffer[out_pointer]; 10016b195c8SJean-Christophe PLAGNIOL-VILLARD return (int)c; 10116b195c8SJean-Christophe PLAGNIOL-VILLARD 10216b195c8SJean-Christophe PLAGNIOL-VILLARD } 10316b195c8SJean-Christophe PLAGNIOL-VILLARD 10416b195c8SJean-Christophe PLAGNIOL-VILLARD /* Simple translation table for the keys */ 10516b195c8SJean-Christophe PLAGNIOL-VILLARD 10616b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char kbd_plain_xlate[] = { 10716b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0x1b, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=','\b','\t', /* 0x00 - 0x0f */ 10816b195c8SJean-Christophe PLAGNIOL-VILLARD 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']','\r',0xff, 'a', 's', /* 0x10 - 0x1f */ 10916b195c8SJean-Christophe PLAGNIOL-VILLARD 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';','\'', '`',0xff,'\\', 'z', 'x', 'c', 'v', /* 0x20 - 0x2f */ 11016b195c8SJean-Christophe PLAGNIOL-VILLARD 'b', 'n', 'm', ',', '.', '/',0xff,0xff,0xff, ' ',0xff,0xff,0xff,0xff,0xff,0xff, /* 0x30 - 0x3f */ 11116b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0xff,0xff,0xff,0xff,0xff,0xff, '7', '8', '9', '-', '4', '5', '6', '+', '1', /* 0x40 - 0x4f */ 11216b195c8SJean-Christophe PLAGNIOL-VILLARD '2', '3', '0', '.',0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 0x50 - 0x5F */ 11316b195c8SJean-Christophe PLAGNIOL-VILLARD '\r',0xff,0xff 11416b195c8SJean-Christophe PLAGNIOL-VILLARD }; 11516b195c8SJean-Christophe PLAGNIOL-VILLARD 11616b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char kbd_shift_xlate[] = { 11716b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0x1b, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+','\b','\t', /* 0x00 - 0x0f */ 11816b195c8SJean-Christophe PLAGNIOL-VILLARD 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}','\r',0xff, 'A', 'S', /* 0x10 - 0x1f */ 11916b195c8SJean-Christophe PLAGNIOL-VILLARD 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '~',0xff, '|', 'Z', 'X', 'C', 'V', /* 0x20 - 0x2f */ 12016b195c8SJean-Christophe PLAGNIOL-VILLARD 'B', 'N', 'M', '<', '>', '?',0xff,0xff,0xff, ' ',0xff,0xff,0xff,0xff,0xff,0xff, /* 0x30 - 0x3f */ 12116b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0xff,0xff,0xff,0xff,0xff,0xff, '7', '8', '9', '-', '4', '5', '6', '+', '1', /* 0x40 - 0x4f */ 12216b195c8SJean-Christophe PLAGNIOL-VILLARD '2', '3', '0', '.',0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 0x50 - 0x5F */ 12316b195c8SJean-Christophe PLAGNIOL-VILLARD '\r',0xff,0xff 12416b195c8SJean-Christophe PLAGNIOL-VILLARD }; 12516b195c8SJean-Christophe PLAGNIOL-VILLARD 12616b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char kbd_ctrl_xlate[] = { 12716b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0x1b, '1',0x00, '3', '4', '5',0x1E, '7', '8', '9', '0',0x1F, '=','\b','\t', /* 0x00 - 0x0f */ 12816b195c8SJean-Christophe PLAGNIOL-VILLARD 0x11,0x17,0x05,0x12,0x14,0x18,0x15,0x09,0x0f,0x10,0x1b,0x1d,'\n',0xff,0x01,0x13, /* 0x10 - 0x1f */ 12916b195c8SJean-Christophe PLAGNIOL-VILLARD 0x04,0x06,0x08,0x09,0x0a,0x0b,0x0c, ';','\'', '~',0x00,0x1c,0x1a,0x18,0x03,0x16, /* 0x20 - 0x2f */ 13016b195c8SJean-Christophe PLAGNIOL-VILLARD 0x02,0x0e,0x0d, '<', '>', '?',0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff, /* 0x30 - 0x3f */ 13116b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff,0xff,0xff,0xff,0xff,0xff,0xff, '7', '8', '9', '-', '4', '5', '6', '+', '1', /* 0x40 - 0x4f */ 13216b195c8SJean-Christophe PLAGNIOL-VILLARD '2', '3', '0', '.',0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 0x50 - 0x5F */ 13316b195c8SJean-Christophe PLAGNIOL-VILLARD '\r',0xff,0xff 13416b195c8SJean-Christophe PLAGNIOL-VILLARD }; 13516b195c8SJean-Christophe PLAGNIOL-VILLARD 13616b195c8SJean-Christophe PLAGNIOL-VILLARD 13716b195c8SJean-Christophe PLAGNIOL-VILLARD void handle_scancode(unsigned char scancode) 13816b195c8SJean-Christophe PLAGNIOL-VILLARD { 13916b195c8SJean-Christophe PLAGNIOL-VILLARD unsigned char keycode; 14016b195c8SJean-Christophe PLAGNIOL-VILLARD 14116b195c8SJean-Christophe PLAGNIOL-VILLARD /* Convert scancode to keycode */ 14216b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("scancode %x\n",scancode); 14316b195c8SJean-Christophe PLAGNIOL-VILLARD if(scancode==0xe0) { 14416b195c8SJean-Christophe PLAGNIOL-VILLARD e0=1; /* special charakters */ 14516b195c8SJean-Christophe PLAGNIOL-VILLARD return; 14616b195c8SJean-Christophe PLAGNIOL-VILLARD } 14716b195c8SJean-Christophe PLAGNIOL-VILLARD if(e0==1) { 14816b195c8SJean-Christophe PLAGNIOL-VILLARD e0=0; /* delete flag */ 14916b195c8SJean-Christophe PLAGNIOL-VILLARD if(!( ((scancode&0x7F)==0x38)|| /* the right ctrl key */ 15016b195c8SJean-Christophe PLAGNIOL-VILLARD ((scancode&0x7F)==0x1D)|| /* the right alt key */ 15116b195c8SJean-Christophe PLAGNIOL-VILLARD ((scancode&0x7F)==0x35)|| /* the right '/' key */ 15216b195c8SJean-Christophe PLAGNIOL-VILLARD ((scancode&0x7F)==0x1C) )) /* the right enter key */ 15316b195c8SJean-Christophe PLAGNIOL-VILLARD /* we swallow unknown e0 codes */ 15416b195c8SJean-Christophe PLAGNIOL-VILLARD return; 15516b195c8SJean-Christophe PLAGNIOL-VILLARD } 15616b195c8SJean-Christophe PLAGNIOL-VILLARD /* special cntrl keys */ 15716b195c8SJean-Christophe PLAGNIOL-VILLARD switch(scancode) { 15816b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x2A: 15916b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x36: /* shift pressed */ 16016b195c8SJean-Christophe PLAGNIOL-VILLARD shift=1; 16116b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 16216b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xAA: 16316b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xB6: /* shift released */ 16416b195c8SJean-Christophe PLAGNIOL-VILLARD shift=0; 16516b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 16616b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x38: /* alt pressed */ 16716b195c8SJean-Christophe PLAGNIOL-VILLARD alt=1; 16816b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 16916b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xB8: /* alt released */ 17016b195c8SJean-Christophe PLAGNIOL-VILLARD alt=0; 17116b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 17216b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x1d: /* ctrl pressed */ 17316b195c8SJean-Christophe PLAGNIOL-VILLARD ctrl=1; 17416b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 17516b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x9d: /* ctrl released */ 17616b195c8SJean-Christophe PLAGNIOL-VILLARD ctrl=0; 17716b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 17816b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x46: /* scrollock pressed */ 17916b195c8SJean-Christophe PLAGNIOL-VILLARD scroll_lock=~scroll_lock; 18016b195c8SJean-Christophe PLAGNIOL-VILLARD if(scroll_lock==0) 18116b195c8SJean-Christophe PLAGNIOL-VILLARD leds&=~LED_SCR; /* switch LED off */ 18216b195c8SJean-Christophe PLAGNIOL-VILLARD else 18316b195c8SJean-Christophe PLAGNIOL-VILLARD leds|=LED_SCR; /* switch on LED */ 18416b195c8SJean-Christophe PLAGNIOL-VILLARD pckbd_leds(leds); 18516b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* do nothing else */ 18616b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x3A: /* capslock pressed */ 18716b195c8SJean-Christophe PLAGNIOL-VILLARD caps_lock=~caps_lock; 18816b195c8SJean-Christophe PLAGNIOL-VILLARD if(caps_lock==0) 18916b195c8SJean-Christophe PLAGNIOL-VILLARD leds&=~LED_CAP; /* switch caps_lock off */ 19016b195c8SJean-Christophe PLAGNIOL-VILLARD else 19116b195c8SJean-Christophe PLAGNIOL-VILLARD leds|=LED_CAP; /* switch on LED */ 19216b195c8SJean-Christophe PLAGNIOL-VILLARD pckbd_leds(leds); 19316b195c8SJean-Christophe PLAGNIOL-VILLARD return; 19416b195c8SJean-Christophe PLAGNIOL-VILLARD case 0x45: /* numlock pressed */ 19516b195c8SJean-Christophe PLAGNIOL-VILLARD num_lock=~num_lock; 19616b195c8SJean-Christophe PLAGNIOL-VILLARD if(num_lock==0) 19716b195c8SJean-Christophe PLAGNIOL-VILLARD leds&=~LED_NUM; /* switch LED off */ 19816b195c8SJean-Christophe PLAGNIOL-VILLARD else 19916b195c8SJean-Christophe PLAGNIOL-VILLARD leds|=LED_NUM; /* switch on LED */ 20016b195c8SJean-Christophe PLAGNIOL-VILLARD pckbd_leds(leds); 20116b195c8SJean-Christophe PLAGNIOL-VILLARD return; 20216b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xC6: /* scroll lock released */ 20316b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xC5: /* num lock released */ 20416b195c8SJean-Christophe PLAGNIOL-VILLARD case 0xBA: /* caps lock released */ 20516b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* just swallow */ 20616b195c8SJean-Christophe PLAGNIOL-VILLARD } 20716b195c8SJean-Christophe PLAGNIOL-VILLARD #if 1 20816b195c8SJean-Christophe PLAGNIOL-VILLARD if((scancode&0x80)==0x80) /* key released */ 20916b195c8SJean-Christophe PLAGNIOL-VILLARD return; 21016b195c8SJean-Christophe PLAGNIOL-VILLARD #else 21116b195c8SJean-Christophe PLAGNIOL-VILLARD if((scancode&0x80)==0x00) /* key pressed */ 21216b195c8SJean-Christophe PLAGNIOL-VILLARD return; 21316b195c8SJean-Christophe PLAGNIOL-VILLARD scancode &= ~0x80; 21416b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 21516b195c8SJean-Christophe PLAGNIOL-VILLARD /* now, decide which table we need */ 21616b195c8SJean-Christophe PLAGNIOL-VILLARD if(scancode > (sizeof(kbd_plain_xlate)/sizeof(kbd_plain_xlate[0]))) { /* scancode not in list */ 21716b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("unkown scancode %X\n",scancode); 21816b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* swallow it */ 21916b195c8SJean-Christophe PLAGNIOL-VILLARD } 22016b195c8SJean-Christophe PLAGNIOL-VILLARD /* setup plain code first */ 22116b195c8SJean-Christophe PLAGNIOL-VILLARD keycode=kbd_plain_xlate[scancode]; 22216b195c8SJean-Christophe PLAGNIOL-VILLARD if(caps_lock==1) { /* caps_lock is pressed, overwrite plain code */ 22316b195c8SJean-Christophe PLAGNIOL-VILLARD if(scancode > (sizeof(kbd_shift_xlate)/sizeof(kbd_shift_xlate[0]))) { /* scancode not in list */ 22416b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("unkown caps-locked scancode %X\n",scancode); 22516b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* swallow it */ 22616b195c8SJean-Christophe PLAGNIOL-VILLARD } 22716b195c8SJean-Christophe PLAGNIOL-VILLARD keycode=kbd_shift_xlate[scancode]; 22816b195c8SJean-Christophe PLAGNIOL-VILLARD if(keycode<'A') { /* we only want the alphas capital */ 22916b195c8SJean-Christophe PLAGNIOL-VILLARD keycode=kbd_plain_xlate[scancode]; 23016b195c8SJean-Christophe PLAGNIOL-VILLARD } 23116b195c8SJean-Christophe PLAGNIOL-VILLARD } 23216b195c8SJean-Christophe PLAGNIOL-VILLARD if(shift==1) { /* shift overwrites caps_lock */ 23316b195c8SJean-Christophe PLAGNIOL-VILLARD if(scancode > (sizeof(kbd_shift_xlate)/sizeof(kbd_shift_xlate[0]))) { /* scancode not in list */ 23416b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("unkown shifted scancode %X\n",scancode); 23516b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* swallow it */ 23616b195c8SJean-Christophe PLAGNIOL-VILLARD } 23716b195c8SJean-Christophe PLAGNIOL-VILLARD keycode=kbd_shift_xlate[scancode]; 23816b195c8SJean-Christophe PLAGNIOL-VILLARD } 23916b195c8SJean-Christophe PLAGNIOL-VILLARD if(ctrl==1) { /* ctrl overwrites caps_lock and shift */ 24016b195c8SJean-Christophe PLAGNIOL-VILLARD if(scancode > (sizeof(kbd_ctrl_xlate)/sizeof(kbd_ctrl_xlate[0]))) { /* scancode not in list */ 24116b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("unkown ctrl scancode %X\n",scancode); 24216b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* swallow it */ 24316b195c8SJean-Christophe PLAGNIOL-VILLARD } 24416b195c8SJean-Christophe PLAGNIOL-VILLARD keycode=kbd_ctrl_xlate[scancode]; 24516b195c8SJean-Christophe PLAGNIOL-VILLARD } 24616b195c8SJean-Christophe PLAGNIOL-VILLARD /* check if valid keycode */ 24716b195c8SJean-Christophe PLAGNIOL-VILLARD if(keycode==0xff) { 24816b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("unkown scancode %X\n",scancode); 24916b195c8SJean-Christophe PLAGNIOL-VILLARD return; /* swallow unknown codes */ 25016b195c8SJean-Christophe PLAGNIOL-VILLARD } 25116b195c8SJean-Christophe PLAGNIOL-VILLARD 25216b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_put_queue(keycode); 25316b195c8SJean-Christophe PLAGNIOL-VILLARD PRINTF("%x\n",keycode); 25416b195c8SJean-Christophe PLAGNIOL-VILLARD } 25516b195c8SJean-Christophe PLAGNIOL-VILLARD 25616b195c8SJean-Christophe PLAGNIOL-VILLARD /****************************************************************** 25716b195c8SJean-Christophe PLAGNIOL-VILLARD * Init 25816b195c8SJean-Christophe PLAGNIOL-VILLARD ******************************************************************/ 25916b195c8SJean-Christophe PLAGNIOL-VILLARD 2606d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE 26116b195c8SJean-Christophe PLAGNIOL-VILLARD extern int overwrite_console (void); 26216b195c8SJean-Christophe PLAGNIOL-VILLARD #define OVERWRITE_CONSOLE overwrite_console () 26316b195c8SJean-Christophe PLAGNIOL-VILLARD #else 26416b195c8SJean-Christophe PLAGNIOL-VILLARD #define OVERWRITE_CONSOLE 0 2656d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE */ 26616b195c8SJean-Christophe PLAGNIOL-VILLARD 26716b195c8SJean-Christophe PLAGNIOL-VILLARD int kbd_init (void) 26816b195c8SJean-Christophe PLAGNIOL-VILLARD { 26916b195c8SJean-Christophe PLAGNIOL-VILLARD int error; 27052cb4d4fSJean-Christophe PLAGNIOL-VILLARD struct stdio_dev kbddev ; 27116b195c8SJean-Christophe PLAGNIOL-VILLARD char *stdinname = getenv ("stdin"); 27216b195c8SJean-Christophe PLAGNIOL-VILLARD 27316b195c8SJean-Christophe PLAGNIOL-VILLARD if(kbd_init_hw()==-1) 27416b195c8SJean-Christophe PLAGNIOL-VILLARD return -1; 27516b195c8SJean-Christophe PLAGNIOL-VILLARD memset (&kbddev, 0, sizeof(kbddev)); 27616b195c8SJean-Christophe PLAGNIOL-VILLARD strcpy(kbddev.name, DEVNAME); 27716b195c8SJean-Christophe PLAGNIOL-VILLARD kbddev.flags = DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM; 27816b195c8SJean-Christophe PLAGNIOL-VILLARD kbddev.getc = kbd_getc ; 27916b195c8SJean-Christophe PLAGNIOL-VILLARD kbddev.tstc = kbd_testc ; 28016b195c8SJean-Christophe PLAGNIOL-VILLARD 28152cb4d4fSJean-Christophe PLAGNIOL-VILLARD error = stdio_register (&kbddev); 28216b195c8SJean-Christophe PLAGNIOL-VILLARD if(error==0) { 28316b195c8SJean-Christophe PLAGNIOL-VILLARD /* check if this is the standard input device */ 28416b195c8SJean-Christophe PLAGNIOL-VILLARD if(strcmp(stdinname,DEVNAME)==0) { 28516b195c8SJean-Christophe PLAGNIOL-VILLARD /* reassign the console */ 28616b195c8SJean-Christophe PLAGNIOL-VILLARD if(OVERWRITE_CONSOLE) { 28716b195c8SJean-Christophe PLAGNIOL-VILLARD return 1; 28816b195c8SJean-Christophe PLAGNIOL-VILLARD } 28916b195c8SJean-Christophe PLAGNIOL-VILLARD error=console_assign(stdin,DEVNAME); 29016b195c8SJean-Christophe PLAGNIOL-VILLARD if(error==0) 29116b195c8SJean-Christophe PLAGNIOL-VILLARD return 1; 29216b195c8SJean-Christophe PLAGNIOL-VILLARD else 29316b195c8SJean-Christophe PLAGNIOL-VILLARD return error; 29416b195c8SJean-Christophe PLAGNIOL-VILLARD } 29516b195c8SJean-Christophe PLAGNIOL-VILLARD return 1; 29616b195c8SJean-Christophe PLAGNIOL-VILLARD } 29716b195c8SJean-Christophe PLAGNIOL-VILLARD return error; 29816b195c8SJean-Christophe PLAGNIOL-VILLARD } 299