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
PS2KB.cpp@5:ead90ca02b18, 2012-09-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |