A version of the PS/2 library customized for MbedConsole. Also includes a few things that make it's behavior easier to control and a few bug fixes.

Dependents:   MbedConsole

Fork of PS2 by Shinichiro Nakamura

Committer:
earlz
Date:
Fri Sep 28 04:03:35 2012 +0000
Revision:
5:ead90ca02b18
Parent:
4:fc7f4cc9fbe8
Changed interrupt priority and initialization to use keyboard defaults

Who changed what in which revision?

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