diff options
Diffstat (limited to 'tmk_core')
-rw-r--r-- | tmk_core/avr.mk | 13 | ||||
-rw-r--r-- | tmk_core/chibios.mk | 1 | ||||
-rw-r--r-- | tmk_core/common.mk | 1 | ||||
-rw-r--r-- | tmk_core/common/action.c | 27 | ||||
-rw-r--r-- | tmk_core/common/action_code.h | 2 | ||||
-rw-r--r-- | tmk_core/common/action_layer.c | 2 | ||||
-rw-r--r-- | tmk_core/common/action_layer.h | 15 | ||||
-rw-r--r-- | tmk_core/common/action_util.c | 54 | ||||
-rw-r--r-- | tmk_core/common/action_util.h | 8 | ||||
-rw-r--r-- | tmk_core/common/keyboard.c | 9 | ||||
-rw-r--r-- | tmk_core/common/report.h | 2 | ||||
-rw-r--r-- | tmk_core/common/sendchar_null.c | 2 | ||||
-rw-r--r-- | tmk_core/protocol/bluefruit.mk | 11 | ||||
-rw-r--r-- | tmk_core/protocol/bluefruit/bluefruit.c | 168 | ||||
-rw-r--r-- | tmk_core/protocol/bluefruit/bluefruit.h | 24 | ||||
-rw-r--r-- | tmk_core/protocol/bluefruit/main.c | 87 | ||||
-rw-r--r-- | tmk_core/protocol/ibm4704.c | 4 | ||||
-rw-r--r-- | tmk_core/protocol/lufa/lufa.c | 2 | ||||
-rw-r--r-- | tmk_core/protocol/vusb.mk | 7 | ||||
-rw-r--r-- | tmk_core/protocol/vusb/main.c | 47 | ||||
-rw-r--r-- | tmk_core/protocol/vusb/usbconfig.h | 16 | ||||
-rw-r--r-- | tmk_core/protocol/vusb/vusb.c | 279 | ||||
-rw-r--r-- | tmk_core/protocol/vusb/vusb.h | 23 | ||||
-rw-r--r-- | tmk_core/ring_buffer.h | 13 |
24 files changed, 434 insertions, 383 deletions
diff --git a/tmk_core/avr.mk b/tmk_core/avr.mk index f5c1257712..04ae162246 100644 --- a/tmk_core/avr.mk +++ b/tmk_core/avr.mk @@ -156,17 +156,20 @@ dfu-split-right: $(BUILD_DIR)/$(TARGET).hex cpfirmware check-size define EXEC_AVRDUDE USB= ;\ if $(GREP) -q -s Microsoft /proc/version; then \ - echo 'ERROR: AVR flashing cannot be automated within the Windows Subsystem for Linux (WSL) currently. Instead, take the .hex file generated and flash it using AVRDUDE, AVRDUDESS, or XLoader.'; \ + echo 'ERROR: AVR flashing cannot be automated within the Windows Subsystem for Linux (WSL) currently. Instead, take the .hex file generated and flash it using QMK Toolbox, AVRDUDE, AVRDUDESS, or XLoader.'; \ else \ printf "Detecting USB port, reset your controller now."; \ - ls /dev/tty* > /tmp/1; \ + TMP1=`mktemp`; \ + TMP2=`mktemp`; \ + ls /dev/tty* > $$TMP1; \ while [ -z $$USB ]; do \ sleep 0.5; \ printf "."; \ - ls /dev/tty* > /tmp/2; \ - USB=`comm -13 /tmp/1 /tmp/2 | $(GREP) -o '/dev/tty.*'`; \ - mv /tmp/2 /tmp/1; \ + ls /dev/tty* > $$TMP2; \ + USB=`comm -13 $$TMP1 $$TMP2 | $(GREP) -o '/dev/tty.*'`; \ + mv $$TMP2 $$TMP1; \ done; \ + rm $$TMP1; \ echo ""; \ echo "Device $$USB has appeared; assuming it is the controller."; \ if $(GREP) -q -s 'MINGW\|MSYS' /proc/version; then \ diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk index 6bacabbbf3..d0f1032acb 100644 --- a/tmk_core/chibios.mk +++ b/tmk_core/chibios.mk @@ -233,7 +233,6 @@ LDFLAGS += -mno-thumb-interwork -mthumb LDSYMBOLS =,--defsym=__process_stack_size__=$(USE_PROCESS_STACKSIZE) LDSYMBOLS :=$(LDSYMBOLS),--defsym=__main_stack_size__=$(USE_EXCEPTIONS_STACKSIZE) LDFLAGS += -Wl,--script=$(LDSCRIPT)$(LDSYMBOLS) -LDFLAGS += --specs=nano.specs OPT_DEFS += -DPROTOCOL_CHIBIOS diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 3d0b83a01c..aa8a0eb7ad 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -10,6 +10,7 @@ TMK_COMMON_SRC += $(COMMON_DIR)/host.c \ $(COMMON_DIR)/action_util.c \ $(COMMON_DIR)/print.c \ $(COMMON_DIR)/debug.c \ + $(COMMON_DIR)/sendchar_null.c \ $(COMMON_DIR)/util.c \ $(COMMON_DIR)/eeconfig.c \ $(COMMON_DIR)/report.c \ diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index e5e9e27052..3b1268dc94 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -98,6 +98,11 @@ void action_exec(keyevent_t event) { if (has_oneshot_mods_timed_out()) { clear_oneshot_mods(); } +# ifdef SWAP_HANDS_ENABLE + if (has_oneshot_swaphands_timed_out()) { + clear_oneshot_swaphands(); + } +# endif # endif #endif @@ -165,6 +170,8 @@ void process_record_tap_hint(keyrecord_t *record) { # ifdef SWAP_HANDS_ENABLE case ACT_SWAP_HANDS: switch (action.swap.code) { + case OP_SH_ONESHOT: + break; case OP_SH_TAP_TOGGLE: default: swap_hands = !swap_hands; @@ -224,7 +231,11 @@ void process_action(keyrecord_t *record, action_t action) { #ifndef NO_ACTION_ONESHOT bool do_release_oneshot = false; // notice we only clear the one shot layer if the pressed key is not a modifier. - if (is_oneshot_layer_active() && event.pressed && !IS_MOD(action.key.code)) { + if (is_oneshot_layer_active() && event.pressed && !IS_MOD(action.key.code) +# ifdef SWAP_HANDS_ENABLE + && !(action.kind.id == ACT_SWAP_HANDS && action.swap.code == OP_SH_ONESHOT) +# endif + ) { clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); do_release_oneshot = !is_oneshot_layer_active(); } @@ -593,6 +604,14 @@ void process_action(keyrecord_t *record, action_t action) { swap_hands = false; } break; + case OP_SH_ONESHOT: + if (event.pressed) { + set_oneshot_swaphands(); + } else { + release_oneshot_swaphands(); + } + break; + # ifndef NO_ACTION_TAPPING case OP_SH_TAP_TOGGLE: /* tap toggle */ @@ -681,6 +700,12 @@ void process_action(keyrecord_t *record, action_t action) { # endif #endif +#ifdef SWAP_HANDS_ENABLE + if (event.pressed && !(action.kind.id == ACT_SWAP_HANDS && action.swap.code == OP_SH_ONESHOT)) { + use_oneshot_swaphands(); + } +#endif + #ifndef NO_ACTION_ONESHOT /* Because we switch layers after a oneshot event, we need to release the * key before we leave the layer or no key up event will be generated. diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h index f80b7a782e..eea554ff21 100644 --- a/tmk_core/common/action_code.h +++ b/tmk_core/common/action_code.h @@ -294,11 +294,13 @@ enum swap_hands_param_tap_op { OP_SH_OFF_ON, OP_SH_OFF, OP_SH_ON, + OP_SH_ONESHOT, }; #define ACTION_SWAP_HANDS() ACTION_SWAP_HANDS_ON_OFF() #define ACTION_SWAP_HANDS_TOGGLE() ACTION(ACT_SWAP_HANDS, OP_SH_TOGGLE) #define ACTION_SWAP_HANDS_TAP_TOGGLE() ACTION(ACT_SWAP_HANDS, OP_SH_TAP_TOGGLE) +#define ACTION_SWAP_HANDS_ONESHOT() ACTION(ACT_SWAP_HANDS, OP_SH_ONESHOT) #define ACTION_SWAP_HANDS_TAP_KEY(key) ACTION(ACT_SWAP_HANDS, key) #define ACTION_SWAP_HANDS_ON_OFF() ACTION(ACT_SWAP_HANDS, OP_SH_ON_OFF) #define ACTION_SWAP_HANDS_OFF_ON() ACTION(ACT_SWAP_HANDS, OP_SH_OFF_ON) diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index 81f86f0f34..af2d7d964b 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -257,7 +257,7 @@ uint8_t layer_switch_get_layer(keypos_t key) { layer_state_t layers = layer_state | default_layer_state; /* check top layer first */ - for (int8_t i = sizeof(layer_state_t) * 8 - 1; i >= 0; i--) { + for (int8_t i = MAX_LAYER - 1; i >= 0; i--) { if (layers & (1UL << i)) { action = action_for_key(i, key); if (action.code != ACTION_TRANSPARENT) { diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h index c283d26232..16922c1ff9 100644 --- a/tmk_core/common/action_layer.h +++ b/tmk_core/common/action_layer.h @@ -23,12 +23,24 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #if defined(LAYER_STATE_8BIT) typedef uint8_t layer_state_t; +# define MAX_LAYER_BITS 3 +# ifndef MAX_LAYER +# define MAX_LAYER 8 +# endif # define get_highest_layer(state) biton(state) #elif defined(LAYER_STATE_16BIT) typedef uint16_t layer_state_t; +# define MAX_LAYER_BITS 4 +# ifndef MAX_LAYER +# define MAX_LAYER 16 +# endif # define get_highest_layer(state) biton16(state) #else typedef uint32_t layer_state_t; +# define MAX_LAYER_BITS 5 +# ifndef MAX_LAYER +# define MAX_LAYER 32 +# endif # define get_highest_layer(state) biton32(state) #endif @@ -96,8 +108,7 @@ layer_state_t layer_state_set_kb(layer_state_t state); /* pressed actions cache */ #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) -/* The number of bits needed to represent the layer number: log2(32). */ -# define MAX_LAYER_BITS 5 + void update_source_layers_cache(keypos_t key, uint8_t layer); uint8_t read_source_layers_cache(keypos_t key); #endif diff --git a/tmk_core/common/action_util.c b/tmk_core/common/action_util.c index 335aa36e62..371acfa610 100644 --- a/tmk_core/common/action_util.c +++ b/tmk_core/common/action_util.c @@ -83,9 +83,63 @@ static int8_t oneshot_layer_data = 0; inline uint8_t get_oneshot_layer(void) { return oneshot_layer_data >> 3; } inline uint8_t get_oneshot_layer_state(void) { return oneshot_layer_data & 0b111; } +# ifdef SWAP_HANDS_ENABLE +enum { + SHO_OFF, + SHO_ACTIVE, // Swap hands button was pressed, and we didn't send any swapped keys yet + SHO_PRESSED, // Swap hands button is currently pressed + SHO_USED, // Swap hands button is still pressed, and we already sent swapped keys +} swap_hands_oneshot = SHO_OFF; +# endif + # if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) static uint16_t oneshot_layer_time = 0; inline bool has_oneshot_layer_timed_out() { return TIMER_DIFF_16(timer_read(), oneshot_layer_time) >= ONESHOT_TIMEOUT && !(get_oneshot_layer_state() & ONESHOT_TOGGLED); } +# ifdef SWAP_HANDS_ENABLE +static uint16_t oneshot_swaphands_time = 0; +inline bool has_oneshot_swaphands_timed_out() { return TIMER_DIFF_16(timer_read(), oneshot_swaphands_time) >= ONESHOT_TIMEOUT && !(swap_hands_oneshot >= SHO_PRESSED); } +# endif +# endif + +# ifdef SWAP_HANDS_ENABLE + +void set_oneshot_swaphands(void) { + swap_hands_oneshot = SHO_PRESSED; + swap_hands = true; +# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) + oneshot_swaphands_time = timer_read(); + if (oneshot_layer_time != 0) { + oneshot_layer_time = oneshot_swaphands_time; + } +# endif +} + +void release_oneshot_swaphands(void) { + if (swap_hands_oneshot == SHO_PRESSED) { + swap_hands_oneshot = SHO_ACTIVE; + } + if (swap_hands_oneshot == SHO_USED) { + clear_oneshot_swaphands(); + } +} + +void use_oneshot_swaphands(void) { + if (swap_hands_oneshot == SHO_PRESSED) { + swap_hands_oneshot = SHO_USED; + } + if (swap_hands_oneshot == SHO_ACTIVE) { + clear_oneshot_swaphands(); + } +} + +void clear_oneshot_swaphands(void) { + swap_hands_oneshot = SHO_OFF; + swap_hands = false; +# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) + oneshot_swaphands_time = 0; +# endif +} + # endif /** \brief Set oneshot layer diff --git a/tmk_core/common/action_util.h b/tmk_core/common/action_util.h index 1ce03ed0e4..5dd8393da4 100644 --- a/tmk_core/common/action_util.h +++ b/tmk_core/common/action_util.h @@ -77,6 +77,7 @@ void reset_oneshot_layer(void); bool is_oneshot_layer_active(void); uint8_t get_oneshot_layer_state(void); bool has_oneshot_layer_timed_out(void); +bool has_oneshot_swaphands_timed_out(void); void oneshot_locked_mods_changed_user(uint8_t mods); void oneshot_locked_mods_changed_kb(uint8_t mods); @@ -88,6 +89,13 @@ void oneshot_layer_changed_kb(uint8_t layer); /* inspect */ uint8_t has_anymod(void); +#ifdef SWAP_HANDS_ENABLE +void set_oneshot_swaphands(void); +void release_oneshot_swaphands(void); +void use_oneshot_swaphands(void); +void clear_oneshot_swaphands(void); +#endif + #ifdef __cplusplus } #endif diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index a767d9c877..53d08959e8 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -213,6 +213,13 @@ void keyboard_setup(void) { */ __attribute__((weak)) bool is_keyboard_master(void) { return true; } +/** \brief should_process_keypress + * + * Override this function if you have a condition where keypresses processing should change: + * - splits where the slave side needs to process for rgb/oled functionality + */ +__attribute__((weak)) bool should_process_keypress(void) { return is_keyboard_master(); } + /** \brief keyboard_init * * FIXME: needs doc @@ -292,7 +299,7 @@ void keyboard_task(void) { matrix_scan(); #endif - if (is_keyboard_master()) { + if (should_process_keypress()) { for (uint8_t r = 0; r < MATRIX_ROWS; r++) { matrix_row = matrix_get_row(r); matrix_change = matrix_row ^ matrix_prev[r]; diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 61ef6ea66c..c2b1b7c710 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -69,6 +69,8 @@ enum consumer_usages { AL_CALCULATOR = 0x192, AL_LOCAL_BROWSER = 0x194, AL_LOCK = 0x19E, + AL_CONTROL_PANEL = 0x19F, + AL_ASSISTANT = 0x1CB, // 15.16 Generic GUI Application Controls AC_MINIMIZE = 0x206, AC_SEARCH = 0x221, diff --git a/tmk_core/common/sendchar_null.c b/tmk_core/common/sendchar_null.c index f6cab1b9d1..fb67f70866 100644 --- a/tmk_core/common/sendchar_null.c +++ b/tmk_core/common/sendchar_null.c @@ -16,4 +16,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "sendchar.h" -int8_t sendchar(uint8_t c) { return 0; } +__attribute__((weak)) int8_t sendchar(uint8_t c) { return 0; } diff --git a/tmk_core/protocol/bluefruit.mk b/tmk_core/protocol/bluefruit.mk deleted file mode 100644 index 13a0693c57..0000000000 --- a/tmk_core/protocol/bluefruit.mk +++ /dev/null @@ -1,11 +0,0 @@ -BLUEFRUIT_DIR = protocol/bluefruit - -SRC += $(BLUEFRUIT_DIR)/main.c \ - $(BLUEFRUIT_DIR)/bluefruit.c \ - serial_uart.c - -# Search Path -VPATH += $(TMK_DIR)/$(BLUEFRUIT_DIR) -#VPATH += $(TMK_DIR)/$(BLUEFRUIT_DIR)/usb_debug_only - -OPT_DEFS += -DPROTOCOL_BLUEFRUIT diff --git a/tmk_core/protocol/bluefruit/bluefruit.c b/tmk_core/protocol/bluefruit/bluefruit.c deleted file mode 100644 index fb001855ea..0000000000 --- a/tmk_core/protocol/bluefruit/bluefruit.c +++ /dev/null @@ -1,168 +0,0 @@ -/* -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> -#include "host.h" -#include "report.h" -#include "print.h" -#include "debug.h" -#include "host_driver.h" -#include "serial.h" -#include "bluefruit.h" - -#define BLUEFRUIT_TRACE_SERIAL 1 - -static uint8_t bluefruit_keyboard_leds = 0; - -static void bluefruit_serial_send(uint8_t); - -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"); -} - -#ifdef BLUEFRUIT_TRACE_SERIAL -static void bluefruit_trace_header() { - dprintf("+------------------------------------+\n"); - dprintf("| HID report to Bluefruit via serial |\n"); - dprintf("+------------------------------------+\n|"); -} - -static void bluefruit_trace_footer() { dprintf("|\n+------------------------------------+\n\n"); } -#endif - -static void bluefruit_serial_send(uint8_t data) { -#ifdef BLUEFRUIT_TRACE_SERIAL - dprintf(" "); - debug_hex8(data); - dprintf(" "); -#endif - serial_send(data); -} - -/*------------------------------------------------------------------* - * Host driver - *------------------------------------------------------------------*/ - -static uint8_t keyboard_leds(void); -static void send_keyboard(report_keyboard_t *report); -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, send_mouse, send_system, send_consumer}; - -host_driver_t *bluefruit_driver(void) { return &driver; } - -static uint8_t keyboard_leds(void) { return bluefruit_keyboard_leds; } - -static void send_keyboard(report_keyboard_t *report) { -#ifdef BLUEFRUIT_TRACE_SERIAL - bluefruit_trace_header(); -#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 - bluefruit_trace_footer(); -#endif -} - -static void send_mouse(report_mouse_t *report) { -#ifdef BLUEFRUIT_TRACE_SERIAL - bluefruit_trace_header(); -#endif - 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); -#ifdef BLUEFRUIT_TRACE_SERIAL - bluefruit_trace_footer(); -#endif -} - -static void send_system(uint16_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))))))))))))))))))) - -static void send_consumer(uint16_t data) { - static uint16_t last_data = 0; - if (data == last_data) return; - last_data = data; - - uint16_t bitmap = CONSUMER2BLUEFRUIT(data); - -#ifdef BLUEFRUIT_TRACE_SERIAL - dprintf("\nData: "); - debug_hex16(data); - dprintf("; bitmap: "); - debug_hex16(bitmap); - dprintf("\n"); - bluefruit_trace_header(); -#endif - 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); -#ifdef BLUEFRUIT_TRACE_SERIAL - bluefruit_trace_footer(); -#endif -}
\ No newline at end of file diff --git a/tmk_core/protocol/bluefruit/bluefruit.h b/tmk_core/protocol/bluefruit/bluefruit.h deleted file mode 100644 index 7b636abb95..0000000000 --- a/tmk_core/protocol/bluefruit/bluefruit.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -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/>. -*/ - -#ifndef VUSB_H -#define VUSB_H - -#include "host_driver.h" - -host_driver_t *bluefruit_driver(void); - -#endif
\ No newline at end of file diff --git a/tmk_core/protocol/bluefruit/main.c b/tmk_core/protocol/bluefruit/main.c deleted file mode 100644 index aca46206d5..0000000000 --- a/tmk_core/protocol/bluefruit/main.c +++ /dev/null @@ -1,87 +0,0 @@ -/* -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> -#include <avr/interrupt.h> -#include <avr/wdt.h> -#include <avr/sleep.h> -#include <util/delay.h> -#include "../serial.h" -#include "keyboard.h" -#include "host.h" -#include "timer.h" -#include "print.h" -#include "debug.h" -#include "sendchar.h" -#include "suspend.h" -#include "bluefruit.h" - -#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) - -int main(void) { - CPU_PRESCALE(0); - - // DDRD = _BV(PD5); - // DDRB = _BV(PB0); - - // PORTD = _BV(PD5); - // PORTB = _BV(PB0); - - print_set_sendchar(sendchar); - - keyboard_setup(); - - dprintf("Initializing keyboard...\n"); - keyboard_init(); - - dprintf("Setting host driver to bluefruit...\n"); - host_set_driver(bluefruit_driver()); - - dprintf("Initializing serial...\n"); - serial_init(); - - // 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]); - // } - - // 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(); - } -} diff --git a/tmk_core/protocol/ibm4704.c b/tmk_core/protocol/ibm4704.c index fd8fc4dbd5..a19443976e 100644 --- a/tmk_core/protocol/ibm4704.c +++ b/tmk_core/protocol/ibm4704.c @@ -161,7 +161,9 @@ ISR(IBM4704_INT_VECT) { case STOP: // Data:Low WAIT(data_lo, 100, state); - rbuf_enqueue(data); + if (!rbuf_enqueue(data)) { + print("rbuf: full\n"); + } ibm4704_error = IBM4704_ERR_NONE; goto DONE; break; diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index d673841fd5..374add20f9 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -801,8 +801,6 @@ ERROR_EXIT: Endpoint_SelectEndpoint(ep); return -1; } -#else -int8_t sendchar(uint8_t c) { return 0; } #endif /******************************************************************************* diff --git a/tmk_core/protocol/vusb.mk b/tmk_core/protocol/vusb.mk index 897b833e1a..6df0d0d339 100644 --- a/tmk_core/protocol/vusb.mk +++ b/tmk_core/protocol/vusb.mk @@ -9,13 +9,12 @@ SRC += $(VUSB_DIR)/main.c \ $(VUSB_DIR)/usbdrv/oddebug.c -ifdef NO_UART -SRC += $(COMMON_DIR)/sendchar_null.c -else +ifneq ($(strip $(CONSOLE_ENABLE)), yes) +ifndef NO_UART SRC += $(COMMON_DIR)/sendchar_uart.c \ $(COMMON_DIR)/uart.c endif - +endif # Search Path VPATH += $(TMK_PATH)/$(VUSB_DIR) diff --git a/tmk_core/protocol/vusb/main.c b/tmk_core/protocol/vusb/main.c index 610638e7d4..7dc16926d2 100644 --- a/tmk_core/protocol/vusb/main.c +++ b/tmk_core/protocol/vusb/main.c @@ -21,12 +21,23 @@ #include "uart.h" #include "debug.h" #include "suspend.h" +#include "wait.h" +#include "sendchar.h" + #ifdef SLEEP_LED_ENABLE # include "sleep_led.h" #endif #define UART_BAUD_RATE 115200 +#ifdef CONSOLE_ENABLE +void console_task(void); +#endif + +#ifdef RAW_ENABLE +void raw_hid_task(void); +#endif + /* This is from main.c of USBaspLoader */ static void initForUsbConnectivity(void) { uint8_t i = 0; @@ -39,10 +50,9 @@ static void initForUsbConnectivity(void) { _delay_ms(1); } usbDeviceConnect(); - sei(); } -void usb_remote_wakeup(void) { +static void usb_remote_wakeup(void) { cli(); int8_t ddr_orig = USBDDR; @@ -59,6 +69,23 @@ void usb_remote_wakeup(void) { sei(); } +/** \brief Setup USB + * + * FIXME: Needs doc + */ +static void setup_usb(void) { + // debug("initForUsbConnectivity()\n"); + initForUsbConnectivity(); + + // for Console_Task + print_set_sendchar(sendchar); +} + +/** \brief Main + * + * FIXME: Needs doc + */ +int main(void) __attribute__((weak)); int main(void) { bool suspended = false; #if USB_COUNT_SOF @@ -76,8 +103,10 @@ int main(void) { keyboard_setup(); host_set_driver(vusb_driver()); - debug("initForUsbConnectivity()\n"); - initForUsbConnectivity(); + setup_usb(); + sei(); + + wait_ms(50); keyboard_init(); #ifdef SLEEP_LED_ENABLE @@ -120,12 +149,13 @@ int main(void) { if (!suspended) { usbPoll(); - // TODO: configuration process is incosistent. it sometime fails. + // TODO: configuration process is inconsistent. it sometime fails. // To prevent failing to configure NOT scan keyboard during configuration if (usbConfiguration && usbInterruptIsReady()) { keyboard_task(); } vusb_transfer_keyboard(); + #ifdef RAW_ENABLE usbPoll(); @@ -133,6 +163,13 @@ int main(void) { raw_hid_task(); } #endif +#ifdef CONSOLE_ENABLE + usbPoll(); + + if (usbConfiguration && usbInterruptIsReady3()) { + console_task(); + } +#endif } else if (suspend_wakeup_condition()) { usb_remote_wakeup(); } diff --git a/tmk_core/protocol/vusb/usbconfig.h b/tmk_core/protocol/vusb/usbconfig.h index f118dc8ede..dcef7584c4 100644 --- a/tmk_core/protocol/vusb/usbconfig.h +++ b/tmk_core/protocol/vusb/usbconfig.h @@ -24,15 +24,21 @@ section at the end of this file). /* ---------------------------- Hardware Config ---------------------------- */ +#ifndef USB_CFG_IOPORTNAME #define USB_CFG_IOPORTNAME D +#endif /* This is the port where the USB bus is connected. When you configure it to * "B", the registers PORTB, PINB and DDRB will be used. */ +#ifndef USB_CFG_DMINUS_BIT #define USB_CFG_DMINUS_BIT 3 +#endif /* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. * This may be any bit in the port. */ +#ifndef USB_CFG_DPLUS_BIT #define USB_CFG_DPLUS_BIT 2 +#endif /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. * This may be any bit in the port. Please note that D+ must also be connected * to interrupt pin INT0! [You can also use other interrupts, see section @@ -151,7 +157,9 @@ section at the end of this file). /* This macro (if defined) is executed when a |