diff options
author | tmk <nobody@nowhere> | 2013-11-28 15:50:17 +0900 |
---|---|---|
committer | tmk <nobody@nowhere> | 2013-11-28 15:50:55 +0900 |
commit | 10b2b1ae431b31b2ae29228dcaccb5ea292bbf9a (patch) | |
tree | 8ce43042c9988a35051667aede10e8afc7dcf204 /converter | |
parent | 8b4fa599cf485f5d06314938a228a88dabb0b7f5 (diff) | |
download | qmk_firmware-10b2b1ae431b31b2ae29228dcaccb5ea292bbf9a.tar.gz qmk_firmware-10b2b1ae431b31b2ae29228dcaccb5ea292bbf9a.zip |
Fix key stack and PS/2 Overrun
Diffstat (limited to 'converter')
-rw-r--r-- | converter/ps2_usb/config.h | 86 | ||||
-rw-r--r-- | converter/ps2_usb/matrix.c | 33 |
2 files changed, 73 insertions, 46 deletions
diff --git a/converter/ps2_usb/config.h b/converter/ps2_usb/config.h index 1ad2bd1b49..c9bab1b072 100644 --- a/converter/ps2_usb/config.h +++ b/converter/ps2_usb/config.h @@ -40,6 +40,52 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. ) +//#define NO_SUSPEND_POWER_DOWN + + +/* + * PS/2 Busywait + */ +#ifdef PS2_USE_BUSYWAIT +#define PS2_CLOCK_PORT PORTD +#define PS2_CLOCK_PIN PIND +#define PS2_CLOCK_DDR DDRD +#define PS2_CLOCK_BIT 5 +#define PS2_DATA_PORT PORTD +#define PS2_DATA_PIN PIND +#define PS2_DATA_DDR DDRD +#define PS2_DATA_BIT 2 +#endif + +/* + * PS/2 Pin interrupt + */ +#ifdef PS2_USE_INT +/* uses INT1 for clock line(ATMega32U4) */ +#define PS2_CLOCK_PORT PORTD +#define PS2_CLOCK_PIN PIND +#define PS2_CLOCK_DDR DDRD +#define PS2_CLOCK_BIT 1 +#define PS2_DATA_PORT PORTD +#define PS2_DATA_PIN PIND +#define PS2_DATA_DDR DDRD +#define PS2_DATA_BIT 2 +#define PS2_INT_INIT() do { \ + EICRA |= ((1<<ISC11) | \ + (0<<ISC10)); \ +} while (0) +#define PS2_INT_ON() do { \ + EIMSK |= (1<<INT1); \ +} while (0) +#define PS2_INT_OFF() do { \ + EIMSK &= ~(1<<INT1); \ +} while (0) +#define PS2_INT_VECT INT1_vect +#endif + +/* + * PS/2 USART + */ #ifdef PS2_USE_USART #if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) /* XCK for clock line and RXD for data line */ @@ -51,7 +97,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define PS2_DATA_PIN PIND #define PS2_DATA_DDR DDRD #define PS2_DATA_BIT 2 - /* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */ /* set DDR of CLOCK as input to be slave */ #define PS2_USART_INIT() do { \ @@ -82,7 +127,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define PS2_USART_RX_DATA UDR1 #define PS2_USART_ERROR (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1))) #define PS2_USART_RX_VECT USART1_RX_vect - #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__) /* XCK for clock line and RXD for data line */ #define PS2_CLOCK_PORT PORTD @@ -93,7 +137,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define PS2_DATA_PIN PIND #define PS2_DATA_DDR DDRD #define PS2_DATA_BIT 0 - /* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */ /* set DDR of CLOCK as input to be slave */ #define PS2_USART_INIT() do { \ @@ -127,41 +170,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #endif #endif - -#ifdef PS2_USE_INT -/* uses INT1 for clock line(ATMega32U4) */ -#define PS2_CLOCK_PORT PORTD -#define PS2_CLOCK_PIN PIND -#define PS2_CLOCK_DDR DDRD -#define PS2_CLOCK_BIT 5 -#define PS2_DATA_PORT PORTD -#define PS2_DATA_PIN PIND -#define PS2_DATA_DDR DDRD -#define PS2_DATA_BIT 2 - -#define PS2_INT_INIT() do { \ - EICRA |= ((1<<ISC11) | \ - (0<<ISC10)); \ -} while (0) -#define PS2_INT_ON() do { \ - EIMSK |= (1<<INT1); \ -} while (0) -#define PS2_INT_OFF() do { \ - EIMSK &= ~(1<<INT1); \ -} while (0) -#define PS2_INT_VECT INT1_vect -#endif - - -#ifdef PS2_USE_BUSYWAIT -#define PS2_CLOCK_PORT PORTD -#define PS2_CLOCK_PIN PIND -#define PS2_CLOCK_DDR DDRD -#define PS2_CLOCK_BIT 5 -#define PS2_DATA_PORT PORTD -#define PS2_DATA_PIN PIND -#define PS2_DATA_DDR DDRD -#define PS2_DATA_BIT 2 -#endif - #endif diff --git a/converter/ps2_usb/matrix.c b/converter/ps2_usb/matrix.c index aa0c38c68d..45344c0f75 100644 --- a/converter/ps2_usb/matrix.c +++ b/converter/ps2_usb/matrix.c @@ -29,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 @@ -84,6 +85,7 @@ uint8_t matrix_cols(void) void matrix_init(void) { + debug_enable = true; ps2_host_init(); // initialize matrix state: all keys off @@ -209,16 +211,18 @@ uint8_t matrix_scan(void) state = INIT; break; case 0x00: // Overrun [3]p.25 - print("Overrun\n"); + matrix_clear(); clear_keyboard(); + print("Overrun\n"); state = INIT; break; default: // normal key make if (code < 0x80) { matrix_make(code); } else { - xprintf("unexpected scan code at INIT: %02X\n", code); + matrix_clear(); clear_keyboard(); + xprintf("unexpected scan code at INIT: %02X\n", code); } state = INIT; } @@ -239,8 +243,9 @@ uint8_t matrix_scan(void) if (code < 0x80) { matrix_make(code|0x80); } else { - xprintf("unexpected scan code at E0: %02X\n", code); + matrix_clear(); clear_keyboard(); + xprintf("unexpected scan code at E0: %02X\n", code); } state = INIT; } @@ -255,12 +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 { - xprintf("unexpected scan code at F0: %02X\n", code); + matrix_clear(); clear_keyboard(); + xprintf("unexpected scan code at F0: %02X\n", code); } state = INIT; } @@ -275,8 +286,9 @@ uint8_t matrix_scan(void) if (code < 0x80) { matrix_break(code|0x80); } else { - xprintf("unexpected scan code at E0_F0: %02X\n", code); + matrix_clear(); clear_keyboard(); + xprintf("unexpected scan code at E0_F0: %02X\n", code); } state = INIT; } @@ -369,10 +381,13 @@ uint8_t matrix_scan(void) } } - if (ps2_error > PS2_ERR_STARTBIT3) { + // 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; } @@ -464,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; +} |