]> git.donarmstrong.com Git - tmk_firmware.git/commitdiff
Add cli() to protoect ADB critical timing part
authortmk <nobody@nowhere>
Thu, 7 Nov 2013 19:25:22 +0000 (04:25 +0900)
committertmk <nobody@nowhere>
Thu, 7 Nov 2013 19:25:22 +0000 (04:25 +0900)
protocol/adb.c

index 750f4b96505c80287102c8a2130f64bb6ea7b260..a4783f36e54886479712c6b1fa6f488d74292c1d 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,15 @@ 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_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 +151,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 +160,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 +182,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