summaryrefslogtreecommitdiff
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
parent72dc413a19562b6a67509d4fd6a1cb9c07227d3d (diff)
Add ADB extended keyboard support by blargg@GH.
This offers distinction between left/right modifiers.
-rw-r--r--converter/adb_usb/keymap.c6
-rw-r--r--protocol/adb.c24
-rw-r--r--protocol/adb.h1
3 files changed, 23 insertions, 8 deletions
diff --git a/converter/adb_usb/keymap.c b/converter/adb_usb/keymap.c
index c622dc6238..25f851859f 100644
--- a/converter/adb_usb/keymap.c
+++ b/converter/adb_usb/keymap.c
@@ -40,7 +40,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K75,K77,K79, K59,K5B,K5C,K4E, \
K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K45, \
K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K3E, K53,K54,K55, \
- K36,K3A,K37, K31, K3B,K3D,K3C, K52, K41,K4C \
+ K36,K3A,K37, K31, K7C,K7D, K3B,K3D,K3C, K52, K41,K4C \
) { \
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
{ KC_##K08, KC_##K09, KC_NO, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \
@@ -57,7 +57,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
{ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_NO, KC_##K67 }, \
{ KC_NO, KC_##K69, KC_NO, KC_##K6B, KC_NO, KC_##K6D, KC_NO, KC_##K6F }, \
{ KC_NO, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \
- { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_NO, KC_NO, KC_NO, KC_##K7F } \
+ { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_NO, KC_##K7F } \
}
@@ -109,7 +109,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, PMNS,
CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS,
LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3,
- LCTL,LGUI,LALT, SPC, LEFT,DOWN,RGHT, P0, PDOT,PENT
+ LCTL,LGUI,LALT, SPC, RGUI,RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT
),
};
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