mirror of
https://github.com/zsa/qmk_firmware.git
synced 2026-05-04 23:12:57 +00:00
Merge tag '0.13.13' into firmware_21
This commit is contained in:
@@ -113,10 +113,16 @@ define EXEC_DFU
|
||||
if [ "$(1)" ]; then \
|
||||
echo "Flashing '$(1)' for EE_HANDS split keyboard support." ;\
|
||||
fi; \
|
||||
until $(DFU_PROGRAMMER) $(MCU) get bootloader-version; do\
|
||||
printf "$(MSG_BOOTLOADER_NOT_FOUND)" ;\
|
||||
sleep 5 ;\
|
||||
done; \
|
||||
if ! $(DFU_PROGRAMMER) $(MCU) get bootloader-version >/dev/null 2>/dev/null; then\
|
||||
printf "$(MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY)" ;\
|
||||
sleep $(BOOTLOADER_RETRY_TIME) ;\
|
||||
while ! $(DFU_PROGRAMMER) $(MCU) get bootloader-version >/dev/null 2>/dev/null; do\
|
||||
printf "." ;\
|
||||
sleep $(BOOTLOADER_RETRY_TIME) ;\
|
||||
done ;\
|
||||
printf "\n" ;\
|
||||
fi; \
|
||||
$(DFU_PROGRAMMER) $(MCU) get bootloader-version ;\
|
||||
if $(DFU_PROGRAMMER) --version 2>&1 | $(GREP) -q 0.7 ; then\
|
||||
$(DFU_PROGRAMMER) $(MCU) erase --force; \
|
||||
if [ "$(1)" ]; then \
|
||||
@@ -172,7 +178,7 @@ define EXEC_AVRDUDE
|
||||
TMP2=`mktemp`; \
|
||||
list_devices > $$TMP1; \
|
||||
while [ -z "$$USB" ]; do \
|
||||
sleep 0.5; \
|
||||
sleep $(BOOTLOADER_RETRY_TIME); \
|
||||
printf "."; \
|
||||
list_devices > $$TMP2; \
|
||||
USB=`comm -13 $$TMP1 $$TMP2 | $(GREP) -o '/dev/tty.*'`; \
|
||||
@@ -187,7 +193,7 @@ define EXEC_AVRDUDE
|
||||
sleep 1; \
|
||||
else \
|
||||
printf "Waiting for $$USB to become writable."; \
|
||||
while [ ! -w "$$USB" ]; do sleep 0.5; printf "."; done; echo ""; \
|
||||
while [ ! -w "$$USB" ]; do sleep $(BOOTLOADER_RETRY_TIME); printf "."; done; echo ""; \
|
||||
fi; \
|
||||
if [ -z "$(1)" ]; then \
|
||||
$(AVRDUDE_PROGRAMMER) -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex; \
|
||||
@@ -294,7 +300,7 @@ ifneq ($(strip $(BOOTLOADER)), qmk-dfu)
|
||||
$(error Please set BOOTLOADER = qmk-dfu first!)
|
||||
endif
|
||||
make -C lib/lufa/Bootloaders/DFU/ clean
|
||||
bin/qmk generate-dfu-header --quiet --keyboard $(KEYBOARD) --output lib/lufa/Bootloaders/DFU/Keyboard.h
|
||||
$(QMK_BIN) generate-dfu-header --quiet --keyboard $(KEYBOARD) --output lib/lufa/Bootloaders/DFU/Keyboard.h
|
||||
$(eval MAX_SIZE=$(shell n=`$(CC) -E -mmcu=$(MCU) $(CFLAGS) $(OPT_DEFS) tmk_core/common/avr/bootloader_size.c 2> /dev/null | sed -ne 's/\r//;/^#/n;/^AVR_SIZE:/,$${s/^AVR_SIZE: //;p;}'` && echo $$(($$n)) || echo 0))
|
||||
$(eval PROGRAM_SIZE_KB=$(shell n=`expr $(MAX_SIZE) / 1024` && echo $$(($$n)) || echo 0))
|
||||
$(eval BOOT_SECTION_SIZE_KB=$(shell n=`expr $(BOOTLOADER_SIZE) / 1024` && echo $$(($$n)) || echo 0))
|
||||
|
||||
@@ -190,6 +190,8 @@ else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/ld/$(MCU_LDSCRIPT).ld)","")
|
||||
LDSCRIPT = $(KEYBOARD_PATH_2)/ld/$(MCU_LDSCRIPT).ld
|
||||
else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld)","")
|
||||
LDSCRIPT = $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld
|
||||
else ifneq ("$(wildcard $(TOP_DIR)/platforms/chibios/$(BOARD)/ld/$(MCU_LDSCRIPT).ld)","")
|
||||
LDSCRIPT = $(TOP_DIR)/platforms/chibios/$(BOARD)/ld/$(MCU_LDSCRIPT).ld
|
||||
else ifneq ("$(wildcard $(TOP_DIR)/platforms/chibios/common/ld/$(MCU_LDSCRIPT).ld)","")
|
||||
LDSCRIPT = $(TOP_DIR)/platforms/chibios/common/ld/$(MCU_LDSCRIPT).ld
|
||||
else ifneq ("$(wildcard $(STARTUPLD_CONTRIB)/$(MCU_LDSCRIPT).ld)","")
|
||||
@@ -339,10 +341,15 @@ ST_LINK_CLI ?= st-link_cli
|
||||
ST_FLASH ?= st-flash
|
||||
|
||||
define EXEC_DFU_UTIL
|
||||
until $(DFU_UTIL) -l | grep -q "Found DFU"; do\
|
||||
printf "$(MSG_BOOTLOADER_NOT_FOUND)" ;\
|
||||
sleep 5 ;\
|
||||
done
|
||||
if ! $(DFU_UTIL) -l | grep -q "Found DFU"; then \
|
||||
printf "$(MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY)" ;\
|
||||
sleep $(BOOTLOADER_RETRY_TIME) ;\
|
||||
while ! $(DFU_UTIL) -l | grep -q "Found DFU"; do \
|
||||
printf "." ;\
|
||||
sleep $(BOOTLOADER_RETRY_TIME) ;\
|
||||
done ;\
|
||||
printf "\n" ;\
|
||||
fi
|
||||
$(DFU_UTIL) $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin
|
||||
endef
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
|
||||
$(COMMON_DIR)/sendchar_null.c \
|
||||
$(COMMON_DIR)/eeconfig.c \
|
||||
$(COMMON_DIR)/report.c \
|
||||
$(COMMON_DIR)/usb_util.c \
|
||||
$(PLATFORM_COMMON_DIR)/suspend.c \
|
||||
$(PLATFORM_COMMON_DIR)/timer.c \
|
||||
$(COMMON_DIR)/sync_timer.c \
|
||||
@@ -26,28 +27,6 @@ else
|
||||
include $(TMK_PATH)/$(COMMON_DIR)/lib_printf.mk
|
||||
endif
|
||||
|
||||
# Option modules
|
||||
BOOTMAGIC_ENABLE ?= no
|
||||
VALID_MAGIC_TYPES := yes full lite
|
||||
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no)
|
||||
ifeq ($(filter $(BOOTMAGIC_ENABLE),$(VALID_MAGIC_TYPES)),)
|
||||
$(error BOOTMAGIC_ENABLE="$(BOOTMAGIC_ENABLE)" is not a valid type of magic)
|
||||
endif
|
||||
ifeq ($(strip $(BOOTMAGIC_ENABLE)), lite)
|
||||
TMK_COMMON_DEFS += -DBOOTMAGIC_LITE
|
||||
TMK_COMMON_SRC += $(COMMON_DIR)/bootmagic_lite.c
|
||||
|
||||
TMK_COMMON_DEFS += -DMAGIC_ENABLE
|
||||
TMK_COMMON_SRC += $(COMMON_DIR)/magic.c
|
||||
else
|
||||
TMK_COMMON_DEFS += -DBOOTMAGIC_ENABLE
|
||||
TMK_COMMON_SRC += $(COMMON_DIR)/bootmagic.c
|
||||
endif
|
||||
else
|
||||
TMK_COMMON_DEFS += -DMAGIC_ENABLE
|
||||
TMK_COMMON_SRC += $(COMMON_DIR)/magic.c
|
||||
endif
|
||||
|
||||
SHARED_EP_ENABLE = no
|
||||
MOUSE_SHARED_EP ?= yes
|
||||
ifeq ($(strip $(KEYBOARD_SHARED_EP)), yes)
|
||||
|
||||
@@ -133,7 +133,8 @@ void process_hand_swap(keyevent_t *event) {
|
||||
bool do_swap = event->pressed ? swap_hands : swap_state[pos.row] & (col_bit);
|
||||
|
||||
if (do_swap) {
|
||||
event->key = hand_swap_config[pos.row][pos.col];
|
||||
event->key.row = pgm_read_byte(&hand_swap_config[pos.row][pos.col].row);
|
||||
event->key.col = pgm_read_byte(&hand_swap_config[pos.row][pos.col].col);
|
||||
swap_state[pos.row] |= col_bit;
|
||||
} else {
|
||||
swap_state[pos.row] &= ~(col_bit);
|
||||
@@ -772,10 +773,9 @@ void register_code(uint8_t code) {
|
||||
}
|
||||
#endif
|
||||
|
||||
else if
|
||||
IS_KEY(code) {
|
||||
// TODO: should push command_proc out of this block?
|
||||
if (command_proc(code)) return;
|
||||
else if IS_KEY (code) {
|
||||
// TODO: should push command_proc out of this block?
|
||||
if (command_proc(code)) return;
|
||||
|
||||
#ifndef NO_ACTION_ONESHOT
|
||||
/* TODO: remove
|
||||
@@ -792,35 +792,33 @@ void register_code(uint8_t code) {
|
||||
} else
|
||||
*/
|
||||
#endif
|
||||
{
|
||||
// Force a new key press if the key is already pressed
|
||||
// without this, keys with the same keycode, but different
|
||||
// modifiers will be reported incorrectly, see issue #1708
|
||||
if (is_key_pressed(keyboard_report, code)) {
|
||||
del_key(code);
|
||||
send_keyboard_report();
|
||||
}
|
||||
add_key(code);
|
||||
{
|
||||
// Force a new key press if the key is already pressed
|
||||
// without this, keys with the same keycode, but different
|
||||
// modifiers will be reported incorrectly, see issue #1708
|
||||
if (is_key_pressed(keyboard_report, code)) {
|
||||
del_key(code);
|
||||
send_keyboard_report();
|
||||
}
|
||||
}
|
||||
else if
|
||||
IS_MOD(code) {
|
||||
add_mods(MOD_BIT(code));
|
||||
add_key(code);
|
||||
send_keyboard_report();
|
||||
}
|
||||
} else if IS_MOD (code) {
|
||||
add_mods(MOD_BIT(code));
|
||||
send_keyboard_report();
|
||||
}
|
||||
#ifdef EXTRAKEY_ENABLE
|
||||
else if
|
||||
IS_SYSTEM(code) { host_system_send(KEYCODE2SYSTEM(code)); }
|
||||
else if
|
||||
IS_CONSUMER(code) { host_consumer_send(KEYCODE2CONSUMER(code)); }
|
||||
else if IS_SYSTEM (code) {
|
||||
host_system_send(KEYCODE2SYSTEM(code));
|
||||
} else if IS_CONSUMER (code) {
|
||||
host_consumer_send(KEYCODE2CONSUMER(code));
|
||||
}
|
||||
#endif
|
||||
#ifdef MOUSEKEY_ENABLE
|
||||
else if
|
||||
IS_MOUSEKEY(code) {
|
||||
mousekey_on(code);
|
||||
mousekey_send();
|
||||
}
|
||||
else if IS_MOUSEKEY (code) {
|
||||
mousekey_on(code);
|
||||
mousekey_send();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -865,26 +863,22 @@ void unregister_code(uint8_t code) {
|
||||
}
|
||||
#endif
|
||||
|
||||
else if
|
||||
IS_KEY(code) {
|
||||
del_key(code);
|
||||
send_keyboard_report();
|
||||
}
|
||||
else if
|
||||
IS_MOD(code) {
|
||||
del_mods(MOD_BIT(code));
|
||||
send_keyboard_report();
|
||||
}
|
||||
else if
|
||||
IS_SYSTEM(code) { host_system_send(0); }
|
||||
else if
|
||||
IS_CONSUMER(code) { host_consumer_send(0); }
|
||||
else if IS_KEY (code) {
|
||||
del_key(code);
|
||||
send_keyboard_report();
|
||||
} else if IS_MOD (code) {
|
||||
del_mods(MOD_BIT(code));
|
||||
send_keyboard_report();
|
||||
} else if IS_SYSTEM (code) {
|
||||
host_system_send(0);
|
||||
} else if IS_CONSUMER (code) {
|
||||
host_consumer_send(0);
|
||||
}
|
||||
#ifdef MOUSEKEY_ENABLE
|
||||
else if
|
||||
IS_MOUSEKEY(code) {
|
||||
mousekey_off(code);
|
||||
mousekey_send();
|
||||
}
|
||||
else if IS_MOUSEKEY (code) {
|
||||
mousekey_off(code);
|
||||
mousekey_send();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -77,8 +77,8 @@ extern bool disable_action_cache;
|
||||
|
||||
/* Code for handling one-handed key modifiers. */
|
||||
#ifdef SWAP_HANDS_ENABLE
|
||||
extern bool swap_hands;
|
||||
extern const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS];
|
||||
extern bool swap_hands;
|
||||
extern const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS];
|
||||
# if (MATRIX_COLS <= 8)
|
||||
typedef uint8_t swap_state_row_t;
|
||||
# elif (MATRIX_COLS <= 16)
|
||||
|
||||
@@ -147,12 +147,16 @@ void clear_oneshot_swaphands(void) {
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
void set_oneshot_layer(uint8_t layer, uint8_t state) {
|
||||
oneshot_layer_data = layer << 3 | state;
|
||||
layer_on(layer);
|
||||
if (!keymap_config.oneshot_disable) {
|
||||
oneshot_layer_data = layer << 3 | state;
|
||||
layer_on(layer);
|
||||
# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
||||
oneshot_layer_time = timer_read();
|
||||
oneshot_layer_time = timer_read();
|
||||
# endif
|
||||
oneshot_layer_changed_kb(get_oneshot_layer());
|
||||
oneshot_layer_changed_kb(get_oneshot_layer());
|
||||
} else {
|
||||
layer_on(layer);
|
||||
}
|
||||
}
|
||||
/** \brief Reset oneshot layer
|
||||
*
|
||||
@@ -172,7 +176,7 @@ void reset_oneshot_layer(void) {
|
||||
void clear_oneshot_layer_state(oneshot_fullfillment_t state) {
|
||||
uint8_t start_state = oneshot_layer_data;
|
||||
oneshot_layer_data &= ~state;
|
||||
if (!get_oneshot_layer_state() && start_state != oneshot_layer_data) {
|
||||
if ((!get_oneshot_layer_state() && start_state != oneshot_layer_data) || keymap_config.oneshot_disable) {
|
||||
layer_off(get_oneshot_layer());
|
||||
reset_oneshot_layer();
|
||||
}
|
||||
@@ -182,6 +186,39 @@ void clear_oneshot_layer_state(oneshot_fullfillment_t state) {
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
bool is_oneshot_layer_active(void) { return get_oneshot_layer_state(); }
|
||||
|
||||
/** \brief set oneshot
|
||||
*
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
void oneshot_set(bool active) {
|
||||
if (keymap_config.oneshot_disable != active) {
|
||||
keymap_config.oneshot_disable = active;
|
||||
eeconfig_update_keymap(keymap_config.raw);
|
||||
dprintf("Oneshot: active: %d\n", active);
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief toggle oneshot
|
||||
*
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
void oneshot_toggle(void) { oneshot_set(!keymap_config.oneshot_disable); }
|
||||
|
||||
/** \brief enable oneshot
|
||||
*
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
void oneshot_enable(void) { oneshot_set(true); }
|
||||
|
||||
/** \brief disable oneshot
|
||||
*
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
void oneshot_disable(void) { oneshot_set(false); }
|
||||
|
||||
bool is_oneshot_enabled(void) { return keymap_config.oneshot_disable; }
|
||||
|
||||
#endif
|
||||
|
||||
/** \brief Send keyboard report
|
||||
@@ -321,14 +358,17 @@ void del_oneshot_mods(uint8_t mods) {
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
void set_oneshot_mods(uint8_t mods) {
|
||||
if (oneshot_mods != mods) {
|
||||
if (!keymap_config.oneshot_disable) {
|
||||
if (oneshot_mods != mods) {
|
||||
# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
||||
oneshot_time = timer_read();
|
||||
oneshot_time = timer_read();
|
||||
# endif
|
||||
oneshot_mods = mods;
|
||||
oneshot_mods_changed_kb(mods);
|
||||
oneshot_mods = mods;
|
||||
oneshot_mods_changed_kb(mods);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief clear oneshot mods
|
||||
*
|
||||
* FIXME: needs doc
|
||||
|
||||
@@ -85,6 +85,11 @@ void oneshot_mods_changed_kb(uint8_t mods);
|
||||
void oneshot_layer_changed_user(uint8_t layer);
|
||||
void oneshot_layer_changed_kb(uint8_t layer);
|
||||
|
||||
void oneshot_toggle(void);
|
||||
void oneshot_enable(void);
|
||||
void oneshot_disable(void);
|
||||
bool is_oneshot_enabled(void);
|
||||
|
||||
/* inspect */
|
||||
uint8_t has_anymod(void);
|
||||
|
||||
|
||||
22
tmk_core/common/arm_atsam/_wait.h
Normal file
22
tmk_core/common/arm_atsam/_wait.h
Normal file
@@ -0,0 +1,22 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* 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 3 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/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "clks.h"
|
||||
|
||||
#define wait_ms(ms) CLK_delay_ms(ms)
|
||||
#define wait_us(us) CLK_delay_us(us)
|
||||
#define waitInputPinDelay()
|
||||
29
tmk_core/common/avr/_wait.h
Normal file
29
tmk_core/common/avr/_wait.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* 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 3 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/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <util/delay.h>
|
||||
|
||||
#define wait_ms(ms) _delay_ms(ms)
|
||||
#define wait_us(us) _delay_us(us)
|
||||
|
||||
/* The AVR series GPIOs have a one clock read delay for changes in the digital input signal.
|
||||
* But here's more margin to make it two clocks. */
|
||||
#ifndef GPIO_INPUT_PIN_DELAY
|
||||
# define GPIO_INPUT_PIN_DELAY 2
|
||||
#endif
|
||||
|
||||
#define waitInputPinDelay() __builtin_avr_delay_cycles(GPIO_INPUT_PIN_DELAY)
|
||||
@@ -28,6 +28,13 @@
|
||||
# include "rgblight.h"
|
||||
#endif
|
||||
|
||||
#ifdef LED_MATRIX_ENABLE
|
||||
# include "led_matrix.h"
|
||||
#endif
|
||||
#ifdef RGB_MATRIX_ENABLE
|
||||
# include "rgb_matrix.h"
|
||||
#endif
|
||||
|
||||
/** \brief Suspend idle
|
||||
*
|
||||
* FIXME: needs doc
|
||||
@@ -156,6 +163,13 @@ void suspend_power_down(void) {
|
||||
rgblight_suspend();
|
||||
# endif
|
||||
|
||||
# if defined(LED_MATRIX_ENABLE)
|
||||
led_matrix_set_suspend_state(true);
|
||||
# endif
|
||||
# if defined(RGB_MATRIX_ENABLE)
|
||||
rgb_matrix_set_suspend_state(true);
|
||||
# endif
|
||||
|
||||
// Enter sleep state if possible (ie, the MCU has a watchdog timeout interrupt)
|
||||
# if defined(WDT_vect)
|
||||
power_down(WDTO_15MS);
|
||||
@@ -208,6 +222,13 @@ void suspend_wakeup_init(void) {
|
||||
rgblight_wakeup();
|
||||
#endif
|
||||
|
||||
#if defined(LED_MATRIX_ENABLE)
|
||||
led_matrix_set_suspend_state(false);
|
||||
#endif
|
||||
#if defined(RGB_MATRIX_ENABLE)
|
||||
rgb_matrix_set_suspend_state(false);
|
||||
#endif
|
||||
|
||||
suspend_wakeup_init_kb();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,163 +0,0 @@
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "wait.h"
|
||||
#include "matrix.h"
|
||||
#include "bootloader.h"
|
||||
#include "debug.h"
|
||||
#include "keymap.h"
|
||||
#include "host.h"
|
||||
#include "action_layer.h"
|
||||
#include "eeconfig.h"
|
||||
#include "bootmagic.h"
|
||||
|
||||
keymap_config_t keymap_config;
|
||||
|
||||
/** \brief Bootmagic
|
||||
*
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
void bootmagic(void) {
|
||||
/* check signature */
|
||||
if (!eeconfig_is_enabled()) {
|
||||
eeconfig_init();
|
||||
}
|
||||
|
||||
/* do scans in case of bounce */
|
||||
print("bootmagic scan: ... ");
|
||||
uint8_t scan = 100;
|
||||
while (scan--) {
|
||||
matrix_scan();
|
||||
wait_ms(10);
|
||||
}
|
||||
print("done.\n");
|
||||
|
||||
/* bootmagic skip */
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SKIP)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* eeconfig clear */
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_EEPROM_CLEAR)) {
|
||||
eeconfig_init();
|
||||
}
|
||||
|
||||
/* bootloader */
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_BOOTLOADER)) {
|
||||
bootloader_jump();
|
||||
}
|
||||
|
||||
/* debug enable */
|
||||
debug_config.raw = eeconfig_read_debug();
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_ENABLE)) {
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_MATRIX)) {
|
||||
debug_config.matrix = !debug_config.matrix;
|
||||
} else if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_KEYBOARD)) {
|
||||
debug_config.keyboard = !debug_config.keyboard;
|
||||
} else if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_MOUSE)) {
|
||||
debug_config.mouse = !debug_config.mouse;
|
||||
} else {
|
||||
debug_config.enable = !debug_config.enable;
|
||||
}
|
||||
}
|
||||
eeconfig_update_debug(debug_config.raw);
|
||||
|
||||
/* keymap config */
|
||||
keymap_config.raw = eeconfig_read_keymap();
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK)) {
|
||||
keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock;
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL)) {
|
||||
keymap_config.capslock_to_control = !keymap_config.capslock_to_control;
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_LALT_LGUI)) {
|
||||
keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui;
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_RALT_RGUI)) {
|
||||
keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui;
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_NO_GUI)) {
|
||||
keymap_config.no_gui = !keymap_config.no_gui;
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_GRAVE_ESC)) {
|
||||
keymap_config.swap_grave_esc = !keymap_config.swap_grave_esc;
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE)) {
|
||||
keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace;
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_HOST_NKRO)) {
|
||||
keymap_config.nkro = !keymap_config.nkro;
|
||||
}
|
||||
eeconfig_update_keymap(keymap_config.raw);
|
||||
|
||||
/* default layer */
|
||||
uint8_t default_layer = 0;
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_0)) {
|
||||
default_layer |= (1 << 0);
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_1)) {
|
||||
default_layer |= (1 << 1);
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_2)) {
|
||||
default_layer |= (1 << 2);
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_3)) {
|
||||
default_layer |= (1 << 3);
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_4)) {
|
||||
default_layer |= (1 << 4);
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_5)) {
|
||||
default_layer |= (1 << 5);
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_6)) {
|
||||
default_layer |= (1 << 6);
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_7)) {
|
||||
default_layer |= (1 << 7);
|
||||
}
|
||||
if (default_layer) {
|
||||
eeconfig_update_default_layer(default_layer);
|
||||
default_layer_set((layer_state_t)default_layer);
|
||||
} else {
|
||||
default_layer = eeconfig_read_default_layer();
|
||||
default_layer_set((layer_state_t)default_layer);
|
||||
}
|
||||
/* Also initialize layer state to trigger callback functions for layer_state */
|
||||
layer_state_set_kb((layer_state_t)layer_state);
|
||||
|
||||
/* EE_HANDS handedness */
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_EE_HANDS_LEFT)) {
|
||||
eeconfig_update_handedness(true);
|
||||
}
|
||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_EE_HANDS_RIGHT)) {
|
||||
eeconfig_update_handedness(false);
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Scan Keycode
|
||||
*
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
static bool scan_keycode(uint8_t keycode) {
|
||||
for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
|
||||
matrix_row_t matrix_row = matrix_get_row(r);
|
||||
for (uint8_t c = 0; c < MATRIX_COLS; c++) {
|
||||
if (matrix_row & ((matrix_row_t)1 << c)) {
|
||||
if (keycode == keymap_key_to_keycode(0, (keypos_t){.row = r, .col = c})) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/** \brief Bootmagic Scan Keycode
|
||||
*
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
bool bootmagic_scan_keycode(uint8_t keycode) {
|
||||
if (!scan_keycode(BOOTMAGIC_KEY_SALT)) return false;
|
||||
|
||||
return scan_keycode(keycode);
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
/* FIXME: Add special doxygen comments for defines here. */
|
||||
|
||||
/* bootmagic salt key */
|
||||
#ifndef BOOTMAGIC_KEY_SALT
|
||||
# define BOOTMAGIC_KEY_SALT KC_SPACE
|
||||
#endif
|
||||
|
||||
/* skip bootmagic and eeconfig */
|
||||
#ifndef BOOTMAGIC_KEY_SKIP
|
||||
# define BOOTMAGIC_KEY_SKIP KC_ESC
|
||||
#endif
|
||||
|
||||
/* eeprom clear */
|
||||
#ifndef BOOTMAGIC_KEY_EEPROM_CLEAR
|
||||
# define BOOTMAGIC_KEY_EEPROM_CLEAR KC_BSPACE
|
||||
#endif
|
||||
|
||||
/* kick up bootloader */
|
||||
#ifndef BOOTMAGIC_KEY_BOOTLOADER
|
||||
# define BOOTMAGIC_KEY_BOOTLOADER KC_B
|
||||
#endif
|
||||
|
||||
/* debug enable */
|
||||
#ifndef BOOTMAGIC_KEY_DEBUG_ENABLE
|
||||
# define BOOTMAGIC_KEY_DEBUG_ENABLE KC_D
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_DEBUG_MATRIX
|
||||
# define BOOTMAGIC_KEY_DEBUG_MATRIX KC_X
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_DEBUG_KEYBOARD
|
||||
# define BOOTMAGIC_KEY_DEBUG_KEYBOARD KC_K
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_DEBUG_MOUSE
|
||||
# define BOOTMAGIC_KEY_DEBUG_MOUSE KC_M
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_EE_HANDS_LEFT
|
||||
# define BOOTMAGIC_KEY_EE_HANDS_LEFT KC_L
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_EE_HANDS_RIGHT
|
||||
# define BOOTMAGIC_KEY_EE_HANDS_RIGHT KC_R
|
||||
#endif
|
||||
|
||||
/*
|
||||
* keymap config
|
||||
*/
|
||||
#ifndef BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK
|
||||
# define BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK KC_LCTRL
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL
|
||||
# define BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL KC_CAPSLOCK
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_SWAP_LALT_LGUI
|
||||
# define BOOTMAGIC_KEY_SWAP_LALT_LGUI KC_LALT
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_SWAP_RALT_RGUI
|
||||
# define BOOTMAGIC_KEY_SWAP_RALT_RGUI KC_RALT
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_NO_GUI
|
||||
# define BOOTMAGIC_KEY_NO_GUI KC_LGUI
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_SWAP_GRAVE_ESC
|
||||
# define BOOTMAGIC_KEY_SWAP_GRAVE_ESC KC_GRAVE
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE
|
||||
# define BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE KC_BSLASH
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_HOST_NKRO
|
||||
# define BOOTMAGIC_HOST_NKRO KC_N
|
||||
#endif
|
||||
|
||||
/*
|
||||
* change default layer
|
||||
*/
|
||||
#ifndef BOOTMAGIC_KEY_DEFAULT_LAYER_0
|
||||
# define BOOTMAGIC_KEY_DEFAULT_LAYER_0 KC_0
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_DEFAULT_LAYER_1
|
||||
# define BOOTMAGIC_KEY_DEFAULT_LAYER_1 KC_1
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_DEFAULT_LAYER_2
|
||||
# define BOOTMAGIC_KEY_DEFAULT_LAYER_2 KC_2
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_DEFAULT_LAYER_3
|
||||
# define BOOTMAGIC_KEY_DEFAULT_LAYER_3 KC_3
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_DEFAULT_LAYER_4
|
||||
# define BOOTMAGIC_KEY_DEFAULT_LAYER_4 KC_4
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_DEFAULT_LAYER_5
|
||||
# define BOOTMAGIC_KEY_DEFAULT_LAYER_5 KC_5
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_DEFAULT_LAYER_6
|
||||
# define BOOTMAGIC_KEY_DEFAULT_LAYER_6 KC_6
|
||||
#endif
|
||||
#ifndef BOOTMAGIC_KEY_DEFAULT_LAYER_7
|
||||
# define BOOTMAGIC_KEY_DEFAULT_LAYER_7 KC_7
|
||||
#endif
|
||||
|
||||
void bootmagic(void);
|
||||
bool bootmagic_scan_keycode(uint8_t keycode);
|
||||
@@ -1,49 +0,0 @@
|
||||
#include "quantum.h"
|
||||
|
||||
/** \brief Reset eeprom
|
||||
*
|
||||
* ...just incase someone wants to only change the eeprom behaviour
|
||||
*/
|
||||
__attribute__((weak)) void bootmagic_lite_reset_eeprom(void) {
|
||||
#if defined(VIA_ENABLE)
|
||||
via_eeprom_reset();
|
||||
#else
|
||||
eeconfig_disable();
|
||||
#endif
|
||||
}
|
||||
|
||||
/** \brief The lite version of TMK's bootmagic based on Wilba.
|
||||
*
|
||||
* 100% less potential for accidentally making the keyboard do stupid things.
|
||||
*/
|
||||
__attribute__((weak)) void bootmagic_lite(void) {
|
||||
// We need multiple scans because debouncing can't be turned off.
|
||||
matrix_scan();
|
||||
#if defined(DEBOUNCE) && DEBOUNCE > 0
|
||||
wait_ms(DEBOUNCE * 2);
|
||||
#else
|
||||
wait_ms(30);
|
||||
#endif
|
||||
matrix_scan();
|
||||
|
||||
// If the configured key (commonly Esc) is held down on power up,
|
||||
// reset the EEPROM valid state and jump to bootloader.
|
||||
// This isn't very generalized, but we need something that doesn't
|
||||
// rely on user's keymaps in firmware or EEPROM.
|
||||
uint8_t row = BOOTMAGIC_LITE_ROW;
|
||||
uint8_t col = BOOTMAGIC_LITE_COLUMN;
|
||||
|
||||
#if defined(SPLIT_KEYBOARD) && defined(BOOTMAGIC_LITE_ROW_RIGHT) && defined(BOOTMAGIC_LITE_COLUMN_RIGHT)
|
||||
if (!is_keyboard_left()) {
|
||||
row = BOOTMAGIC_LITE_ROW_RIGHT;
|
||||
col = BOOTMAGIC_LITE_COLUMN_RIGHT;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (matrix_get_row(row) & (1 << col)) {
|
||||
bootmagic_lite_reset_eeprom();
|
||||
|
||||
// Jump to bootloader.
|
||||
bootloader_jump();
|
||||
}
|
||||
}
|
||||
55
tmk_core/common/chibios/_wait.h
Normal file
55
tmk_core/common/chibios/_wait.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* 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 3 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/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <ch.h>
|
||||
|
||||
/* chThdSleepX of zero maps to infinite - so we map to a tiny delay to still yield */
|
||||
#define wait_ms(ms) \
|
||||
do { \
|
||||
if (ms != 0) { \
|
||||
chThdSleepMilliseconds(ms); \
|
||||
} else { \
|
||||
chThdSleepMicroseconds(1); \
|
||||
} \
|
||||
} while (0)
|
||||
#define wait_us(us) \
|
||||
do { \
|
||||
if (us != 0) { \
|
||||
chThdSleepMicroseconds(us); \
|
||||
} else { \
|
||||
chThdSleepMicroseconds(1); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* For GPIOs on ARM-based MCUs, the input pins are sampled by the clock of the bus
|
||||
* to which the GPIO is connected.
|
||||
* The connected buses differ depending on the various series of MCUs.
|
||||
* And since the instruction execution clock of the CPU and the bus clock of GPIO are different,
|
||||
* there is a delay of several clocks to read the change of the input signal.
|
||||
*
|
||||
* Define this delay with the GPIO_INPUT_PIN_DELAY macro.
|
||||
* If the GPIO_INPUT_PIN_DELAY macro is not defined, the following default values will be used.
|
||||
* (A fairly large value of 0.25 microseconds is set.)
|
||||
*/
|
||||
|
||||
#include "wait.c"
|
||||
|
||||
#ifndef GPIO_INPUT_PIN_DELAY
|
||||
# define GPIO_INPUT_PIN_DELAY (STM32_SYSCLK / 1000000L / 4)
|
||||
#endif
|
||||
|
||||
#define waitInputPinDelay() wait_cpuclock(GPIO_INPUT_PIN_DELAY)
|
||||
@@ -13,7 +13,23 @@
|
||||
# define STM32_BOOTLOADER_DUAL_BANK FALSE
|
||||
#endif
|
||||
|
||||
#if STM32_BOOTLOADER_DUAL_BANK
|
||||
#ifdef BOOTLOADER_TINYUF2
|
||||
|
||||
# define DBL_TAP_MAGIC 0xf01669ef // From tinyuf2's board_api.h
|
||||
|
||||
// defined by linker script
|
||||
extern uint32_t _board_dfu_dbl_tap[];
|
||||
# define DBL_TAP_REG _board_dfu_dbl_tap[0]
|
||||
|
||||
void bootloader_jump(void) {
|
||||
DBL_TAP_REG = DBL_TAP_MAGIC;
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
void enter_bootloader_mode_if_requested(void) { /* not needed, no two-stage reset */
|
||||
}
|
||||
|
||||
#elif STM32_BOOTLOADER_DUAL_BANK
|
||||
|
||||
// Need pin definitions
|
||||
# include "config_common.h"
|
||||
@@ -79,7 +95,7 @@ void enter_bootloader_mode_if_requested(void) {
|
||||
}
|
||||
}
|
||||
|
||||
#elif defined(KL2x) || defined(K20x) // STM32_BOOTLOADER_DUAL_BANK // STM32_BOOTLOADER_ADDRESS
|
||||
#elif defined(KL2x) || defined(K20x) || defined(MK66F18) // STM32_BOOTLOADER_DUAL_BANK // STM32_BOOTLOADER_ADDRESS
|
||||
/* Kinetis */
|
||||
|
||||
# if defined(BOOTLOADER_KIIBOHD)
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#define SPLIT_USB_DETECT // Force this on for now
|
||||
|
||||
#if defined(STM32F1XX)
|
||||
# define USE_GPIOV1
|
||||
#endif
|
||||
@@ -28,4 +30,9 @@
|
||||
# define USE_I2CV1
|
||||
# define USE_I2CV1_CONTRIB // for some reason a bunch of ChibiOS-Contrib boards only have clock_speed
|
||||
# define USE_GPIOV1
|
||||
# define STM32_SYSCLK KINETIS_SYSCLK_FREQUENCY
|
||||
#endif
|
||||
|
||||
#if defined(MK66F18)
|
||||
# define STM32_SYSCLK KINETIS_SYSCLK_FREQUENCY
|
||||
#endif
|
||||
|
||||
@@ -70,6 +70,23 @@
|
||||
# define A13 PAL_LINE(GPIOA, 13)
|
||||
# define A14 PAL_LINE(GPIOA, 14)
|
||||
# define A15 PAL_LINE(GPIOA, 15)
|
||||
# define A16 PAL_LINE(GPIOA, 16)
|
||||
# define A17 PAL_LINE(GPIOA, 17)
|
||||
# define A18 PAL_LINE(GPIOA, 18)
|
||||
# define A19 PAL_LINE(GPIOA, 19)
|
||||
# define A20 PAL_LINE(GPIOA, 20)
|
||||
# define A21 PAL_LINE(GPIOA, 21)
|
||||
# define A22 PAL_LINE(GPIOA, 22)
|
||||
# define A23 PAL_LINE(GPIOA, 23)
|
||||
# define A24 PAL_LINE(GPIOA, 24)
|
||||
# define A25 PAL_LINE(GPIOA, 25)
|
||||
# define A26 PAL_LINE(GPIOA, 26)
|
||||
# define A27 PAL_LINE(GPIOA, 27)
|
||||
# define A28 PAL_LINE(GPIOA, 28)
|
||||
# define A29 PAL_LINE(GPIOA, 29)
|
||||
# define A30 PAL_LINE(GPIOA, 30)
|
||||
# define A31 PAL_LINE(GPIOA, 31)
|
||||
# define A32 PAL_LINE(GPIOA, 32)
|
||||
# define B0 PAL_LINE(GPIOB, 0)
|
||||
# define B1 PAL_LINE(GPIOB, 1)
|
||||
# define B2 PAL_LINE(GPIOB, 2)
|
||||
@@ -90,6 +107,19 @@
|
||||
# define B17 PAL_LINE(GPIOB, 17)
|
||||
# define B18 PAL_LINE(GPIOB, 18)
|
||||
# define B19 PAL_LINE(GPIOB, 19)
|
||||
# define B20 PAL_LINE(GPIOB, 20)
|
||||
# define B21 PAL_LINE(GPIOB, 21)
|
||||
# define B22 PAL_LINE(GPIOB, 22)
|
||||
# define B23 PAL_LINE(GPIOB, 23)
|
||||
# define B24 PAL_LINE(GPIOB, 24)
|
||||
# define B25 PAL_LINE(GPIOB, 25)
|
||||
# define B26 PAL_LINE(GPIOB, 26)
|
||||
# define B27 PAL_LINE(GPIOB, 27)
|
||||
# define B28 PAL_LINE(GPIOB, 28)
|
||||
# define B29 PAL_LINE(GPIOB, 29)
|
||||
# define B30 PAL_LINE(GPIOB, 30)
|
||||
# define B31 PAL_LINE(GPIOB, 31)
|
||||
# define B32 PAL_LINE(GPIOB, 32)
|
||||
# define C0 PAL_LINE(GPIOC, 0)
|
||||
# define C1 PAL_LINE(GPIOC, 1)
|
||||
# define C2 PAL_LINE(GPIOC, 2)
|
||||
@@ -106,6 +136,23 @@
|
||||
# define C13 PAL_LINE(GPIOC, 13)
|
||||
# define C14 PAL_LINE(GPIOC, 14)
|
||||
# define C15 PAL_LINE(GPIOC, 15)
|
||||
# define C16 PAL_LINE(GPIOC, 16)
|
||||
# define C17 PAL_LINE(GPIOC, 17)
|
||||
# define C18 PAL_LINE(GPIOC, 18)
|
||||
# define C19 PAL_LINE(GPIOC, 19)
|
||||
# define C20 PAL_LINE(GPIOC, 20)
|
||||
# define C21 PAL_LINE(GPIOC, 21)
|
||||
# define C22 PAL_LINE(GPIOC, 22)
|
||||
# define C23 PAL_LINE(GPIOC, 23)
|
||||
# define C24 PAL_LINE(GPIOC, 24)
|
||||
# define C25 PAL_LINE(GPIOC, 25)
|
||||
# define C26 PAL_LINE(GPIOC, 26)
|
||||
# define C27 PAL_LINE(GPIOC, 27)
|
||||
# define C28 PAL_LINE(GPIOC, 28)
|
||||
# define C29 PAL_LINE(GPIOC, 29)
|
||||
# define C30 PAL_LINE(GPIOC, 30)
|
||||
# define C31 PAL_LINE(GPIOC, 31)
|
||||
# define C32 PAL_LINE(GPIOC, 32)
|
||||
# define D0 PAL_LINE(GPIOD, 0)
|
||||
# define D1 PAL_LINE(GPIOD, 1)
|
||||
# define D2 PAL_LINE(GPIOD, 2)
|
||||
@@ -122,6 +169,23 @@
|
||||
# define D13 PAL_LINE(GPIOD, 13)
|
||||
# define D14 PAL_LINE(GPIOD, 14)
|
||||
# define D15 PAL_LINE(GPIOD, 15)
|
||||
# define D16 PAL_LINE(GPIOD, 16)
|
||||
# define D17 PAL_LINE(GPIOD, 17)
|
||||
# define D18 PAL_LINE(GPIOD, 18)
|
||||
# define D19 PAL_LINE(GPIOD, 19)
|
||||
# define D20 PAL_LINE(GPIOD, 20)
|
||||
# define D21 PAL_LINE(GPIOD, 21)
|
||||
# define D22 PAL_LINE(GPIOD, 22)
|
||||
# define D23 PAL_LINE(GPIOD, 23)
|
||||
# define D24 PAL_LINE(GPIOD, 24)
|
||||
# define D25 PAL_LINE(GPIOD, 25)
|
||||
# define D26 PAL_LINE(GPIOD, 26)
|
||||
# define D27 PAL_LINE(GPIOD, 27)
|
||||
# define D28 PAL_LINE(GPIOD, 28)
|
||||
# define D29 PAL_LINE(GPIOD, 29)
|
||||
# define D30 PAL_LINE(GPIOD, 30)
|
||||
# define D31 PAL_LINE(GPIOD, 31)
|
||||
# define D32 PAL_LINE(GPIOD, 32)
|
||||
# define E0 PAL_LINE(GPIOE, 0)
|
||||
# define E1 PAL_LINE(GPIOE, 1)
|
||||
# define E2 PAL_LINE(GPIOE, 2)
|
||||
@@ -138,6 +202,23 @@
|
||||
# define E13 PAL_LINE(GPIOE, 13)
|
||||
# define E14 PAL_LINE(GPIOE, 14)
|
||||
# define E15 PAL_LINE(GPIOE, 15)
|
||||
# define E16 PAL_LINE(GPIOE, 16)
|
||||
# define E17 PAL_LINE(GPIOE, 17)
|
||||
# define E18 PAL_LINE(GPIOE, 18)
|
||||
# define E19 PAL_LINE(GPIOE, 19)
|
||||
# define E20 PAL_LINE(GPIOE, 20)
|
||||
# define E21 PAL_LINE(GPIOE, 21)
|
||||
# define E22 PAL_LINE(GPIOE, 22)
|
||||
# define E23 PAL_LINE(GPIOE, 23)
|
||||
# define E24 PAL_LINE(GPIOE, 24)
|
||||
# define E25 PAL_LINE(GPIOE, 25)
|
||||
# define E26 PAL_LINE(GPIOE, 26)
|
||||
# define E27 PAL_LINE(GPIOE, 27)
|
||||
# define E28 PAL_LINE(GPIOE, 28)
|
||||
# define E29 PAL_LINE(GPIOE, 29)
|
||||
# define E30 PAL_LINE(GPIOE, 30)
|
||||
# define E31 PAL_LINE(GPIOE, 31)
|
||||
# define E32 PAL_LINE(GPIOE, 32)
|
||||
# define F0 PAL_LINE(GPIOF, 0)
|
||||
# define F1 PAL_LINE(GPIOF, 1)
|
||||
# define F2 PAL_LINE(GPIOF, 2)
|
||||
|
||||
@@ -9,21 +9,13 @@
|
||||
* Use LP timer on Kinetises, TIM14 on STM32F0.
|
||||
*/
|
||||
|
||||
#if defined(KL2x) || defined(K20x)
|
||||
|
||||
/* Use Low Power Timer (LPTMR) */
|
||||
# define TIMER_INTERRUPT_VECTOR KINETIS_LPTMR0_IRQ_VECTOR
|
||||
# define RESET_COUNTER LPTMR0->CSR |= LPTMRx_CSR_TCF
|
||||
|
||||
#elif defined(STM32F0XX)
|
||||
|
||||
/* Use TIM14 manually */
|
||||
# define TIMER_INTERRUPT_VECTOR STM32_TIM14_HANDLER
|
||||
# define RESET_COUNTER STM32_TIM14->SR &= ~STM32_TIM_SR_UIF
|
||||
|
||||
#ifndef SLEEP_LED_GPT_DRIVER
|
||||
# if defined(STM32F0XX)
|
||||
# define SLEEP_LED_GPT_DRIVER GPTD14
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(KL2x) || defined(K20x) || defined(STM32F0XX) /* common parts for timers/interrupts */
|
||||
#if defined(KL2x) || defined(K20x) || defined(SLEEP_LED_GPT_DRIVER) /* common parts for timers/interrupts */
|
||||
|
||||
/* Breathing Sleep LED brighness(PWM On period) table
|
||||
* (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
|
||||
@@ -33,10 +25,7 @@
|
||||
*/
|
||||
static const uint8_t breathing_table[64] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 10, 15, 23, 32, 44, 58, 74, 93, 113, 135, 157, 179, 199, 218, 233, 245, 252, 255, 252, 245, 233, 218, 199, 179, 157, 135, 113, 93, 74, 58, 44, 32, 23, 15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
/* interrupt handler */
|
||||
OSAL_IRQ_HANDLER(TIMER_INTERRUPT_VECTOR) {
|
||||
OSAL_IRQ_PROLOGUE();
|
||||
|
||||
void sleep_led_timer_callback(void) {
|
||||
/* Software PWM
|
||||
* timer:1111 1111 1111 1111
|
||||
* \_____/\/ \_______/____ count(0-255)
|
||||
@@ -64,20 +53,19 @@ OSAL_IRQ_HANDLER(TIMER_INTERRUPT_VECTOR) {
|
||||
if (timer.pwm.count == breathing_table[timer.pwm.index]) {
|
||||
led_set(0);
|
||||
}
|
||||
|
||||
/* Reset the counter */
|
||||
RESET_COUNTER;
|
||||
|
||||
OSAL_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
#endif /* common parts for known platforms */
|
||||
|
||||
#if defined(KL2x) || defined(K20x) /* platform selection: familiar Kinetis chips */
|
||||
|
||||
/* Use Low Power Timer (LPTMR) */
|
||||
# define TIMER_INTERRUPT_VECTOR KINETIS_LPTMR0_IRQ_VECTOR
|
||||
# define RESET_COUNTER LPTMR0->CSR |= LPTMRx_CSR_TCF
|
||||
|
||||
/* LPTMR clock options */
|
||||
# define LPTMR_CLOCK_MCGIRCLK 0 /* 4MHz clock */
|
||||
# define LPTMR_CLOCK_LPO 1 /* 1kHz clock */
|
||||
# define LPTMR_CLOCK_LPO 1 /* 1kHz clock */
|
||||
# define LPTMR_CLOCK_ERCLK32K 2 /* external 32kHz crystal */
|
||||
# define LPTMR_CLOCK_OSCERCLK 3 /* output from OSC */
|
||||
|
||||
@@ -86,6 +74,18 @@ OSAL_IRQ_HANDLER(TIMER_INTERRUPT_VECTOR) {
|
||||
# define SIM_SCGC5_LPTMR SIM_SCGC5_LPTIMER
|
||||
# endif
|
||||
|
||||
/* interrupt handler */
|
||||
OSAL_IRQ_HANDLER(TIMER_INTERRUPT_VECTOR) {
|
||||
OSAL_IRQ_PROLOGUE();
|
||||
|
||||
sleep_led_timer_callback();
|
||||
|
||||
/* Reset the counter */
|
||||
RESET_COUNTER;
|
||||
|
||||
OSAL_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
/* Initialise the timer */
|
||||
void sleep_led_init(void) {
|
||||
/* Make sure the clock to the LPTMR is enabled */
|
||||
@@ -121,7 +121,7 @@ void sleep_led_init(void) {
|
||||
MCG->C2 |= MCG_C2_IRCS; // fast (4MHz) internal ref clock
|
||||
# if defined(KL27) // divide the 8MHz IRC by 2, to have the same MCGIRCLK speed as others
|
||||
MCG->MC |= MCG_MC_LIRC_DIV2_DIV2;
|
||||
# endif /* KL27 */
|
||||
# endif /* KL27 */
|
||||
MCG->C1 |= MCG_C1_IRCLKEN; // enable internal ref clock
|
||||
// to work in stop mode, also MCG_C1_IREFSTEN
|
||||
// Divide 4MHz by 2^N (N=6) => 62500 irqs/sec =>
|
||||
@@ -159,45 +159,23 @@ void sleep_led_toggle(void) {
|
||||
LPTMR0->CSR ^= LPTMRx_CSR_TEN;
|
||||
}
|
||||
|
||||
#elif defined(STM32F0XX) /* platform selection: STM32F0XX */
|
||||
#elif defined(SLEEP_LED_GPT_DRIVER)
|
||||
|
||||
static void gptTimerCallback(GPTDriver *gptp) {
|
||||
(void)gptp;
|
||||
sleep_led_timer_callback();
|
||||
}
|
||||
|
||||
static const GPTConfig gptcfg = {1000000, gptTimerCallback, 0, 0};
|
||||
|
||||
/* Initialise the timer */
|
||||
void sleep_led_init(void) {
|
||||
/* enable clock */
|
||||
rccEnableTIM14(FALSE); /* low power enable = FALSE */
|
||||
rccResetTIM14();
|
||||
void sleep_led_init(void) { gptStart(&SLEEP_LED_GPT_DRIVER, &gptcfg); }
|
||||
|
||||
/* prescale */
|
||||
/* Assuming 48MHz internal clock */
|
||||
/* getting cca 65484 irqs/sec */
|
||||
STM32_TIM14->PSC = 733;
|
||||
void sleep_led_enable(void) { gptStartContinuous(&SLEEP_LED_GPT_DRIVER, gptcfg.frequency / 0xFFFF); }
|
||||
|
||||
/* auto-reload */
|
||||
/* 0 => interrupt every time */
|
||||
STM32_TIM14->ARR = 3;
|
||||
void sleep_led_disable(void) { gptStopTimer(&SLEEP_LED_GPT_DRIVER); }
|
||||
|
||||
/* enable counter update event interrupt */
|
||||
STM32_TIM14->DIER |= STM32_TIM_DIER_UIE;
|
||||
|
||||
/* register interrupt vector */
|
||||
nvicEnableVector(STM32_TIM14_NUMBER, 2); /* vector, priority */
|
||||
}
|
||||
|
||||
void sleep_led_enable(void) {
|
||||
/* Enable the timer */
|
||||
STM32_TIM14->CR1 = STM32_TIM_CR1_CEN | STM32_TIM_CR1_URS;
|
||||
/* URS => update event only on overflow; setting UG bit disabled */
|
||||
}
|
||||
|
||||
void sleep_led_disable(void) {
|
||||
/* Disable the timer */
|
||||
STM32_TIM14->CR1 = 0;
|
||||
}
|
||||
|
||||
void sleep_led_toggle(void) {
|
||||
/* Toggle the timer */
|
||||
STM32_TIM14->CR1 ^= STM32_TIM_CR1_CEN;
|
||||
}
|
||||
void sleep_led_toggle(void) { (SLEEP_LED_GPT_DRIVER.state == GPT_READY) ? sleep_led_enable() : sleep_led_disable(); }
|
||||
|
||||
#else /* platform selection: not on familiar chips */
|
||||
|
||||
|
||||
@@ -24,6 +24,13 @@
|
||||
# include "rgblight.h"
|
||||
#endif
|
||||
|
||||
#ifdef LED_MATRIX_ENABLE
|
||||
# include "led_matrix.h"
|
||||
#endif
|
||||
#ifdef RGB_MATRIX_ENABLE
|
||||
# include "rgb_matrix.h"
|
||||
#endif
|
||||
|
||||
/** \brief suspend idle
|
||||
*
|
||||
* FIXME: needs doc
|
||||
@@ -53,6 +60,13 @@ void suspend_power_down(void) {
|
||||
backlight_set(0);
|
||||
#endif
|
||||
|
||||
#ifdef LED_MATRIX_ENABLE
|
||||
led_matrix_task();
|
||||
#endif
|
||||
#ifdef RGB_MATRIX_ENABLE
|
||||
rgb_matrix_task();
|
||||
#endif
|
||||
|
||||
// Turn off LED indicators
|
||||
uint8_t leds_off = 0;
|
||||
#if defined(BACKLIGHT_CAPS_LOCK) && defined(BACKLIGHT_ENABLE)
|
||||
@@ -69,6 +83,13 @@ void suspend_power_down(void) {
|
||||
#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
|
||||
rgblight_suspend();
|
||||
#endif
|
||||
|
||||
#if defined(LED_MATRIX_ENABLE)
|
||||
led_matrix_set_suspend_state(true);
|
||||
#endif
|
||||
#if defined(RGB_MATRIX_ENABLE)
|
||||
rgb_matrix_set_suspend_state(true);
|
||||
#endif
|
||||
#ifdef AUDIO_ENABLE
|
||||
stop_all_notes();
|
||||
#endif /* AUDIO_ENABLE */
|
||||
@@ -137,5 +158,12 @@ void suspend_wakeup_init(void) {
|
||||
#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
|
||||
rgblight_wakeup();
|
||||
#endif
|
||||
|
||||
#if defined(LED_MATRIX_ENABLE)
|
||||
led_matrix_set_suspend_state(false);
|
||||
#endif
|
||||
#if defined(RGB_MATRIX_ENABLE)
|
||||
rgb_matrix_set_suspend_state(false);
|
||||
#endif
|
||||
suspend_wakeup_init_kb();
|
||||
}
|
||||
|
||||
89
tmk_core/common/chibios/wait.c
Normal file
89
tmk_core/common/chibios/wait.c
Normal file
@@ -0,0 +1,89 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* 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 3 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 __OPTIMIZE__
|
||||
# pragma message "Compiler optimizations disabled; wait_cpuclock() won't work as designed"
|
||||
#endif
|
||||
|
||||
#define CLOCK_DELAY_NOP8 "nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
|
||||
|
||||
__attribute__((always_inline)) static inline void wait_cpuclock(unsigned int n) { /* n: 1..135 */
|
||||
/* The argument n must be a constant expression.
|
||||
* That way, compiler optimization will remove unnecessary code. */
|
||||
if (n < 1) {
|
||||
return;
|
||||
}
|
||||
if (n > 8) {
|
||||
unsigned int n8 = n / 8;
|
||||
n = n - n8 * 8;
|
||||
switch (n8) {
|
||||
case 16:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 15:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 14:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 13:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 12:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 11:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 10:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 9:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 8:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 7:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 6:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 5:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 4:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 3:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 2:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 1:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 0:
|
||||
break;
|
||||
}
|
||||
}
|
||||
switch (n) {
|
||||
case 8:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 7:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 6:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 5:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 4:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 3:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 2:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 1:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 0:
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -60,10 +60,12 @@ void eeconfig_init_quantum(void) {
|
||||
eeprom_update_dword(EECONFIG_HAPTIC, 0);
|
||||
eeprom_update_byte(EECONFIG_VELOCIKEY, 0);
|
||||
eeprom_update_dword(EECONFIG_RGB_MATRIX, 0);
|
||||
eeprom_update_byte(EECONFIG_RGB_MATRIX_SPEED, 0);
|
||||
eeprom_update_word(EECONFIG_RGB_MATRIX_EXTENDED, 0);
|
||||
|
||||
#ifdef ORYX_ENABLE
|
||||
eeconfig_init_oryx();
|
||||
#endif
|
||||
|
||||
// TODO: Remove once ARM has a way to configure EECONFIG_HANDEDNESS
|
||||
// within the emulated eeprom via dfu-util or another tool
|
||||
#if defined INIT_EE_HANDS_LEFT
|
||||
@@ -160,17 +162,6 @@ void eeconfig_update_keymap(uint16_t val) {
|
||||
eeprom_update_byte(EECONFIG_KEYMAP_UPPER_BYTE, (val >> 8) & 0xFF);
|
||||
}
|
||||
|
||||
/** \brief eeconfig read backlight
|
||||
*
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
|
||||
/** \brief eeconfig update backlight
|
||||
*
|
||||
* FIXME: needs doc
|
||||
*/
|
||||
void eeconfig_update_backlight(uint8_t val) { eeprom_update_byte(EECONFIG_BACKLIGHT, val); }
|
||||
|
||||
/** \brief eeconfig read audio
|
||||
*
|
||||
* FIXME: needs doc
|
||||
|
||||
@@ -21,7 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifndef EECONFIG_MAGIC_NUMBER
|
||||
# define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEEB // When changing, decrement this value to avoid future re-init issues
|
||||
# define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEEA // When changing, decrement this value to avoid future re-init issues
|
||||
#endif
|
||||
#define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF
|
||||
|
||||
@@ -43,12 +43,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define EECONFIG_VELOCIKEY (uint8_t *)23
|
||||
|
||||
#define EECONFIG_HAPTIC (uint32_t *)24
|
||||
|
||||
// Mutually exclusive
|
||||
#define EECONFIG_LED_MATRIX (uint32_t *)28
|
||||
#define EECONFIG_RGB_MATRIX (uint32_t *)28
|
||||
#define EECONFIG_RGB_MATRIX_SPEED (uint8_t *)32
|
||||
// Speed & Flags
|
||||
#define EECONFIG_LED_MATRIX_EXTENDED (uint16_t *)32
|
||||
#define EECONFIG_RGB_MATRIX_EXTENDED (uint16_t *)32
|
||||
|
||||
// TODO: Combine these into a single word and single block of EEPROM
|
||||
#define EECONFIG_KEYMAP_UPPER_BYTE (uint8_t *)33
|
||||
#define EECONFIG_KEYMAP_UPPER_BYTE (uint8_t *)34
|
||||
// Size of EEPROM being used, other code can refer to this for available EEPROM
|
||||
#define EECONFIG_SIZE 34
|
||||
#define EECONFIG_SIZE 35
|
||||
/* debug bit */
|
||||
#define EECONFIG_DEBUG_ENABLE (1 << 0)
|
||||
#define EECONFIG_DEBUG_MATRIX (1 << 1)
|
||||
@@ -88,11 +94,6 @@ void eeconfig_update_default_layer(uint8_t val);
|
||||
uint16_t eeconfig_read_keymap(void);
|
||||
void eeconfig_update_keymap(uint16_t val);
|
||||
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
uint8_t eeconfig_read_backlight(void);
|
||||
void eeconfig_update_backlight(uint8_t val);
|
||||
#endif
|
||||
|
||||
#ifdef AUDIO_ENABLE
|
||||
uint8_t eeconfig_read_audio(void);
|
||||
void eeconfig_update_audio(uint8_t val);
|
||||
|
||||
@@ -34,11 +34,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
# include "backlight.h"
|
||||
#endif
|
||||
#ifdef BOOTMAGIC_ENABLE
|
||||
# include "bootmagic.h"
|
||||
#else
|
||||
# include "magic.h"
|
||||
#endif
|
||||
#ifdef MOUSEKEY_ENABLE
|
||||
# include "mousekey.h"
|
||||
#endif
|
||||
@@ -54,6 +49,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
# include "rgblight.h"
|
||||
#endif
|
||||
#ifdef LED_MATRIX_ENABLE
|
||||
# include "led_matrix.h"
|
||||
#endif
|
||||
#ifdef RGB_MATRIX_ENABLE
|
||||
# include "rgb_matrix.h"
|
||||
#endif
|
||||
@@ -96,6 +94,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#ifdef DIP_SWITCH_ENABLE
|
||||
# include "dip_switch.h"
|
||||
#endif
|
||||
#ifdef STM32_EEPROM_ENABLE
|
||||
# include "eeprom_stm32.h"
|
||||
#endif
|
||||
#ifdef EEPROM_DRIVER
|
||||
# include "eeprom_driver.h"
|
||||
#endif
|
||||
|
||||
static uint32_t last_input_modification_time = 0;
|
||||
uint32_t last_input_activity_time(void) { return last_input_modification_time; }
|
||||
@@ -233,6 +237,12 @@ void keyboard_setup(void) {
|
||||
disable_jtag();
|
||||
#endif
|
||||
print_set_sendchar(sendchar);
|
||||
#ifdef STM32_EEPROM_ENABLE
|
||||
EEPROM_Init();
|
||||
#endif
|
||||
#ifdef EEPROM_DRIVER
|
||||
eeprom_driver_init();
|
||||
#endif
|
||||
matrix_setup();
|
||||
keyboard_pre_init_kb();
|
||||
}
|
||||
@@ -270,6 +280,15 @@ __attribute__((weak)) void housekeeping_task_kb(void) {}
|
||||
*/
|
||||
__attribute__((weak)) void housekeeping_task_user(void) {}
|
||||
|
||||
/** \brief housekeeping_task
|
||||
*
|
||||
* Invokes hooks for executing code after QMK is done after each loop iteration.
|
||||
*/
|
||||
void housekeeping_task(void) {
|
||||
housekeeping_task_kb();
|
||||
housekeeping_task_user();
|
||||
}
|
||||
|
||||
/** \brief keyboard_init
|
||||
*
|
||||
* FIXME: needs doc
|
||||
@@ -296,11 +315,6 @@ void keyboard_init(void) {
|
||||
#ifdef ADB_MOUSE_ENABLE
|
||||
adb_mouse_init();
|
||||
#endif
|
||||
#ifdef BOOTMAGIC_ENABLE
|
||||
bootmagic();
|
||||
#else
|
||||
magic();
|
||||
#endif
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
backlight_init();
|
||||
#endif
|
||||
@@ -337,6 +351,9 @@ void keyboard_init(void) {
|
||||
* This is differnet than keycode events as no layer processing, or filtering occurs.
|
||||
*/
|
||||
void switch_events(uint8_t row, uint8_t col, bool pressed) {
|
||||
#if defined(LED_MATRIX_ENABLE)
|
||||
process_led_matrix(row, col, pressed);
|
||||
#endif
|
||||
#if defined(RGB_MATRIX_ENABLE)
|
||||
process_rgb_matrix(row, col, pressed);
|
||||
#endif
|
||||
@@ -366,9 +383,6 @@ void keyboard_task(void) {
|
||||
bool encoders_changed = false;
|
||||
#endif
|
||||
|
||||
housekeeping_task_kb();
|
||||
housekeeping_task_user();
|
||||
|
||||
uint8_t matrix_changed = matrix_scan();
|
||||
if (matrix_changed) last_matrix_activity_trigger();
|
||||
|
||||
@@ -422,6 +436,9 @@ MATRIX_LOOP_END:
|
||||
rgblight_task();
|
||||
#endif
|
||||
|
||||
#ifdef LED_MATRIX_ENABLE
|
||||
led_matrix_task();
|
||||
#endif
|
||||
#ifdef RGB_MATRIX_ENABLE
|
||||
rgb_matrix_task();
|
||||
#endif
|
||||
|
||||
@@ -70,8 +70,9 @@ void keyboard_pre_init_user(void);
|
||||
void keyboard_post_init_kb(void);
|
||||
void keyboard_post_init_user(void);
|
||||
|
||||
void housekeeping_task_kb(void);
|
||||
void housekeeping_task_user(void);
|
||||
void housekeeping_task(void); // To be executed by the main loop in each backend TMK protocol
|
||||
void housekeeping_task_kb(void); // To be overridden by keyboard-level code
|
||||
void housekeeping_task_user(void); // To be overridden by user/keymap-level code
|
||||
|
||||
uint32_t last_input_activity_time(void); // Timestamp of the last matrix or encoder activity
|
||||
uint32_t last_input_activity_elapsed(void); // Number of milliseconds since the last matrix or encoder activity
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#if defined(__AVR__)
|
||||
# include <util/delay.h>
|
||||
#endif
|
||||
#include "matrix.h"
|
||||
#include "bootloader.h"
|
||||
#include "debug.h"
|
||||
#include "keymap.h"
|
||||
#include "host.h"
|
||||
#include "action_layer.h"
|
||||
#include "eeconfig.h"
|
||||
#include "magic.h"
|
||||
|
||||
keymap_config_t keymap_config;
|
||||
|
||||
/** \brief Magic
|
||||
*
|
||||
* FIXME: Needs doc
|
||||
*/
|
||||
void magic(void) {
|
||||
/* check signature */
|
||||
if (!eeconfig_is_enabled()) {
|
||||
eeconfig_init();
|
||||
}
|
||||
|
||||
/* debug enable */
|
||||
debug_config.raw = eeconfig_read_debug();
|
||||
|
||||
/* keymap config */
|
||||
keymap_config.raw = eeconfig_read_keymap();
|
||||
|
||||
uint8_t default_layer = 0;
|
||||
default_layer = eeconfig_read_default_layer();
|
||||
default_layer_set((layer_state_t)default_layer);
|
||||
|
||||
/* Also initialize layer state to trigger callback functions for layer_state */
|
||||
layer_state_set_kb((layer_state_t)layer_state);
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
void magic(void);
|
||||
22
tmk_core/common/test/_wait.h
Normal file
22
tmk_core/common/test/_wait.h
Normal file
@@ -0,0 +1,22 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* 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 3 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/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
void wait_ms(uint32_t ms);
|
||||
#define wait_us(us) wait_ms(us / 1000)
|
||||
#define waitInputPinDelay()
|
||||
29
tmk_core/common/usb_util.c
Normal file
29
tmk_core/common/usb_util.c
Normal file
@@ -0,0 +1,29 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* 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 3 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 "usb_util.h"
|
||||
#include "wait.h"
|
||||
|
||||
__attribute__((weak)) void usb_disable(void) {}
|
||||
__attribute__((weak)) bool usb_connected_state(void) { return true; }
|
||||
__attribute__((weak)) bool usb_vbus_state(void) {
|
||||
#ifdef USB_VBUS_PIN
|
||||
setPinInput(USB_VBUS_PIN);
|
||||
wait_us(5);
|
||||
return readPin(USB_VBUS_PIN);
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
22
tmk_core/common/usb_util.h
Normal file
22
tmk_core/common/usb_util.h
Normal file
@@ -0,0 +1,22 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* 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 3 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/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
void usb_disable(void);
|
||||
bool usb_connected_state(void);
|
||||
bool usb_vbus_state(void);
|
||||
@@ -1,3 +1,18 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* 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 3 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/>.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <inttypes.h>
|
||||
@@ -6,114 +21,8 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(__ARMEL__) || defined(__ARMEB__)
|
||||
# ifndef __OPTIMIZE__
|
||||
# pragma message "Compiler optimizations disabled; wait_cpuclock() won't work as designed"
|
||||
# endif
|
||||
|
||||
# define wait_cpuclock(x) wait_cpuclock_allnop(x)
|
||||
|
||||
# define CLOCK_DELAY_NOP8 "nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
|
||||
|
||||
__attribute__((always_inline)) static inline void wait_cpuclock_allnop(unsigned int n) { /* n: 1..135 */
|
||||
/* The argument n must be a constant expression.
|
||||
* That way, compiler optimization will remove unnecessary code. */
|
||||
if (n < 1) {
|
||||
return;
|
||||
}
|
||||
if (n > 8) {
|
||||
unsigned int n8 = n / 8;
|
||||
n = n - n8 * 8;
|
||||
switch (n8) {
|
||||
case 16:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 15:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 14:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 13:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 12:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 11:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 10:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 9:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 8:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 7:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 6:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 5:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 4:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 3:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 2:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 1:
|
||||
asm volatile(CLOCK_DELAY_NOP8::: "memory");
|
||||
case 0:
|
||||
break;
|
||||
}
|
||||
}
|
||||
switch (n) {
|
||||
case 8:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 7:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 6:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 5:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 4:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 3:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 2:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 1:
|
||||
asm volatile("nop" ::: "memory");
|
||||
case 0:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(__AVR__)
|
||||
# include <util/delay.h>
|
||||
# define wait_ms(ms) _delay_ms(ms)
|
||||
# define wait_us(us) _delay_us(us)
|
||||
# define wait_cpuclock(x) __builtin_avr_delay_cycles(x)
|
||||
#elif defined PROTOCOL_CHIBIOS
|
||||
# include <ch.h>
|
||||
# define wait_ms(ms) \
|
||||
do { \
|
||||
if (ms != 0) { \
|
||||
chThdSleepMilliseconds(ms); \
|
||||
} else { \
|
||||
chThdSleepMicroseconds(1); \
|
||||
} \
|
||||
} while (0)
|
||||
# define wait_us(us) \
|
||||
do { \
|
||||
if (us != 0) { \
|
||||
chThdSleepMicroseconds(us); \
|
||||
} else { \
|
||||
chThdSleepMicroseconds(1); \
|
||||
} \
|
||||
} while (0)
|
||||
#elif defined PROTOCOL_ARM_ATSAM
|
||||
# include "clks.h"
|
||||
# define wait_ms(ms) CLK_delay_ms(ms)
|
||||
# define wait_us(us) CLK_delay_us(us)
|
||||
#else // Unit tests
|
||||
void wait_ms(uint32_t ms);
|
||||
# define wait_us(us) wait_ms(us / 1000)
|
||||
#if __has_include_next("_wait.h")
|
||||
# include_next "_wait.h" /* Include the platforms _wait.h */
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -54,5 +54,9 @@ ifeq ($(strip $(XT_ENABLE)), yes)
|
||||
OPT_DEFS += -DXT_ENABLE
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(USB_HID_ENABLE)), yes)
|
||||
include $(TMK_DIR)/protocol/usb_hid.mk
|
||||
endif
|
||||
|
||||
# Search Path
|
||||
VPATH += $(TMK_DIR)/protocol
|
||||
|
||||
@@ -305,5 +305,10 @@ int main(void) {
|
||||
// dprintf("5v=%u 5vu=%u dlow=%u dhi=%u gca=%u gcd=%u\r\n", v_5v, v_5v_avg, v_5v_avg - V5_LOW, v_5v_avg - V5_HIGH, gcr_actual, gcr_desired);
|
||||
}
|
||||
#endif // CONSOLE_ENABLE
|
||||
|
||||
// Run housekeeping
|
||||
housekeeping_task();
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ SRC += $(CHIBIOS_DIR)/usb_main.c
|
||||
SRC += $(CHIBIOS_DIR)/main.c
|
||||
SRC += usb_descriptor.c
|
||||
SRC += $(CHIBIOS_DIR)/usb_driver.c
|
||||
SRC += $(CHIBIOS_DIR)/usb_util.c
|
||||
SRC += $(LIBSRC)
|
||||
|
||||
VPATH += $(TMK_PATH)/$(PROTOCOL_DIR)
|
||||
|
||||
@@ -51,12 +51,6 @@
|
||||
#ifdef MIDI_ENABLE
|
||||
# include "qmk_midi.h"
|
||||
#endif
|
||||
#ifdef STM32_EEPROM_ENABLE
|
||||
# include "eeprom_stm32.h"
|
||||
#endif
|
||||
#ifdef EEPROM_DRIVER
|
||||
# include "eeprom_driver.h"
|
||||
#endif
|
||||
#include "suspend.h"
|
||||
#include "wait.h"
|
||||
|
||||
@@ -154,13 +148,6 @@ int main(void) {
|
||||
halInit();
|
||||
chSysInit();
|
||||
|
||||
#ifdef STM32_EEPROM_ENABLE
|
||||
EEPROM_Init();
|
||||
#endif
|
||||
#ifdef EEPROM_DRIVER
|
||||
eeprom_driver_init();
|
||||
#endif
|
||||
|
||||
// TESTING
|
||||
// chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);
|
||||
|
||||
@@ -277,7 +264,6 @@ int main(void) {
|
||||
#endif
|
||||
|
||||
// Run housekeeping
|
||||
housekeeping_task_kb();
|
||||
housekeeping_task_user();
|
||||
housekeeping_task();
|
||||
}
|
||||
}
|
||||
|
||||
21
tmk_core/protocol/chibios/usb_util.c
Normal file
21
tmk_core/protocol/chibios/usb_util.c
Normal file
@@ -0,0 +1,21 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* 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 3 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 <hal.h>
|
||||
#include "usb_util.h"
|
||||
|
||||
void usb_disable(void) { usbStop(&USBD1); }
|
||||
|
||||
bool usb_connected_state(void) { return usbGetDriverStateI(&USBD1) == USB_ACTIVE; }
|
||||
@@ -44,6 +44,7 @@ ifeq ($(strip $(VIRTSER_ENABLE)), yes)
|
||||
endif
|
||||
|
||||
SRC += $(LUFA_SRC)
|
||||
SRC += $(LUFA_DIR)/usb_util.c
|
||||
|
||||
# Search Path
|
||||
VPATH += $(TMK_PATH)/$(LUFA_DIR)
|
||||
@@ -66,8 +67,8 @@ LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8
|
||||
LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8
|
||||
LUFA_OPTS += -DFIXED_NUM_CONFIGURATIONS=1
|
||||
|
||||
# Remote wakeup fix for ATmega32U2 https://github.com/tmk/tmk_keyboard/issues/361
|
||||
ifeq ($(MCU),atmega32u2)
|
||||
# Remote wakeup fix for ATmega16/32U2 https://github.com/tmk/tmk_keyboard/issues/361
|
||||
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2))
|
||||
LUFA_OPTS += -DNO_LIMITED_CONTROLLER_CONNECT
|
||||
endif
|
||||
|
||||
|
||||
@@ -1238,8 +1238,7 @@ int main(void) {
|
||||
#endif
|
||||
|
||||
// Run housekeeping
|
||||
housekeeping_task_kb();
|
||||
housekeeping_task_user();
|
||||
housekeeping_task();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
34
tmk_core/protocol/lufa/usb_util.c
Normal file
34
tmk_core/protocol/lufa/usb_util.c
Normal file
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* 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 3 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 <LUFA/Drivers/USB/USB.h>
|
||||
#include "usb_util.h"
|
||||
#include "wait.h"
|
||||
|
||||
void usb_disable(void) {
|
||||
USB_Disable();
|
||||
USB_DeviceState = DEVICE_STATE_Unattached;
|
||||
}
|
||||
|
||||
bool usb_connected_state(void) { return USB_Device_IsAddressSet(); }
|
||||
|
||||
#if defined(OTGPADE)
|
||||
bool usb_vbus_state(void) {
|
||||
USB_OTGPAD_On(); // enables VBUS pad
|
||||
wait_us(5);
|
||||
|
||||
return USB_VBUS_GetStatus(); // checks state of VBUS
|
||||
}
|
||||
#endif
|
||||
@@ -5,6 +5,7 @@ VUSB_PATH = $(LIB_PATH)/vusb
|
||||
|
||||
SRC += $(VUSB_DIR)/main.c \
|
||||
$(VUSB_DIR)/vusb.c \
|
||||
$(VUSB_DIR)/usb_util.c \
|
||||
$(VUSB_PATH)/usbdrv/usbdrv.c \
|
||||
$(VUSB_PATH)/usbdrv/usbdrvasm.S \
|
||||
$(VUSB_PATH)/usbdrv/oddebug.c
|
||||
|
||||
24
tmk_core/protocol/vusb/usb_util.c
Normal file
24
tmk_core/protocol/vusb/usb_util.c
Normal file
@@ -0,0 +1,24 @@
|
||||
/* Copyright 2021 QMK
|
||||
*
|
||||
* 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 3 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 <usbdrv/usbdrv.h>
|
||||
#include "usb_util.h"
|
||||
|
||||
void usb_disable(void) { usbDeviceDisconnect(); }
|
||||
|
||||
bool usb_connected_state(void) {
|
||||
usbPoll();
|
||||
return usbConfiguration;
|
||||
}
|
||||
@@ -223,6 +223,12 @@ ifneq ($(filter Darwin FreeBSD,$(shell uname -s)),)
|
||||
MD5SUM = md5
|
||||
endif
|
||||
|
||||
# UF2 format settings
|
||||
# To produce a UF2 file in your build, add to your keyboard's rules.mk:
|
||||
# FIRMWARE_FORMAT = uf2
|
||||
UF2CONV = $(TOP_DIR)/util/uf2conv.py
|
||||
UF2_FAMILY ?= 0x0
|
||||
|
||||
# Compiler flags to generate dependency files.
|
||||
#GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||
GENDEPFLAGS = -MMD -MP -MF $(patsubst %.o,%.td,$@)
|
||||
@@ -255,6 +261,7 @@ DFU_SUFFIX_ARGS ?=
|
||||
|
||||
elf: $(BUILD_DIR)/$(TARGET).elf
|
||||
hex: $(BUILD_DIR)/$(TARGET).hex
|
||||
uf2: $(BUILD_DIR)/$(TARGET).uf2
|
||||
cpfirmware: $(FIRMWARE_FORMAT)
|
||||
$(SILENT) || printf "Copying $(TARGET).$(FIRMWARE_FORMAT) to qmk_firmware folder" | $(AWK_CMD)
|
||||
$(COPY) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT) $(TARGET).$(FIRMWARE_FORMAT) && $(PRINT_OK)
|
||||
@@ -283,34 +290,46 @@ gccversion :
|
||||
|
||||
# Create final output files (.hex, .eep) from ELF output file.
|
||||
%.hex: %.elf
|
||||
@$(SILENT) || printf "$(MSG_FLASH) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(HEX) $< $@)
|
||||
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||
@$(SILENT) || printf "$(MSG_FLASH) $@" | $(AWK_CMD)
|
||||
@$(BUILD_CMD)
|
||||
|
||||
%.uf2: %.hex
|
||||
$(eval CMD=$(UF2CONV) $(BUILD_DIR)/$(TARGET).hex -o $(BUILD_DIR)/$(TARGET).uf2 -c -f $(UF2_FAMILY) >/dev/null 2>&1)
|
||||
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||
@$(SILENT) || printf "$(MSG_UF2) $@" | $(AWK_CMD)
|
||||
@$(BUILD_CMD)
|
||||
|
||||
%.eep: %.elf
|
||||
@$(SILENT) || printf "$(MSG_EEPROM) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(EEP) $< $@ || exit 0)
|
||||
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||
@$(SILENT) || printf "$(MSG_EEPROM) $@" | $(AWK_CMD)
|
||||
@$(BUILD_CMD)
|
||||
|
||||
# Create extended listing file from ELF output file.
|
||||
%.lss: %.elf
|
||||
@$(SILENT) || printf "$(MSG_EXTENDED_LISTING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(OBJDUMP) -h -S -z $< > $@)
|
||||
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||
@$(SILENT) || printf "$(MSG_EXTENDED_LISTING) $@" | $(AWK_CMD)
|
||||
@$(BUILD_CMD)
|
||||
|
||||
# Create a symbol table from ELF output file.
|
||||
%.sym: %.elf
|
||||
@$(SILENT) || printf "$(MSG_SYMBOL_TABLE) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(NM) -n $< > $@ )
|
||||
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||
@$(SILENT) || printf "$(MSG_SYMBOL_TABLE) $@" | $(AWK_CMD)
|
||||
@$(BUILD_CMD)
|
||||
|
||||
%.bin: %.elf
|
||||
@$(SILENT) || printf "$(MSG_BIN) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(BIN) $< $@ || exit 0)
|
||||
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||
@$(SILENT) || printf "$(MSG_BIN) $@" | $(AWK_CMD)
|
||||
@$(BUILD_CMD)
|
||||
if [ ! -z "$(DFU_SUFFIX_ARGS)" ]; then \
|
||||
$(DFU_SUFFIX) $(DFU_SUFFIX_ARGS) -a $(BUILD_DIR)/$(TARGET).bin 1>/dev/null ;\
|
||||
fi
|
||||
#$(SILENT) || printf "$(MSG_EXECUTING) '$(DFU_SUFFIX) $(DFU_SUFFIX_ARGS) -a $(BUILD_DIR)/$(TARGET).bin 1>/dev/null':\n" ;\
|
||||
$(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin;
|
||||
|
||||
BEGIN = gccversion sizebefore
|
||||
@@ -476,7 +495,7 @@ $(eval $(foreach OUTPUT,$(OUTPUTS),$(shell mkdir -p $(OUTPUT) 2>/dev/null)))
|
||||
|
||||
# Listing of phony targets.
|
||||
.PHONY : all dump_vars finish sizebefore sizeafter qmkversion \
|
||||
gccversion build elf hex eep lss sym coff extcoff \
|
||||
gccversion build elf hex uf2 eep lss sym coff extcoff \
|
||||
clean clean_list debug gdb-config show_path \
|
||||
program teensy dfu dfu-ee dfu-start \
|
||||
flash dfu-split-left dfu-split-right \
|
||||
|
||||
Reference in New Issue
Block a user