]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - tmk_core/protocol/ibmpc.c
ibmpc: Add ibmpc_isr_debug to see isr_state
[max/tmk_keyboard.git] / tmk_core / protocol / ibmpc.c
index 8e195e9484b7bd916fdd98c7d80a2bda2d02e59d..0e3998aae6a846e5e512e078f70ecb609436cdd2 100644 (file)
@@ -56,7 +56,8 @@ POSSIBILITY OF SUCH DAMAGE.
 } while (0)
 
 
-volatile uint8_t ibmpc_protocol = IBMPC_PROTOCOL_AT;
+volatile uint16_t ibmpc_isr_debug = 0;
+volatile uint8_t ibmpc_protocol = IBMPC_PROTOCOL_NO;
 volatile uint8_t ibmpc_error = IBMPC_ERR_NONE;
 
 /* 2-byte buffer for data received from keyhboard
@@ -97,8 +98,6 @@ int16_t ibmpc_host_send(uint8_t data)
     bool parity = true;
     ibmpc_error = IBMPC_ERR_NONE;
 
-    if (ibmpc_protocol == IBMPC_PROTOCOL_XT) return -1;
-
     dprintf("w%02X ", data);
 
     IBMPC_INT_OFF();
@@ -176,8 +175,8 @@ int16_t ibmpc_host_recv(void)
         }
     }
 
+    if ((data | 0x00FF) != 0xFFFF) dprintf("b%04X ", data);
     if (ret != 0xFF) dprintf("r%02X ", ret);
-    if (recv_data != 0xFFFF) dprintf("b%04X ", recv_data);
     return ((ret != 0xFF) ? ret : -1);
 
 }
@@ -246,10 +245,12 @@ ISR(IBMPC_INT_VECT)
     //       x  x  x  x    x  x  x  x | *1  0  0  0    0  0  0  0     midway(8 bits received)
     //      b6 b5 b4 b3   b2 b1 b0  1 |  0 *1  0  0    0  0  0  0     XT_IBM-midway ^1
     //      b7 b6 b5 b4   b3 b2 b1 b0 |  0 *1  0  0    0  0  0  0     AT-midway ^1
-    //      b7 b6 b5 b4   b3 b2 b1 b0 |  1 *1  0  0    0  0  0  0     XT_Clone-done
+    //      b7 b6 b5 b4   b3 b2 b1 b0 |  1 *1  0  0    0  0  0  0     XT_Clone-done ^3
+    //      b6 b5 b4 b3   b2 b1 b0  1 |  1 *1  0  0    0  0  0  0     XT_IBM-error ^3
     //      pr b7 b6 b5   b4 b3 b2 b1 |  0  0 *1  0    0  0  0  0     AT-midway[b0=0]
     //      b7 b6 b5 b4   b3 b2 b1 b0 |  1  0 *1  0    0  0  0  0     XT_IBM-done ^2
     //      pr b7 b6 b5   b4 b3 b2 b1 |  1  0 *1  0    0  0  0  0     AT-midway[b0=1] ^2
+    //      b7 b6 b5 b4   b3 b2 b1 b0 |  1  1 *1  0    0  0  0  0     XT_IBM-error-done
     //       x  x  x  x    x  x  x  x |  x  1  1  0    0  0  0  0     illegal
     //      st pr b7 b6   b5 b4 b3 b2 | b1 b0  0 *1    0  0  0  0     AT-done
     //       x  x  x  x    x  x  x  x |  x  x  1 *1    0  0  0  0     illegal
@@ -266,9 +267,29 @@ ISR(IBMPC_INT_VECT)
             // midway
             goto NEXT;
             break;
-        case 0b11000000:
-            // XT_Clone-done
+        case 0b11000000:    // ^3
+            {
+                uint8_t us = 100;
+                // wait for rising and falling edge of b7 of XT_IBM
+                while (!(IBMPC_CLOCK_PIN&(1<<IBMPC_CLOCK_BIT)) && us) { wait_us(1); us--; }
+                while (  IBMPC_CLOCK_PIN&(1<<IBMPC_CLOCK_BIT)  && us) { wait_us(1); us--; }
+
+                if (us) {
+                    // XT_IBM-error: read start(0) as 1
+                    goto NEXT;
+                } else {
+                    // XT_Clone-done
+                    isr_state = isr_state>>8;
+                    ibmpc_protocol = IBMPC_PROTOCOL_XT_CLONE;
+                    goto DONE;
+                }
+            }
+            break;
+        case 0b11100000:
+            // XT_IBM-error-done
+            ibmpc_isr_debug = isr_state;
             isr_state = isr_state>>8;
+            ibmpc_protocol = IBMPC_PROTOCOL_XT_ERROR;
             goto DONE;
             break;
         case 0b10100000:    // ^2
@@ -284,6 +305,7 @@ ISR(IBMPC_INT_VECT)
                 } else {
                     // no stop bit: XT_IBM-done
                     isr_state = isr_state>>8;
+                    ibmpc_protocol = IBMPC_PROTOCOL_XT_IBM;
                     goto DONE;
                 }
              }
@@ -293,24 +315,28 @@ 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?
             isr_state = isr_state>>6;
+            ibmpc_protocol = IBMPC_PROTOCOL_AT;
             goto DONE;
             break;
         case 0b01100000:
-        case 0b11100000:
         case 0b00110000:
         case 0b10110000:
         case 0b01110000:
         case 0b11110000:
         default:            // xxxx_oooo(any 1 in low nibble)
             // Illegal
+            ibmpc_isr_debug = isr_state;
             ibmpc_error = IBMPC_ERR_ILLEGAL;
             goto ERROR;
             break;
     }
 
 ERROR:
+    ibmpc_isr_debug = isr_state;
     isr_state = 0x8000;
     recv_data = 0xFF00; // clear data and scancode of error 0x00
     return;
@@ -333,6 +359,7 @@ NEXT:
 /* send LED state to keyboard */
 void ibmpc_host_set_led(uint8_t led)
 {
-    ibmpc_host_send(0xED);
-    ibmpc_host_send(led);
+    if (0xFA == ibmpc_host_send(0xED)) {
+        ibmpc_host_send(led);
+    }
 }