summary refs log tree commit diff
path: root/protocol
diff options
context:
space:
mode:
authortmk <nobody@nowhere>2012-12-12 09:45:00 +0900
committertmk <nobody@nowhere>2012-12-12 09:49:59 +0900
commitcf1eb8fbc6789776d3b3457dd5cf4ed84815e8b3 (patch)
treedc2ec05a2b19e60a0550b44085142fd548b5a54f /protocol
parent72dc413a19562b6a67509d4fd6a1cb9c07227d3d (diff)
Add ADB extended keyboard support by blargg@GH.
This offers distinction between left/right modifiers.
Diffstat (limited to 'protocol')
-rw-r--r--protocol/adb.c24
-rw-r--r--protocol/adb.h1
2 files changed, 20 insertions, 5 deletions
diff --git a/protocol/adb.c b/protocol/adb.c
index d7105b3a9a..9f52f6ce77 100644
--- a/protocol/adb.c
+++ b/protocol/adb.c
@@ -67,6 +67,12 @@ void adb_host_init(void)
 #ifdef ADB_PSW_BIT
     psw_hi();
 #endif
+
+    // Enable keyboard left/right modifier distinction
+    // Addr:Keyboard(0010), Cmd:Listen(10), Register3(11)
+    // upper byte: reserved bits 0000, device address 0010
+    // lower byte: device handler 00000011
+    adb_host_listen(0x2B,0x02,0x03);
 }
 
 #ifdef ADB_PSW_BIT
@@ -98,19 +104,27 @@ uint16_t adb_host_kbd_recv(void)
     return data;
 }
 
-// send state of LEDs
-void adb_host_kbd_led(uint8_t led)
+void adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l)
 {
     attention();
-    send_byte(0x2A);            // Addr:Keyboard(0010), Cmd:Listen(10), Register2(10)
+    send_byte(cmd);
     place_bit0();               // Stopbit(0)
     _delay_us(200);             // Tlt/Stop to Start
     place_bit1();               // Startbit(1)
-    send_byte(0);               // send upper byte (not used)
-    send_byte(led&0x07);        // send lower byte (bit2: ScrollLock, bit1: CapsLock, bit0: NumLock)
+    send_byte(data_h); 
+    send_byte(data_l);
     place_bit0();               // Stopbit(0);
 }
 
+// send state of LEDs
+void adb_host_kbd_led(uint8_t led)
+{
+    // Addr:Keyboard(0010), Cmd:Listen(10), Register2(10)
+    // send upper byte (not used)
+    // send lower byte (bit2: ScrollLock, bit1: CapsLock, bit0:
+    adb_host_listen(0x2A,0,led&0x07);
+}
+
 
 static inline void data_lo()
 {
diff --git a/protocol/adb.h b/protocol/adb.h
index 1e4ca40132..bfe598bbf1 100644
--- a/protocol/adb.h
+++ b/protocol/adb.h
@@ -56,6 +56,7 @@ POSSIBILITY OF SUCH DAMAGE.
 void     adb_host_init(void);
 bool     adb_host_psw(void);
 uint16_t adb_host_kbd_recv(void);
+void     adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l);
 void     adb_host_kbd_led(uint8_t led);
 
 #endif