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.
Fork of PS2 by
PS2Keyboard.cpp@4:fc7f4cc9fbe8, 2012-09-26 (annotated)
- Committer:
- earlz
- Date:
- Wed Sep 26 05:21:38 2012 +0000
- Revision:
- 4:fc7f4cc9fbe8
- Parent:
- 3:e8048e31eaff
- Child:
- 5:ead90ca02b18
Made it easier to work with for how my code works (AlloyOS port)
Who changed what in which revision?
User | Revision | Line number | New 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 | 3:e8048e31eaff | 20 | NVIC_SetPriority( EINT3_IRQn, 255 ); |
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 | } |