ibm4704_usb: Fix protocol handling
authortmk <hasu@tmk-kbd.com>
Mon, 18 May 2015 15:32:58 +0000 (00:32 +0900)
committertmk <hasu@tmk-kbd.com>
Mon, 18 May 2015 15:39:44 +0000 (00:39 +0900)
converter/ibm4704_usb/README.md
converter/ibm4704_usb/config.h
converter/ibm4704_usb/ibm4704.txt
converter/ibm4704_usb/matrix.c
tmk_core/protocol/ibm4704.c

index 25b72ba671718e1660f55e4c3d5c04e54ed0b238..15c826ab8b7f7a26afc7c75f636731c34c0f40d5 100644 (file)
@@ -8,6 +8,7 @@ Keyboard initialization process takes a few seconds at start up. During that you
 Update
 ------
 2015/05/05  Added keymaps for 107-key, 77-key and 50-key. Thanks, orihalcon @ geekhack!
+2015/05/19  Fixed a protocol handling bug.
 
 
 
index d9d8d39bc0eb3d38408d60b765c3f457a617e084..2fee10fd61fafc681c2feff7158cabab6dd59b8c 100644 (file)
@@ -53,7 +53,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* Pin interrupt on rising edge of clock */
 #define IBM4704_INT_INIT()  do { EICRA |= ((1<<ISC11)|(1<<ISC10)); } while (0)
-#define IBM4704_INT_ON()    do { EIMSK |=  (1<<INT1); } while (0)
+#define IBM4704_INT_ON()    do { EIFR |= (1<<INTF1); EIMSK |= (1<<INT1); } while (0)
 #define IBM4704_INT_OFF()   do { EIMSK &= ~(1<<INT1); } while (0)
 #define IBM4704_INT_VECT    INT1_vect
 
index 50d8c98b0865bc394ae6736e55e875d3b02c2f8a..e2d42f08fda64e5da8e9b6721b2d436ac7785b9b 100644 (file)
@@ -166,13 +166,14 @@ Data sent from host:
          |   `-----`--- scan code
          `------------- enable bit(0: enable repeat, 1: enable break)
 
-    00-77   Enable repeat(78-7F: invalid scancode)
-    80-F7   Enable break(F8-FF: invalid scancode)
+    00-79   Enable repeat
+    80-F9   Enable break(FA-FF are used as other commands, see above.)
     FE      Resend(011ah) no need to use
     FF      End(0114h) exits FC command mode.
 
 Response from keyboard:
     FD      Out of bound - Invalid scancode
+    --      OK - No response means that command is accepted.
 
 Examples:
     To enable break code of all keys.
index 5f928d716fc5beedfd145ed197a38819d3c528ef..155df9c38f26f5fa2d9a610e4773436c75dd1fdc 100644 (file)
@@ -67,35 +67,31 @@ uint8_t matrix_cols(void)
 
 static void enable_break(void)
 {
-    uint8_t ret;
     print("Enable break: ");
     // valid scancode: 00-79h
     for (uint8_t code = 0; code < 0x7A; code++) {
-        while (ibm4704_send(0x80|code)) _delay_ms(1);
-        // get none when ok, get FD when out of bound
-        _delay_ms(5);
-        if ((ret = ibm4704_recv()) != 0xff) {
-            xprintf("c%02X:r%02X ", code, ret);
-        }
-        _delay_ms(1);
+        while (ibm4704_send(0x80|code)) _delay_ms(10);
+        _delay_ms(5);   // wait for response
+        // No response(FF) when ok, FD when out of bound
+        xprintf("s%02X:r%02X ", code, ibm4704_recv());
     }
-    _delay_us(1000);
-    while (ibm4704_send(0xFF)) { _delay_ms(1); } // End
+    while (ibm4704_send(0xFF)) { _delay_ms(10); } // End
     print("End\n");
 }
 
-void matrix_init(void)
-{
-    debug_enable = true;
 
+void matrix_setup(void)
+{
     ibm4704_init();
-    matrix_clear();
+}
 
-    _delay_ms(2000);    // wait for starting up debug console
+void matrix_init(void)
+{
+    debug_enable = true;
 
     print("IBM 4704 converter\n");
-    while (ibm4704_send(0xFE)) _delay_ms(1);    // resend
-    _delay_ms(5);
+    matrix_clear();
+    _delay_ms(2000);    // wait for keyboard starting up
     xprintf("Keyboard ID: %02X\n", ibm4704_recv());
     enable_break();
 }
index a2c6700477f97794676e0085c0865c15d4bb0c16..6a03cd441959fe9e571fd80997d3f634b448fae6 100644 (file)
@@ -21,9 +21,10 @@ uint8_t ibm4704_error = 0;
 
 void ibm4704_init(void)
 {
+    inhibit();  // keep keyboard from sending
     IBM4704_INT_INIT();
     IBM4704_INT_ON();
-    idle();
+    idle();     // allow keyboard sending
 }
 
 /*
@@ -132,8 +133,8 @@ Stop bit:   Keyboard pulls down Data line to lo after 9th clock.
 ISR(IBM4704_INT_VECT)
 {
     static enum {
-        STOP, BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY
-    } state = STOP;
+        BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, STOP
+    } state = BIT0;
     // LSB first
     static uint8_t data = 0;
     // Odd parity
@@ -141,11 +142,7 @@ ISR(IBM4704_INT_VECT)
 
     ibm4704_error = 0;
 
-    switch (state++) {
-        case STOP:
-            // Data:Low
-            WAIT(data_lo, 10, state);
-            break;
+    switch (state) {
         case BIT0:
         case BIT1:
         case BIT2:
@@ -166,6 +163,10 @@ ISR(IBM4704_INT_VECT)
             }
             if (!parity)
                 goto ERROR;
+            break;
+        case STOP:
+            // Data:Low
+            WAIT(data_lo, 100, state);
             rbuf_enqueue(data);
             ibm4704_error = IBM4704_ERR_NONE;
             goto DONE;
@@ -173,13 +174,14 @@ ISR(IBM4704_INT_VECT)
         default:
             goto ERROR;
     }
+    state++;
     goto RETURN;
 ERROR:
     ibm4704_error = state;
     while (ibm4704_send(0xFE)) _delay_ms(1); // resend
     xprintf("R:%02X%02X\n", state, data);
 DONE:
-    state = STOP;
+    state = BIT0;
     data = 0;
     parity = false;
 RETURN:
Imprint / Impressum