X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;ds=sidebyside;f=tmk_core%2Fprotocol%2Fibmpc.c;h=5f2ca79b2fba9f1bd8067b46ed1d2ca8ca6044a1;hb=12e5a3a13eb86852ad58c131e28ba29c5f09bb2d;hp=c2400dc5b68eaa0bade4bdda10a9e7db985e73c7;hpb=54e3c239fcb0a2c71afde8fd920c211dbf0c51c0;p=max%2Ftmk_keyboard.git diff --git a/tmk_core/protocol/ibmpc.c b/tmk_core/protocol/ibmpc.c index c2400dc5..5f2ca79b 100644 --- a/tmk_core/protocol/ibmpc.c +++ b/tmk_core/protocol/ibmpc.c @@ -105,13 +105,13 @@ int16_t ibmpc_host_send(uint8_t data) /* terminate a transmission if we have */ inhibit(); - wait_us(100); // 100us [4]p.13, [5]p.50 + wait_us(100); // [5]p.54 /* 'Request to Send' and Start bit */ data_lo(); wait_us(100); - clock_hi(); - WAIT(clock_lo, 10000, 1); // 10ms [5]p.50 + clock_hi(); // [5]p.54 [clock low]>100us [5]p.50 + WAIT(clock_lo, 10000, 1); // [5]p.53, -10ms [5]p.50 /* Data bit[2-9] */ for (uint8_t i = 0; i < 8; i++) { @@ -135,14 +135,15 @@ int16_t ibmpc_host_send(uint8_t data) /* Stop bit */ wait_us(15); data_hi(); + WAIT(clock_hi, 50, 6); + WAIT(clock_lo, 50, 7); /* Ack */ - WAIT(data_lo, 50, 6); - WAIT(clock_lo, 50, 7); + WAIT(data_lo, 50, 8); /* wait for idle state */ - WAIT(clock_hi, 50, 8); - WAIT(data_hi, 50, 9); + WAIT(clock_hi, 50, 9); + WAIT(data_hi, 50, 10); // clear buffer to get response correctly recv_data = 0xFFFF; @@ -252,8 +253,8 @@ ISR(IBMPC_INT_VECT) if (isr_state == 0x8000) { timer_start = t; } else { - // should not take more than 1ms - if (timer_start != t && (uint8_t)(timer_start + 1) != t) { + // This gives 2.0ms at least before timeout + if ((uint8_t)(t - timer_start) >= 3) { ibmpc_isr_debug = isr_state; ibmpc_error = IBMPC_ERR_TIMEOUT; goto ERROR; @@ -358,12 +359,17 @@ ISR(IBMPC_INT_VECT) case 0b01010000: case 0b11010000: // AT-done - // DO NOT check stop bit. Zenith Z-150(AT) asserts stop bit as low for no reason. - // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#zenith-z-150-beige // TODO: parity check? ibmpc_isr_debug = isr_state; + // stop bit check + if (isr_state & 0x8000) { + ibmpc_protocol = IBMPC_PROTOCOL_AT; + } else { + // Zenith Z-150 AT(beige/white lable) asserts stop bit as low + // https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#zenith-z-150-beige + ibmpc_protocol = IBMPC_PROTOCOL_AT_Z150; + } isr_state = isr_state>>6; - ibmpc_protocol = IBMPC_PROTOCOL_AT; goto DONE; break; case 0b01100000: