From 71a8fd8b1286926bd21edce3d2ec7423d8ca4eef Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 23 Oct 2015 20:12:04 -0400 Subject: [PATCH] bluetooth working with usb --- keyboard/planck/Makefile | 20 +++------ keyboard/planck/config.h | 4 +- keyboard/planck/keymaps/keymap_lock.c | 40 ++++++++--------- protocol/lufa.mk | 5 +++ protocol/lufa/bluetooth.c | 37 ++++++++++++++++ protocol/lufa/bluetooth.h | 63 +++++++++++++++++++++++++++ protocol/lufa/lufa.c | 51 +++++++++++++++++++++- protocol/lufa/lufa.h | 2 +- 8 files changed, 182 insertions(+), 40 deletions(-) create mode 100644 protocol/lufa/bluetooth.c create mode 100644 protocol/lufa/bluetooth.h diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index d9e8ce7889..3ac4540e16 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -124,13 +124,13 @@ COMMAND_ENABLE = yes # Commands for debug and configuration # SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend # NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -# MIDI_ENABLE = YES # MIDI controls +MIDI_ENABLE = YES # MIDI controls # UNICODE_ENABLE = YES # Unicode -# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID +BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID ifdef MIDI_ENABLE - SRC += keymap_midi.c - # beeps.c + SRC += keymap_midi.c \ + beeps.c endif ifdef UNICODE_ENABLE @@ -144,17 +144,7 @@ endif VPATH += $(TARGET_DIR) VPATH += $(TOP_DIR) - - -ifdef BLUETOOTH_ENABLE - BLUEFRUIT_TRACE_SERIAL=true - - include $(TOP_DIR)/protocol.mk - include $(TOP_DIR)/protocol/bluefruit.mk - include $(TOP_DIR)/protocol.mk -else - include $(TOP_DIR)/protocol/lufa.mk -endif +include $(TOP_DIR)/protocol/lufa.mk include $(TOP_DIR)/common.mk include $(TOP_DIR)/rules.mk diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h index 0a1a6a9357..cc3a1741a2 100644 --- a/keyboard/planck/config.h +++ b/keyboard/planck/config.h @@ -131,10 +131,10 @@ along with this program. If not, see . */ /* disable debug print */ -// #define NO_DEBUG +#define NO_DEBUG /* disable print */ -// #define NO_PRINT +#define NO_PRINT /* disable action features */ //#define NO_ACTION_LAYER diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c index b844d1cdab..cc9be55f64 100644 --- a/keyboard/planck/keymaps/keymap_lock.c +++ b/keyboard/planck/keymaps/keymap_lock.c @@ -75,33 +75,33 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) default_layer_and(0); default_layer_or((1<<5)); - uint8_t low = boot_lock_fuse_bits_get(0x0000); - uint8_t high = boot_lock_fuse_bits_get(0x0003); - uint8_t ext = boot_lock_fuse_bits_get(0x0002); - uint8_t lock = boot_lock_fuse_bits_get(0x0001); + // uint8_t low = boot_lock_fuse_bits_get(0x0000); + // uint8_t high = boot_lock_fuse_bits_get(0x0003); + // uint8_t ext = boot_lock_fuse_bits_get(0x0002); + // uint8_t lock = boot_lock_fuse_bits_get(0x0001); - register_code(hextokeycode((low & 0xF0) >> 4)); - unregister_code(hextokeycode((low & 0xF0) >> 4)); - register_code(hextokeycode((low & 0x0F))); - unregister_code(hextokeycode((low & 0x0F))); + // register_code(hextokeycode((low & 0xF0) >> 4)); + // unregister_code(hextokeycode((low & 0xF0) >> 4)); + // register_code(hextokeycode((low & 0x0F))); + // unregister_code(hextokeycode((low & 0x0F))); - register_code(hextokeycode((high & 0xF0) >> 4)); - unregister_code(hextokeycode((high & 0xF0) >> 4)); - register_code(hextokeycode((high & 0x0F))); - unregister_code(hextokeycode((high & 0x0F))); + // register_code(hextokeycode((high & 0xF0) >> 4)); + // unregister_code(hextokeycode((high & 0xF0) >> 4)); + // register_code(hextokeycode((high & 0x0F))); + // unregister_code(hextokeycode((high & 0x0F))); - register_code(hextokeycode((ext & 0xF0) >> 4)); - unregister_code(hextokeycode((ext & 0xF0) >> 4)); - register_code(hextokeycode((ext & 0x0F))); - unregister_code(hextokeycode((ext & 0x0F))); + // register_code(hextokeycode((ext & 0xF0) >> 4)); + // unregister_code(hextokeycode((ext & 0xF0) >> 4)); + // register_code(hextokeycode((ext & 0x0F))); + // unregister_code(hextokeycode((ext & 0x0F))); - register_code(hextokeycode((lock & 0xF0) >> 4)); - unregister_code(hextokeycode((lock & 0xF0) >> 4)); - register_code(hextokeycode((lock & 0x0F))); - unregister_code(hextokeycode((lock & 0x0F))); + // register_code(hextokeycode((lock & 0xF0) >> 4)); + // unregister_code(hextokeycode((lock & 0xF0) >> 4)); + // register_code(hextokeycode((lock & 0x0F))); + // unregister_code(hextokeycode((lock & 0x0F))); // note(0+12, 20); // note(0+24, 20); diff --git a/protocol/lufa.mk b/protocol/lufa.mk index 5dbb74ffc2..958c37516f 100644 --- a/protocol/lufa.mk +++ b/protocol/lufa.mk @@ -29,6 +29,11 @@ ifdef MIDI_ENABLE $(LUFA_SRC_USBCLASS) endif +ifdef BLUETOOTH_ENABLE + LUFA_SRC += $(LUFA_DIR)/bluetooth.c \ + $(LUFA_DIR)/../serial_uart.c +endif + SRC += $(LUFA_SRC) # Search Path diff --git a/protocol/lufa/bluetooth.c b/protocol/lufa/bluetooth.c new file mode 100644 index 0000000000..ed66e52c1f --- /dev/null +++ b/protocol/lufa/bluetooth.c @@ -0,0 +1,37 @@ +/* +Bluefruit Protocol for TMK firmware +Author: Benjamin Gould, 2013 + Jack Humbert, 2015 +Based on code Copyright 2011 Jun Wako +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include +#include "report.h" +#include "print.h" +#include "debug.h" +#include "../serial.h" +#include "bluetooth.h" + +void bluefruit_keyboard_print_report(report_keyboard_t *report) +{ + if (!debug_keyboard) return; + dprintf("keys: "); for (int i = 0; i < KEYBOARD_REPORT_KEYS; i++) { debug_hex8(report->keys[i]); dprintf(" "); } + dprintf(" mods: "); debug_hex8(report->mods); + dprintf(" reserved: "); debug_hex8(report->reserved); + dprintf("\n"); +} + +void bluefruit_serial_send(uint8_t data) +{ + serial_send(data); +} \ No newline at end of file diff --git a/protocol/lufa/bluetooth.h b/protocol/lufa/bluetooth.h new file mode 100644 index 0000000000..01f07e8e67 --- /dev/null +++ b/protocol/lufa/bluetooth.h @@ -0,0 +1,63 @@ +/* +Bluefruit Protocol for TMK firmware +Author: Benjamin Gould, 2013 + Jack Humbert, 2015 +Based on code Copyright 2011 Jun Wako +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef BLUETOOTH_H +#define BLUETOOTH_H + +void bluefruit_serial_send(uint8_t data); + +/* ++-----------------+-------------------+-------+ +| Consumer Key | Bit Map | Hex | ++-----------------+-------------------+-------+ +| Home | 00000001 00000000 | 01 00 | +| KeyboardLayout | 00000010 00000000 | 02 00 | +| Search | 00000100 00000000 | 04 00 | +| Snapshot | 00001000 00000000 | 08 00 | +| VolumeUp | 00010000 00000000 | 10 00 | +| VolumeDown | 00100000 00000000 | 20 00 | +| Play/Pause | 01000000 00000000 | 40 00 | +| Fast Forward | 10000000 00000000 | 80 00 | +| Rewind | 00000000 00000001 | 00 01 | +| Scan Next Track | 00000000 00000010 | 00 02 | +| Scan Prev Track | 00000000 00000100 | 00 04 | +| Random Play | 00000000 00001000 | 00 08 | +| Stop | 00000000 00010000 | 00 10 | ++-------------------------------------+-------+ +*/ +#define CONSUMER2BLUEFRUIT(usage) \ + (usage == AUDIO_MUTE ? 0x0000 : \ + (usage == AUDIO_VOL_UP ? 0x1000 : \ + (usage == AUDIO_VOL_DOWN ? 0x2000 : \ + (usage == TRANSPORT_NEXT_TRACK ? 0x0002 : \ + (usage == TRANSPORT_PREV_TRACK ? 0x0004 : \ + (usage == TRANSPORT_STOP ? 0x0010 : \ + (usage == TRANSPORT_STOP_EJECT ? 0x0000 : \ + (usage == TRANSPORT_PLAY_PAUSE ? 0x4000 : \ + (usage == AL_CC_CONFIG ? 0x0000 : \ + (usage == AL_EMAIL ? 0x0000 : \ + (usage == AL_CALCULATOR ? 0x0000 : \ + (usage == AL_LOCAL_BROWSER ? 0x0000 : \ + (usage == AC_SEARCH ? 0x0400 : \ + (usage == AC_HOME ? 0x0100 : \ + (usage == AC_BACK ? 0x0000 : \ + (usage == AC_FORWARD ? 0x0000 : \ + (usage == AC_STOP ? 0x0000 : \ + (usage == AC_REFRESH ? 0x0000 : \ + (usage == AC_BOOKMARKS ? 0x0000 : 0))))))))))))))))))) + +#endif \ No newline at end of file diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index 85c7bf712f..e5267fead6 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -51,8 +51,13 @@ #include "descriptor.h" #include "lufa.h" + #ifdef MIDI_ENABLE -#include + #include +#endif + +#ifdef BLUETOOTH_ENABLE + #include "bluetooth.h" #endif // #include @@ -89,7 +94,6 @@ host_driver_t lufa_driver = { usb_get_midi, midi_usb_init, #endif - }; void SetupHardware(void); @@ -477,6 +481,13 @@ static void send_keyboard(report_keyboard_t *report) Endpoint_ClearIN(); keyboard_report_sent = *report; + +#ifdef BLUETOOTH_ENABLE + bluefruit_serial_send(0xFD); + for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { + bluefruit_serial_send(report->raw[i]); + } +#endif } static void send_mouse(report_mouse_t *report) @@ -499,6 +510,20 @@ static void send_mouse(report_mouse_t *report) /* Finalize the stream transfer to send the last packet */ Endpoint_ClearIN(); + + +#ifdef BLUETOOTH_ENABLE + bluefruit_serial_send(0xFD); + bluefruit_serial_send(0x00); + bluefruit_serial_send(0x03); + bluefruit_serial_send(report->buttons); + bluefruit_serial_send(report->x); + bluefruit_serial_send(report->y); + bluefruit_serial_send(report->v); // should try sending the wheel v here + bluefruit_serial_send(report->h); // should try sending the wheel h here + bluefruit_serial_send(0x00); +#endif + #endif } @@ -542,6 +567,23 @@ static void send_consumer(uint16_t data) Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); + +#ifdef BLUETOOTH_ENABLE + static uint16_t last_data = 0; + if (data == last_data) return; + last_data = data; + uint16_t bitmap = CONSUMER2BLUEFRUIT(data); + bluefruit_serial_send(0xFD); + bluefruit_serial_send(0x00); + bluefruit_serial_send(0x02); + bluefruit_serial_send((bitmap>>8)&0xFF); + bluefruit_serial_send(bitmap&0xFF); + bluefruit_serial_send(0x00); + bluefruit_serial_send(0x00); + bluefruit_serial_send(0x00); + bluefruit_serial_send(0x00); +#endif + } @@ -838,6 +880,11 @@ int main(void) // midi_send_noteoff(&midi_device, 0, 64, 127); #endif +#ifdef BLUETOOTH_ENABLE + print_set_sendchar(sendchar); + serial_init(); +#endif + /* wait for USB startup & debug output */ while (USB_DeviceState != DEVICE_STATE_Configured) { diff --git a/protocol/lufa/lufa.h b/protocol/lufa/lufa.h index 8bcd8503a6..af01bf6b9d 100644 --- a/protocol/lufa/lufa.h +++ b/protocol/lufa/lufa.h @@ -49,7 +49,7 @@ #include #include "host.h" #ifdef MIDI_ENABLE -#include "midi/midi.h" + #include "midi/midi.h" #endif #ifdef __cplusplus extern "C" {