diff options
Diffstat (limited to 'protocol')
-rw-r--r-- | protocol/bluefruit.mk | 2 | ||||
-rw-r--r-- | protocol/bluefruit/bluefruit.c | 15 | ||||
-rw-r--r-- | protocol/bluefruit/bluefruit.h | 5 | ||||
-rw-r--r-- | protocol/bluefruit/main.c | 100 | ||||
-rw-r--r-- | protocol/lufa.mk | 5 | ||||
-rw-r--r-- | protocol/lufa/bluetooth.c | 37 | ||||
-rw-r--r-- | protocol/lufa/bluetooth.h | 63 | ||||
-rw-r--r-- | protocol/lufa/descriptor.c | 2 | ||||
-rw-r--r-- | protocol/lufa/lufa.c | 59 | ||||
-rw-r--r-- | protocol/lufa/lufa.h | 2 |
10 files changed, 236 insertions, 54 deletions
diff --git a/protocol/bluefruit.mk b/protocol/bluefruit.mk index 7e6328f6cb..85313ba621 100644 --- a/protocol/bluefruit.mk +++ b/protocol/bluefruit.mk @@ -3,7 +3,7 @@ PJRC_DIR = protocol/pjrc SRC += $(BLUEFRUIT_DIR)/main.c \ $(BLUEFRUIT_DIR)/bluefruit.c \ - serial_uart.c \ + protocol/serial_uart.c \ $(PJRC_DIR)/pjrc.c \ $(PJRC_DIR)/usb_keyboard.c \ $(PJRC_DIR)/usb_debug.c \ diff --git a/protocol/bluefruit/bluefruit.c b/protocol/bluefruit/bluefruit.c index cf26b83dff..47c63555cd 100644 --- a/protocol/bluefruit/bluefruit.c +++ b/protocol/bluefruit/bluefruit.c @@ -2,20 +2,16 @@ Bluefruit Protocol for TMK firmware Author: Benjamin Gould, 2013 Based on code Copyright 2011 Jun Wako <wakojun@gmail.com> - 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 <http://www.gnu.org/licenses/>. - */ #include <stdint.h> @@ -76,6 +72,13 @@ static void send_mouse(report_mouse_t *report); static void send_system(uint16_t data); static void send_consumer(uint16_t data); + +void sendString(char string[], int length) { + for(int i = 0; i < length; i++) { + serial_send(string[i]); + } +} + static host_driver_t driver = { keyboard_leds, send_keyboard, @@ -100,6 +103,7 @@ static void send_keyboard(report_keyboard_t *report) #endif bluefruit_serial_send(0xFD); for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) { + bluefruit_serial_send(report->raw[i]); } #ifdef BLUEFRUIT_TRACE_SERIAL @@ -198,5 +202,4 @@ static void send_consumer(uint16_t data) #ifdef BLUEFRUIT_TRACE_SERIAL bluefruit_trace_footer(); #endif -} - +}
\ No newline at end of file diff --git a/protocol/bluefruit/bluefruit.h b/protocol/bluefruit/bluefruit.h index 4f9b58836d..ceacc4a367 100644 --- a/protocol/bluefruit/bluefruit.h +++ b/protocol/bluefruit/bluefruit.h @@ -2,17 +2,14 @@ Bluefruit Protocol for TMK firmware Author: Benjamin Gould, 2013 Based on code Copyright 2011 Jun Wako <wakojun@gmail.com> - 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 <http://www.gnu.org/licenses/>. */ @@ -25,4 +22,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. host_driver_t *bluefruit_driver(void); -#endif +#endif
\ No newline at end of file diff --git a/protocol/bluefruit/main.c b/protocol/bluefruit/main.c index 871062ab11..0dbb637e2c 100644 --- a/protocol/bluefruit/main.c +++ b/protocol/bluefruit/main.c @@ -22,7 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <avr/wdt.h> #include <avr/sleep.h> #include <util/delay.h> -#include "serial.h" +#include "../serial.h" #include "keyboard.h" #include "usb.h" #include "host.h" @@ -40,23 +40,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define BLUEFRUIT_HOST_DRIVER 1 #define PJRC_HOST_DRIVER 2 + int main(void) { CPU_PRESCALE(0); - DDRD = _BV(PD5); - DDRB = _BV(PB0); + // DDRD = _BV(PD5); + // DDRB = _BV(PB0); - PORTD = _BV(PD5); - PORTB = _BV(PB0); + // PORTD = _BV(PD5); + // PORTB = _BV(PB0); print_set_sendchar(sendchar); - usb_init(); - _delay_ms(2000); + // usb_init(); + // _delay_ms(2000); // while (!usb_configured()) /* wait */ + + dprintf("Initializing keyboard...\n"); keyboard_init(); @@ -64,53 +67,72 @@ int main(void) // is not configured, choose the Bluefruit, otherwise use USB // Definitely would prefer to have this driven by an input pin and make // it switch dynamically - BCG - if (!usb_configured()) { + // if (!usb_configured()) { - // Send power to Bluefruit... Adafruit says it takes 27 mA, I think - // the pins should provide 40 mA, but just in case I switch the - // Bluefruit using a transistor - BCG - DDRB = _BV(PB6); - PORTB |= _BV(PB6); + // // Send power to Bluefruit... Adafruit says it takes 27 mA, I think + // // the pins should provide 40 mA, but just in case I switch the + // // Bluefruit using a transistor - BCG + // DDRB = _BV(PB6); + // PORTB |= _BV(PB6); dprintf("Setting host driver to bluefruit...\n"); host_set_driver(bluefruit_driver()); dprintf("Initializing serial...\n"); serial_init(); - - // wait an extra second for the PC's operating system - // to load drivers and do whatever it does to actually - // be ready for input - _delay_ms(1000); - PORTD = ~_BV(PD5); - dprintf("Starting main loop"); - while (1) { - keyboard_task(); - } - } else { + // char swpa[] = "+++\r\n"; + // for (int i = 0; i < 5; i++) { + // serial_send(swpa[i]); + // } + + // char ble_enable[] = "AT+BLEKEYBOARDEN=1\r\n"; + // for (int i = 0; i < 20; i++) { + // serial_send(ble_enable[i]); + // } + + // char reset[] = "ATZ\r\n"; + // for (int i = 0; i < 5; i++) { + // serial_send(reset[i]); + // } + + // for (int i = 0; i < 5; i++) { + // serial_send(swpa[i]); + // } - // I'm not smart enough to get this done with LUFA - BCG - dprintf("Setting host driver to PJRC...\n"); - host_set_driver(pjrc_driver()); -#ifdef SLEEP_LED_ENABLE - sleep_led_init(); -#endif // wait an extra second for the PC's operating system // to load drivers and do whatever it does to actually // be ready for input _delay_ms(1000); - PORTB = ~_BV(PB0); + // PORTD = ~_BV(PD5); dprintf("Starting main loop"); while (1) { - while (suspend) { - suspend_power_down(); - if (remote_wakeup && suspend_wakeup_condition()) { - usb_remote_wakeup(); - } - } - keyboard_task(); + keyboard_task(); } - } + +// } else { + +// // I'm not smart enough to get this done with LUFA - BCG +// dprintf("Setting host driver to PJRC...\n"); +// host_set_driver(pjrc_driver()); +// #ifdef SLEEP_LED_ENABLE +// sleep_led_init(); +// #endif +// // wait an extra second for the PC's operating system +// // to load drivers and do whatever it does to actually +// // be ready for input +// _delay_ms(1000); +// PORTB = ~_BV(PB0); +// dprintf("Starting main loop"); +// while (1) { +// while (suspend) { +// suspend_power_down(); +// if (remote_wakeup && suspend_wakeup_condition()) { +// usb_remote_wakeup(); +// } +// } +// keyboard_task(); +// } +// } } 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 <wakojun@gmail.com> +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 <http://www.gnu.org/licenses/>. +*/ + +#include <stdint.h> +#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 <wakojun@gmail.com> +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 <http://www.gnu.org/licenses/>. +*/ + +#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/descriptor.c b/protocol/lufa/descriptor.c index 5454926b18..b345da27b4 100644 --- a/protocol/lufa/descriptor.c +++ b/protocol/lufa/descriptor.c @@ -266,7 +266,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP), - .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + .MaxPowerConsumption = USB_CONFIG_POWER_MA(500) }, /* diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index c6e6e95054..d310d4b807 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -51,7 +51,14 @@ #include "descriptor.h" #include "lufa.h" -#include <beeps.h> + +#ifdef MIDI_ENABLE + #include <beeps.h> +#endif + +#ifdef BLUETOOTH_ENABLE + #include "bluetooth.h" +#endif // #include <LUFA/Version.h> // #include <LUFA/Drivers/USB/USB.h> @@ -87,7 +94,6 @@ host_driver_t lufa_driver = { usb_get_midi, midi_usb_init, #endif - }; void SetupHardware(void); @@ -439,6 +445,14 @@ static uint8_t keyboard_leds(void) static void send_keyboard(report_keyboard_t *report) { + +#ifdef BLUETOOTH_ENABLE + bluefruit_serial_send(0xFD); + for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { + bluefruit_serial_send(report->raw[i]); + } +#endif + uint8_t timeout = 255; if (USB_DeviceState != DEVICE_STATE_Configured) @@ -475,11 +489,25 @@ static void send_keyboard(report_keyboard_t *report) Endpoint_ClearIN(); keyboard_report_sent = *report; + } static void send_mouse(report_mouse_t *report) { #ifdef MOUSE_ENABLE + +#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 + uint8_t timeout = 255; if (USB_DeviceState != DEVICE_STATE_Configured) @@ -497,6 +525,7 @@ static void send_mouse(report_mouse_t *report) /* Finalize the stream transfer to send the last packet */ Endpoint_ClearIN(); + #endif } @@ -523,6 +552,23 @@ static void send_system(uint16_t data) static void send_consumer(uint16_t data) { + +#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 + uint8_t timeout = 255; if (USB_DeviceState != DEVICE_STATE_Configured) @@ -540,6 +586,8 @@ static void send_consumer(uint16_t data) Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); + + } @@ -836,6 +884,10 @@ int main(void) // midi_send_noteoff(&midi_device, 0, 64, 127); #endif +#ifdef BLUETOOTH_ENABLE + serial_init(); +#endif + /* wait for USB startup & debug output */ // while (USB_DeviceState != DEVICE_STATE_Configured) { @@ -856,6 +908,8 @@ int main(void) print("Keyboard start.\n"); while (1) { + +#ifndef BLUETOOTH_ENABLE while (USB_DeviceState == DEVICE_STATE_Suspended) { print("[s]"); suspend_power_down(); @@ -863,6 +917,7 @@ int main(void) USB_Device_SendRemoteWakeup(); } } +#endif #ifdef MIDI_ENABLE midi_device_process(&midi_device); 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 <LUFA/Drivers/USB/USB.h> #include "host.h" #ifdef MIDI_ENABLE -#include "midi/midi.h" + #include "midi/midi.h" #endif #ifdef __cplusplus extern "C" { |