Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
PS2Keyboard.cpp
00001 /** 00002 * PS/2 keyboard interface control class (Version 0.0.1) 00003 * 00004 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems) 00005 * http://shinta.main.jp/ 00006 */ 00007 #include "PS2Keyboard.h" 00008 00009 PS2Keyboard::PS2Keyboard(PinName clk_pin, PinName dat_pin) 00010 : ps2kb_init(clk_pin, dat_pin), ps2kb(clk_pin, dat_pin) { 00011 } 00012 00013 PS2Keyboard::~PS2Keyboard() { 00014 } 00015 00016 bool PS2Keyboard::processing(keyboard_event_t *p) { 00017 bool emit = false; 00018 const int c = ps2kb.getc(); 00019 if (0 <= c) { 00020 scancode[count++] = c; 00021 switch (count) { 00022 case 1: 00023 if ((scancode[0] != 0xE0) 00024 && (scancode[0] != 0xE1) 00025 && (scancode[0] != 0xF0)) { 00026 p->type = KeyMake; 00027 p->length = count; 00028 memcpy(p->scancode, scancode, sizeof(p->scancode)); 00029 emit = true; 00030 count = 0; 00031 } 00032 break; 00033 case 2: 00034 if (scancode[0] == 0xF0) { 00035 p->type = KeyBreak; 00036 p->length = count; 00037 memcpy(p->scancode, scancode, sizeof(p->scancode)); 00038 emit = true; 00039 count = 0; 00040 } 00041 if ((scancode[0] == 0xE0) 00042 && (scancode[1] != 0xF0) 00043 && (scancode[1] != 0x12)) { 00044 p->type = KeyMake; 00045 p->length = count; 00046 memcpy(p->scancode, scancode, sizeof(p->scancode)); 00047 emit = true; 00048 count = 0; 00049 } 00050 break; 00051 case 3: 00052 if ((scancode[0] == 0xE0) 00053 && (scancode[1] == 0xF0) 00054 && (scancode[2] != 0x7C)) { 00055 p->type = KeyBreak; 00056 p->length = count; 00057 memcpy(p->scancode, scancode, sizeof(p->scancode)); 00058 emit = true; 00059 count = 0; 00060 } 00061 break; 00062 case 4: 00063 if ((scancode[0] == 0xE0) 00064 && (scancode[1] == 0x12) 00065 && (scancode[2] == 0xE0) 00066 && (scancode[3] == 0x7C)) { 00067 p->type = KeyMake; 00068 p->length = count; 00069 memcpy(p->scancode, scancode, sizeof(p->scancode)); 00070 emit = true; 00071 count = 0; 00072 } 00073 break; 00074 case 5: 00075 // Do nothing. 00076 break; 00077 case 6: 00078 if ((scancode[0] == 0xE0) 00079 && (scancode[1] == 0xF0) 00080 && (scancode[2] == 0x7C) 00081 && (scancode[3] == 0xE0) 00082 && (scancode[4] == 0xF0) 00083 && (scancode[5] == 0x12)) { 00084 p->type = KeyBreak; 00085 p->length = count; 00086 memcpy(p->scancode, scancode, sizeof(p->scancode)); 00087 emit = true; 00088 count = 0; 00089 } 00090 break; 00091 case 7: 00092 // Do nothing. 00093 break; 00094 case 8: 00095 if ((scancode[0] == 0xE1) 00096 && (scancode[1] == 0x14) 00097 && (scancode[2] == 0x77) 00098 && (scancode[3] == 0xE1) 00099 && (scancode[4] == 0xF0) 00100 && (scancode[5] == 0x14) 00101 && (scancode[6] == 0xF0) 00102 && (scancode[7] == 0x77)) { 00103 p->type = KeyMake; 00104 p->length = count; 00105 memcpy(p->scancode, scancode, sizeof(p->scancode)); 00106 emit = true; 00107 count = 0; 00108 } 00109 break; 00110 default: 00111 count = 0; 00112 break; 00113 } 00114 count = count % sizeof(scancode); 00115 } 00116 return emit; 00117 }
Generated on Wed Jul 20 2022 18:12:36 by
