diff options
| author | tmk <nobody@nowhere> | 2013-11-28 16:02:29 +0900 | 
|---|---|---|
| committer | tmk <nobody@nowhere> | 2013-11-28 16:02:29 +0900 | 
| commit | bc5b64d83259715667356770965a33aa620a8030 (patch) | |
| tree | 074377caef4d838ac3890f39e9ff67f346aab506 /converter/ps2_usb/matrix.c | |
| parent | 4e36159be226e544dfebbe06b1955261951209a4 (diff) | |
| parent | 0b9c0f6012a90eeb8cced9feccf3a65d8b4e5535 (diff) | |
| download | firmware-bc5b64d83259715667356770965a33aa620a8030.tar.gz firmware-bc5b64d83259715667356770965a33aa620a8030.tar.bz2 firmware-bc5b64d83259715667356770965a33aa620a8030.zip | |
Merge branch 'ps2_keyboard_fix'
Diffstat (limited to 'converter/ps2_usb/matrix.c')
| -rw-r--r-- | converter/ps2_usb/matrix.c | 49 | 
1 files changed, 42 insertions, 7 deletions
| diff --git a/converter/ps2_usb/matrix.c b/converter/ps2_usb/matrix.c index 4187ea060..45344c0f7 100644 --- a/converter/ps2_usb/matrix.c +++ b/converter/ps2_usb/matrix.c @@ -19,6 +19,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include <stdbool.h>  #include <avr/io.h>  #include <util/delay.h> +#include "action.h"  #include "print.h"  #include "util.h"  #include "debug.h" @@ -28,6 +29,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  static void matrix_make(uint8_t code);  static void matrix_break(uint8_t code); +static void matrix_clear(void);  #ifdef MATRIX_HAS_GHOST  static bool matrix_has_ghost_in_row(uint8_t row);  #endif @@ -83,6 +85,7 @@ uint8_t matrix_cols(void)  void matrix_init(void)  { +    debug_enable = true;      ps2_host_init();      // initialize matrix state: all keys off @@ -185,8 +188,8 @@ uint8_t matrix_scan(void)          matrix_break(PAUSE);      } -    uint8_t code; -    while ((code = ps2_host_recv())) { +    uint8_t code = ps2_host_recv(); +    if (!ps2_error) {          switch (state) {              case INIT:                  switch (code) { @@ -207,11 +210,19 @@ uint8_t matrix_scan(void)                          matrix_make(PRINT_SCREEN);                          state = INIT;                          break; +                    case 0x00:  // Overrun [3]p.25 +                        matrix_clear(); +                        clear_keyboard(); +                        print("Overrun\n"); +                        state = INIT; +                        break;                      default:    // normal key make                          if (code < 0x80) {                              matrix_make(code);                          } else { -                            debug("unexpected scan code at INIT: "); debug_hex(code); debug("\n"); +                            matrix_clear(); +                            clear_keyboard(); +                            xprintf("unexpected scan code at INIT: %02X\n", code);                          }                          state = INIT;                  } @@ -232,7 +243,9 @@ uint8_t matrix_scan(void)                          if (code < 0x80) {                              matrix_make(code|0x80);                          } else { -                            debug("unexpected scan code at E0: "); debug_hex(code); debug("\n"); +                            matrix_clear(); +                            clear_keyboard(); +                            xprintf("unexpected scan code at E0: %02X\n", code);                          }                          state = INIT;                  } @@ -247,11 +260,18 @@ uint8_t matrix_scan(void)                          matrix_break(PRINT_SCREEN);                          state = INIT;                          break; +                    case 0xF0: +                        matrix_clear(); +                        clear_keyboard(); +                        xprintf("unexpected scan code at F0: F0(clear and cont.)\n"); +                        break;                      default:                      if (code < 0x80) {                          matrix_break(code);                      } else { -                        debug("unexpected scan code at F0: "); debug_hex(code); debug("\n"); +                        matrix_clear(); +                        clear_keyboard(); +                        xprintf("unexpected scan code at F0: %02X\n", code);                      }                      state = INIT;                  } @@ -266,7 +286,9 @@ uint8_t matrix_scan(void)                          if (code < 0x80) {                              matrix_break(code|0x80);                          } else { -                            debug("unexpected scan code at E0_F0: "); debug_hex(code); debug("\n"); +                            matrix_clear(); +                            clear_keyboard(); +                            xprintf("unexpected scan code at E0_F0: %02X\n", code);                          }                          state = INIT;                  } @@ -357,8 +379,15 @@ uint8_t matrix_scan(void)              default:                  state = INIT;          } -        phex(code);      } + +    // TODO: request RESEND when error occurs? +/* +    if (PS2_IS_FAILED(ps2_error)) { +        uint8_t ret = ps2_host_send(PS2_RESEND); +        xprintf("Resend: %02X\n", ret); +    } +*/      return 1;  } @@ -450,3 +479,9 @@ static void matrix_break(uint8_t code)          is_modified = true;      }  } + +inline +static void matrix_clear(void) +{ +    for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; +} | 
