A project to implement a console using the Mbed using VGA for video output and a PS/2 keyboard for the input. The eventual goal is to also include tools for managing SD cards, and a semi-self-hosting programming environment.
Dependencies: PS2_MbedConsole fastlib SDFileSystem vga640x480g_mbedconsole lightvm mbed
MbedConsole is a cool little project to have a self-contained computer all on an Mbed. So far it has VGA and PS/2 support and can stand alone without a computer powering it. Next planned features are SD card support and a lightweight programmable VM complete with a file editor and self-hosted assembler.
You can view additional details about it at http://earlz.net/tags/mbedconsole
Diff: keyboard.cpp
- Revision:
- 11:fede136943a9
- Parent:
- 10:bda85442b674
- Child:
- 12:3ee3062cc11c
diff -r bda85442b674 -r fede136943a9 keyboard.cpp --- a/keyboard.cpp Wed Sep 26 05:22:44 2012 +0000 +++ b/keyboard.cpp Fri Sep 28 04:03:54 2012 +0000 @@ -9,120 +9,194 @@ #define KBD_BUFFER_SIZE 128 //key defines -#define LSHIFT_KEY 42 -#define RSHIFT_KEY 54 -#define CTRL_KEY 29 -#define ALT_KEY 56 -#define CAPS_KEY 58 -#define NUM_KEY 69 -#define SCROLL_KEY 70 -#define F_BASE_KEY 59 //59 is F1, 60 is F2, and so on until F10 -#define HOME_KEY 71 -#define UP_KEY 72 -#define PAGE_UP_KEY 73 -#define LEFT_KEY 75 -#define RIGHT_KEY 77 -#define END_KEY 79 -#define DOWN_KEY 80 -#define PAGE_DOWN_KEY 81 -#define INSERT_KEY 82 -#define DEL_KEY 83 -#define F11_KEY 87 -#define F12_KEY 89 +#define LSHIFT_KEY 0x12 +#define RSHIFT_KEY 0x59 + +#define CTRL_KEY 0xF3 +#define ALT_KEY 0xF4 +#define CAPS_KEY 0x58 +#define NUM_KEY 0x77 +#define SCROLL_KEY 0xF7 +//#define F_BASE_KEY 0xFF //59 is F1, 60 is F2, and so on until F10 +#define HOME_KEY 0xFF +#define UP_KEY 0xFF +#define PAGE_UP_KEY 0xFF +#define LEFT_KEY 0xFF +#define RIGHT_KEY 0xFF +#define END_KEY 0xFF +#define DOWN_KEY 0xFF +#define PAGE_DOWN_KEY 0xFF +#define INSERT_KEY 0xFF +#define DEL_KEY 0xFF +#define F11_KEY 0xFF +#define F12_KEY 0xFF #define SCROLL_LED 1 #define NUM_LED 2 #define CAPS_LED 4 -const char kbdus[128] = +const char kbdus[0x84] = { - 0, 27, '1', '2', '3', '4', '5', '6', '7', '8', /* 9 */ - '9', '0', '-', '=', '\b', /* Backspace */ - '\t', /* Tab */ - 'q', 'w', 'e', 'r', /* 19 */ - 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', /* Enter key */ - 0, /* 29 - Control */ - 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', /* 39 */ - '\'', '`', 0, /* Left shift */ - '\\', 'z', 'x', 'c', 'v', 'b', 'n', /* 49 */ - 'm', ',', '.', '/', 0, /* Right shift */ - '*', - 0, /* Alt */ - ' ', /* Space bar */ - 0, /* Caps lock */ - 0, /* 59 - F1 key ... > */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, /* < ... F10 */ - 0, /* 69 - Num lock*/ - 0, /* Scroll Lock */ - 0, /* Home key */ - 0, /* Up Arrow */ - 0, /* Page Up */ - '-', - 0, /* Left Arrow */ - 0, - 0, /* Right Arrow */ - '+', - 0, /* 79 - End key*/ - 0, /* Down Arrow */ - 0, /* Page Down */ - 0, /* Insert Key */ - 0, /* Delete Key */ - 0, 0, 0, - 0, /* F11 Key */ - 0, /* F12 Key */ - 0, /* All other keys are undefined */ + 0, + 0, //1 F9 + 0, //2 ? + 0, //3 f5 + 0, //4 f3 + 0, //5 F1 + 0, //6 F2 + 0, //7 F12 + 0, //8 ? + 0, //9 F10 + 0, //A F8 + 0, //B F6 + 0, //C F4 + '\t', + '`', + 0, //F ? + 0, //10 ? + 0, //11 L alt + 0, //L shift + 0, //13 ? + 0, //14 L CTRL + 'q', '1', + 0, 0, 0, //17-19 ? + 'z', 's', 'a', 'w', '2', + 0, 0, //1F-20 ? + 'c', 'x', 'd', 'e', '4', '3', + 0, 0, //27-28 ? + ' ', 'v', 'f', 't', 'r', '5', + 0, 0, //2F-30 ? + 'n', 'b', 'h', 'g', 'y', '6', + 0, 0, 0, //37-39 ? + 'm','j', 'u', '7', '8', + 0, 0, //3F-40 ? + ',', 'k', 'i', 'o', '0', '9', + 0, 0, //47-48 ? + '.', '/', 'l', ';', 'p', '-', + 0, 0, 0, //4f-51 ? + '\'', + 0, //53 ? + '[', '=', + 0, 0, //56-57 ? + 0, //58 caplock + 0, //59 R shift + '\n', //5A enter + ']', + 0, //5C ? + '\\', + 0, 0, 0, 0, 0, 0, 0, 0, //5E-65 ? + '\b', //backspace + 0, 0, //67-68 + 0, //69 End 1 + 0, //6a ? + '4', //6b left 4 + 0, //6c home 7 + 0, 0, 0, //6d-6f ? + '0', //70 ins 0 + 0, //71 del . + '2', //72 down 2 + '5', //73 5 + '6', //74 right 6 + '8', //75 up 8 + 27, //76 esc + 0, //77 numlock + 0, //78 f11 + '+', //79 + + '3', //7A pagedown 3 + '-', //7B + '*', //7C + '9', //7D pageup 9 + '0', //7E scroll lock + 0, 0, 0, 0, //7F-82 ? + 0, //83 F7 }; -const char kbdus_caps[128] = + +const char kbdus_caps[0x84] = { - 0, 27, '!', '@', '#', '$', '%', '^', '&', '*', /* 9 */ - '(', ')', '_', '+', '\b', /* Backspace */ - '\t', /* Tab */ - 'Q', 'W', 'E', 'R', /* 19 */ - 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', /* Enter key */ - 0, /* 29 - Control */ - 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', /* 39 */ - '"', '~', 0, /* Left shift */ - '|', 'Z', 'X', 'C', 'V', 'B', 'N', /* 49 */ - 'M', '<', '>', '?', 0, /* Right shift */ - '*', - 0, /* Alt */ - ' ', /* Space bar */ - 0, /* Caps lock */ - 0, /* 59 - F1 key ... > */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, /* < ... F10 */ - 0, /* 69 - Num lock*/ - 0, /* Scroll Lock */ - 0, /* Home key */ - 0, /* Up Arrow */ - 0, /* Page Up */ - '-', - 0, /* Left Arrow */ - 0, - 0, /* Right Arrow */ - '+', - 0, /* 79 - End key*/ - 0, /* Down Arrow */ - 0, /* Page Down */ - 0, /* Insert Key */ - 0, /* Delete Key */ - 0, 0, 0, - 0, /* F11 Key */ - 0, /* F12 Key */ - 0, /* All other keys are undefined */ + 0, + 0, //1 F9 + 0, //2 ? + 0, //3 f5 + 0, //4 f3 + 0, //5 F1 + 0, //6 F2 + 0, //7 F12 + 0, //8 ? + 0, //9 F10 + 0, //A F8 + 0, //B F6 + 0, //C F4 + '\t', + '~', + 0, //F ? + 0, //10 ? + 0, //11 L alt + 0, //L shift + 0, //13 ? + 0, //14 L CTRL + 'Q', '!', + 0, 0, 0, //17-19 ? + 'Z', 'S', 'A', 'W', '@', + 0, 0, //1F-20 ? + 'C', 'X', 'D', 'E', '#', '$', + 0, 0, //27-28 ? + ' ', 'V', 'F', 'T', 'R', '%', + 0, 0, //2F-30 ? + 'N', 'B', 'H', 'G', 'Y', '^', + 0, 0, 0, //37-39 ? + 'M','J', 'U', '&', '*', + 0, 0, //3F-40 ? + '<', 'K', 'I', 'O', ')', '(', + 0, 0, //47-48 ? + '>', '?', 'L', ':', 'P', '_', + 0, 0, 0, //4f-51 ? + '\"', + 0, //53 ? + '{', '+', + 0, 0, //56-57 ? + 0, //58 caplock + 0, //59 R shift + '\n', //5A enter + '}', + 0, //5C ? + '|', + 0, 0, 0, 0, 0, 0, 0, 0, //5E-65 ? + '\b', //backspace + 0, 0, //67-68 + 0, //69 End 1 + 0, //6a ? + '4', //6b left 4 + 0, //6c home 7 + 0, 0, 0, //6d-6f ? + '0', //70 ins 0 + 0, //71 del . + '2', //72 down 2 + '5', //73 5 + '6', //74 right 6 + '8', //75 up 8 + 27, //76 esc + 0, //77 numlock + 0, //78 f11 + '+', //79 + + '3', //7A pagedown 3 + '-', //7B + '*', //7C + '9', //7D pageup 9 + '0', //7E scroll lock + 0, 0, 0, 0, //7F-82 ? + 0, //83 F7 }; typedef struct { - unsigned char caps; - unsigned char shift; - unsigned char scroll; - unsigned char num; - unsigned char ctrl; - unsigned char alt; + unsigned char caps; + unsigned char shift; + unsigned char scroll; + unsigned char num; + unsigned char ctrl; + unsigned char alt; } shift_locks; /*for simplicity and speed*/ @@ -130,8 +204,8 @@ typedef struct { - uint16_t scancode; - uint8_t asci; + uint16_t scancode; + uint8_t asci; }kbd_key; @@ -149,12 +223,12 @@ void keyboard_init() { keys=(kbd_key*)malloc(256*sizeof(kbd_key)); - kbd_shifts.shift=0; - kbd_shifts.caps=0; - kbd_shifts.num=0; - kbd_shifts.scroll=0; - kbd_shifts.ctrl=0; - kbd_shifts.alt=0; + kbd_shifts.shift=0; + kbd_shifts.caps=0; + kbd_shifts.num=0; + kbd_shifts.scroll=0; + kbd_shifts.ctrl=0; + kbd_shifts.alt=0; ps2_kb_init=new PS2KB_INIT(KEYBOARD_CLOCKPIN, KEYBOARD_DATAPIN); ps2_kb=new PS2KB(KEYBOARD_CLOCKPIN, KEYBOARD_DATAPIN, (KeyboardCallback) &keyboard_callback); } @@ -175,137 +249,140 @@ of these keys to where not all of them are stored, and they are only stored when needed**/ int kbd_PutBuffer(uint16_t scan,uint8_t asci){ - keys[current_key].scancode=scan; - keys[current_key].asci=asci; - current_key++; - pending_key++;; - return 0; + keys[current_key].scancode=scan; + keys[current_key].asci=asci; + current_key++; + pending_key++;; + return 0; } kbd_key kbd_PopBuffer(){ - kbd_key k; - while(pending_key==0){ - //hlt(); - //fill in busy code here - } - - k.scancode=keys[key_got].scancode; - k.asci=keys[key_got].asci; - pending_key--; - key_got++; - return k; + kbd_key k; + while(pending_key==0){ + //hlt(); + //fill in busy code here + } + + k.scancode=keys[key_got].scancode; + k.asci=keys[key_got].asci; + pending_key--; + key_got++; + return k; } uint8_t kbd_GetKey(){ //this will just return the asci code - kbd_key k; - k.asci=0; - while(k.asci==0){ - k=kbd_PopBuffer(); - } - return k.asci; + kbd_key k; + k.asci=0; + while(k.asci==0){ + k=kbd_PopBuffer(); + } + return k.asci; } void kbd_update_leds(uint8_t status){ - uint8_t tmp; - //TODO - /*while((inportb(0x64)&2)!=0){} - outportb(0x60,0xED); - - while((inportb(0x64)&2)!=0){} - outportb(0x60,status); - */ + uint8_t tmp; + //TODO + /*while((inportb(0x64)&2)!=0){} + outportb(0x60,0xED); + + while((inportb(0x64)&2)!=0){} + outportb(0x60,status); + */ } int kbd_DoShifts(uint8_t scan){ - switch(scan){ - case RSHIFT_KEY: - kbd_shifts.shift++; - break; - case LSHIFT_KEY: - kbd_shifts.shift++; - break; - case CTRL_KEY: - kbd_shifts.ctrl++; - break; - case ALT_KEY: - kbd_shifts.alt++; - break; - case CAPS_KEY: - led_status^=CAPS_LED; - kbd_update_leds(led_status); - kbd_shifts.caps^=1; - break; - case NUM_KEY: - led_status^=NUM_LED; - kbd_update_leds(led_status); - kbd_shifts.num^=1; - break; - case SCROLL_KEY: - led_status^=SCROLL_LED; - kbd_update_leds(led_status); - kbd_shifts.scroll^=1; - break; - default: - return 0; - break; - } - return 1; + switch(scan){ + case RSHIFT_KEY: + kbd_shifts.shift++; + break; + case LSHIFT_KEY: + kbd_shifts.shift++; + break; + case CTRL_KEY: + kbd_shifts.ctrl++; + break; + case ALT_KEY: + kbd_shifts.alt++; + break; + case CAPS_KEY: + led_status^=CAPS_LED; + kbd_update_leds(led_status); + kbd_shifts.caps^=1; + break; + case NUM_KEY: + led_status^=NUM_LED; + kbd_update_leds(led_status); + kbd_shifts.num^=1; + break; + case SCROLL_KEY: + led_status^=SCROLL_LED; + kbd_update_leds(led_status); + kbd_shifts.scroll^=1; + break; + default: + return 0; + break; + } + return 1; } int kbd_DoUnshifts(uint8_t scan){ - switch(scan){ - case RSHIFT_KEY: - kbd_shifts.shift--; - break; - case LSHIFT_KEY: - kbd_shifts.shift--; - break; - case CTRL_KEY: - kbd_shifts.ctrl--; - break; - case ALT_KEY: - kbd_shifts.alt--; - break; - case CAPS_KEY: - //kbd_shifts.caps=0; - break; - case NUM_KEY: - //kbd_shifts.num=0; - break; - case SCROLL_KEY: - //kbd_shifts.scroll=0; - break; - default: - return 0; - break; - } - return 1; + switch(scan){ + case RSHIFT_KEY: + kbd_shifts.shift--; + break; + case LSHIFT_KEY: + kbd_shifts.shift--; + break; + case CTRL_KEY: + kbd_shifts.ctrl--; + break; + case ALT_KEY: + kbd_shifts.alt--; + break; + case CAPS_KEY: + //kbd_shifts.caps=0; + break; + case NUM_KEY: + //kbd_shifts.num=0; + break; + case SCROLL_KEY: + //kbd_shifts.scroll=0; + break; + default: + return 0; + break; + } + return 1; } volatile bool expecting_break=false; void keyboard_callback(PS2KB kb, uint8_t val) //this is called from interrupt! Must be fast { - //stopints(); + //stopints(); if(expecting_break){ - val^=0x80; + //val^=0xF0; kbd_DoUnshifts(val); expecting_break=false; }else{ - if(val>=0x80){ - expecting_break=true; - }else{ - if(kbd_DoShifts(val)==0){ //if not a shift-type key - - if ((kbd_shifts.caps^kbd_shifts.shift)==1) { - kbd_PutBuffer(val,kbdus_caps[val]); - }else{ - kbd_PutBuffer(val,kbdus[val]); - } - } - } - } + if(val>=0xF0){ + expecting_break=true; + }else{ + //add check for 0x84 to make sure we don't go over our keymap + if(val<=0x84 && kbd_DoShifts(val)==0){ //if not a shift-type key + + if ((kbd_shifts.caps^kbd_shifts.shift)==1) { + kbd_PutBuffer(val,kbdus_caps[val]); + }else{ + kbd_PutBuffer(val,kbdus[val]); + } + } + } + } } + +