PS/2

Dependents:   Synth Lab3Translator PS2_Keyboard CLI ... more

Committer:
shintamainjp
Date:
Wed Sep 29 22:15:03 2010 +0000
Revision:
2:a57bbbec16b1
Parent:
1:823c2798e398

        

Who changed what in which revision?

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