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
Revision 11:fede136943a9, committed 2012-09-28
- Comitter:
- earlz
- Date:
- Fri Sep 28 04:03:54 2012 +0000
- Parent:
- 10:bda85442b674
- Child:
- 12:3ee3062cc11c
- Commit message:
- Finally have keyboard support, AND it plays nice with VGA
Changed in this revision
--- a/PS2.lib Wed Sep 26 05:22:44 2012 +0000 +++ b/PS2.lib Fri Sep 28 04:03:54 2012 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/shintamainjp/code/PS2/#fc7f4cc9fbe8 +http://mbed.org/users/shintamainjp/code/PS2/#ead90ca02b18
--- 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]); + } + } + } + } } + +
--- a/main.cpp Wed Sep 26 05:22:44 2012 +0000 +++ b/main.cpp Fri Sep 28 04:03:54 2012 +0000 @@ -14,6 +14,53 @@ void keyboard_init(); int main() { + //Set all priorities to 100 so we are able to make VGA a priority + //By default, all priorities are at their highest 0 + NVIC_SetPriority( NonMaskableInt_IRQn, 100 ); + NVIC_SetPriority(MemoryManagement_IRQn, 100); + + NVIC_SetPriority(BusFault_IRQn, 100); + NVIC_SetPriority(UsageFault_IRQn, 100); + NVIC_SetPriority(SVCall_IRQn, 100); + NVIC_SetPriority(DebugMonitor_IRQn, 100); + NVIC_SetPriority(PendSV_IRQn, 100); + NVIC_SetPriority(SysTick_IRQn, 100); + NVIC_SetPriority(WDT_IRQn, 100); + NVIC_SetPriority(TIMER0_IRQn, 100); + NVIC_SetPriority(TIMER1_IRQn, 100); + NVIC_SetPriority(TIMER2_IRQn, 100); + NVIC_SetPriority(TIMER3_IRQn, 100); + NVIC_SetPriority(UART0_IRQn, 100); + NVIC_SetPriority(UART1_IRQn, 100); + NVIC_SetPriority(UART2_IRQn, 100); + NVIC_SetPriority(UART3_IRQn, 100); + + NVIC_SetPriority(PWM1_IRQn, 100); + NVIC_SetPriority(I2C0_IRQn, 100); + NVIC_SetPriority(I2C1_IRQn, 100); + NVIC_SetPriority(I2C2_IRQn, 100); + NVIC_SetPriority(SPI_IRQn, 100); + NVIC_SetPriority(SSP0_IRQn, 100); + NVIC_SetPriority(SSP1_IRQn, 100); + NVIC_SetPriority(PLL0_IRQn, 100); + NVIC_SetPriority(RTC_IRQn, 100); + NVIC_SetPriority(EINT0_IRQn, 100); + NVIC_SetPriority(EINT1_IRQn, 100); + + NVIC_SetPriority(EINT2_IRQn, 100); + NVIC_SetPriority(EINT3_IRQn, 100); + NVIC_SetPriority(ADC_IRQn, 100); + NVIC_SetPriority(BOD_IRQn, 100); + NVIC_SetPriority(USB_IRQn, 100); + NVIC_SetPriority(CAN_IRQn, 100); + NVIC_SetPriority(DMA_IRQn, 100); + + NVIC_SetPriority(I2S_IRQn, 100); + NVIC_SetPriority(ENET_IRQn, 100); + NVIC_SetPriority(RIT_IRQn, 100); + NVIC_SetPriority(MCPWM_IRQn, 100); + NVIC_SetPriority(QEI_IRQn, 100); + NVIC_SetPriority(PLL1_IRQn, 100); init_vga(); vga_cls(); serial.baud(115200); @@ -23,7 +70,7 @@ fl_i2s_set_tx_rate(1,4); // set 25 MHz pixel clock - NVIC_SetPriority( EINT3_IRQn, 255 ); + NVIC_SetPriority( EINT3_IRQn, 90 ); serial.printf("Done\r\n");
--- a/mbedconsole.h Wed Sep 26 05:22:44 2012 +0000 +++ b/mbedconsole.h Fri Sep 28 04:03:54 2012 +0000 @@ -36,7 +36,7 @@ } virtual int _getc() { - return 0; //not yet implemented + return vgetc(); } };
--- a/textio.cpp Wed Sep 26 05:22:44 2012 +0000 +++ b/textio.cpp Fri Sep 28 04:03:54 2012 +0000 @@ -71,38 +71,35 @@ char vgetc() { - while(!serial.readable()){ - return serial.getc(); - } - return '!'; //unreachable + char tmp=kbd_GetKey(); + vputc(tmp); + return tmp; } int vgetsl(char *buf, int len) { int pos=0; while(1){ - if(serial.readable()){ - buf[pos]=serial.getc(); - if(buf[pos]=='\r'){ - buf[pos]='\n'; + buf[pos]=kbd_GetKey(); + if(buf[pos]=='\r'){ + buf[pos]='\n'; + } + + vputc(buf[pos]); + if(buf[pos]=='\b'){ + buf[pos]=0; + if(pos>0){ + pos--; + buf[pos--]=0; } - - vputc(buf[pos]); - if(buf[pos]=='\b'){ - buf[pos]=0; - if(pos>0){ - pos--; - buf[pos--]=0; - } - } - if(pos>len-1){ - break; - } - if(buf[pos]=='\n'){ - buf[pos]=0; - return 1; - } - pos++; + } + if(pos>len-1){ + break; } + if(buf[pos]=='\n'){ + buf[pos]=0; + return 1; + } + pos++; } return 0; }
--- a/vga640x480g.lib Wed Sep 26 05:22:44 2012 +0000 +++ b/vga640x480g.lib Fri Sep 28 04:03:54 2012 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/gertk/code/vga640x480g/#89bf087ed9cd +http://mbed.org/users/gertk/code/vga640x480g/#c9543fb59830