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:
shintamainjp
Date:
Wed Sep 29 14:11:44 2010 +0000
Revision:
1:823c2798e398
Child:
4:fc7f4cc9fbe8

        

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