]> git.donarmstrong.com Git - tmk_firmware.git/blobdiff - protocol/adb.c
Remove MCU dependent code from common/keyboard.c
[tmk_firmware.git] / protocol / adb.c
index 750f4b96505c80287102c8a2130f64bb6ea7b260..f57afac9374a6a43e94925a07bca7e1dd1b74899 100644 (file)
@@ -41,7 +41,6 @@ POSSIBILITY OF SUCH DAMAGE.
 #include <avr/io.h>
 #include <avr/interrupt.h>
 #include "adb.h"
-#include "debug.h"
 
 
 // GCC doesn't inline functions normally
@@ -125,16 +124,19 @@ bool adb_host_psw(void)
 uint16_t adb_host_kbd_recv(void)
 {
     uint16_t data = 0;
+    cli();
     attention();
     send_byte(0x2C);            // Addr:Keyboard(0010), Cmd:Talk(11), Register0(00)
     place_bit0();               // Stopbit(0)
+    if (!wait_data_hi(500)) {    // Service Request(310us Adjustable Keyboard): just ignored
+        sei();
+        return -30;             // something wrong
+    }
     if (!wait_data_lo(500)) {   // Tlt/Stop to Start(140-260us)
+        sei();
         return 0;               // No data to send
     }
     
-    // ad hoc fix: without block inerrupt read wrong bit occasionally and get keys stuck
-    // TODO: is this needed anymore with improved timing?
-    //cli();
     uint8_t n = 17; // start bit + 16 data bits
     do {
         uint8_t lo = (uint8_t) wait_data_hi(130);
@@ -153,10 +155,8 @@ uint16_t adb_host_kbd_recv(void)
             data |= 1;
         }
         else if (n == 17) {
-            // Service Request
-            dprintf("Startbit ERROR\n");
             sei();
-            return -2;
+            return -20;
         }
     }
     while ( --n );
@@ -164,21 +164,20 @@ uint16_t adb_host_kbd_recv(void)
     // Stop bit can't be checked normally since it could have service request lenghtening
     // and its high state never goes low.
     if (!wait_data_hi(351) || wait_data_lo(91)) {
-        dprintf("Stopbit ERROR\n");
         sei();
-        return -3;
+        return -21;
     }
     sei();
     return data;
 
 error:
-    dprintf("Bit ERROR\n");
     sei();
-    return -4;
+    return -n;
 }
 
 void adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l)
 {
+    cli();
     attention();
     send_byte(cmd);
     place_bit0();               // Stopbit(0)
@@ -187,6 +186,7 @@ void adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l)
     send_byte(data_h); 
     send_byte(data_l);
     place_bit0();               // Stopbit(0);
+    sei();
 }
 
 // send state of LEDs