PS2 keyboard

Dependents:   uVGAII_WebBrowser

Committer:
yaolu23
Date:
Wed Mar 12 16:15:14 2014 +0000
Revision:
0:33c8907eb27a
na

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yaolu23 0:33c8907eb27a 1 /**
yaolu23 0:33c8907eb27a 2 * PS/2 keyboard interface control class (Version 0.0.1)
yaolu23 0:33c8907eb27a 3 *
yaolu23 0:33c8907eb27a 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
yaolu23 0:33c8907eb27a 5 * http://shinta.main.jp/
yaolu23 0:33c8907eb27a 6 */
yaolu23 0:33c8907eb27a 7 #include "PS2Keyboard.h"
yaolu23 0:33c8907eb27a 8
yaolu23 0:33c8907eb27a 9 PS2Keyboard::PS2Keyboard(PinName clk_pin, PinName dat_pin)
yaolu23 0:33c8907eb27a 10 : ps2kb_init(clk_pin, dat_pin), ps2kb(clk_pin, dat_pin) {
yaolu23 0:33c8907eb27a 11 }
yaolu23 0:33c8907eb27a 12
yaolu23 0:33c8907eb27a 13 PS2Keyboard::~PS2Keyboard() {
yaolu23 0:33c8907eb27a 14 }
yaolu23 0:33c8907eb27a 15
yaolu23 0:33c8907eb27a 16 bool PS2Keyboard::processing(keyboard_event_t *p) {
yaolu23 0:33c8907eb27a 17 bool emit = false;
yaolu23 0:33c8907eb27a 18 const int c = ps2kb.getc();
yaolu23 0:33c8907eb27a 19 if (0 <= c) {
yaolu23 0:33c8907eb27a 20 scancode[count++] = c;
yaolu23 0:33c8907eb27a 21 switch (count) {
yaolu23 0:33c8907eb27a 22 case 1:
yaolu23 0:33c8907eb27a 23 if ((scancode[0] != 0xE0)
yaolu23 0:33c8907eb27a 24 && (scancode[0] != 0xE1)
yaolu23 0:33c8907eb27a 25 && (scancode[0] != 0xF0)) {
yaolu23 0:33c8907eb27a 26 p->type = KeyMake;
yaolu23 0:33c8907eb27a 27 p->length = count;
yaolu23 0:33c8907eb27a 28 memcpy(p->scancode, scancode, sizeof(p->scancode));
yaolu23 0:33c8907eb27a 29 emit = true;
yaolu23 0:33c8907eb27a 30 count = 0;
yaolu23 0:33c8907eb27a 31 }
yaolu23 0:33c8907eb27a 32 break;
yaolu23 0:33c8907eb27a 33 case 2:
yaolu23 0:33c8907eb27a 34 if (scancode[0] == 0xF0) {
yaolu23 0:33c8907eb27a 35 p->type = KeyBreak;
yaolu23 0:33c8907eb27a 36 p->length = count;
yaolu23 0:33c8907eb27a 37 memcpy(p->scancode, scancode, sizeof(p->scancode));
yaolu23 0:33c8907eb27a 38 emit = true;
yaolu23 0:33c8907eb27a 39 count = 0;
yaolu23 0:33c8907eb27a 40 }
yaolu23 0:33c8907eb27a 41 if ((scancode[0] == 0xE0)
yaolu23 0:33c8907eb27a 42 && (scancode[1] != 0xF0)
yaolu23 0:33c8907eb27a 43 && (scancode[1] != 0x12)) {
yaolu23 0:33c8907eb27a 44 p->type = KeyMake;
yaolu23 0:33c8907eb27a 45 p->length = count;
yaolu23 0:33c8907eb27a 46 memcpy(p->scancode, scancode, sizeof(p->scancode));
yaolu23 0:33c8907eb27a 47 emit = true;
yaolu23 0:33c8907eb27a 48 count = 0;
yaolu23 0:33c8907eb27a 49 }
yaolu23 0:33c8907eb27a 50 break;
yaolu23 0:33c8907eb27a 51 case 3:
yaolu23 0:33c8907eb27a 52 if ((scancode[0] == 0xE0)
yaolu23 0:33c8907eb27a 53 && (scancode[1] == 0xF0)
yaolu23 0:33c8907eb27a 54 && (scancode[2] != 0x7C)) {
yaolu23 0:33c8907eb27a 55 p->type = KeyBreak;
yaolu23 0:33c8907eb27a 56 p->length = count;
yaolu23 0:33c8907eb27a 57 memcpy(p->scancode, scancode, sizeof(p->scancode));
yaolu23 0:33c8907eb27a 58 emit = true;
yaolu23 0:33c8907eb27a 59 count = 0;
yaolu23 0:33c8907eb27a 60 }
yaolu23 0:33c8907eb27a 61 break;
yaolu23 0:33c8907eb27a 62 case 4:
yaolu23 0:33c8907eb27a 63 if ((scancode[0] == 0xE0)
yaolu23 0:33c8907eb27a 64 && (scancode[1] == 0x12)
yaolu23 0:33c8907eb27a 65 && (scancode[2] == 0xE0)
yaolu23 0:33c8907eb27a 66 && (scancode[3] == 0x7C)) {
yaolu23 0:33c8907eb27a 67 p->type = KeyMake;
yaolu23 0:33c8907eb27a 68 p->length = count;
yaolu23 0:33c8907eb27a 69 memcpy(p->scancode, scancode, sizeof(p->scancode));
yaolu23 0:33c8907eb27a 70 emit = true;
yaolu23 0:33c8907eb27a 71 count = 0;
yaolu23 0:33c8907eb27a 72 }
yaolu23 0:33c8907eb27a 73 break;
yaolu23 0:33c8907eb27a 74 case 5:
yaolu23 0:33c8907eb27a 75 // Do nothing.
yaolu23 0:33c8907eb27a 76 break;
yaolu23 0:33c8907eb27a 77 case 6:
yaolu23 0:33c8907eb27a 78 if ((scancode[0] == 0xE0)
yaolu23 0:33c8907eb27a 79 && (scancode[1] == 0xF0)
yaolu23 0:33c8907eb27a 80 && (scancode[2] == 0x7C)
yaolu23 0:33c8907eb27a 81 && (scancode[3] == 0xE0)
yaolu23 0:33c8907eb27a 82 && (scancode[4] == 0xF0)
yaolu23 0:33c8907eb27a 83 && (scancode[5] == 0x12)) {
yaolu23 0:33c8907eb27a 84 p->type = KeyBreak;
yaolu23 0:33c8907eb27a 85 p->length = count;
yaolu23 0:33c8907eb27a 86 memcpy(p->scancode, scancode, sizeof(p->scancode));
yaolu23 0:33c8907eb27a 87 emit = true;
yaolu23 0:33c8907eb27a 88 count = 0;
yaolu23 0:33c8907eb27a 89 }
yaolu23 0:33c8907eb27a 90 break;
yaolu23 0:33c8907eb27a 91 case 7:
yaolu23 0:33c8907eb27a 92 // Do nothing.
yaolu23 0:33c8907eb27a 93 break;
yaolu23 0:33c8907eb27a 94 case 8:
yaolu23 0:33c8907eb27a 95 if ((scancode[0] == 0xE1)
yaolu23 0:33c8907eb27a 96 && (scancode[1] == 0x14)
yaolu23 0:33c8907eb27a 97 && (scancode[2] == 0x77)
yaolu23 0:33c8907eb27a 98 && (scancode[3] == 0xE1)
yaolu23 0:33c8907eb27a 99 && (scancode[4] == 0xF0)
yaolu23 0:33c8907eb27a 100 && (scancode[5] == 0x14)
yaolu23 0:33c8907eb27a 101 && (scancode[6] == 0xF0)
yaolu23 0:33c8907eb27a 102 && (scancode[7] == 0x77)) {
yaolu23 0:33c8907eb27a 103 p->type = KeyMake;
yaolu23 0:33c8907eb27a 104 p->length = count;
yaolu23 0:33c8907eb27a 105 memcpy(p->scancode, scancode, sizeof(p->scancode));
yaolu23 0:33c8907eb27a 106 emit = true;
yaolu23 0:33c8907eb27a 107 count = 0;
yaolu23 0:33c8907eb27a 108 }
yaolu23 0:33c8907eb27a 109 break;
yaolu23 0:33c8907eb27a 110 default:
yaolu23 0:33c8907eb27a 111 count = 0;
yaolu23 0:33c8907eb27a 112 break;
yaolu23 0:33c8907eb27a 113 }
yaolu23 0:33c8907eb27a 114 count = count % sizeof(scancode);
yaolu23 0:33c8907eb27a 115 }
yaolu23 0:33c8907eb27a 116 return emit;
yaolu23 0:33c8907eb27a 117 }