PS/2

Dependents:   Synth Lab3Translator PS2_Keyboard CLI ... more

Committer:
shintamainjp
Date:
Wed Sep 29 14:11:44 2010 +0000
Revision:
1:823c2798e398

        

Who changed what in which revision?

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