summaryrefslogtreecommitdiff
path: root/tmk_core
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core')
-rw-r--r--tmk_core/avr.mk1
-rw-r--r--tmk_core/chibios.mk6
-rw-r--r--tmk_core/common.mk11
-rw-r--r--tmk_core/common/avr/bootloader.c54
-rw-r--r--tmk_core/common/keyboard.c19
-rw-r--r--tmk_core/common/keycode.h7
-rw-r--r--tmk_core/common/matrix.h5
-rw-r--r--tmk_core/protocol/chibios/main.c45
-rw-r--r--tmk_core/rules.mk81
9 files changed, 154 insertions, 75 deletions
diff --git a/tmk_core/avr.mk b/tmk_core/avr.mk
index 72be5e6da..3bf2b34f8 100644
--- a/tmk_core/avr.mk
+++ b/tmk_core/avr.mk
@@ -10,6 +10,7 @@ AR = avr-ar rcs
NM = avr-nm
HEX = $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature
EEP = $(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT)
+BIN =
diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk
index 0abb933a8..cb67ac6f2 100644
--- a/tmk_core/chibios.mk
+++ b/tmk_core/chibios.mk
@@ -113,6 +113,7 @@ AR = arm-none-eabi-ar
NM = arm-none-eabi-nm
HEX = $(OBJCOPY) -O $(FORMAT)
EEP =
+BIN = $(OBJCOPY) -O binary
THUMBFLAGS = -DTHUMB_PRESENT -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -mthumb -DTHUMB
@@ -151,4 +152,7 @@ else ifneq ("$(wildcard $(KEYBOARD_PATH)/boards/$(BOARD)/bootloader_defs.h)","")
endif
# List any extra directories to look for libraries here.
-EXTRALIBDIRS = $(RULESPATH)/ld \ No newline at end of file
+EXTRALIBDIRS = $(RULESPATH)/ld
+
+dfu-util: $(BUILD_DIR)/$(TARGET).bin sizeafter
+ dfu-util -D $(BUILD_DIR)/$(TARGET).bin \ No newline at end of file
diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index d71fba9bc..aa05b9491 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -97,8 +97,17 @@ ifeq ($(strip $(KEYMAP_SECTION_ENABLE)), yes)
endif
endif
+ifeq ($(MASTER),right)
+ OPT_DEFS += -DMASTER_IS_ON_RIGHT
+else
+ ifneq ($(MASTER),left)
+$(error MASTER does not have a valid value(left/right))
+ endif
+endif
+
+
# Version string
-OPT_DEFS += -DVERSION=$(shell (git describe --always --dirty || echo 'unknown') 2> /dev/null)
+OPT_DEFS += -DVERSION=$(GIT_VERSION)
# Bootloader address
ifdef STM32_BOOTLOADER_ADDRESS
diff --git a/tmk_core/common/avr/bootloader.c b/tmk_core/common/avr/bootloader.c
index 7c744e8c7..fb9bf2d1c 100644
--- a/tmk_core/common/avr/bootloader.c
+++ b/tmk_core/common/avr/bootloader.c
@@ -73,26 +73,46 @@ uint32_t reset_key __attribute__ ((section (".noinit")));
/* initialize MCU status by watchdog reset */
void bootloader_jump(void) {
-#ifdef PROTOCOL_LUFA
- USB_Disable();
- cli();
- _delay_ms(2000);
-#endif
+ #ifndef CATERINA_BOOTLOADER
-#ifdef PROTOCOL_PJRC
- cli();
- UDCON = 1;
- USBCON = (1<<FRZCLK);
- UCSR1B = 0;
- _delay_ms(5);
-#endif
+ #ifdef PROTOCOL_LUFA
+ USB_Disable();
+ cli();
+ _delay_ms(2000);
+ #endif
- // watchdog reset
- reset_key = BOOTLOADER_RESET_KEY;
- wdt_enable(WDTO_250MS);
- for (;;);
-}
+ #ifdef PROTOCOL_PJRC
+ cli();
+ UDCON = 1;
+ USBCON = (1<<FRZCLK);
+ UCSR1B = 0;
+ _delay_ms(5);
+ #endif
+
+ // watchdog reset
+ reset_key = BOOTLOADER_RESET_KEY;
+ wdt_enable(WDTO_250MS);
+ for (;;);
+
+ #else
+ // this block may be optional
+ // TODO: figure it out
+
+ uint16_t *const bootKeyPtr = (uint16_t *)0x0800;
+ // Value used by Caterina bootloader use to determine whether to run the
+ // sketch or the bootloader programmer.
+ uint16_t bootKey = 0x7777;
+
+ *bootKeyPtr = bootKey;
+
+ // setup watchdog timeout
+ wdt_enable(WDTO_60MS);
+
+ while(1) {} // wait for watchdog timer to trigger
+
+ #endif
+}
/* this runs before main() */
void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3")));
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c
index 81df8eb73..c46a701b3 100644
--- a/tmk_core/common/keyboard.c
+++ b/tmk_core/common/keyboard.c
@@ -29,6 +29,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "sendchar.h"
#include "eeconfig.h"
#include "backlight.h"
+#include "action_layer.h"
#ifdef BOOTMAGIC_ENABLE
# include "bootmagic.h"
#else
@@ -49,6 +50,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifdef RGBLIGHT_ENABLE
# include "rgblight.h"
#endif
+#ifdef SERIAL_LINK_ENABLE
+# include "serial_link/system/serial_link.h"
+#endif
+#ifdef VISUALIZER_ENABLE
+# include "visualizer/visualizer.h"
+#endif
#ifdef MATRIX_HAS_GHOST
static bool has_ghost_in_row(uint8_t row)
@@ -167,11 +174,19 @@ MATRIX_LOOP_END:
#endif
#ifdef SERIAL_MOUSE_ENABLE
- serial_mouse_task();
+ serial_mouse_task();
#endif
#ifdef ADB_MOUSE_ENABLE
- adb_mouse_task();
+ adb_mouse_task();
+#endif
+
+#ifdef SERIAL_LINK_ENABLE
+ serial_link_update();
+#endif
+
+#ifdef VISUALIZER_ENABLE
+ visualizer_update(default_layer_state, layer_state, host_keyboard_leds());
#endif
// update LED
diff --git a/tmk_core/common/keycode.h b/tmk_core/common/keycode.h
index 448195306..2f208c54e 100644
--- a/tmk_core/common/keycode.h
+++ b/tmk_core/common/keycode.h
@@ -31,7 +31,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define IS_SPECIAL(code) ((0xA5 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF))
#define IS_SYSTEM(code) (KC_PWR <= (code) && (code) <= KC_WAKE)
-#define IS_CONSUMER(code) (KC_MUTE <= (code) && (code) <= KC_WFAV)
+#define IS_CONSUMER(code) (KC_MUTE <= (code) && (code) <= KC_MRWD)
#define IS_FN(code) (KC_FN0 <= (code) && (code) <= KC_FN31)
#define IS_MOUSEKEY(code) (KC_MS_UP <= (code) && (code) <= KC_MS_ACCEL2)
#define IS_MOUSEKEY_MOVE(code) (KC_MS_UP <= (code) && (code) <= KC_MS_RIGHT)
@@ -156,8 +156,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define KC_WSTP KC_WWW_STOP
#define KC_WREF KC_WWW_REFRESH
#define KC_WFAV KC_WWW_FAVORITES
-/* Jump to bootloader */
-#define KC_BTLD KC_BOOTLOADER
/* Transparent */
#define KC_TRANSPARENT 1
#define KC_TRNS KC_TRANSPARENT
@@ -428,9 +426,6 @@ enum internal_special_keycodes {
KC_MEDIA_FAST_FORWARD,
KC_MEDIA_REWIND, /* 0xBC */
- /* Jump to bootloader */
- KC_BOOTLOADER = 0xBF,
-
/* Fn key */
KC_FN0 = 0xC0,
KC_FN1,
diff --git a/tmk_core/common/matrix.h b/tmk_core/common/matrix.h
index 71153a5f5..cee3593ee 100644
--- a/tmk_core/common/matrix.h
+++ b/tmk_core/common/matrix.h
@@ -72,6 +72,11 @@ void matrix_scan_kb(void);
void matrix_init_user(void);
void matrix_scan_user(void);
+#ifdef I2C_SPLIT
+ void slave_matrix_init(void);
+ uint8_t slave_matrix_scan(void);
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c
index 54bb6a8f5..b0eb9aef8 100644
--- a/tmk_core/protocol/chibios/main.c
+++ b/tmk_core/protocol/chibios/main.c
@@ -35,6 +35,12 @@
#ifdef SLEEP_LED_ENABLE
#include "sleep_led.h"
#endif
+#ifdef SERIAL_LINK_ENABLE
+#include "serial_link/system/serial_link.h"
+#endif
+#ifdef VISUALIZER_ENABLE
+#include "visualizer/visualizer.h"
+#endif
#include "suspend.h"
@@ -98,9 +104,32 @@ int main(void) {
/* init printf */
init_printf(NULL,sendchar_pf);
- /* Wait until the USB is active */
- while(USB_DRIVER.state != USB_ACTIVE)
+#ifdef SERIAL_LINK_ENABLE
+ init_serial_link();
+#endif
+
+#ifdef VISUALIZER_ENABLE
+ visualizer_init();
+#endif
+
+
+ host_driver_t* driver = NULL;
+
+ /* Wait until the USB or serial link is active */
+ while (true) {
+ if(USB_DRIVER.state == USB_ACTIVE) {
+ driver = &chibios_driver;
+ break;
+ }
+#ifdef SERIAL_LINK_ENABLE
+ if(is_serial_link_connected()) {
+ driver = get_serial_link_driver();
+ break;
+ }
+ serial_link_update();
+#endif
chThdSleepMilliseconds(50);
+ }
/* Do need to wait here!
* Otherwise the next print might start a transfer on console EP
@@ -113,7 +142,7 @@ int main(void) {
/* init TMK modules */
keyboard_init();
- host_set_driver(&chibios_driver);
+ host_set_driver(driver);
#ifdef SLEEP_LED_ENABLE
sleep_led_init();
@@ -126,8 +155,14 @@ int main(void) {
if(USB_DRIVER.state == USB_SUSPENDED) {
print("[s]");
+#ifdef VISUALIZER_ENABLE
+ visualizer_suspend();
+#endif
while(USB_DRIVER.state == USB_SUSPENDED) {
/* Do this in the suspended state */
+#ifdef SERIAL_LINK_ENABLE
+ serial_link_update();
+#endif
suspend_power_down(); // on AVR this deep sleeps for 15ms
/* Remote wakeup */
if((USB_DRIVER.status & 2) && suspend_wakeup_condition()) {
@@ -140,6 +175,10 @@ int main(void) {
#ifdef MOUSEKEY_ENABLE
mousekey_send();
#endif /* MOUSEKEY_ENABLE */
+
+#ifdef VISUALIZER_ENABLE
+ visualizer_resume();
+#endif
}
keyboard_task();
diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk
index 7d3d8f9a6..f13351ea1 100644
--- a/tmk_core/rules.mk
+++ b/tmk_core/rules.mk
@@ -234,6 +234,7 @@ MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
+MSG_BIN = Creating binary load file for Flash:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
@@ -259,7 +260,7 @@ LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.lst,$(patsubst
# Compiler flags to generate dependency files.
#GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
-GENDEPFLAGS = -MMD -MP -MF $(BUILD_DIR)/.dep/$(subst /,_,$@).d
+GENDEPFLAGS = -MMD -MP -MF $(BUILD_DIR)/.dep/$(subst /,_,$(subst $(BUILD_DIR)/,,$@)).d
# Combine all necessary flags and optional flags.
@@ -270,23 +271,10 @@ ALL_CPPFLAGS = $(MCUFLAGS) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS)
ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS)
# Default target.
-all:
- @$(MAKE) begin
- @$(MAKE) gccversion
- @$(MAKE) sizebefore
- @$(MAKE) clean_list # force clean each time
- @$(MAKE) build
- @$(MAKE) sizeafter
- @$(MAKE) end
+all: build sizeafter
# Quick make that doesn't clean
-quick:
- @$(MAKE) begin
- @$(MAKE) gccversion
- @$(MAKE) sizebefore
- @$(MAKE) build
- @$(MAKE) sizeafter
- @$(MAKE) end
+quick: build sizeafter
# Change the build target to build a HEX file or a library.
build: elf hex
@@ -302,13 +290,7 @@ sym: $(BUILD_DIR)/$(TARGET).sym
LIBNAME=lib$(TARGET).a
lib: $(LIBNAME)
-
-
-# Eye candy.
-# AVR Studio 3.x does not check make's exit code but relies on
-# the following magic strings to be generated by the compile job.
-begin:
- @$(SECHO) $(MSG_BEGIN)
+check_submodule:
git submodule status --recursive | \
while IFS= read -r x; do \
case "$$x" in \
@@ -317,10 +299,6 @@ begin:
esac \
done
-end:
- @$(SECHO) $(MSG_END)
-
-
# Display size of file.
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
#ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf
@@ -330,7 +308,7 @@ sizebefore:
@if test -f $(TARGET).hex; then $(SECHO) $(MSG_SIZE_BEFORE); $(SILENT) || $(HEXSIZE); \
2>/dev/null; $(SECHO); fi
-sizeafter:
+sizeafter: $(BUILD_DIR)/$(TARGET).hex
@if test -f $(TARGET).hex; then $(SECHO); $(SECHO) $(MSG_SIZE_AFTER); $(SILENT) || $(HEXSIZE); \
2>/dev/null; $(SECHO); fi
# test file sizes eventually
@@ -369,6 +347,11 @@ gccversion :
$(eval CMD=$(NM) -n $< > $@ )
@$(BUILD_CMD)
+%.bin: %.elf
+ @$(SILENT) || printf "$(MSG_BIN) $@" | $(AWK_CMD)
+ $(eval CMD=$(BIN) $< $@ || exit 0)
+ @$(BUILD_CMD)
+
# Create library from object files.
.SECONDARY : $(BUILD_DIR)/$(TARGET).a
.PRECIOUS : $(OBJ)
@@ -377,60 +360,55 @@ gccversion :
$(eval CMD=$(AR) $@ $(OBJ) )
@$(BUILD_CMD)
+BEGIN = gccversion check_submodule sizebefore
+
# Link: create ELF output file from object files.
.SECONDARY : $(BUILD_DIR)/$(TARGET).elf
.PRECIOUS : $(OBJ)
-%.elf: $(OBJ)
+%.elf: $(OBJ) | $(BEGIN)
@$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD)
$(eval CMD=$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS))
@$(BUILD_CMD)
# Compile: create object files from C source files.
-$(OBJDIR)/%.o : %.c
+$(OBJDIR)/%.o : %.c | $(BEGIN)
@mkdir -p $(@D)
@$(SILENT) || printf "$(MSG_COMPILING) $<" | $(AWK_CMD)
$(eval CMD=$(CC) -c $(ALL_CFLAGS) $< -o $@)
@$(BUILD_CMD)
# Compile: create object files from C++ source files.
-$(OBJDIR)/%.o : %.cpp
+$(OBJDIR)/%.o : %.cpp | $(BEGIN)
@mkdir -p $(@D)
@$(SILENT) || printf "$(MSG_COMPILING_CPP) $<" | $(AWK_CMD)
$(eval CMD=$(CC) -c $(ALL_CPPFLAGS) $< -o $@)
@$(BUILD_CMD)
# Compile: create assembler files from C source files.
-%.s : %.c
+%.s : %.c | $(BEGIN)
@$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD)
$(eval CMD=$(CC) -S $(ALL_CFLAGS) $< -o $@)
@$(BUILD_CMD)
# Compile: create assembler files from C++ source files.
-%.s : %.cpp
+%.s : %.cpp | $(BEGIN)
@$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD)
$(eval CMD=$(CC) -S $(ALL_CPPFLAGS) $< -o $@)
@$(BUILD_CMD)
# Assemble: create object files from assembler source files.
-$(OBJDIR)/%.o : %.S
+$(OBJDIR)/%.o : %.S | $(BEGIN)
@mkdir -p $(@D)
@$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD)
$(eval CMD=$(CC) -c $(ALL_ASFLAGS) $< -o $@)
@$(BUILD_CMD)
# Create preprocessed source for use in sending a bug report.
-%.i : %.c
+%.i : %.c | $(BEGIN)
$(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@
# Target: clean project.
-clean: begin clean_list end
-
-clean_list :
- @$(REMOVE) -r $(BUILD_DIR)
- @$(REMOVE) -r $(TOP_DIR)/$(BUILD_DIR)
- @$(REMOVE) -r $(KEYBOARD_PATH)/$(BUILD_DIR)
- @if $$SUBPROJECT; then $(REMOVE) -r $(SUBPROJECT_PATH)/$(BUILD_DIR); fi
- @$(REMOVE) -r $(KEYMAP_PATH)/$(BUILD_DIR)
+clean:
show_path:
@echo VPATH=$(VPATH)
@@ -490,6 +468,19 @@ all-keymaps-%:
all-keymaps: all-keymaps-all
+GOAL=$(MAKECMDGOALS)
+ifeq ($(MAKECMDGOALS),)
+GOAL = all
+endif
+CLEANING_GOALS=clean clean_list all
+ifneq ($(findstring $(GOAL),$(CLEANING_GOALS)),)
+$(shell $(REMOVE) -r $(BUILD_DIR) 2>/dev/null)
+$(shell $(REMOVE) -r $(TOP_DIR)/$(BUILD_DIR))
+$(shell $(REMOVE) -r $(KEYBOARD_PATH)/$(BUILD_DIR))
+$(shell if $$SUBPROJECT; then $(REMOVE) -r $(SUBPROJECT_PATH)/$(BUILD_DIR); fi)
+$(shell $(REMOVE) -r $(KEYMAP_PATH)/$(BUILD_DIR))
+endif
+
# Create build directory
$(shell mkdir $(BUILD_DIR) 2>/dev/null)
@@ -502,8 +493,8 @@ $(shell mkdir $(OBJDIR) 2>/dev/null)
# Listing of phony targets.
-.PHONY : all quick begin finish end sizebefore sizeafter gccversion \
-build elf hex eep lss sym coff extcoff \
+.PHONY : all quick finish sizebefore sizeafter gccversion \
+build elf hex eep lss sym coff extcoff check_submodule \
clean clean_list debug gdb-config show_path \
program teensy dfu flip dfu-ee flip-ee dfu-start \
all-keyboards-defaults all-keyboards all-keymaps \