ibmpc_usb: Add 'protocol change detection'

for better keybaord hotswap support
This commit is contained in:
tmk 2020-05-12 21:59:02 +09:00
parent d987783c1a
commit c6a6049bc8
2 changed files with 22 additions and 14 deletions

View file

@ -135,6 +135,7 @@ uint8_t matrix_scan(void)
if (!(ibmpc_error & (IBMPC_ERR_SEND | IBMPC_ERR_FULL))) {
// keyboard init again
if (state == LOOP) {
xprintf("[RST] ");
state = INIT;
}
}
@ -144,9 +145,21 @@ uint8_t matrix_scan(void)
ibmpc_isr_debug = 0;
}
// check protocol AT/XT
// check protocol change AT/XT
if (ibmpc_protocol && ibmpc_protocol != current_protocol) {
xprintf("\nPROTO:%02X ISR:%04X ", ibmpc_protocol, ibmpc_isr_debug);
xprintf("\nPRT:%02X ISR:%04X ", ibmpc_protocol, ibmpc_isr_debug);
// protocol change between AT and XT indicates that
// keyboard is hotswapped or something goes wrong.
// This requires initializing keyboard again probably.
if (((current_protocol&IBMPC_PROTOCOL_XT) && (ibmpc_protocol&IBMPC_PROTOCOL_AT)) ||
((current_protocol&IBMPC_PROTOCOL_AT) && (ibmpc_protocol&IBMPC_PROTOCOL_XT))) {
if (state == LOOP) {
xprintf("[CHG] ");
state = INIT;
}
}
current_protocol = ibmpc_protocol;
ibmpc_isr_debug = 0;
}
@ -328,17 +341,11 @@ uint8_t matrix_scan(void)
// Scan Code Set 2 and 3: 0x00
// Buffer full(IBMPC_ERR_FULL): 0xFF
if (code == 0x00 || code == 0xFF) {
xprintf("\n!OVERRUN![");
// read and ignore data
do {
wait_ms(10);
} while ((code = ibmpc_host_recv()) != -1);
xprintf("]\n");
// clear stuck keys
matrix_clear();
clear_keyboard();
xprintf("\n[OVR] ");
break;
}

View file

@ -71,10 +71,11 @@ POSSIBILITY OF SUCH DAMAGE.
#define IBMPC_SET_LED 0xED
#define IBMPC_PROTOCOL_NO 0
#define IBMPC_PROTOCOL_AT 1
#define IBMPC_PROTOCOL_XT_IBM 2
#define IBMPC_PROTOCOL_XT_CLONE 3
#define IBMPC_PROTOCOL_XT_ERROR 4
#define IBMPC_PROTOCOL_AT 0x10
#define IBMPC_PROTOCOL_XT 0x20
#define IBMPC_PROTOCOL_XT_IBM 0x21
#define IBMPC_PROTOCOL_XT_CLONE 0x22
#define IBMPC_PROTOCOL_XT_ERROR 0x23
// Error numbers
#define IBMPC_ERR_NONE 0