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
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
shintamainjp 1:823c2798e398 8 #include "PS2KB.h"
earlz 5:ead90ca02b18 9 //#include "nvic.h"
shintamainjp 1:823c2798e398 10 /**
shintamainjp 1:823c2798e398 11 * Create.
shintamainjp 1:823c2798e398 12 *
shintamainjp 1:823c2798e398 13 * @param clk_pin Clock pin.
shintamainjp 1:823c2798e398 14 * @param dat_pin Data pin.
shintamainjp 1:823c2798e398 15 */
earlz 4:fc7f4cc9fbe8 16 PS2KB::PS2KB(PinName clk_pin, PinName dat_pin, KeyboardCallback cb)
shintamainjp 1:823c2798e398 17 : clk(clk_pin), dat(dat_pin) {
shintamainjp 1:823c2798e398 18 init_work();
earlz 4:fc7f4cc9fbe8 19 callback=cb;
shintamainjp 1:823c2798e398 20 clk.fall(this, &PS2KB::func_fall);
earlz 4:fc7f4cc9fbe8 21
shintamainjp 1:823c2798e398 22 }
shintamainjp 1:823c2798e398 23
shintamainjp 1:823c2798e398 24 /**
shintamainjp 1:823c2798e398 25 * Destory.
shintamainjp 1:823c2798e398 26 */
shintamainjp 1:823c2798e398 27 PS2KB::~PS2KB() {
earlz 4:fc7f4cc9fbe8 28 //wdt.detach();
shintamainjp 1:823c2798e398 29 }
shintamainjp 1:823c2798e398 30
shintamainjp 1:823c2798e398 31 /**
shintamainjp 1:823c2798e398 32 * Get a data from a PS/2 device.
shintamainjp 1:823c2798e398 33 *
shintamainjp 1:823c2798e398 34 * @return A data from a PS/2 device.
earlz 4:fc7f4cc9fbe8 35 *
shintamainjp 1:823c2798e398 36 int PS2KB::getc() {
shintamainjp 1:823c2798e398 37 tot.reset();
shintamainjp 1:823c2798e398 38 tot.start();
shintamainjp 1:823c2798e398 39 while (work.cStart == work.cEnd) {
shintamainjp 1:823c2798e398 40 wait_ms(1);
shintamainjp 1:823c2798e398 41 if ((timeout > 0) && (tot.read_ms() > timeout)) {
shintamainjp 1:823c2798e398 42 // printf("Timeout occured.\n");
shintamainjp 1:823c2798e398 43 return EOF;
shintamainjp 1:823c2798e398 44 }
shintamainjp 1:823c2798e398 45 }
shintamainjp 1:823c2798e398 46 tot.stop();
shintamainjp 1:823c2798e398 47
shintamainjp 1:823c2798e398 48 char c = work.buffer[work.cStart++];
shintamainjp 1:823c2798e398 49 work.cStart = work.cStart % RINGBUFSIZ;
shintamainjp 1:823c2798e398 50
shintamainjp 1:823c2798e398 51 return c;
earlz 4:fc7f4cc9fbe8 52
earlz 4:fc7f4cc9fbe8 53 }*/
shintamainjp 1:823c2798e398 54
shintamainjp 1:823c2798e398 55 /**
shintamainjp 1:823c2798e398 56 * Set timeout.
shintamainjp 1:823c2798e398 57 *
shintamainjp 1:823c2798e398 58 * @param ms Timeout ms.
shintamainjp 1:823c2798e398 59 */
earlz 4:fc7f4cc9fbe8 60 /*
shintamainjp 1:823c2798e398 61 void PS2KB::setTimeout(int ms) {
shintamainjp 1:823c2798e398 62 timeout = ms;
shintamainjp 1:823c2798e398 63 }
shintamainjp 1:823c2798e398 64
shintamainjp 1:823c2798e398 65 void PS2KB::func_timeout(void) {
shintamainjp 1:823c2798e398 66 work.bitcnt = 0;
shintamainjp 1:823c2798e398 67 }
earlz 4:fc7f4cc9fbe8 68 */
shintamainjp 1:823c2798e398 69 void PS2KB::func_fall(void) {
earlz 5:ead90ca02b18 70 //NVIC_SetPriority( EINT3_IRQn, 255 );
shintamainjp 1:823c2798e398 71 int oddpar = 0;
shintamainjp 1:823c2798e398 72 /*
shintamainjp 1:823c2798e398 73 */
earlz 4:fc7f4cc9fbe8 74 switch (bitcnt) {
shintamainjp 1:823c2798e398 75 case 0:
shintamainjp 1:823c2798e398 76 /*
shintamainjp 1:823c2798e398 77 * Start bit.
shintamainjp 1:823c2798e398 78 */
shintamainjp 1:823c2798e398 79 if (dat.read() != 0) {
shintamainjp 1:823c2798e398 80 // printf("Illegal start bit condition.\n");
shintamainjp 1:823c2798e398 81 }
earlz 4:fc7f4cc9fbe8 82 bitcnt++;
shintamainjp 1:823c2798e398 83 break;
shintamainjp 1:823c2798e398 84 case 9:
shintamainjp 1:823c2798e398 85 /*
shintamainjp 1:823c2798e398 86 * Parity bit.
shintamainjp 1:823c2798e398 87 */
shintamainjp 1:823c2798e398 88 for (int i = 0; i < 8; i++) {
earlz 4:fc7f4cc9fbe8 89 if ((buffer & (1 << i)) != 0) {
shintamainjp 1:823c2798e398 90 oddpar++;
shintamainjp 1:823c2798e398 91 }
shintamainjp 1:823c2798e398 92 }
shintamainjp 1:823c2798e398 93 if (dat.read() == 1) {
shintamainjp 1:823c2798e398 94 oddpar++;
shintamainjp 1:823c2798e398 95 }
shintamainjp 1:823c2798e398 96 if ((oddpar % 2) != 1) {
shintamainjp 1:823c2798e398 97 // printf("Data parity error.\n");
shintamainjp 1:823c2798e398 98 }
earlz 4:fc7f4cc9fbe8 99 bitcnt++;
shintamainjp 1:823c2798e398 100 break;
shintamainjp 1:823c2798e398 101 case 10:
shintamainjp 1:823c2798e398 102 /*
shintamainjp 1:823c2798e398 103 * Stop bit.
shintamainjp 1:823c2798e398 104 */
earlz 4:fc7f4cc9fbe8 105 //if (dat.read() != 1) {
shintamainjp 1:823c2798e398 106 // printf("Illegal stop bit condition.\n");
earlz 4:fc7f4cc9fbe8 107 //}
earlz 4:fc7f4cc9fbe8 108 //if (work.cStart != ((work.cEnd + 1) % RINGBUFSIZ)) {
earlz 4:fc7f4cc9fbe8 109 //work.cEnd++;
earlz 4:fc7f4cc9fbe8 110 //work.cEnd = work.cEnd % RINGBUFSIZ;
earlz 4:fc7f4cc9fbe8 111 bitcnt = 0;
earlz 4:fc7f4cc9fbe8 112 if(callback!=NULL){
earlz 4:fc7f4cc9fbe8 113 callback(this, buffer);
earlz 4:fc7f4cc9fbe8 114 }
earlz 4:fc7f4cc9fbe8 115 //} else {
shintamainjp 1:823c2798e398 116 // printf("Buffer overrun.\n");
earlz 4:fc7f4cc9fbe8 117 //}
shintamainjp 1:823c2798e398 118 break;
shintamainjp 1:823c2798e398 119 default:
earlz 4:fc7f4cc9fbe8 120 if ((1 <= bitcnt) && (bitcnt <= 8)) {
shintamainjp 1:823c2798e398 121 /*
shintamainjp 1:823c2798e398 122 * data bit.
shintamainjp 1:823c2798e398 123 */
shintamainjp 1:823c2798e398 124 if (dat.read() == 1) {
earlz 4:fc7f4cc9fbe8 125 buffer |= (1 << (bitcnt - 1));
shintamainjp 1:823c2798e398 126 } else {
earlz 4:fc7f4cc9fbe8 127 buffer &= ~(1 << (bitcnt - 1));
shintamainjp 1:823c2798e398 128 }
earlz 4:fc7f4cc9fbe8 129 bitcnt++;
shintamainjp 1:823c2798e398 130 } else {
shintamainjp 1:823c2798e398 131 /*
shintamainjp 1:823c2798e398 132 * Illegal internal state.
shintamainjp 1:823c2798e398 133 */
shintamainjp 1:823c2798e398 134 // printf("Illegal internal state found.\n");
shintamainjp 1:823c2798e398 135 init_work();
shintamainjp 1:823c2798e398 136 }
shintamainjp 1:823c2798e398 137 break;
shintamainjp 1:823c2798e398 138 }
earlz 4:fc7f4cc9fbe8 139 //wdt.detach();
earlz 4:fc7f4cc9fbe8 140 //wdt.attach_us(this, &PS2KB::func_timeout, 250);
shintamainjp 1:823c2798e398 141 }
shintamainjp 1:823c2798e398 142
shintamainjp 1:823c2798e398 143 void PS2KB::init_work(void) {
earlz 4:fc7f4cc9fbe8 144 bitcnt = 0;
earlz 4:fc7f4cc9fbe8 145 //work.cStart = 0;
earlz 4:fc7f4cc9fbe8 146 //work.cEnd = 0;
shintamainjp 1:823c2798e398 147 }