PS/2 Keyboard

Dependents:   Hangman

Committer:
pprasad7
Date:
Thu Oct 11 20:15:09 2012 +0000
Revision:
0:62b62530a82f
PS/2 Input;

Who changed what in which revision?

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