}
uint8_t code = xt_host_recv();
- if (code) xprintf("%X\r\n", code);
switch (state) {
case INIT:
switch (code) {
case 0xE1:
state = E1;
break;
- case 0x00:
- break;
default: // normal key make
- if (code < 0x80) {
+ if (code < 0x80 && code != 0x00) {
xprintf("make: %X\r\n", code);
matrix_make(code);
- } else if (code > 0x80 && code < 0xFF) {
+ } else if (code > 0x80 && code < 0xFF && code != 0x00) {
xprintf("break %X\r\n", code);
matrix_break(code - 0x80);
- } else {
- matrix_clear();
- clear_keyboard();
- xprintf("unexpected scan code at INIT: %02X\n", code);
}
state = INIT;
}
case 0xB7:
state = E0_B7;
break;
- case 0x00:
- state = INIT;
- break;
default:
- if (code < 0x80) {
+ if (code < 0x80 && code != 0x00) {
matrix_make(move_codes(code));
- } else if (code > 0x80 && code < 0xFF) {
+ } else if (code > 0x80 && code < 0xFF && code != 0x00) {
matrix_break(move_codes(code - 0x80));
- } else {
- matrix_clear();
- clear_keyboard();
- xprintf("unexpected scan code at E0: %02X\n", code);
}
state = INIT;
}
break;
case E0_2A:
- switch (code) {
- case 0xE0:
- state = E0_2A_E0;
- break;
- default:
- state = INIT;
- }
+ if(code == 0xE0)
+ state = E0_2A_E0;
+ else
+ state = INIT;
break;
case E0_2A_E0:
- switch (code) {
- case 0x37:
- matrix_make(PRINT_SCREEN);
- break;
- default:
- state = INIT;
- }
+ if(code == 0x37)
+ matrix_make(PRINT_SCREEN);
+ else
+ state = INIT;
break;
case E0_B7:
- switch (code) {
- case 0xE0:
- state = E0_B7;
- break;
- default:
- state = INIT;
- }
+ if(code == 0xE0)
+ state = E0_B7;
+ else
+ state = INIT;
break;
case E0_B7_E0:
- switch (code) {
- case 0xAA:
- matrix_break(PRINT_SCREEN);
- break;
- default:
- state = INIT;
- }
+ if(code == 0xAA)
+ matrix_break(PRINT_SCREEN);
+ else
+ state = INIT;
break;
case E1:
- switch (code) {
- case 0x1D:
- state = E1_1D;
- break;
- default:
- state = INIT;
- }
+ if (code == 0x1D)
+ state = E1_1D;
+ else
+ state = INIT;
break;
case E1_1D:
- switch (code) {
- case 0x45:
- state = E1_1D_45;
- break;
- default:
- state = INIT;
- }
+ if(code == 0x45)
+ state = E1_1D_45;
+ else
+ state = INIT;
break;
case E1_1D_45:
- switch (code) {
- case 0xE1:
- state = E1_1D_45_E1;
- break;
- default:
- state = INIT;
- }
+ if(code == 0xE1)
+ state = E1_1D_45_E1;
+ else
+ state = INIT;
break;
case E1_1D_45_E1:
- switch (code) {
- case 0x9D:
- state = E1_1D_45_E1_9D;
- break;
- default:
- state = INIT;
- }
+ if(code == 0x9D)
+ state = E1_1D_45_E1_9D;
+ else
+ state = INIT;
break;
case E1_1D_45_E1_9D:
- switch (code) {
- case 0xC5:
- matrix_make(PAUSE);
- break;
- default:
- state = INIT;
- }
+ if(code == 0xC5)
+ matrix_make(PAUSE);
+ else
+ state = INIT;
break;
default:
state = INIT;
}
-
- // 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;
}
ISR(XT_INT_VECT)
{
- static enum {
- INIT,
- BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7,
- STOP,
- } state = INIT;
+ static uint8_t state = 0;
static uint8_t data = 0;
- // wait for clock falling edge
- if(state != INIT)
- wait_clock_lo(70);
- switch (state) {
- case INIT:
- if (data_in())
- state++;
- break;
- case BIT0:
- case BIT1:
- case BIT2:
- case BIT3:
- case BIT4:
- case BIT5:
- case BIT6:
- case BIT7:
+ if (state == 0) {
+ if (data_in())
state++;
- data >>= 1;
- if (data_in()) {
- data |= 0x80;
- }
- break;
- case STOP:
- if (!data_in())
- goto DONE;
- pbuf_enqueue(data);
- goto DONE;
- break;
- default:
- goto DONE;
+ } else if (state >= 1 && state <= 8) {
+ wait_clock_lo(20);
+ data >>= 1;
+ if (data_in())
+ data |= 0x80;
+ if (state == 8)
+ goto END;
+ state++;
+ } else {
+ goto DONE;
}
goto RETURN;
+END:
+ pbuf_enqueue(data);
DONE:
- state = INIT;
+ state = 0;
data = 0;
RETURN:
return;