Yao Lu / PS2

Dependents:   uVGAII_WebBrowser

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PS2Keyboard.cpp Source File

PS2Keyboard.cpp

00001 /**
00002  * PS/2 keyboard interface control class (Version 0.0.1)
00003  *
00004  * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
00005  * http://shinta.main.jp/
00006  */
00007 #include "PS2Keyboard.h"
00008 
00009 PS2Keyboard::PS2Keyboard(PinName clk_pin, PinName dat_pin)
00010         : ps2kb_init(clk_pin, dat_pin), ps2kb(clk_pin, dat_pin) {
00011 }
00012 
00013 PS2Keyboard::~PS2Keyboard() {
00014 }
00015 
00016 bool PS2Keyboard::processing(keyboard_event_t *p) {
00017     bool emit = false;
00018     const int c = ps2kb.getc();
00019     if (0 <= c) {
00020         scancode[count++] = c;
00021         switch (count) {
00022             case 1:
00023                 if ((scancode[0] != 0xE0)
00024                         && (scancode[0] != 0xE1)
00025                         && (scancode[0] != 0xF0)) {
00026                     p->type = KeyMake;
00027                     p->length = count;
00028                     memcpy(p->scancode, scancode, sizeof(p->scancode));
00029                     emit = true;
00030                     count = 0;
00031                 }
00032                 break;
00033             case 2:
00034                 if (scancode[0] == 0xF0) {
00035                     p->type = KeyBreak;
00036                     p->length = count;
00037                     memcpy(p->scancode, scancode, sizeof(p->scancode));
00038                     emit = true;
00039                     count = 0;
00040                 }
00041                 if ((scancode[0] == 0xE0)
00042                         && (scancode[1] != 0xF0)
00043                         && (scancode[1] != 0x12)) {
00044                     p->type = KeyMake;
00045                     p->length = count;
00046                     memcpy(p->scancode, scancode, sizeof(p->scancode));
00047                     emit = true;
00048                     count = 0;
00049                 }
00050                 break;
00051             case 3:
00052                 if ((scancode[0] == 0xE0)
00053                         && (scancode[1] == 0xF0)
00054                         && (scancode[2] != 0x7C)) {
00055                     p->type = KeyBreak;
00056                     p->length = count;
00057                     memcpy(p->scancode, scancode, sizeof(p->scancode));
00058                     emit = true;
00059                     count = 0;
00060                 }
00061                 break;
00062             case 4:
00063                 if ((scancode[0] == 0xE0)
00064                         && (scancode[1] == 0x12)
00065                         && (scancode[2] == 0xE0)
00066                         && (scancode[3] == 0x7C)) {
00067                     p->type = KeyMake;
00068                     p->length = count;
00069                     memcpy(p->scancode, scancode, sizeof(p->scancode));
00070                     emit = true;
00071                     count = 0;
00072                 }
00073                 break;
00074             case 5:
00075                 // Do nothing.
00076                 break;
00077             case 6:
00078                 if ((scancode[0] == 0xE0)
00079                         && (scancode[1] == 0xF0)
00080                         && (scancode[2] == 0x7C)
00081                         && (scancode[3] == 0xE0)
00082                         && (scancode[4] == 0xF0)
00083                         && (scancode[5] == 0x12)) {
00084                     p->type = KeyBreak;
00085                     p->length = count;
00086                     memcpy(p->scancode, scancode, sizeof(p->scancode));
00087                     emit = true;
00088                     count = 0;
00089                 }
00090                 break;
00091             case 7:
00092                 // Do nothing.
00093                 break;
00094             case 8:
00095                 if ((scancode[0] == 0xE1)
00096                         && (scancode[1] == 0x14)
00097                         && (scancode[2] == 0x77)
00098                         && (scancode[3] == 0xE1)
00099                         && (scancode[4] == 0xF0)
00100                         && (scancode[5] == 0x14)
00101                         && (scancode[6] == 0xF0)
00102                         && (scancode[7] == 0x77)) {
00103                     p->type = KeyMake;
00104                     p->length = count;
00105                     memcpy(p->scancode, scancode, sizeof(p->scancode));
00106                     emit = true;
00107                     count = 0;
00108                 }
00109                 break;
00110             default:
00111                 count = 0;
00112                 break;
00113         }
00114         count = count % sizeof(scancode);
00115     }
00116     return emit;
00117 }