diff options
Diffstat (limited to 'drivers/bluetooth')
| -rw-r--r-- | drivers/bluetooth/bluefruit_le.cpp (renamed from drivers/bluetooth/adafruit_ble.cpp) | 64 | ||||
| -rw-r--r-- | drivers/bluetooth/bluefruit_le.h (renamed from drivers/bluetooth/adafruit_ble.h) | 20 | ||||
| -rw-r--r-- | drivers/bluetooth/outputselect.c | 21 | ||||
| -rw-r--r-- | drivers/bluetooth/rn42.c | 99 | ||||
| -rw-r--r-- | drivers/bluetooth/rn42.h | 25 | 
5 files changed, 172 insertions, 57 deletions
diff --git a/drivers/bluetooth/adafruit_ble.cpp b/drivers/bluetooth/bluefruit_le.cpp index 34a780e9a5..86581a1a48 100644 --- a/drivers/bluetooth/adafruit_ble.cpp +++ b/drivers/bluetooth/bluefruit_le.cpp @@ -1,4 +1,4 @@ -#include "adafruit_ble.h" +#include "bluefruit_le.h"  #include <stdio.h>  #include <stdlib.h> @@ -16,20 +16,20 @@  // These are the pin assignments for the 32u4 boards.  // You may define them to something else in your config.h  // if yours is wired up differently. -#ifndef ADAFRUIT_BLE_RST_PIN -#    define ADAFRUIT_BLE_RST_PIN D4 +#ifndef BLUEFRUIT_LE_RST_PIN +#    define BLUEFRUIT_LE_RST_PIN D4  #endif -#ifndef ADAFRUIT_BLE_CS_PIN -#    define ADAFRUIT_BLE_CS_PIN B4 +#ifndef BLUEFRUIT_LE_CS_PIN +#    define BLUEFRUIT_LE_CS_PIN B4  #endif -#ifndef ADAFRUIT_BLE_IRQ_PIN -#    define ADAFRUIT_BLE_IRQ_PIN E6 +#ifndef BLUEFRUIT_LE_IRQ_PIN +#    define BLUEFRUIT_LE_IRQ_PIN E6  #endif -#ifndef ADAFRUIT_BLE_SCK_DIVISOR -#    define ADAFRUIT_BLE_SCK_DIVISOR 2  // 4MHz SCK/8MHz CPU, calculated for Feather 32U4 BLE +#ifndef BLUEFRUIT_LE_SCK_DIVISOR +#    define BLUEFRUIT_LE_SCK_DIVISOR 2  // 4MHz SCK/8MHz CPU, calculated for Feather 32U4 BLE  #endif  #define SAMPLE_BATTERY @@ -143,7 +143,7 @@ static bool at_command_P(const char *cmd, char *resp, uint16_t resplen, bool ver  // Send a single SDEP packet  static bool sdep_send_pkt(const struct sdep_msg *msg, uint16_t timeout) { -    spi_start(ADAFRUIT_BLE_CS_PIN, false, 0, ADAFRUIT_BLE_SCK_DIVISOR); +    spi_start(BLUEFRUIT_LE_CS_PIN, false, 0, BLUEFRUIT_LE_SCK_DIVISOR);      uint16_t timerStart = timer_read();      bool     success    = false;      bool     ready      = false; @@ -157,7 +157,7 @@ static bool sdep_send_pkt(const struct sdep_msg *msg, uint16_t timeout) {          // Release it and let it initialize          spi_stop();          wait_us(SdepBackOff); -        spi_start(ADAFRUIT_BLE_CS_PIN, false, 0, ADAFRUIT_BLE_SCK_DIVISOR); +        spi_start(BLUEFRUIT_LE_CS_PIN, false, 0, BLUEFRUIT_LE_SCK_DIVISOR);      } while (timer_elapsed(timerStart) < timeout);      if (ready) { @@ -190,7 +190,7 @@ static bool sdep_recv_pkt(struct sdep_msg *msg, uint16_t timeout) {      bool     ready      = false;      do { -        ready = readPin(ADAFRUIT_BLE_IRQ_PIN); +        ready = readPin(BLUEFRUIT_LE_IRQ_PIN);          if (ready) {              break;          } @@ -198,7 +198,7 @@ static bool sdep_recv_pkt(struct sdep_msg *msg, uint16_t timeout) {      } while (timer_elapsed(timerStart) < timeout);      if (ready) { -        spi_start(ADAFRUIT_BLE_CS_PIN, false, 0, ADAFRUIT_BLE_SCK_DIVISOR); +        spi_start(BLUEFRUIT_LE_CS_PIN, false, 0, BLUEFRUIT_LE_SCK_DIVISOR);          do {              // Read the command type, waiting for the data to be ready @@ -207,7 +207,7 @@ static bool sdep_recv_pkt(struct sdep_msg *msg, uint16_t timeout) {                  // Release it and let it initialize                  spi_stop();                  wait_us(SdepBackOff); -                spi_start(ADAFRUIT_BLE_CS_PIN, false, 0, ADAFRUIT_BLE_SCK_DIVISOR); +                spi_start(BLUEFRUIT_LE_CS_PIN, false, 0, BLUEFRUIT_LE_SCK_DIVISOR);                  continue;              } @@ -233,7 +233,7 @@ static void resp_buf_read_one(bool greedy) {          return;      } -    if (readPin(ADAFRUIT_BLE_IRQ_PIN)) { +    if (readPin(BLUEFRUIT_LE_IRQ_PIN)) {          struct sdep_msg msg;      again: @@ -244,7 +244,7 @@ static void resp_buf_read_one(bool greedy) {                  dprintf("recv latency %dms\n", TIMER_DIFF_16(timer_read(), last_send));              } -            if (greedy && resp_buf.peek(last_send) && readPin(ADAFRUIT_BLE_IRQ_PIN)) { +            if (greedy && resp_buf.peek(last_send) && readPin(BLUEFRUIT_LE_IRQ_PIN)) {                  goto again;              }          } @@ -295,16 +295,16 @@ static bool ble_init(void) {      state.configured   = false;      state.is_connected = false; -    setPinInput(ADAFRUIT_BLE_IRQ_PIN); +    setPinInput(BLUEFRUIT_LE_IRQ_PIN);      spi_init();      // Perform a hardware reset -    setPinOutput(ADAFRUIT_BLE_RST_PIN); -    writePinHigh(ADAFRUIT_BLE_RST_PIN); -    writePinLow(ADAFRUIT_BLE_RST_PIN); +    setPinOutput(BLUEFRUIT_LE_RST_PIN); +    writePinHigh(BLUEFRUIT_LE_RST_PIN); +    writePinLow(BLUEFRUIT_LE_RST_PIN);      wait_ms(10); -    writePinHigh(ADAFRUIT_BLE_RST_PIN); +    writePinHigh(BLUEFRUIT_LE_RST_PIN);      wait_ms(1000);  // Give it a second to initialize @@ -424,9 +424,9 @@ bool at_command_P(const char *cmd, char *resp, uint16_t resplen, bool verbose) {      return at_command(cmdbuf, resp, resplen, verbose);  } -bool adafruit_ble_is_connected(void) { return state.is_connected; } +bool bluefruit_le_is_connected(void) { return state.is_connected; } -bool adafruit_ble_enable_keyboard(void) { +bool bluefruit_le_enable_keyboard(void) {      char resbuf[128];      if (!state.initialized && !ble_init()) { @@ -498,16 +498,16 @@ static void set_connected(bool connected) {      }  } -void adafruit_ble_task(void) { +void bluefruit_le_task(void) {      char resbuf[48]; -    if (!state.configured && !adafruit_ble_enable_keyboard()) { +    if (!state.configured && !bluefruit_le_enable_keyboard()) {          return;      }      resp_buf_read_one(true);      send_buf_send_one(SdepShortTimeout); -    if (resp_buf.empty() && (state.event_flags & UsingEvents) && readPin(ADAFRUIT_BLE_IRQ_PIN)) { +    if (resp_buf.empty() && (state.event_flags & UsingEvents) && readPin(BLUEFRUIT_LE_IRQ_PIN)) {          // Must be an event update          if (at_command_P(PSTR("AT+EVENTSTATUS"), resbuf, sizeof(resbuf))) {              uint32_t mask = strtoul(resbuf, NULL, 16); @@ -609,7 +609,7 @@ static bool process_queue_item(struct queue_item *item, uint16_t timeout) {      }  } -void adafruit_ble_send_keys(uint8_t hid_modifier_mask, uint8_t *keys, uint8_t nkeys) { +void bluefruit_le_send_keys(uint8_t hid_modifier_mask, uint8_t *keys, uint8_t nkeys) {      struct queue_item item;      bool              didWait = false; @@ -643,7 +643,7 @@ void adafruit_ble_send_keys(uint8_t hid_modifier_mask, uint8_t *keys, uint8_t nk      }  } -void adafruit_ble_send_consumer_key(uint16_t usage) { +void bluefruit_le_send_consumer_key(uint16_t usage) {      struct queue_item item;      item.queue_type = QTConsumer; @@ -655,7 +655,7 @@ void adafruit_ble_send_consumer_key(uint16_t usage) {  }  #ifdef MOUSE_ENABLE -void adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll, int8_t pan, uint8_t buttons) { +void bluefruit_le_send_mouse_move(int8_t x, int8_t y, int8_t scroll, int8_t pan, uint8_t buttons) {      struct queue_item item;      item.queue_type        = QTMouseMove; @@ -671,9 +671,9 @@ void adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll, int8_t pan,  }  #endif -uint32_t adafruit_ble_read_battery_voltage(void) { return state.vbat; } +uint32_t bluefruit_le_read_battery_voltage(void) { return state.vbat; } -bool adafruit_ble_set_mode_leds(bool on) { +bool bluefruit_le_set_mode_leds(bool on) {      if (!state.configured) {          return false;      } @@ -689,7 +689,7 @@ bool adafruit_ble_set_mode_leds(bool on) {  }  // https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/ble-generic#at-plus-blepowerlevel -bool adafruit_ble_set_power_level(int8_t level) { +bool bluefruit_le_set_power_level(int8_t level) {      char cmd[46];      if (!state.configured) {          return false; diff --git a/drivers/bluetooth/adafruit_ble.h b/drivers/bluetooth/bluefruit_le.h index b43e0771d9..de301c6167 100644 --- a/drivers/bluetooth/adafruit_ble.h +++ b/drivers/bluetooth/bluefruit_le.h @@ -16,43 +16,43 @@ extern "C" {  #endif  /* Instruct the module to enable HID keyboard support and reset */ -extern bool adafruit_ble_enable_keyboard(void); +extern bool bluefruit_le_enable_keyboard(void);  /* Query to see if the BLE module is connected */ -extern bool adafruit_ble_query_is_connected(void); +extern bool bluefruit_le_query_is_connected(void);  /* Returns true if we believe that the BLE module is connected.   * This uses our cached understanding that is maintained by   * calling ble_task() periodically. */ -extern bool adafruit_ble_is_connected(void); +extern bool bluefruit_le_is_connected(void);  /* Call this periodically to process BLE-originated things */ -extern void adafruit_ble_task(void); +extern void bluefruit_le_task(void);  /* Generates keypress events for a set of keys.   * The hid modifier mask specifies the state of the modifier keys for   * this set of keys.   * Also sends a key release indicator, so that the keys do not remain   * held down. */ -extern void adafruit_ble_send_keys(uint8_t hid_modifier_mask, uint8_t *keys, uint8_t nkeys); +extern void bluefruit_le_send_keys(uint8_t hid_modifier_mask, uint8_t *keys, uint8_t nkeys);  /* Send a consumer usage.   * (milliseconds) */ -extern void adafruit_ble_send_consumer_key(uint16_t usage); +extern void bluefruit_le_send_consumer_key(uint16_t usage);  #ifdef MOUSE_ENABLE  /* Send a mouse/wheel movement report.   * The parameters are signed and indicate positive or negative direction   * change. */ -extern void adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll, int8_t pan, uint8_t buttons); +extern void bluefruit_le_send_mouse_move(int8_t x, int8_t y, int8_t scroll, int8_t pan, uint8_t buttons);  #endif  /* Compute battery voltage by reading an analog pin.   * Returns the integer number of millivolts */ -extern uint32_t adafruit_ble_read_battery_voltage(void); +extern uint32_t bluefruit_le_read_battery_voltage(void); -extern bool adafruit_ble_set_mode_leds(bool on); -extern bool adafruit_ble_set_power_level(int8_t level); +extern bool bluefruit_le_set_mode_leds(bool on); +extern bool bluefruit_le_set_power_level(int8_t level);  #ifdef __cplusplus  } diff --git a/drivers/bluetooth/outputselect.c b/drivers/bluetooth/outputselect.c index f758c65280..44bc4a9aa3 100644 --- a/drivers/bluetooth/outputselect.c +++ b/drivers/bluetooth/outputselect.c @@ -13,13 +13,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */  #include "outputselect.h" +#include "usb_util.h" -#if defined(PROTOCOL_LUFA) -#    include "lufa.h" -#endif - -#ifdef MODULE_ADAFRUIT_BLE -#    include "adafruit_ble.h" +#ifdef BLUETOOTH_BLUEFRUIT_LE +#    include "bluefruit_le.h"  #endif  uint8_t desired_output = OUTPUT_DEFAULT; @@ -39,23 +36,17 @@ void set_output(uint8_t output) {   */  __attribute__((weak)) void set_output_user(uint8_t output) {} -static bool is_usb_configured(void) { -#if defined(PROTOCOL_LUFA) -    return USB_DeviceState == DEVICE_STATE_Configured; -#endif -} -  /** \brief Auto Detect Output   *   * FIXME: Needs doc   */  uint8_t auto_detect_output(void) { -    if (is_usb_configured()) { +    if (usb_connected_state()) {          return OUTPUT_USB;      } -#ifdef MODULE_ADAFRUIT_BLE -    if (adafruit_ble_is_connected()) { +#ifdef BLUETOOTH_BLUEFRUIT_LE +    if (bluefruit_le_is_connected()) {          return OUTPUT_BLUETOOTH;      }  #endif diff --git a/drivers/bluetooth/rn42.c b/drivers/bluetooth/rn42.c new file mode 100644 index 0000000000..2ef40bb7e0 --- /dev/null +++ b/drivers/bluetooth/rn42.c @@ -0,0 +1,99 @@ +/* Copyright 2021 + * + * 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 "report.h" +#include "uart.h" + +#ifndef RN42_BAUD_RATE +#    define RN42_BAUD_RATE 115200 +#endif + +// https://cdn.sparkfun.com/datasheets/Wireless/Bluetooth/bluetooth_cr_UG-v1.0r.pdf#G7.663734 +static inline uint16_t rn42_consumer_usage_to_bitmap(uint16_t usage) { +    switch (usage) { +        case AC_HOME: +            return 0x0001; +        case AL_EMAIL: +            return 0x0002; +        case AC_SEARCH: +            return 0x0004; +        case AL_KEYBOARD_LAYOUT: +            return 0x0008; +        case AUDIO_VOL_UP: +            return 0x0010; +        case AUDIO_VOL_DOWN: +            return 0x0020; +        case AUDIO_MUTE: +            return 0x0040; +        case TRANSPORT_PLAY_PAUSE: +            return 0x0080; +        case TRANSPORT_NEXT_TRACK: +            return 0x0100; +        case TRANSPORT_PREV_TRACK: +            return 0x0200; +        case TRANSPORT_STOP: +            return 0x0400; +        case TRANSPORT_EJECT: +            return 0x0800; +        case TRANSPORT_FAST_FORWARD: +            return 0x1000; +        case TRANSPORT_REWIND: +            return 0x2000; +        case TRANSPORT_STOP_EJECT: +            return 0x4000; +        case AL_LOCAL_BROWSER: +            return 0x8000; +        default: +            return 0; +    } +} + +void rn42_init(void) { uart_init(RN42_BAUD_RATE); } + +void rn42_send_keyboard(report_keyboard_t *report) { +    uart_write(0xFD); +    uart_write(0x09); +    uart_write(0x01); +    uart_write(report->mods); +    uart_write(0x00); +    for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { +        uart_write(report->keys[i]); +    } +} + +void rn42_send_mouse(report_mouse_t *report) { +    uart_write(0xFD); +    uart_write(0x00); +    uart_write(0x03); +    uart_write(report->buttons); +    uart_write(report->x); +    uart_write(report->y); +    uart_write(report->v);  // should try sending the wheel v here +    uart_write(report->h);  // should try sending the wheel h here +    uart_write(0x00); +} + +void rn42_send_consumer(uint16_t data) { +    static uint16_t last_data = 0; +    if (data == last_data) return; +    last_data       = data; +    uint16_t bitmap = rn42_consumer_usage_to_bitmap(data); +    uart_write(0xFD); +    uart_write(0x03); +    uart_write(0x03); +    uart_write(bitmap & 0xFF); +    uart_write((bitmap >> 8) & 0xFF); +} diff --git a/drivers/bluetooth/rn42.h b/drivers/bluetooth/rn42.h new file mode 100644 index 0000000000..4747759111 --- /dev/null +++ b/drivers/bluetooth/rn42.h @@ -0,0 +1,25 @@ +/* Copyright 2021 + * + * 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 "report.h" + +void rn42_init(void); + +void rn42_send_keyboard(report_keyboard_t *report); + +void rn42_send_mouse(report_mouse_t *report); + +void rn42_send_consumer(uint16_t data);  | 
