From 1c2705eea59c6e772dd771c5f77fbbddeda1d61d Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sat, 11 Jun 2016 17:24:28 -0500 Subject: [PATCH 01/20] fixed color detection routine in makefile --- tmk_core/rules.mk | 58 +++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index 8cae22b38..79a728245 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -43,7 +43,7 @@ # make flip-ee = Download the eeprom file to the device, using Atmel FLIP # (must have Atmel FLIP installed). # -# make debug = Start either simulavr or avarice as specified for debugging, +# make debug = Start either simulavr or avarice as specified for debugging, # with avr-gdb or avr-insight as the front end for debugging. # # make filename.s = Just compile filename.c into the assembler code only. @@ -66,7 +66,7 @@ BUILD_DIR = .build OBJDIR = $(BUILD_DIR)/obj_$(TARGET) -# Optimization level, can be [0, 1, 2, 3, s]. +# Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s @@ -161,10 +161,8 @@ CFLAGS += -fshort-enums CFLAGS += -fno-strict-aliasing # add color ifeq ($(COLOR),true) -ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") +ifeq ("$(echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") CFLAGS+= -fdiagnostics-color -else ifeq ("$(shell echo "int main(){}" | $(CC) -fcolor-diagnostics -x c - -o /dev/null 2>&1)", "") - CFLAGS+= -fcolor-diagnostics endif endif CFLAGS += -Wall @@ -223,7 +221,7 @@ endif # for use in COFF files, additional information about filenames # and function names needs to be present in the assembler source # files -- see avr-libc docs [FIXME: not yet described there] -# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. ASFLAGS = $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) @@ -239,7 +237,7 @@ PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt # If this is left blank, then it will use the Standard printf version. -PRINTF_LIB = +PRINTF_LIB = #PRINTF_LIB = $(PRINTF_LIB_MIN) #PRINTF_LIB = $(PRINTF_LIB_FLOAT) @@ -251,7 +249,7 @@ SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt # If this is left blank, then it will use the Standard scanf version. -SCANF_LIB = +SCANF_LIB = #SCANF_LIB = $(SCANF_LIB_MIN) #SCANF_LIB = $(SCANF_LIB_FLOAT) @@ -263,7 +261,7 @@ MATH_LIB = -lm # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = +EXTRALIBDIRS = @@ -324,7 +322,7 @@ JTAG_DEV = /dev/com1 DEBUG_PORT = 4242 # Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when +# just set to localhost unless doing some sort of crazy debugging when # avarice is running on a different computer. DEBUG_HOST = localhost @@ -358,7 +356,7 @@ endif MSG_ERRORS_NONE = Errors: none MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: +MSG_SIZE_BEFORE = Size before: MSG_SIZE_AFTER = Size after: MSG_COFF = Converting to AVR COFF: MSG_EXTENDED_COFF = Converting to AVR Extended COFF: @@ -396,22 +394,22 @@ ALL_CPPFLAGS = -mmcu=$(MCU) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) ALL_ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) # Default target. -all: - @$(MAKE) begin - @$(MAKE) gccversion - @$(MAKE) sizebefore +all: + @$(MAKE) begin + @$(MAKE) gccversion + @$(MAKE) sizebefore @$(MAKE) clean_list # force clean each time - @$(MAKE) build - @$(MAKE) sizeafter + @$(MAKE) build + @$(MAKE) sizeafter @$(MAKE) end # Quick make that doesn't clean -quick: - @$(MAKE) begin - @$(MAKE) gccversion - @$(MAKE) sizebefore - @$(MAKE) build - @$(MAKE) sizeafter +quick: + @$(MAKE) begin + @$(MAKE) gccversion + @$(MAKE) sizebefore + @$(MAKE) build + @$(MAKE) sizeafter @$(MAKE) end # Change the build target to build a HEX file or a library. @@ -456,12 +454,12 @@ sizeafter: # @if [[ $($(SIZE) --target=$(FORMAT) $(TARGET).hex | awk 'NR==2 {print "0x"$5}') -gt 0x200 ]]; then $(SECHO) "File is too big!"; fi # Display compiler version information. -gccversion : +gccversion : @$(SILENT) || $(CC) --version -# Program the device. +# Program the device. program: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep $(PROGRAM_CMD) @@ -492,7 +490,7 @@ endif dfu-programmer $(MCU) erase dfu-programmer $(MCU) flash $(KEYMAP_PATH)/compiled.hex dfu-programmer $(MCU) reset - + dfu-start: dfu-programmer $(MCU) reset dfu-programmer $(MCU) start @@ -514,9 +512,9 @@ endif # Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set +# define the reset signal, load the target file, connect to target, and set # a breakpoint at main(). -gdb-config: +gdb-config: @$(REMOVE) $(GDBINIT_FILE) @echo define reset >> $(GDBINIT_FILE) @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) @@ -618,7 +616,7 @@ $(OBJDIR)/%.o : %.c $(OBJDIR)/%.o : %.cpp @mkdir -p $(@D) @$(SILENT) || printf "$(MSG_COMPILING_CPP) $<" | $(AWK_CMD) - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ @$(BUILD_CMD) # Compile: create assembler files from C source files. @@ -642,7 +640,7 @@ $(OBJDIR)/%.o : %.S # Create preprocessed source for use in sending a bug report. %.i : %.c - $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@ + $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@ # Target: clean project. clean: begin clean_list end From fdaae7ec8836ffa47949bde0d5dd865acb3016e8 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sat, 11 Jun 2016 17:24:28 -0500 Subject: [PATCH 02/20] fixed color detection routine in makefile --- tmk_core/rules.mk | 550 ++++++++++++++++++++++++++++++---------------- 1 file changed, 356 insertions(+), 194 deletions(-) diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index d2350f27c..8563f1e07 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -14,27 +14,71 @@ # Frederik Rouleau # Carlos Lamas # - -# Enable vpath seraching for source files only -# Without this, output files, could be read from the wrong .build directories -VPATH_SRC := $(VPATH) -vpath %.c $(VPATH_SRC) -vpath %.h $(VPATH_SRC) -vpath %.cpp $(VPATH_SRC) -vpath %.hpp $(VPATH_SRC) -vpath %.S $(VPATH_SRC) -VPATH := +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- # Output format. (can be srec, ihex, binary) FORMAT = ihex -# Optimization level, can be [0, 1, 2, 3, s]. +BUILD_DIR = .build + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = $(BUILD_DIR)/obj_$(TARGET) + + +# Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s -COLOR ?= true + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + +COLOR?=true ifeq ($(COLOR),true) NO_COLOR=\033[0m @@ -45,38 +89,30 @@ ifeq ($(COLOR),true) BOLD=\033[1m endif -AUTOGEN ?= false - -ifneq ($(shell awk --version 2>/dev/null),) - AWK=awk -else - AWK=cat && test -endif - -OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n -ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n -WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n +OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR) +ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR) +WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR) ifndef $(SILENT) SILENT = false endif -TAB_LOG = printf "\n$$LOG\n\n" | $(AWK) '{ sub(/^/," | "); print }' +TAB_LOG = printf "\n$$LOG\n\n" | awk '{ sub(/^/," | "); print }' TAB_LOG_PLAIN = printf "$$LOG\n" -AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }' -AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }' -PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && exit 1 -PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) -PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && exit 1 -PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) -PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS) +AWK_STATUS = awk '{ printf " %-10s\n", $$1; }' +AWK_CMD = awk '{ printf "%-69s", $$0; }' +PRINT_ERROR = ($(SILENT) ||printf "$(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && false +PRINT_WARNING = ($(SILENT) || printf "$(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) +PRINT_ERROR_PLAIN = ($(SILENT) ||printf "$(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && false +PRINT_WARNING_PLAIN = ($(SILENT) || printf "$(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) +PRINT_OK = $(SILENT) || printf "$(OK_STRING)" | $(AWK_STATUS) BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi; # List any extra directories to look for include files here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS += $(subst :, ,$(VPATH_SRC)) +EXTRAINCDIRS = $(subst :, ,$(VPATH)) # Compiler flag to set the C Standard level. @@ -88,14 +124,17 @@ CSTANDARD = -std=gnu99 # Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL CDEFS += $(OPT_DEFS) # Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) ADEFS += $(OPT_DEFS) # Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL #CPPDEFS += -D__STDC_LIMIT_MACROS #CPPDEFS += -D__STDC_CONSTANT_MACROS CPPDEFS += $(OPT_DEFS) @@ -109,12 +148,20 @@ CPPDEFS += $(OPT_DEFS) # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing -CFLAGS += -g$(DEBUG) +CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fdata-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing # add color ifeq ($(COLOR),true) -ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") +ifeq ("$(echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") CFLAGS+= -fdiagnostics-color endif endif @@ -140,9 +187,16 @@ endif # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing -CPPFLAGS += -g$(DEBUG) +CPPFLAGS = -g$(DEBUG) CPPFLAGS += $(CPPDEFS) CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -ffunction-sections +CPPFLAGS += -fdata-sections # to supress "warning: only initialized variables can be placed into program memory area" CPPFLAGS += -w CPPFLAGS += -Wall @@ -169,7 +223,7 @@ endif # files -- see avr-libc docs [FIXME: not yet described there] # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. -ASFLAGS += $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) ifdef CONFIG_H ASFLAGS += -include $(CONFIG_H) @@ -203,6 +257,28 @@ SCANF_LIB = MATH_LIB = -lm +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file @@ -211,8 +287,9 @@ MATH_LIB = -lm # Comennt out "--relax" option to avoid a error such: # (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12' # -LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref +LDFLAGS = -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref #LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) @@ -220,13 +297,59 @@ LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) # You can give EXTRALDFLAGS at 'make' command line. LDFLAGS += $(EXTRALDFLAGS) + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + # Define programs and commands. SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm REMOVE = rm -f REMOVEDIR = rmdir COPY = cp WINSHELL = cmd SECHO = $(SILENT) || echo +# Autodecct teensy loader +ifneq (, $(shell which teensy-loader-cli 2>/dev/null)) + TEENSY_LOADER_CLI = teensy-loader-cli +else + TEENSY_LOADER_CLI = teensy_loader_cli +endif # Define Messages # English @@ -239,7 +362,6 @@ 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: @@ -248,24 +370,12 @@ MSG_COMPILING_CPP = Compiling: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: MSG_CREATING_LIBRARY = Creating library: -MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \ - Some git sub-modules are out of date or modified, please consider runnning:$(BOLD)\n\ - git submodule sync --recursive\n\ - git submodule update --init --recursive$(NO_COLOR)\n\n\ - You can ignore this warning if you are not compiling any ChibiOS keyboards,\n\ - or if you have modified the ChibiOS libraries yourself. \n\n + + # Define all object files. OBJ = $(patsubst %.c,$(OBJDIR)/%.o,$(patsubst %.cpp,$(OBJDIR)/%.o,$(patsubst %.S,$(OBJDIR)/%.o,$(SRC)))) -# The files in the lib folder are shared between all keymaps, so generate that folder name by removing -# the keymap from the name -KBOBJDIR=$(subst _$(KEYMAP),,$(OBJDIR)) -# And fixup the object files to match -LIBOBJ = $(foreach v,$(OBJ),$(if $(findstring /lib/,$v),$v)) -NONLIBOBJ := $(filter-out $(LIBOBJ),$(OBJ)) -LIBOBJ := $(subst _$(KEYMAP)/,/,$(LIBOBJ)) -OBJ := $(LIBOBJ) $(NONLIBOBJ) # Define all listing files. LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.lst,$(patsubst %.S,$(OBJDIR)/%.lst,$(SRC)))) @@ -273,20 +383,34 @@ 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 $(patsubst %.o,%.td,$@) +GENDEPFLAGS = -MMD -MP -MF $(BUILD_DIR)/.dep/$(subst /,_,$@).d # Combine all necessary flags and optional flags. # Add target processor to flags. # You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar -ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS) -ALL_CPPFLAGS = $(MCUFLAGS) -x c++ $(CPPFLAGS) $(EXTRAFLAGS) -ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) - -MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@) +ALL_CFLAGS = -mmcu=$(MCU) $(CFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) # Default target. -all: build sizeafter +all: + @$(MAKE) begin + @$(MAKE) gccversion + @$(MAKE) sizebefore + @$(MAKE) clean_list # force clean each time + @$(MAKE) build + @$(MAKE) sizeafter + @$(MAKE) end + +# Quick make that doesn't clean +quick: + @$(MAKE) begin + @$(MAKE) gccversion + @$(MAKE) sizebefore + @$(MAKE) build + @$(MAKE) sizeafter + @$(MAKE) end # Change the build target to build a HEX file or a library. build: elf hex @@ -302,14 +426,17 @@ sym: $(BUILD_DIR)/$(TARGET).sym LIBNAME=lib$(TARGET).a lib: $(LIBNAME) -check_submodule: - git submodule status --recursive | \ - while IFS= read -r x; do \ - case "$$x" in \ - \ *) ;; \ - *) printf "$(MSG_SUBMODULE_DIRTY)";break;; \ - esac \ - done + + +# 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) + +end: + @$(SECHO) $(MSG_END) + # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex @@ -320,31 +447,134 @@ sizebefore: @if test -f $(TARGET).hex; then $(SECHO) $(MSG_SIZE_BEFORE); $(SILENT) || $(HEXSIZE); \ 2>/dev/null; $(SECHO); fi -sizeafter: $(BUILD_DIR)/$(TARGET).hex +sizeafter: @if test -f $(TARGET).hex; then $(SECHO); $(SECHO) $(MSG_SIZE_AFTER); $(SILENT) || $(HEXSIZE); \ 2>/dev/null; $(SECHO); fi # test file sizes eventually - # @if [[ $($(SIZE) --target=$(FORMAT) $(TARGET).hex | $(AWK) 'NR==2 {print "0x"$5}') -gt 0x200 ]]; then $(SECHO) "File is too big!"; fi + # @if [[ $($(SIZE) --target=$(FORMAT) $(TARGET).hex | awk 'NR==2 {print "0x"$5}') -gt 0x200 ]]; then $(SECHO) "File is too big!"; fi # Display compiler version information. gccversion : @$(SILENT) || $(CC) --version + + +# Program the device. +program: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep + $(PROGRAM_CMD) + +teensy: $(BUILD_DIR)/$(TARGET).hex + $(TEENSY_LOADER_CLI) -mmcu=$(MCU) -w -v $(BUILD_DIR)/$(TARGET).hex + +flip: $(BUILD_DIR)/$(TARGET).hex + batchisp -hardware usb -device $(MCU) -operation erase f + batchisp -hardware usb -device $(MCU) -operation loadbuffer $(BUILD_DIR)/$(TARGET).hex program + batchisp -hardware usb -device $(MCU) -operation start reset 0 + +dfu: $(BUILD_DIR)/$(TARGET).hex sizeafter +ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) + dfu-programmer $(MCU) erase --force +else + dfu-programmer $(MCU) erase +endif + dfu-programmer $(MCU) erase + dfu-programmer $(MCU) flash $(BUILD_DIR)/$(TARGET).hex + dfu-programmer $(MCU) reset + +dfu-no-build: +ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) + dfu-programmer $(MCU) erase --force +else + dfu-programmer $(MCU) erase +endif + dfu-programmer $(MCU) erase + dfu-programmer $(MCU) flash $(KEYMAP_PATH)/compiled.hex + dfu-programmer $(MCU) reset + +dfu-start: + dfu-programmer $(MCU) reset + dfu-programmer $(MCU) start + +flip-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep + $(COPY) $(BUILD_DIR)/$(TARGET).eep $(BUILD_DIR)/$(TARGET)eep.hex + batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase + batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(BUILD_DIR)/$(TARGET)eep.hex program + batchisp -hardware usb -device $(MCU) -operation start reset 0 + $(REMOVE) $(BUILD_DIR)/$(TARGET)eep.hex + +dfu-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep +ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) + dfu-programmer $(MCU) flash --eeprom $(BUILD_DIR)/$(TARGET).eep +else + dfu-programmer $(MCU) flash-eeprom $(BUILD_DIR)/$(TARGET).eep +endif + dfu-programmer $(MCU) reset + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(BUILD_DIR)/$(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(BUILD_DIR)/$(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(BUILD_DIR)/$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(BUILD_DIR)/$(TARGET).elf + @$(SECHO) $(MSG_COFF) $(BUILD_DIR)/$(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(BUILD_DIR)/$(TARGET).cof + + +extcoff: $(BUILD_DIR)/$(TARGET).elf + @$(SECHO) $(MSG_EXTENDED_COFF) $(BUILD_DIR)/$(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(BUILD_DIR)/$(TARGET).cof + + + # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @$(SILENT) || printf "$(MSG_FLASH) $@" | $(AWK_CMD) - $(eval CMD=$(HEX) $< $@) + $(eval CMD=$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@) + @$(BUILD_CMD) + @$(COPY) $@ $(TARGET).hex + $(SILENT) || printf "Copying $(TARGET).hex to keymaps/$(KEYMAP)/compiled.hex" | $(AWK_CMD) + $(eval CMD=$(COPY) $@ $(KEYMAP_PATH)/compiled.hex) @$(BUILD_CMD) - @if $(AUTOGEN); then \ - $(SILENT) || printf "Copying $(TARGET).hex to keymaps/$(KEYMAP)/$(KEYBOARD)_$(KEYMAP).hex\n"; \ - $(COPY) $@ $(KEYMAP_PATH)/$(KEYBOARD)_$(KEYMAP).hex; \ - else \ - $(COPY) $@ $(TARGET).hex; \ - fi %.eep: %.elf @$(SILENT) || printf "$(MSG_EEPROM) $@" | $(AWK_CMD) - $(eval CMD=$(EEP) $< $@ || exit 0) + $(eval CMD=$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0) @$(BUILD_CMD) # Create extended listing file from ELF output file. @@ -359,11 +589,6 @@ 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) @@ -372,164 +597,101 @@ 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) -# Note the obj.txt depeendency is there to force linking if a source file is deleted -%.elf: $(OBJ) $(OBJDIR)/cflags.txt $(OBJDIR)/ldflags.txt $(OBJDIR)/obj.txt | $(BEGIN) +%.elf: $(OBJ) @$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD) - $(eval CMD=$(CC) $(ALL_CFLAGS) $(filter-out %.txt,$^) --output $@ $(LDFLAGS)) + $(eval CMD=$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)) @$(BUILD_CMD) -define GEN_OBJRULE # Compile: create object files from C source files. -$1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN) - @mkdir -p $$(@D) - @$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) - @$$(BUILD_CMD) +$(OBJDIR)/%.o : %.c + @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. -$1/%.o : %.cpp $1/%.d $1/cppflags.txt $1/compiler.txt | $(BEGIN) - @mkdir -p $$(@D) - @$$(SILENT) || printf "$$(MSG_COMPILING_CPP) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) +$(OBJDIR)/%.o : %.cpp + @mkdir -p $(@D) + @$(SILENT) || printf "$(MSG_COMPILING_CPP) $<" | $(AWK_CMD) + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ @$(BUILD_CMD) -# Assemble: create object files from assembler source files. -$1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN) - @mkdir -p $$(@D) - @$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_ASFLAGS) $$< -o $$@) - @$$(BUILD_CMD) - -$1/force: - -$1/cflags.txt: $1/force - echo '$$(ALL_CFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CFLAGS)' > $$@ - -$1/cppflags.txt: $1/force - echo '$$(ALL_CPPFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CPPFLAGS)' > $$@ - -$1/asflags.txt: $1/force - echo '$$(ALL_ASFLAGS)' | cmp -s - $$@ || echo '$$(ALL_ASFLAGS)' > $$@ - -$1/ldflags.txt: $1/force - echo '$$(LDFLAGS)' | cmp -s - $$@ || echo '$$(LDFLAGS)' > $$@ - -$1/obj.txt: $1/force - echo '$$(OBJ)' | cmp -s - $$@ || echo '$$(OBJ)' > $$@ - -$1/compiler.txt: $1/force - $$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@ -endef - -# We have to use static rules for the .d files for some reason -DEPS = $(patsubst %.o,%.d,$(OBJ)) -# Keep the .d files -.PRECIOUS: $(DEPS) -# Empty rule to force recompilation if the .d file is missing -$(DEPS): - -# Since the object files could be in two different folders, generate -# separate rules for them, rather than having too generic rules -$(eval $(call GEN_OBJRULE,$(OBJDIR))) -$(eval $(call GEN_OBJRULE,$(KBOBJDIR))) - # Compile: create assembler files from C source files. -%.s : %.c | $(BEGIN) +%.s : %.c @$(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 | $(BEGIN) +%.s : %.cpp @$(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 + @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 | $(BEGIN) - $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@ +%.i : %.c + $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@ # Target: clean project. -clean: - $(REMOVE) -r $(OBJDIR) 2>/dev/null - $(REMOVE) -r $(KBOBJDIR) 2>/dev/null - $(REMOVE) $(BUILD_DIR)/$(TARGET).* +clean: begin clean_list end + +clean_list : + $(REMOVE) -r $(TOP_DIR)/$(BUILD_DIR) + $(REMOVE) -r $(KEYBOARD_PATH)/$(BUILD_DIR) + $(REMOVE) -r $(KEYMAP_PATH)/$(BUILD_DIR) show_path: @echo VPATH=$(VPATH) @echo SRC=$(SRC) -SUBDIRS := $(filter-out %/util/ %/doc/ %/keymaps/ %/old_keymap_files/,$(dir $(wildcard $(TOP_DIR)/keyboards/**/*/Makefile))) -SUBDIRS := $(SUBDIRS) $(dir $(wildcard $(TOP_DIR)/keyboards/*/.)) -SUBDIRS := $(sort $(SUBDIRS)) -# $(error $(SUBDIRS)) -all-keyboards-defaults-%: +SUBDIRS := $(sort $(dir $(wildcard $(TOP_DIR)/keyboard/*/.))) +all-keyboards-defaults: @for x in $(SUBDIRS) ; do \ printf "Compiling with default: $$x" | $(AWK_CMD); \ - LOG=$$($(MAKE) -C $$x $(subst all-keyboards-defaults-,,$@) VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ + LOG=$$($(MAKE) -C $$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ done -all-keyboards-defaults: all-keyboards-defaults-all - -KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboards/%/=/keyboards/%) -all-keyboards-all: $(addsuffix -all,$(KEYBOARDS)) -all-keyboards-clean: $(addsuffix -clean,$(KEYBOARDS)) -all-keyboards: all-keyboards-all - -define make_keyboard -$(eval KEYBOARD=$(patsubst /keyboards/%,%,$1)) -$(eval SUBPROJECT=$(lastword $(subst /, ,$(KEYBOARD)))) -$(eval KEYBOARD=$(firstword $(subst /, ,$(KEYBOARD)))) -$(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.)))) -$(eval KEYMAPS+=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/$(SUBPROJECT)/keymaps/*/.)))) -@for x in $(KEYMAPS) ; do \ - printf "Compiling $(BOLD)$(KEYBOARD)/$(SUBPROJECT)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \ - LOG=$$($(MAKE) -C $(TOP_DIR)$1 $2 keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ -done -endef - -define make_keyboard_helper -# Just remove the -all and so on from the first argument and pass it forward -$(call make_keyboard,$(subst -$2,,$1),$2) -endef - -/keyboards/%-all: - $(call make_keyboard_helper,$@,all) -/keyboards/%-clean: - $(call make_keyboard_helper,$@,clean) -/keyboards/%: - $(call make_keyboard_helper,$@,all) - -all-keymaps-%: - $(eval MAKECONFIG=$(call get_target,all-keymaps,$@)) - $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.)))) +KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboard/%/=/keyboard/%) +all-keyboards: $(KEYBOARDS) +/keyboard/%: + $(eval KEYBOARD=$(patsubst /keyboard/%,%,$@)) + $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)$@/keymaps/*/.)))) @for x in $(KEYMAPS) ; do \ - printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \ - LOG=$$($(MAKE) $(subst all-keymaps-,,$@) keyboard=$(KEYBOARD) keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ + printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | awk '{ printf "%-88s", $$0; }'; \ + LOG=$$($(MAKE) -C $(TOP_DIR)$@ keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ done -all-keymaps: all-keymaps-all +all-keymaps: + $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboard/$(KEYBOARD)/keymaps/*/.)))) + @for x in $(KEYMAPS) ; do \ + printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | awk '{ printf "%-88s", $$0; }'; \ + LOG=$$($(MAKE) keyboard=$(KEYBOARD) keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ + done # Create build directory $(shell mkdir $(BUILD_DIR) 2>/dev/null) # Create object files directory $(shell mkdir $(OBJDIR) 2>/dev/null) -$(shell mkdir $(KBOBJDIR) 2>/dev/null) + # Include the dependency files. --include $(patsubst %.o,%.d,$(OBJ)) +-include $(shell mkdir $(BUILD_DIR)/.dep 2>/dev/null) $(wildcard $(BUILD_DIR)/.dep/*) # Listing of phony targets. -.PHONY : all finish sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff check_submodule \ +.PHONY : all quick begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ 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 \ -all-keyboards-defaults-% all-keyboards-% all-keymaps-% +all-keyboards-defaults all-keyboards all-keymaps From dd553d460e280298839bddd66fca36ecdf64f721 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sat, 11 Jun 2016 17:24:28 -0500 Subject: [PATCH 03/20] fixed color detection routine in makefile --- tmk_core/rules.mk | 550 ++++++++++++++++++++++++++++++---------------- 1 file changed, 356 insertions(+), 194 deletions(-) diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index d2350f27c..8563f1e07 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -14,27 +14,71 @@ # Frederik Rouleau # Carlos Lamas # - -# Enable vpath seraching for source files only -# Without this, output files, could be read from the wrong .build directories -VPATH_SRC := $(VPATH) -vpath %.c $(VPATH_SRC) -vpath %.h $(VPATH_SRC) -vpath %.cpp $(VPATH_SRC) -vpath %.hpp $(VPATH_SRC) -vpath %.S $(VPATH_SRC) -VPATH := +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- # Output format. (can be srec, ihex, binary) FORMAT = ihex -# Optimization level, can be [0, 1, 2, 3, s]. +BUILD_DIR = .build + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = $(BUILD_DIR)/obj_$(TARGET) + + +# Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s -COLOR ?= true + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + +COLOR?=true ifeq ($(COLOR),true) NO_COLOR=\033[0m @@ -45,38 +89,30 @@ ifeq ($(COLOR),true) BOLD=\033[1m endif -AUTOGEN ?= false - -ifneq ($(shell awk --version 2>/dev/null),) - AWK=awk -else - AWK=cat && test -endif - -OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n -ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n -WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n +OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR) +ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR) +WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR) ifndef $(SILENT) SILENT = false endif -TAB_LOG = printf "\n$$LOG\n\n" | $(AWK) '{ sub(/^/," | "); print }' +TAB_LOG = printf "\n$$LOG\n\n" | awk '{ sub(/^/," | "); print }' TAB_LOG_PLAIN = printf "$$LOG\n" -AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }' -AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }' -PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && exit 1 -PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) -PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && exit 1 -PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) -PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS) +AWK_STATUS = awk '{ printf " %-10s\n", $$1; }' +AWK_CMD = awk '{ printf "%-69s", $$0; }' +PRINT_ERROR = ($(SILENT) ||printf "$(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && false +PRINT_WARNING = ($(SILENT) || printf "$(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) +PRINT_ERROR_PLAIN = ($(SILENT) ||printf "$(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && false +PRINT_WARNING_PLAIN = ($(SILENT) || printf "$(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) +PRINT_OK = $(SILENT) || printf "$(OK_STRING)" | $(AWK_STATUS) BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi; # List any extra directories to look for include files here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS += $(subst :, ,$(VPATH_SRC)) +EXTRAINCDIRS = $(subst :, ,$(VPATH)) # Compiler flag to set the C Standard level. @@ -88,14 +124,17 @@ CSTANDARD = -std=gnu99 # Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL CDEFS += $(OPT_DEFS) # Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) ADEFS += $(OPT_DEFS) # Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL #CPPDEFS += -D__STDC_LIMIT_MACROS #CPPDEFS += -D__STDC_CONSTANT_MACROS CPPDEFS += $(OPT_DEFS) @@ -109,12 +148,20 @@ CPPDEFS += $(OPT_DEFS) # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing -CFLAGS += -g$(DEBUG) +CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fdata-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing # add color ifeq ($(COLOR),true) -ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") +ifeq ("$(echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") CFLAGS+= -fdiagnostics-color endif endif @@ -140,9 +187,16 @@ endif # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing -CPPFLAGS += -g$(DEBUG) +CPPFLAGS = -g$(DEBUG) CPPFLAGS += $(CPPDEFS) CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -ffunction-sections +CPPFLAGS += -fdata-sections # to supress "warning: only initialized variables can be placed into program memory area" CPPFLAGS += -w CPPFLAGS += -Wall @@ -169,7 +223,7 @@ endif # files -- see avr-libc docs [FIXME: not yet described there] # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. -ASFLAGS += $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) ifdef CONFIG_H ASFLAGS += -include $(CONFIG_H) @@ -203,6 +257,28 @@ SCANF_LIB = MATH_LIB = -lm +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file @@ -211,8 +287,9 @@ MATH_LIB = -lm # Comennt out "--relax" option to avoid a error such: # (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12' # -LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref +LDFLAGS = -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref #LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) @@ -220,13 +297,59 @@ LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) # You can give EXTRALDFLAGS at 'make' command line. LDFLAGS += $(EXTRALDFLAGS) + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + # Define programs and commands. SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm REMOVE = rm -f REMOVEDIR = rmdir COPY = cp WINSHELL = cmd SECHO = $(SILENT) || echo +# Autodecct teensy loader +ifneq (, $(shell which teensy-loader-cli 2>/dev/null)) + TEENSY_LOADER_CLI = teensy-loader-cli +else + TEENSY_LOADER_CLI = teensy_loader_cli +endif # Define Messages # English @@ -239,7 +362,6 @@ 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: @@ -248,24 +370,12 @@ MSG_COMPILING_CPP = Compiling: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: MSG_CREATING_LIBRARY = Creating library: -MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \ - Some git sub-modules are out of date or modified, please consider runnning:$(BOLD)\n\ - git submodule sync --recursive\n\ - git submodule update --init --recursive$(NO_COLOR)\n\n\ - You can ignore this warning if you are not compiling any ChibiOS keyboards,\n\ - or if you have modified the ChibiOS libraries yourself. \n\n + + # Define all object files. OBJ = $(patsubst %.c,$(OBJDIR)/%.o,$(patsubst %.cpp,$(OBJDIR)/%.o,$(patsubst %.S,$(OBJDIR)/%.o,$(SRC)))) -# The files in the lib folder are shared between all keymaps, so generate that folder name by removing -# the keymap from the name -KBOBJDIR=$(subst _$(KEYMAP),,$(OBJDIR)) -# And fixup the object files to match -LIBOBJ = $(foreach v,$(OBJ),$(if $(findstring /lib/,$v),$v)) -NONLIBOBJ := $(filter-out $(LIBOBJ),$(OBJ)) -LIBOBJ := $(subst _$(KEYMAP)/,/,$(LIBOBJ)) -OBJ := $(LIBOBJ) $(NONLIBOBJ) # Define all listing files. LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.lst,$(patsubst %.S,$(OBJDIR)/%.lst,$(SRC)))) @@ -273,20 +383,34 @@ 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 $(patsubst %.o,%.td,$@) +GENDEPFLAGS = -MMD -MP -MF $(BUILD_DIR)/.dep/$(subst /,_,$@).d # Combine all necessary flags and optional flags. # Add target processor to flags. # You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar -ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS) -ALL_CPPFLAGS = $(MCUFLAGS) -x c++ $(CPPFLAGS) $(EXTRAFLAGS) -ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) - -MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@) +ALL_CFLAGS = -mmcu=$(MCU) $(CFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) # Default target. -all: build sizeafter +all: + @$(MAKE) begin + @$(MAKE) gccversion + @$(MAKE) sizebefore + @$(MAKE) clean_list # force clean each time + @$(MAKE) build + @$(MAKE) sizeafter + @$(MAKE) end + +# Quick make that doesn't clean +quick: + @$(MAKE) begin + @$(MAKE) gccversion + @$(MAKE) sizebefore + @$(MAKE) build + @$(MAKE) sizeafter + @$(MAKE) end # Change the build target to build a HEX file or a library. build: elf hex @@ -302,14 +426,17 @@ sym: $(BUILD_DIR)/$(TARGET).sym LIBNAME=lib$(TARGET).a lib: $(LIBNAME) -check_submodule: - git submodule status --recursive | \ - while IFS= read -r x; do \ - case "$$x" in \ - \ *) ;; \ - *) printf "$(MSG_SUBMODULE_DIRTY)";break;; \ - esac \ - done + + +# 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) + +end: + @$(SECHO) $(MSG_END) + # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex @@ -320,31 +447,134 @@ sizebefore: @if test -f $(TARGET).hex; then $(SECHO) $(MSG_SIZE_BEFORE); $(SILENT) || $(HEXSIZE); \ 2>/dev/null; $(SECHO); fi -sizeafter: $(BUILD_DIR)/$(TARGET).hex +sizeafter: @if test -f $(TARGET).hex; then $(SECHO); $(SECHO) $(MSG_SIZE_AFTER); $(SILENT) || $(HEXSIZE); \ 2>/dev/null; $(SECHO); fi # test file sizes eventually - # @if [[ $($(SIZE) --target=$(FORMAT) $(TARGET).hex | $(AWK) 'NR==2 {print "0x"$5}') -gt 0x200 ]]; then $(SECHO) "File is too big!"; fi + # @if [[ $($(SIZE) --target=$(FORMAT) $(TARGET).hex | awk 'NR==2 {print "0x"$5}') -gt 0x200 ]]; then $(SECHO) "File is too big!"; fi # Display compiler version information. gccversion : @$(SILENT) || $(CC) --version + + +# Program the device. +program: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep + $(PROGRAM_CMD) + +teensy: $(BUILD_DIR)/$(TARGET).hex + $(TEENSY_LOADER_CLI) -mmcu=$(MCU) -w -v $(BUILD_DIR)/$(TARGET).hex + +flip: $(BUILD_DIR)/$(TARGET).hex + batchisp -hardware usb -device $(MCU) -operation erase f + batchisp -hardware usb -device $(MCU) -operation loadbuffer $(BUILD_DIR)/$(TARGET).hex program + batchisp -hardware usb -device $(MCU) -operation start reset 0 + +dfu: $(BUILD_DIR)/$(TARGET).hex sizeafter +ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) + dfu-programmer $(MCU) erase --force +else + dfu-programmer $(MCU) erase +endif + dfu-programmer $(MCU) erase + dfu-programmer $(MCU) flash $(BUILD_DIR)/$(TARGET).hex + dfu-programmer $(MCU) reset + +dfu-no-build: +ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) + dfu-programmer $(MCU) erase --force +else + dfu-programmer $(MCU) erase +endif + dfu-programmer $(MCU) erase + dfu-programmer $(MCU) flash $(KEYMAP_PATH)/compiled.hex + dfu-programmer $(MCU) reset + +dfu-start: + dfu-programmer $(MCU) reset + dfu-programmer $(MCU) start + +flip-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep + $(COPY) $(BUILD_DIR)/$(TARGET).eep $(BUILD_DIR)/$(TARGET)eep.hex + batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase + batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(BUILD_DIR)/$(TARGET)eep.hex program + batchisp -hardware usb -device $(MCU) -operation start reset 0 + $(REMOVE) $(BUILD_DIR)/$(TARGET)eep.hex + +dfu-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep +ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) + dfu-programmer $(MCU) flash --eeprom $(BUILD_DIR)/$(TARGET).eep +else + dfu-programmer $(MCU) flash-eeprom $(BUILD_DIR)/$(TARGET).eep +endif + dfu-programmer $(MCU) reset + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(BUILD_DIR)/$(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(BUILD_DIR)/$(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(BUILD_DIR)/$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(BUILD_DIR)/$(TARGET).elf + @$(SECHO) $(MSG_COFF) $(BUILD_DIR)/$(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(BUILD_DIR)/$(TARGET).cof + + +extcoff: $(BUILD_DIR)/$(TARGET).elf + @$(SECHO) $(MSG_EXTENDED_COFF) $(BUILD_DIR)/$(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(BUILD_DIR)/$(TARGET).cof + + + # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @$(SILENT) || printf "$(MSG_FLASH) $@" | $(AWK_CMD) - $(eval CMD=$(HEX) $< $@) + $(eval CMD=$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@) + @$(BUILD_CMD) + @$(COPY) $@ $(TARGET).hex + $(SILENT) || printf "Copying $(TARGET).hex to keymaps/$(KEYMAP)/compiled.hex" | $(AWK_CMD) + $(eval CMD=$(COPY) $@ $(KEYMAP_PATH)/compiled.hex) @$(BUILD_CMD) - @if $(AUTOGEN); then \ - $(SILENT) || printf "Copying $(TARGET).hex to keymaps/$(KEYMAP)/$(KEYBOARD)_$(KEYMAP).hex\n"; \ - $(COPY) $@ $(KEYMAP_PATH)/$(KEYBOARD)_$(KEYMAP).hex; \ - else \ - $(COPY) $@ $(TARGET).hex; \ - fi %.eep: %.elf @$(SILENT) || printf "$(MSG_EEPROM) $@" | $(AWK_CMD) - $(eval CMD=$(EEP) $< $@ || exit 0) + $(eval CMD=$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0) @$(BUILD_CMD) # Create extended listing file from ELF output file. @@ -359,11 +589,6 @@ 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) @@ -372,164 +597,101 @@ 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) -# Note the obj.txt depeendency is there to force linking if a source file is deleted -%.elf: $(OBJ) $(OBJDIR)/cflags.txt $(OBJDIR)/ldflags.txt $(OBJDIR)/obj.txt | $(BEGIN) +%.elf: $(OBJ) @$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD) - $(eval CMD=$(CC) $(ALL_CFLAGS) $(filter-out %.txt,$^) --output $@ $(LDFLAGS)) + $(eval CMD=$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)) @$(BUILD_CMD) -define GEN_OBJRULE # Compile: create object files from C source files. -$1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN) - @mkdir -p $$(@D) - @$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) - @$$(BUILD_CMD) +$(OBJDIR)/%.o : %.c + @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. -$1/%.o : %.cpp $1/%.d $1/cppflags.txt $1/compiler.txt | $(BEGIN) - @mkdir -p $$(@D) - @$$(SILENT) || printf "$$(MSG_COMPILING_CPP) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) +$(OBJDIR)/%.o : %.cpp + @mkdir -p $(@D) + @$(SILENT) || printf "$(MSG_COMPILING_CPP) $<" | $(AWK_CMD) + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ @$(BUILD_CMD) -# Assemble: create object files from assembler source files. -$1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN) - @mkdir -p $$(@D) - @$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_ASFLAGS) $$< -o $$@) - @$$(BUILD_CMD) - -$1/force: - -$1/cflags.txt: $1/force - echo '$$(ALL_CFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CFLAGS)' > $$@ - -$1/cppflags.txt: $1/force - echo '$$(ALL_CPPFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CPPFLAGS)' > $$@ - -$1/asflags.txt: $1/force - echo '$$(ALL_ASFLAGS)' | cmp -s - $$@ || echo '$$(ALL_ASFLAGS)' > $$@ - -$1/ldflags.txt: $1/force - echo '$$(LDFLAGS)' | cmp -s - $$@ || echo '$$(LDFLAGS)' > $$@ - -$1/obj.txt: $1/force - echo '$$(OBJ)' | cmp -s - $$@ || echo '$$(OBJ)' > $$@ - -$1/compiler.txt: $1/force - $$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@ -endef - -# We have to use static rules for the .d files for some reason -DEPS = $(patsubst %.o,%.d,$(OBJ)) -# Keep the .d files -.PRECIOUS: $(DEPS) -# Empty rule to force recompilation if the .d file is missing -$(DEPS): - -# Since the object files could be in two different folders, generate -# separate rules for them, rather than having too generic rules -$(eval $(call GEN_OBJRULE,$(OBJDIR))) -$(eval $(call GEN_OBJRULE,$(KBOBJDIR))) - # Compile: create assembler files from C source files. -%.s : %.c | $(BEGIN) +%.s : %.c @$(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 | $(BEGIN) +%.s : %.cpp @$(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 + @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 | $(BEGIN) - $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@ +%.i : %.c + $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@ # Target: clean project. -clean: - $(REMOVE) -r $(OBJDIR) 2>/dev/null - $(REMOVE) -r $(KBOBJDIR) 2>/dev/null - $(REMOVE) $(BUILD_DIR)/$(TARGET).* +clean: begin clean_list end + +clean_list : + $(REMOVE) -r $(TOP_DIR)/$(BUILD_DIR) + $(REMOVE) -r $(KEYBOARD_PATH)/$(BUILD_DIR) + $(REMOVE) -r $(KEYMAP_PATH)/$(BUILD_DIR) show_path: @echo VPATH=$(VPATH) @echo SRC=$(SRC) -SUBDIRS := $(filter-out %/util/ %/doc/ %/keymaps/ %/old_keymap_files/,$(dir $(wildcard $(TOP_DIR)/keyboards/**/*/Makefile))) -SUBDIRS := $(SUBDIRS) $(dir $(wildcard $(TOP_DIR)/keyboards/*/.)) -SUBDIRS := $(sort $(SUBDIRS)) -# $(error $(SUBDIRS)) -all-keyboards-defaults-%: +SUBDIRS := $(sort $(dir $(wildcard $(TOP_DIR)/keyboard/*/.))) +all-keyboards-defaults: @for x in $(SUBDIRS) ; do \ printf "Compiling with default: $$x" | $(AWK_CMD); \ - LOG=$$($(MAKE) -C $$x $(subst all-keyboards-defaults-,,$@) VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ + LOG=$$($(MAKE) -C $$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ done -all-keyboards-defaults: all-keyboards-defaults-all - -KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboards/%/=/keyboards/%) -all-keyboards-all: $(addsuffix -all,$(KEYBOARDS)) -all-keyboards-clean: $(addsuffix -clean,$(KEYBOARDS)) -all-keyboards: all-keyboards-all - -define make_keyboard -$(eval KEYBOARD=$(patsubst /keyboards/%,%,$1)) -$(eval SUBPROJECT=$(lastword $(subst /, ,$(KEYBOARD)))) -$(eval KEYBOARD=$(firstword $(subst /, ,$(KEYBOARD)))) -$(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.)))) -$(eval KEYMAPS+=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/$(SUBPROJECT)/keymaps/*/.)))) -@for x in $(KEYMAPS) ; do \ - printf "Compiling $(BOLD)$(KEYBOARD)/$(SUBPROJECT)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \ - LOG=$$($(MAKE) -C $(TOP_DIR)$1 $2 keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ -done -endef - -define make_keyboard_helper -# Just remove the -all and so on from the first argument and pass it forward -$(call make_keyboard,$(subst -$2,,$1),$2) -endef - -/keyboards/%-all: - $(call make_keyboard_helper,$@,all) -/keyboards/%-clean: - $(call make_keyboard_helper,$@,clean) -/keyboards/%: - $(call make_keyboard_helper,$@,all) - -all-keymaps-%: - $(eval MAKECONFIG=$(call get_target,all-keymaps,$@)) - $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.)))) +KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboard/%/=/keyboard/%) +all-keyboards: $(KEYBOARDS) +/keyboard/%: + $(eval KEYBOARD=$(patsubst /keyboard/%,%,$@)) + $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)$@/keymaps/*/.)))) @for x in $(KEYMAPS) ; do \ - printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \ - LOG=$$($(MAKE) $(subst all-keymaps-,,$@) keyboard=$(KEYBOARD) keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ + printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | awk '{ printf "%-88s", $$0; }'; \ + LOG=$$($(MAKE) -C $(TOP_DIR)$@ keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ done -all-keymaps: all-keymaps-all +all-keymaps: + $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboard/$(KEYBOARD)/keymaps/*/.)))) + @for x in $(KEYMAPS) ; do \ + printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | awk '{ printf "%-88s", $$0; }'; \ + LOG=$$($(MAKE) keyboard=$(KEYBOARD) keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ + done # Create build directory $(shell mkdir $(BUILD_DIR) 2>/dev/null) # Create object files directory $(shell mkdir $(OBJDIR) 2>/dev/null) -$(shell mkdir $(KBOBJDIR) 2>/dev/null) + # Include the dependency files. --include $(patsubst %.o,%.d,$(OBJ)) +-include $(shell mkdir $(BUILD_DIR)/.dep 2>/dev/null) $(wildcard $(BUILD_DIR)/.dep/*) # Listing of phony targets. -.PHONY : all finish sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff check_submodule \ +.PHONY : all quick begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ 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 \ -all-keyboards-defaults-% all-keyboards-% all-keymaps-% +all-keyboards-defaults all-keyboards all-keymaps From e1590abea9c8d0fbfcd4c4e71f0758709f975d08 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sat, 11 Jun 2016 17:24:28 -0500 Subject: [PATCH 04/20] fixed color detection routine in makefile --- tmk_core/rules.mk | 161 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index d2350f27c..f97c5cb49 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -203,6 +203,28 @@ SCANF_LIB = MATH_LIB = -lm +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file @@ -220,6 +242,40 @@ LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) # You can give EXTRALDFLAGS at 'make' command line. LDFLAGS += $(EXTRALDFLAGS) + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + # Define programs and commands. SHELL = sh REMOVE = rm -f @@ -330,6 +386,111 @@ sizeafter: $(BUILD_DIR)/$(TARGET).hex gccversion : @$(SILENT) || $(CC) --version + + +# Program the device. +program: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep + $(PROGRAM_CMD) + +teensy: $(BUILD_DIR)/$(TARGET).hex + $(TEENSY_LOADER_CLI) -mmcu=$(MCU) -w -v $(BUILD_DIR)/$(TARGET).hex + +flip: $(BUILD_DIR)/$(TARGET).hex + batchisp -hardware usb -device $(MCU) -operation erase f + batchisp -hardware usb -device $(MCU) -operation loadbuffer $(BUILD_DIR)/$(TARGET).hex program + batchisp -hardware usb -device $(MCU) -operation start reset 0 + +dfu: $(BUILD_DIR)/$(TARGET).hex sizeafter +ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) + dfu-programmer $(MCU) erase --force +else + dfu-programmer $(MCU) erase +endif + dfu-programmer $(MCU) erase + dfu-programmer $(MCU) flash $(BUILD_DIR)/$(TARGET).hex + dfu-programmer $(MCU) reset + +dfu-no-build: +ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) + dfu-programmer $(MCU) erase --force +else + dfu-programmer $(MCU) erase +endif + dfu-programmer $(MCU) erase + dfu-programmer $(MCU) flash $(KEYMAP_PATH)/compiled.hex + dfu-programmer $(MCU) reset + +dfu-start: + dfu-programmer $(MCU) reset + dfu-programmer $(MCU) start + +flip-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep + $(COPY) $(BUILD_DIR)/$(TARGET).eep $(BUILD_DIR)/$(TARGET)eep.hex + batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase + batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(BUILD_DIR)/$(TARGET)eep.hex program + batchisp -hardware usb -device $(MCU) -operation start reset 0 + $(REMOVE) $(BUILD_DIR)/$(TARGET)eep.hex + +dfu-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep +ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) + dfu-programmer $(MCU) flash --eeprom $(BUILD_DIR)/$(TARGET).eep +else + dfu-programmer $(MCU) flash-eeprom $(BUILD_DIR)/$(TARGET).eep +endif + dfu-programmer $(MCU) reset + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(BUILD_DIR)/$(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(BUILD_DIR)/$(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(BUILD_DIR)/$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(BUILD_DIR)/$(TARGET).elf + @$(SECHO) $(MSG_COFF) $(BUILD_DIR)/$(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(BUILD_DIR)/$(TARGET).cof + + +extcoff: $(BUILD_DIR)/$(TARGET).elf + @$(SECHO) $(MSG_EXTENDED_COFF) $(BUILD_DIR)/$(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(BUILD_DIR)/$(TARGET).cof + + + # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @$(SILENT) || printf "$(MSG_FLASH) $@" | $(AWK_CMD) From 2dfe13ac6d12fb2a8e46061cf81ba223adf0550d Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sat, 11 Jun 2016 17:24:28 -0500 Subject: [PATCH 05/20] fixed color detection routine in makefile --- tmk_core/rules.mk | 389 +++++++++++++++++++++++----------------------- 1 file changed, 195 insertions(+), 194 deletions(-) diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index f97c5cb49..8563f1e07 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -14,27 +14,71 @@ # Frederik Rouleau # Carlos Lamas # - -# Enable vpath seraching for source files only -# Without this, output files, could be read from the wrong .build directories -VPATH_SRC := $(VPATH) -vpath %.c $(VPATH_SRC) -vpath %.h $(VPATH_SRC) -vpath %.cpp $(VPATH_SRC) -vpath %.hpp $(VPATH_SRC) -vpath %.S $(VPATH_SRC) -VPATH := +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- # Output format. (can be srec, ihex, binary) FORMAT = ihex -# Optimization level, can be [0, 1, 2, 3, s]. +BUILD_DIR = .build + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = $(BUILD_DIR)/obj_$(TARGET) + + +# Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s -COLOR ?= true + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + +COLOR?=true ifeq ($(COLOR),true) NO_COLOR=\033[0m @@ -45,38 +89,30 @@ ifeq ($(COLOR),true) BOLD=\033[1m endif -AUTOGEN ?= false - -ifneq ($(shell awk --version 2>/dev/null),) - AWK=awk -else - AWK=cat && test -endif - -OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n -ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n -WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n +OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR) +ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR) +WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR) ifndef $(SILENT) SILENT = false endif -TAB_LOG = printf "\n$$LOG\n\n" | $(AWK) '{ sub(/^/," | "); print }' +TAB_LOG = printf "\n$$LOG\n\n" | awk '{ sub(/^/," | "); print }' TAB_LOG_PLAIN = printf "$$LOG\n" -AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }' -AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }' -PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && exit 1 -PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) -PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && exit 1 -PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) -PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS) +AWK_STATUS = awk '{ printf " %-10s\n", $$1; }' +AWK_CMD = awk '{ printf "%-69s", $$0; }' +PRINT_ERROR = ($(SILENT) ||printf "$(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && false +PRINT_WARNING = ($(SILENT) || printf "$(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) +PRINT_ERROR_PLAIN = ($(SILENT) ||printf "$(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && false +PRINT_WARNING_PLAIN = ($(SILENT) || printf "$(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) +PRINT_OK = $(SILENT) || printf "$(OK_STRING)" | $(AWK_STATUS) BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi; # List any extra directories to look for include files here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS += $(subst :, ,$(VPATH_SRC)) +EXTRAINCDIRS = $(subst :, ,$(VPATH)) # Compiler flag to set the C Standard level. @@ -88,14 +124,17 @@ CSTANDARD = -std=gnu99 # Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL CDEFS += $(OPT_DEFS) # Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) ADEFS += $(OPT_DEFS) # Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL #CPPDEFS += -D__STDC_LIMIT_MACROS #CPPDEFS += -D__STDC_CONSTANT_MACROS CPPDEFS += $(OPT_DEFS) @@ -109,12 +148,20 @@ CPPDEFS += $(OPT_DEFS) # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing -CFLAGS += -g$(DEBUG) +CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fdata-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing # add color ifeq ($(COLOR),true) -ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") +ifeq ("$(echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") CFLAGS+= -fdiagnostics-color endif endif @@ -140,9 +187,16 @@ endif # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing -CPPFLAGS += -g$(DEBUG) +CPPFLAGS = -g$(DEBUG) CPPFLAGS += $(CPPDEFS) CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -ffunction-sections +CPPFLAGS += -fdata-sections # to supress "warning: only initialized variables can be placed into program memory area" CPPFLAGS += -w CPPFLAGS += -Wall @@ -169,7 +223,7 @@ endif # files -- see avr-libc docs [FIXME: not yet described there] # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. -ASFLAGS += $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) ifdef CONFIG_H ASFLAGS += -include $(CONFIG_H) @@ -233,8 +287,9 @@ EXTMEMOPTS = # Comennt out "--relax" option to avoid a error such: # (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12' # -LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref +LDFLAGS = -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref #LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) @@ -278,11 +333,23 @@ DEBUG_HOST = localhost # Define programs and commands. SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm REMOVE = rm -f REMOVEDIR = rmdir COPY = cp WINSHELL = cmd SECHO = $(SILENT) || echo +# Autodecct teensy loader +ifneq (, $(shell which teensy-loader-cli 2>/dev/null)) + TEENSY_LOADER_CLI = teensy-loader-cli +else + TEENSY_LOADER_CLI = teensy_loader_cli +endif # Define Messages # English @@ -295,7 +362,6 @@ 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: @@ -304,24 +370,12 @@ MSG_COMPILING_CPP = Compiling: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: MSG_CREATING_LIBRARY = Creating library: -MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \ - Some git sub-modules are out of date or modified, please consider runnning:$(BOLD)\n\ - git submodule sync --recursive\n\ - git submodule update --init --recursive$(NO_COLOR)\n\n\ - You can ignore this warning if you are not compiling any ChibiOS keyboards,\n\ - or if you have modified the ChibiOS libraries yourself. \n\n + + # Define all object files. OBJ = $(patsubst %.c,$(OBJDIR)/%.o,$(patsubst %.cpp,$(OBJDIR)/%.o,$(patsubst %.S,$(OBJDIR)/%.o,$(SRC)))) -# The files in the lib folder are shared between all keymaps, so generate that folder name by removing -# the keymap from the name -KBOBJDIR=$(subst _$(KEYMAP),,$(OBJDIR)) -# And fixup the object files to match -LIBOBJ = $(foreach v,$(OBJ),$(if $(findstring /lib/,$v),$v)) -NONLIBOBJ := $(filter-out $(LIBOBJ),$(OBJ)) -LIBOBJ := $(subst _$(KEYMAP)/,/,$(LIBOBJ)) -OBJ := $(LIBOBJ) $(NONLIBOBJ) # Define all listing files. LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.lst,$(patsubst %.S,$(OBJDIR)/%.lst,$(SRC)))) @@ -329,20 +383,34 @@ 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 $(patsubst %.o,%.td,$@) +GENDEPFLAGS = -MMD -MP -MF $(BUILD_DIR)/.dep/$(subst /,_,$@).d # Combine all necessary flags and optional flags. # Add target processor to flags. # You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar -ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS) -ALL_CPPFLAGS = $(MCUFLAGS) -x c++ $(CPPFLAGS) $(EXTRAFLAGS) -ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) - -MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@) +ALL_CFLAGS = -mmcu=$(MCU) $(CFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) # Default target. -all: build sizeafter +all: + @$(MAKE) begin + @$(MAKE) gccversion + @$(MAKE) sizebefore + @$(MAKE) clean_list # force clean each time + @$(MAKE) build + @$(MAKE) sizeafter + @$(MAKE) end + +# Quick make that doesn't clean +quick: + @$(MAKE) begin + @$(MAKE) gccversion + @$(MAKE) sizebefore + @$(MAKE) build + @$(MAKE) sizeafter + @$(MAKE) end # Change the build target to build a HEX file or a library. build: elf hex @@ -358,14 +426,17 @@ sym: $(BUILD_DIR)/$(TARGET).sym LIBNAME=lib$(TARGET).a lib: $(LIBNAME) -check_submodule: - git submodule status --recursive | \ - while IFS= read -r x; do \ - case "$$x" in \ - \ *) ;; \ - *) printf "$(MSG_SUBMODULE_DIRTY)";break;; \ - esac \ - done + + +# 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) + +end: + @$(SECHO) $(MSG_END) + # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex @@ -376,11 +447,11 @@ sizebefore: @if test -f $(TARGET).hex; then $(SECHO) $(MSG_SIZE_BEFORE); $(SILENT) || $(HEXSIZE); \ 2>/dev/null; $(SECHO); fi -sizeafter: $(BUILD_DIR)/$(TARGET).hex +sizeafter: @if test -f $(TARGET).hex; then $(SECHO); $(SECHO) $(MSG_SIZE_AFTER); $(SILENT) || $(HEXSIZE); \ 2>/dev/null; $(SECHO); fi # test file sizes eventually - # @if [[ $($(SIZE) --target=$(FORMAT) $(TARGET).hex | $(AWK) 'NR==2 {print "0x"$5}') -gt 0x200 ]]; then $(SECHO) "File is too big!"; fi + # @if [[ $($(SIZE) --target=$(FORMAT) $(TARGET).hex | awk 'NR==2 {print "0x"$5}') -gt 0x200 ]]; then $(SECHO) "File is too big!"; fi # Display compiler version information. gccversion : @@ -494,18 +565,16 @@ extcoff: $(BUILD_DIR)/$(TARGET).elf # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @$(SILENT) || printf "$(MSG_FLASH) $@" | $(AWK_CMD) - $(eval CMD=$(HEX) $< $@) + $(eval CMD=$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@) + @$(BUILD_CMD) + @$(COPY) $@ $(TARGET).hex + $(SILENT) || printf "Copying $(TARGET).hex to keymaps/$(KEYMAP)/compiled.hex" | $(AWK_CMD) + $(eval CMD=$(COPY) $@ $(KEYMAP_PATH)/compiled.hex) @$(BUILD_CMD) - @if $(AUTOGEN); then \ - $(SILENT) || printf "Copying $(TARGET).hex to keymaps/$(KEYMAP)/$(KEYBOARD)_$(KEYMAP).hex\n"; \ - $(COPY) $@ $(KEYMAP_PATH)/$(KEYBOARD)_$(KEYMAP).hex; \ - else \ - $(COPY) $@ $(TARGET).hex; \ - fi %.eep: %.elf @$(SILENT) || printf "$(MSG_EEPROM) $@" | $(AWK_CMD) - $(eval CMD=$(EEP) $< $@ || exit 0) + $(eval CMD=$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0) @$(BUILD_CMD) # Create extended listing file from ELF output file. @@ -520,11 +589,6 @@ extcoff: $(BUILD_DIR)/$(TARGET).elf $(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) @@ -533,164 +597,101 @@ extcoff: $(BUILD_DIR)/$(TARGET).elf $(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) -# Note the obj.txt depeendency is there to force linking if a source file is deleted -%.elf: $(OBJ) $(OBJDIR)/cflags.txt $(OBJDIR)/ldflags.txt $(OBJDIR)/obj.txt | $(BEGIN) +%.elf: $(OBJ) @$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD) - $(eval CMD=$(CC) $(ALL_CFLAGS) $(filter-out %.txt,$^) --output $@ $(LDFLAGS)) + $(eval CMD=$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)) @$(BUILD_CMD) -define GEN_OBJRULE # Compile: create object files from C source files. -$1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN) - @mkdir -p $$(@D) - @$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) - @$$(BUILD_CMD) +$(OBJDIR)/%.o : %.c + @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. -$1/%.o : %.cpp $1/%.d $1/cppflags.txt $1/compiler.txt | $(BEGIN) - @mkdir -p $$(@D) - @$$(SILENT) || printf "$$(MSG_COMPILING_CPP) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) +$(OBJDIR)/%.o : %.cpp + @mkdir -p $(@D) + @$(SILENT) || printf "$(MSG_COMPILING_CPP) $<" | $(AWK_CMD) + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ @$(BUILD_CMD) -# Assemble: create object files from assembler source files. -$1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN) - @mkdir -p $$(@D) - @$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_ASFLAGS) $$< -o $$@) - @$$(BUILD_CMD) - -$1/force: - -$1/cflags.txt: $1/force - echo '$$(ALL_CFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CFLAGS)' > $$@ - -$1/cppflags.txt: $1/force - echo '$$(ALL_CPPFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CPPFLAGS)' > $$@ - -$1/asflags.txt: $1/force - echo '$$(ALL_ASFLAGS)' | cmp -s - $$@ || echo '$$(ALL_ASFLAGS)' > $$@ - -$1/ldflags.txt: $1/force - echo '$$(LDFLAGS)' | cmp -s - $$@ || echo '$$(LDFLAGS)' > $$@ - -$1/obj.txt: $1/force - echo '$$(OBJ)' | cmp -s - $$@ || echo '$$(OBJ)' > $$@ - -$1/compiler.txt: $1/force - $$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@ -endef - -# We have to use static rules for the .d files for some reason -DEPS = $(patsubst %.o,%.d,$(OBJ)) -# Keep the .d files -.PRECIOUS: $(DEPS) -# Empty rule to force recompilation if the .d file is missing -$(DEPS): - -# Since the object files could be in two different folders, generate -# separate rules for them, rather than having too generic rules -$(eval $(call GEN_OBJRULE,$(OBJDIR))) -$(eval $(call GEN_OBJRULE,$(KBOBJDIR))) - # Compile: create assembler files from C source files. -%.s : %.c | $(BEGIN) +%.s : %.c @$(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 | $(BEGIN) +%.s : %.cpp @$(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 + @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 | $(BEGIN) - $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@ +%.i : %.c + $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@ # Target: clean project. -clean: - $(REMOVE) -r $(OBJDIR) 2>/dev/null - $(REMOVE) -r $(KBOBJDIR) 2>/dev/null - $(REMOVE) $(BUILD_DIR)/$(TARGET).* +clean: begin clean_list end + +clean_list : + $(REMOVE) -r $(TOP_DIR)/$(BUILD_DIR) + $(REMOVE) -r $(KEYBOARD_PATH)/$(BUILD_DIR) + $(REMOVE) -r $(KEYMAP_PATH)/$(BUILD_DIR) show_path: @echo VPATH=$(VPATH) @echo SRC=$(SRC) -SUBDIRS := $(filter-out %/util/ %/doc/ %/keymaps/ %/old_keymap_files/,$(dir $(wildcard $(TOP_DIR)/keyboards/**/*/Makefile))) -SUBDIRS := $(SUBDIRS) $(dir $(wildcard $(TOP_DIR)/keyboards/*/.)) -SUBDIRS := $(sort $(SUBDIRS)) -# $(error $(SUBDIRS)) -all-keyboards-defaults-%: +SUBDIRS := $(sort $(dir $(wildcard $(TOP_DIR)/keyboard/*/.))) +all-keyboards-defaults: @for x in $(SUBDIRS) ; do \ printf "Compiling with default: $$x" | $(AWK_CMD); \ - LOG=$$($(MAKE) -C $$x $(subst all-keyboards-defaults-,,$@) VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ + LOG=$$($(MAKE) -C $$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ done -all-keyboards-defaults: all-keyboards-defaults-all - -KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboards/%/=/keyboards/%) -all-keyboards-all: $(addsuffix -all,$(KEYBOARDS)) -all-keyboards-clean: $(addsuffix -clean,$(KEYBOARDS)) -all-keyboards: all-keyboards-all - -define make_keyboard -$(eval KEYBOARD=$(patsubst /keyboards/%,%,$1)) -$(eval SUBPROJECT=$(lastword $(subst /, ,$(KEYBOARD)))) -$(eval KEYBOARD=$(firstword $(subst /, ,$(KEYBOARD)))) -$(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.)))) -$(eval KEYMAPS+=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/$(SUBPROJECT)/keymaps/*/.)))) -@for x in $(KEYMAPS) ; do \ - printf "Compiling $(BOLD)$(KEYBOARD)/$(SUBPROJECT)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \ - LOG=$$($(MAKE) -C $(TOP_DIR)$1 $2 keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ -done -endef - -define make_keyboard_helper -# Just remove the -all and so on from the first argument and pass it forward -$(call make_keyboard,$(subst -$2,,$1),$2) -endef - -/keyboards/%-all: - $(call make_keyboard_helper,$@,all) -/keyboards/%-clean: - $(call make_keyboard_helper,$@,clean) -/keyboards/%: - $(call make_keyboard_helper,$@,all) - -all-keymaps-%: - $(eval MAKECONFIG=$(call get_target,all-keymaps,$@)) - $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.)))) +KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboard/%/=/keyboard/%) +all-keyboards: $(KEYBOARDS) +/keyboard/%: + $(eval KEYBOARD=$(patsubst /keyboard/%,%,$@)) + $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)$@/keymaps/*/.)))) @for x in $(KEYMAPS) ; do \ - printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \ - LOG=$$($(MAKE) $(subst all-keymaps-,,$@) keyboard=$(KEYBOARD) keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ + printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | awk '{ printf "%-88s", $$0; }'; \ + LOG=$$($(MAKE) -C $(TOP_DIR)$@ keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ done -all-keymaps: all-keymaps-all +all-keymaps: + $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboard/$(KEYBOARD)/keymaps/*/.)))) + @for x in $(KEYMAPS) ; do \ + printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | awk '{ printf "%-88s", $$0; }'; \ + LOG=$$($(MAKE) keyboard=$(KEYBOARD) keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ + done # Create build directory $(shell mkdir $(BUILD_DIR) 2>/dev/null) # Create object files directory $(shell mkdir $(OBJDIR) 2>/dev/null) -$(shell mkdir $(KBOBJDIR) 2>/dev/null) + # Include the dependency files. --include $(patsubst %.o,%.d,$(OBJ)) +-include $(shell mkdir $(BUILD_DIR)/.dep 2>/dev/null) $(wildcard $(BUILD_DIR)/.dep/*) # Listing of phony targets. -.PHONY : all finish sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff check_submodule \ +.PHONY : all quick begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ 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 \ -all-keyboards-defaults-% all-keyboards-% all-keymaps-% +all-keyboards-defaults all-keyboards all-keymaps From 462e516ad9afb3540b70597afffed4fe77ae8988 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sat, 20 Aug 2016 08:34:42 -0500 Subject: [PATCH 06/20] Merge --- tmk_core/rules.mk | 550 ++++++++++++++++------------------------------ 1 file changed, 194 insertions(+), 356 deletions(-) diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index 8563f1e07..86ad90f5d 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -14,71 +14,27 @@ # Frederik Rouleau # Carlos Lamas # -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device. -# Please customize your programmer settings(PROGRAM_CMD) -# -# make teensy = Download the hex file to the device, using teensy_loader_cli. -# (must have teensy_loader_cli installed). -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- + +# Enable vpath seraching for source files only +# Without this, output files, could be read from the wrong .build directories +VPATH_SRC := $(VPATH) +vpath %.c $(VPATH_SRC) +vpath %.h $(VPATH_SRC) +vpath %.cpp $(VPATH_SRC) +vpath %.hpp $(VPATH_SRC) +vpath %.S $(VPATH_SRC) +VPATH := # Output format. (can be srec, ihex, binary) FORMAT = ihex -BUILD_DIR = .build - -# Object files directory -# To put object files in current directory, use a dot (.), do NOT make -# this an empty or blank macro! -OBJDIR = $(BUILD_DIR)/obj_$(TARGET) - - -# Optimization level, can be [0, 1, 2, 3, s]. +# Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = s - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DEBUG = dwarf-2 - -COLOR?=true +COLOR ?= true ifeq ($(COLOR),true) NO_COLOR=\033[0m @@ -89,30 +45,38 @@ ifeq ($(COLOR),true) BOLD=\033[1m endif -OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR) -ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR) -WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR) +AUTOGEN ?= false + +ifneq ($(shell awk --version 2>/dev/null),) + AWK=awk +else + AWK=cat && test +endif + +OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n +ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n +WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n ifndef $(SILENT) SILENT = false endif -TAB_LOG = printf "\n$$LOG\n\n" | awk '{ sub(/^/," | "); print }' +TAB_LOG = printf "\n$$LOG\n\n" | $(AWK) '{ sub(/^/," | "); print }' TAB_LOG_PLAIN = printf "$$LOG\n" -AWK_STATUS = awk '{ printf " %-10s\n", $$1; }' -AWK_CMD = awk '{ printf "%-69s", $$0; }' -PRINT_ERROR = ($(SILENT) ||printf "$(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && false -PRINT_WARNING = ($(SILENT) || printf "$(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) -PRINT_ERROR_PLAIN = ($(SILENT) ||printf "$(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && false -PRINT_WARNING_PLAIN = ($(SILENT) || printf "$(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) -PRINT_OK = $(SILENT) || printf "$(OK_STRING)" | $(AWK_STATUS) +AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }' +AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }' +PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && exit 1 +PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) +PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && exit 1 +PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) +PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS) BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi; # List any extra directories to look for include files here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. -EXTRAINCDIRS = $(subst :, ,$(VPATH)) +EXTRAINCDIRS += $(subst :, ,$(VPATH_SRC)) # Compiler flag to set the C Standard level. @@ -124,17 +88,14 @@ CSTANDARD = -std=gnu99 # Place -D or -U options here for C sources -CDEFS = -DF_CPU=$(F_CPU)UL CDEFS += $(OPT_DEFS) # Place -D or -U options here for ASM sources -ADEFS = -DF_CPU=$(F_CPU) ADEFS += $(OPT_DEFS) # Place -D or -U options here for C++ sources -CPPDEFS = -DF_CPU=$(F_CPU)UL #CPPDEFS += -D__STDC_LIMIT_MACROS #CPPDEFS += -D__STDC_CONSTANT_MACROS CPPDEFS += $(OPT_DEFS) @@ -148,20 +109,12 @@ CPPDEFS += $(OPT_DEFS) # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) +CFLAGS += -g$(DEBUG) CFLAGS += $(CDEFS) CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -CFLAGS += -funsigned-bitfields -CFLAGS += -ffunction-sections -CFLAGS += -fdata-sections -CFLAGS += -fno-inline-small-functions -CFLAGS += -fpack-struct -CFLAGS += -fshort-enums -CFLAGS += -fno-strict-aliasing # add color ifeq ($(COLOR),true) -ifeq ("$(echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") +ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") CFLAGS+= -fdiagnostics-color endif endif @@ -187,16 +140,9 @@ endif # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing -CPPFLAGS = -g$(DEBUG) +CPPFLAGS += -g$(DEBUG) CPPFLAGS += $(CPPDEFS) CPPFLAGS += -O$(OPT) -CPPFLAGS += -funsigned-char -CPPFLAGS += -funsigned-bitfields -CPPFLAGS += -fpack-struct -CPPFLAGS += -fshort-enums -CPPFLAGS += -fno-exceptions -CPPFLAGS += -ffunction-sections -CPPFLAGS += -fdata-sections # to supress "warning: only initialized variables can be placed into program memory area" CPPFLAGS += -w CPPFLAGS += -Wall @@ -223,7 +169,7 @@ endif # files -- see avr-libc docs [FIXME: not yet described there] # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 +ASFLAGS += $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) ifdef CONFIG_H ASFLAGS += -include $(CONFIG_H) @@ -257,28 +203,6 @@ SCANF_LIB = MATH_LIB = -lm -# List any extra directories to look for libraries here. -# Each directory must be seperated by a space. -# Use forward slashes for directory separators. -# For a directory that has spaces, enclose it in quotes. -EXTRALIBDIRS = - - - -#---------------- External Memory Options ---------------- - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - - - #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file @@ -287,9 +211,8 @@ EXTMEMOPTS = # Comennt out "--relax" option to avoid a error such: # (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12' # -LDFLAGS = -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref +LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref #LDFLAGS += -Wl,--relax -LDFLAGS += -Wl,--gc-sections LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) @@ -297,59 +220,13 @@ LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) # You can give EXTRALDFLAGS at 'make' command line. LDFLAGS += $(EXTRALDFLAGS) - - -#---------------- Debugging Options ---------------- - -# For simulavr only - target MCU frequency. -DEBUG_MFREQ = $(F_CPU) - -# Set the DEBUG_UI to either gdb or insight. -# DEBUG_UI = gdb -DEBUG_UI = insight - -# Set the debugging back-end to either avarice, simulavr. -DEBUG_BACKEND = avarice -#DEBUG_BACKEND = simulavr - -# GDB Init Filename. -GDBINIT_FILE = __avr_gdbinit - -# When using avarice settings for the JTAG -JTAG_DEV = /dev/com1 - -# Debugging port used to communicate between GDB / avarice / simulavr. -DEBUG_PORT = 4242 - -# Debugging host used to communicate between GDB / avarice / simulavr, normally -# just set to localhost unless doing some sort of crazy debugging when -# avarice is running on a different computer. -DEBUG_HOST = localhost - - - -#============================================================================ - - # Define programs and commands. SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -AR = avr-ar rcs -NM = avr-nm REMOVE = rm -f REMOVEDIR = rmdir COPY = cp WINSHELL = cmd SECHO = $(SILENT) || echo -# Autodecct teensy loader -ifneq (, $(shell which teensy-loader-cli 2>/dev/null)) - TEENSY_LOADER_CLI = teensy-loader-cli -else - TEENSY_LOADER_CLI = teensy_loader_cli -endif # Define Messages # English @@ -362,6 +239,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: @@ -370,12 +248,24 @@ MSG_COMPILING_CPP = Compiling: MSG_ASSEMBLING = Assembling: MSG_CLEANING = Cleaning project: MSG_CREATING_LIBRARY = Creating library: - - +MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \ + Some git sub-modules are out of date or modified, please consider runnning:$(BOLD)\n\ + git submodule sync --recursive\n\ + git submodule update --init --recursive$(NO_COLOR)\n\n\ + You can ignore this warning if you are not compiling any ChibiOS keyboards,\n\ + or if you have modified the ChibiOS libraries yourself. \n\n # Define all object files. OBJ = $(patsubst %.c,$(OBJDIR)/%.o,$(patsubst %.cpp,$(OBJDIR)/%.o,$(patsubst %.S,$(OBJDIR)/%.o,$(SRC)))) +# The files in the lib folder are shared between all keymaps, so generate that folder name by removing +# the keymap from the name +KBOBJDIR=$(subst _$(KEYMAP),,$(OBJDIR)) +# And fixup the object files to match +LIBOBJ = $(foreach v,$(OBJ),$(if $(findstring /lib/,$v),$v)) +NONLIBOBJ := $(filter-out $(LIBOBJ),$(OBJ)) +LIBOBJ := $(subst _$(KEYMAP)/,/,$(LIBOBJ)) +OBJ := $(LIBOBJ) $(NONLIBOBJ) # Define all listing files. LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.lst,$(patsubst %.S,$(OBJDIR)/%.lst,$(SRC)))) @@ -383,34 +273,20 @@ 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 $(patsubst %.o,%.td,$@) # Combine all necessary flags and optional flags. # Add target processor to flags. # You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar -ALL_CFLAGS = -mmcu=$(MCU) $(CFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) +ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS) +ALL_CPPFLAGS = $(MCUFLAGS) -x c++ $(CPPFLAGS) $(EXTRAFLAGS) +ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) + +MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@) # Default target. -all: - @$(MAKE) begin - @$(MAKE) gccversion - @$(MAKE) sizebefore - @$(MAKE) clean_list # force clean each time - @$(MAKE) build - @$(MAKE) sizeafter - @$(MAKE) end - -# Quick make that doesn't clean -quick: - @$(MAKE) begin - @$(MAKE) gccversion - @$(MAKE) sizebefore - @$(MAKE) build - @$(MAKE) sizeafter - @$(MAKE) end +all: build sizeafter # Change the build target to build a HEX file or a library. build: elf hex @@ -426,17 +302,14 @@ 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) - -end: - @$(SECHO) $(MSG_END) - +check_submodule: + git submodule status --recursive | \ + while IFS= read -r x; do \ + case "$$x" in \ + \ *) ;; \ + *) printf "$(MSG_SUBMODULE_DIRTY)";break;; \ + esac \ + done # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex @@ -447,134 +320,31 @@ 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 - # @if [[ $($(SIZE) --target=$(FORMAT) $(TARGET).hex | awk 'NR==2 {print "0x"$5}') -gt 0x200 ]]; then $(SECHO) "File is too big!"; fi + # @if [[ $($(SIZE) --target=$(FORMAT) $(TARGET).hex | $(AWK) 'NR==2 {print "0x"$5}') -gt 0x200 ]]; then $(SECHO) "File is too big!"; fi # Display compiler version information. gccversion : @$(SILENT) || $(CC) --version - - -# Program the device. -program: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep - $(PROGRAM_CMD) - -teensy: $(BUILD_DIR)/$(TARGET).hex - $(TEENSY_LOADER_CLI) -mmcu=$(MCU) -w -v $(BUILD_DIR)/$(TARGET).hex - -flip: $(BUILD_DIR)/$(TARGET).hex - batchisp -hardware usb -device $(MCU) -operation erase f - batchisp -hardware usb -device $(MCU) -operation loadbuffer $(BUILD_DIR)/$(TARGET).hex program - batchisp -hardware usb -device $(MCU) -operation start reset 0 - -dfu: $(BUILD_DIR)/$(TARGET).hex sizeafter -ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) - dfu-programmer $(MCU) erase --force -else - dfu-programmer $(MCU) erase -endif - dfu-programmer $(MCU) erase - dfu-programmer $(MCU) flash $(BUILD_DIR)/$(TARGET).hex - dfu-programmer $(MCU) reset - -dfu-no-build: -ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) - dfu-programmer $(MCU) erase --force -else - dfu-programmer $(MCU) erase -endif - dfu-programmer $(MCU) erase - dfu-programmer $(MCU) flash $(KEYMAP_PATH)/compiled.hex - dfu-programmer $(MCU) reset - -dfu-start: - dfu-programmer $(MCU) reset - dfu-programmer $(MCU) start - -flip-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep - $(COPY) $(BUILD_DIR)/$(TARGET).eep $(BUILD_DIR)/$(TARGET)eep.hex - batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase - batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(BUILD_DIR)/$(TARGET)eep.hex program - batchisp -hardware usb -device $(MCU) -operation start reset 0 - $(REMOVE) $(BUILD_DIR)/$(TARGET)eep.hex - -dfu-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep -ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) - dfu-programmer $(MCU) flash --eeprom $(BUILD_DIR)/$(TARGET).eep -else - dfu-programmer $(MCU) flash-eeprom $(BUILD_DIR)/$(TARGET).eep -endif - dfu-programmer $(MCU) reset - - -# Generate avr-gdb config/init file which does the following: -# define the reset signal, load the target file, connect to target, and set -# a breakpoint at main(). -gdb-config: - @$(REMOVE) $(GDBINIT_FILE) - @echo define reset >> $(GDBINIT_FILE) - @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) - @echo end >> $(GDBINIT_FILE) - @echo file $(BUILD_DIR)/$(TARGET).elf >> $(GDBINIT_FILE) - @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) -ifeq ($(DEBUG_BACKEND),simulavr) - @echo load >> $(GDBINIT_FILE) -endif - @echo break main >> $(GDBINIT_FILE) - -debug: gdb-config $(BUILD_DIR)/$(TARGET).elf -ifeq ($(DEBUG_BACKEND), avarice) - @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. - @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ - $(BUILD_DIR)/$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) - @$(WINSHELL) /c pause - -else - @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ - $(DEBUG_MFREQ) --port $(DEBUG_PORT) -endif - @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT = $(OBJCOPY) --debugging -COFFCONVERT += --change-section-address .data-0x800000 -COFFCONVERT += --change-section-address .bss-0x800000 -COFFCONVERT += --change-section-address .noinit-0x800000 -COFFCONVERT += --change-section-address .eeprom-0x810000 - - - -coff: $(BUILD_DIR)/$(TARGET).elf - @$(SECHO) $(MSG_COFF) $(BUILD_DIR)/$(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(BUILD_DIR)/$(TARGET).cof - - -extcoff: $(BUILD_DIR)/$(TARGET).elf - @$(SECHO) $(MSG_EXTENDED_COFF) $(BUILD_DIR)/$(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(BUILD_DIR)/$(TARGET).cof - - - # Create final output files (.hex, .eep) from ELF output file. %.hex: %.elf @$(SILENT) || printf "$(MSG_FLASH) $@" | $(AWK_CMD) - $(eval CMD=$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@) - @$(BUILD_CMD) - @$(COPY) $@ $(TARGET).hex - $(SILENT) || printf "Copying $(TARGET).hex to keymaps/$(KEYMAP)/compiled.hex" | $(AWK_CMD) - $(eval CMD=$(COPY) $@ $(KEYMAP_PATH)/compiled.hex) + $(eval CMD=$(HEX) $< $@) @$(BUILD_CMD) + @if $(AUTOGEN); then \ + $(SILENT) || printf "Copying $(TARGET).hex to keymaps/$(KEYMAP)/$(KEYBOARD)_$(KEYMAP).hex\n"; \ + $(COPY) $@ $(KEYMAP_PATH)/$(KEYBOARD)_$(KEYMAP).hex; \ + else \ + $(COPY) $@ $(TARGET).hex; \ + fi %.eep: %.elf @$(SILENT) || printf "$(MSG_EEPROM) $@" | $(AWK_CMD) - $(eval CMD=$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0) + $(eval CMD=$(EEP) $< $@ || exit 0) @$(BUILD_CMD) # Create extended listing file from ELF output file. @@ -589,6 +359,11 @@ extcoff: $(BUILD_DIR)/$(TARGET).elf $(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) @@ -597,101 +372,164 @@ extcoff: $(BUILD_DIR)/$(TARGET).elf $(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) +# Note the obj.txt depeendency is there to force linking if a source file is deleted +%.elf: $(OBJ) $(OBJDIR)/cflags.txt $(OBJDIR)/ldflags.txt $(OBJDIR)/obj.txt | $(BEGIN) @$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD) - $(eval CMD=$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)) + $(eval CMD=$(CC) $(ALL_CFLAGS) $(filter-out %.txt,$^) --output $@ $(LDFLAGS)) @$(BUILD_CMD) +define GEN_OBJRULE # Compile: create object files from C source files. -$(OBJDIR)/%.o : %.c - @mkdir -p $(@D) - @$(SILENT) || printf "$(MSG_COMPILING) $<" | $(AWK_CMD) - $(eval CMD=$(CC) -c $(ALL_CFLAGS) $< -o $@) - @$(BUILD_CMD) +$1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN) + @mkdir -p $$(@D) + @$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD) + $$(eval CMD=$$(CC) -c $$(ALL_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) + @$$(BUILD_CMD) # Compile: create object files from C++ source files. -$(OBJDIR)/%.o : %.cpp - @mkdir -p $(@D) - @$(SILENT) || printf "$(MSG_COMPILING_CPP) $<" | $(AWK_CMD) - $(CC) -c $(ALL_CPPFLAGS) $< -o $@ +$1/%.o : %.cpp $1/%.d $1/cppflags.txt $1/compiler.txt | $(BEGIN) + @mkdir -p $$(@D) + @$$(SILENT) || printf "$$(MSG_COMPILING_CPP) $$<" | $$(AWK_CMD) + $$(eval CMD=$$(CC) -c $$(ALL_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) @$(BUILD_CMD) +# Assemble: create object files from assembler source files. +$1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN) + @mkdir -p $$(@D) + @$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD) + $$(eval CMD=$$(CC) -c $$(ALL_ASFLAGS) $$< -o $$@) + @$$(BUILD_CMD) + +$1/force: + +$1/cflags.txt: $1/force + echo '$$(ALL_CFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CFLAGS)' > $$@ + +$1/cppflags.txt: $1/force + echo '$$(ALL_CPPFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CPPFLAGS)' > $$@ + +$1/asflags.txt: $1/force + echo '$$(ALL_ASFLAGS)' | cmp -s - $$@ || echo '$$(ALL_ASFLAGS)' > $$@ + +$1/ldflags.txt: $1/force + echo '$$(LDFLAGS)' | cmp -s - $$@ || echo '$$(LDFLAGS)' > $$@ + +$1/obj.txt: $1/force + echo '$$(OBJ)' | cmp -s - $$@ || echo '$$(OBJ)' > $$@ + +$1/compiler.txt: $1/force + $$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@ +endef + +# We have to use static rules for the .d files for some reason +DEPS = $(patsubst %.o,%.d,$(OBJ)) +# Keep the .d files +.PRECIOUS: $(DEPS) +# Empty rule to force recompilation if the .d file is missing +$(DEPS): + +# Since the object files could be in two different folders, generate +# separate rules for them, rather than having too generic rules +$(eval $(call GEN_OBJRULE,$(OBJDIR))) +$(eval $(call GEN_OBJRULE,$(KBOBJDIR))) + # 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 - @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 - $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@ +%.i : %.c | $(BEGIN) + $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@ # Target: clean project. -clean: begin clean_list end - -clean_list : - $(REMOVE) -r $(TOP_DIR)/$(BUILD_DIR) - $(REMOVE) -r $(KEYBOARD_PATH)/$(BUILD_DIR) - $(REMOVE) -r $(KEYMAP_PATH)/$(BUILD_DIR) +clean: + $(REMOVE) -r $(OBJDIR) 2>/dev/null + $(REMOVE) -r $(KBOBJDIR) 2>/dev/null + $(REMOVE) $(BUILD_DIR)/$(TARGET).* show_path: @echo VPATH=$(VPATH) @echo SRC=$(SRC) -SUBDIRS := $(sort $(dir $(wildcard $(TOP_DIR)/keyboard/*/.))) -all-keyboards-defaults: +SUBDIRS := $(filter-out %/util/ %/doc/ %/keymaps/ %/old_keymap_files/,$(dir $(wildcard $(TOP_DIR)/keyboards/**/*/Makefile))) +SUBDIRS := $(SUBDIRS) $(dir $(wildcard $(TOP_DIR)/keyboards/*/.)) +SUBDIRS := $(sort $(SUBDIRS)) +# $(error $(SUBDIRS)) +all-keyboards-defaults-%: @for x in $(SUBDIRS) ; do \ printf "Compiling with default: $$x" | $(AWK_CMD); \ - LOG=$$($(MAKE) -C $$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ + LOG=$$($(MAKE) -C $$x $(subst all-keyboards-defaults-,,$@) VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ done -KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboard/%/=/keyboard/%) -all-keyboards: $(KEYBOARDS) -/keyboard/%: - $(eval KEYBOARD=$(patsubst /keyboard/%,%,$@)) - $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)$@/keymaps/*/.)))) +all-keyboards-defaults: all-keyboards-defaults-all + +KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboards/%/=/keyboards/%) +all-keyboards-all: $(addsuffix -all,$(KEYBOARDS)) +all-keyboards-clean: $(addsuffix -clean,$(KEYBOARDS)) +all-keyboards: all-keyboards-all + +define make_keyboard +$(eval KEYBOARD=$(patsubst /keyboards/%,%,$1)) +$(eval SUBPROJECT=$(lastword $(subst /, ,$(KEYBOARD)))) +$(eval KEYBOARD=$(firstword $(subst /, ,$(KEYBOARD)))) +$(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.)))) +$(eval KEYMAPS+=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/$(SUBPROJECT)/keymaps/*/.)))) +@for x in $(KEYMAPS) ; do \ + printf "Compiling $(BOLD)$(KEYBOARD)/$(SUBPROJECT)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \ + LOG=$$($(MAKE) -C $(TOP_DIR)$1 $2 keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ +done +endef + +define make_keyboard_helper +# Just remove the -all and so on from the first argument and pass it forward +$(call make_keyboard,$(subst -$2,,$1),$2) +endef + +/keyboards/%-all: + $(call make_keyboard_helper,$@,all) +/keyboards/%-clean: + $(call make_keyboard_helper,$@,clean) +/keyboards/%: + $(call make_keyboard_helper,$@,all) + +all-keymaps-%: + $(eval MAKECONFIG=$(call get_target,all-keymaps,$@)) + $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.)))) @for x in $(KEYMAPS) ; do \ - printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | awk '{ printf "%-88s", $$0; }'; \ - LOG=$$($(MAKE) -C $(TOP_DIR)$@ keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ + printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \ + LOG=$$($(MAKE) $(subst all-keymaps-,,$@) keyboard=$(KEYBOARD) keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ done -all-keymaps: - $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboard/$(KEYBOARD)/keymaps/*/.)))) - @for x in $(KEYMAPS) ; do \ - printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | awk '{ printf "%-88s", $$0; }'; \ - LOG=$$($(MAKE) keyboard=$(KEYBOARD) keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ - done +all-keymaps: all-keymaps-all # Create build directory $(shell mkdir $(BUILD_DIR) 2>/dev/null) # Create object files directory $(shell mkdir $(OBJDIR) 2>/dev/null) - +$(shell mkdir $(KBOBJDIR) 2>/dev/null) # Include the dependency files. --include $(shell mkdir $(BUILD_DIR)/.dep 2>/dev/null) $(wildcard $(BUILD_DIR)/.dep/*) +-include $(patsubst %.o,%.d,$(OBJ)) # Listing of phony targets. -.PHONY : all quick begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff \ +.PHONY : all 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 +all-keyboards-defaults all-keyboards all-keymaps \ +all-keyboards-defaults-% all-keyboards-% all-keymaps-% \ No newline at end of file From 5febdb0a3c9e63d79d6695ebc1f58259669dd168 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sat, 20 Aug 2016 10:26:36 -0500 Subject: [PATCH 07/20] Initial Commmit --- keyboards/vision_division/Makefile | 75 ++++++++ keyboards/vision_division/config.h | 162 ++++++++++++++++++ .../vision_division/keymaps/default/Makefile | 21 +++ .../vision_division/keymaps/default/config.h | 8 + .../vision_division/keymaps/default/keymap.c | 44 +++++ .../vision_division/keymaps/default/readme.md | 1 + keyboards/vision_division/readme.md | 28 +++ keyboards/vision_division/vision_division.c | 28 +++ keyboards/vision_division/vision_division.h | 19 ++ tmk_core/rules.mk | 2 +- 10 files changed, 387 insertions(+), 1 deletion(-) create mode 100644 keyboards/vision_division/Makefile create mode 100644 keyboards/vision_division/config.h create mode 100644 keyboards/vision_division/keymaps/default/Makefile create mode 100644 keyboards/vision_division/keymaps/default/config.h create mode 100644 keyboards/vision_division/keymaps/default/keymap.c create mode 100644 keyboards/vision_division/keymaps/default/readme.md create mode 100644 keyboards/vision_division/readme.md create mode 100644 keyboards/vision_division/vision_division.c create mode 100644 keyboards/vision_division/vision_division.h diff --git a/keyboards/vision_division/Makefile b/keyboards/vision_division/Makefile new file mode 100644 index 000000000..3f6d133c9 --- /dev/null +++ b/keyboards/vision_division/Makefile @@ -0,0 +1,75 @@ + + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 + +ifndef QUANTUM_DIR + include ../../Makefile +endif + + diff --git a/keyboards/vision_division/config.h b/keyboards/vision_division/config.h new file mode 100644 index 000000000..106cf384c --- /dev/null +++ b/keyboards/vision_division/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER You +#define PRODUCT vision_division +#define DESCRIPTION A custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 2 +#define MATRIX_COLS 3 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { D0, D5 } +#define MATRIX_COL_PINS { F1, F0, B0 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/vision_division/keymaps/default/Makefile b/keyboards/vision_division/keymaps/default/Makefile new file mode 100644 index 000000000..f4671a9d1 --- /dev/null +++ b/keyboards/vision_division/keymaps/default/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/vision_division/keymaps/default/config.h b/keyboards/vision_division/keymaps/default/config.h new file mode 100644 index 000000000..df06a2620 --- /dev/null +++ b/keyboards/vision_division/keymaps/default/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif \ No newline at end of file diff --git a/keyboards/vision_division/keymaps/default/keymap.c b/keyboards/vision_division/keymaps/default/keymap.c new file mode 100644 index 000000000..599c2cb52 --- /dev/null +++ b/keyboards/vision_division/keymaps/default/keymap.c @@ -0,0 +1,44 @@ +#include "vision_division.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( /* Base */ + KC_A, KC_1, KC_H, \ + KC_TAB, KC_SPC \ +), +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} \ No newline at end of file diff --git a/keyboards/vision_division/keymaps/default/readme.md b/keyboards/vision_division/keymaps/default/readme.md new file mode 100644 index 000000000..bb0ed3862 --- /dev/null +++ b/keyboards/vision_division/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for vision_division \ No newline at end of file diff --git a/keyboards/vision_division/readme.md b/keyboards/vision_division/readme.md new file mode 100644 index 000000000..0a637fd06 --- /dev/null +++ b/keyboards/vision_division/readme.md @@ -0,0 +1,28 @@ +vision_division keyboard firmware +====================== + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme.md](/doc/readme.md). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/vision_division folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make`. + +### Other Keymaps + +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. + +To build the firmware binary hex file with a keymap just do `make` with `keymap` option like: + +``` +$ make keymap=[default|jack|] +``` + +Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` \ No newline at end of file diff --git a/keyboards/vision_division/vision_division.c b/keyboards/vision_division/vision_division.c new file mode 100644 index 000000000..eb9336fa3 --- /dev/null +++ b/keyboards/vision_division/vision_division.c @@ -0,0 +1,28 @@ +#include "vision_division.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/vision_division/vision_division.h b/keyboards/vision_division/vision_division.h new file mode 100644 index 000000000..d30fc8499 --- /dev/null +++ b/keyboards/vision_division/vision_division.h @@ -0,0 +1,19 @@ +#ifndef VISION_DIVISION_H +#define VISION_DIVISION_H + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. +// The following is an example using the Planck MIT layout +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define KEYMAP( \ + k00, k01, k02, \ + k10, k11 \ +) \ +{ \ + { k00, k01, k02 }, \ + { k10, KC_NO, k11 }, \ +} + +#endif diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index 86ad90f5d..d2350f27c 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -532,4 +532,4 @@ 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 \ -all-keyboards-defaults-% all-keyboards-% all-keymaps-% \ No newline at end of file +all-keyboards-defaults-% all-keyboards-% all-keymaps-% From 4807feec8a8ea51db40b881b5057784b2b00310b Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sat, 20 Aug 2016 14:49:16 -0500 Subject: [PATCH 08/20] In Progress Merge --- keyboards/vision_division/Makefile | 11 +- keyboards/vision_division/config.h | 31 +++-- .../vision_division/keymaps/default/Makefile | 2 +- keyboards/vision_division/vision_division.h | 111 +++++++++++++++++- 4 files changed, 137 insertions(+), 18 deletions(-) diff --git a/keyboards/vision_division/Makefile b/keyboards/vision_division/Makefile index 3f6d133c9..4f3130c48 100644 --- a/keyboards/vision_division/Makefile +++ b/keyboards/vision_division/Makefile @@ -1,8 +1,9 @@ # MCU name -#MCU = at90usb1287 -MCU = atmega32u4 +MCU = at90usb1286 +# MCU = at90usb1287 +# MCU = atmega32u4 # Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the @@ -47,13 +48,13 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=512 +OPT_DEFS += -DBOOTLOADER_SIZE=1024 # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) CONSOLE_ENABLE ?= yes # Console for debug(+400) @@ -61,7 +62,7 @@ COMMAND_ENABLE ?= yes # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE ?= no # USB Nkey Rollover +NKRO_ENABLE ?= yes # USB Nkey Rollover BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default MIDI_ENABLE ?= no # MIDI controls UNICODE_ENABLE ?= no # Unicode diff --git a/keyboards/vision_division/config.h b/keyboards/vision_division/config.h index 106cf384c..1faea335a 100644 --- a/keyboards/vision_division/config.h +++ b/keyboards/vision_division/config.h @@ -22,15 +22,21 @@ along with this program. If not, see . /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6060 +#define PRODUCT_ID 0x2525 #define DEVICE_VER 0x0001 #define MANUFACTURER You -#define PRODUCT vision_division -#define DESCRIPTION A custom keyboard +#define PRODUCT Vision Division +#define DESCRIPTION Split or Full Keyboard +#define MATRIX_EXTENDED /* key matrix size */ -#define MATRIX_ROWS 2 -#define MATRIX_COLS 3 +#ifdef MATRIX_EXTENDED + #define MATRIX_ROWS 6 + #define MATRIX_COLS 24 +#else + #define MATRIX_ROWS 6 + #define MATRIX_COLS 12 +#endif /* * Keyboard Matrix Assignments @@ -42,8 +48,19 @@ along with this program. If not, see . * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) * */ -#define MATRIX_ROW_PINS { D0, D5 } -#define MATRIX_COL_PINS { F1, F0, B0 } + +#ifdef MATRIX_EXTENDED + // Note that the extended colums are reversed because the second PCB has col 1 on the far right. + #define MATRIX_ROW_PINS { C2, C3, F4, F5, F6, F7 } + #define MATRIX_COL_PINS { C1, C0, E1, E0, F3, F2, F1, F0, B0, B1, B2, B3, E6, A4, A0, A1, A5, A2, A6, A3, A7, C4, C5, C7} +#else #ifdef MATRIX_LEFT + #define MATRIX_ROW_PINS { C2, C3, F4, F5, F6, F7 } + #define MATRIX_COL_PINS { C1, C0, E1, E0, F3, F2, F1, F0, B0, B1, B2, B3 } + + + #define MATRIX_COL_PINS { B3, B2, B1, B0, F0, F1, F2, F3, E0, E1, C0, C1 } +#endif + #define UNUSED_PINS /* COL2ROW or ROW2COL */ diff --git a/keyboards/vision_division/keymaps/default/Makefile b/keyboards/vision_division/keymaps/default/Makefile index f4671a9d1..43fee2668 100644 --- a/keyboards/vision_division/keymaps/default/Makefile +++ b/keyboards/vision_division/keymaps/default/Makefile @@ -2,7 +2,7 @@ # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) diff --git a/keyboards/vision_division/vision_division.h b/keyboards/vision_division/vision_division.h index d30fc8499..deeb85c1f 100644 --- a/keyboards/vision_division/vision_division.h +++ b/keyboards/vision_division/vision_division.h @@ -7,13 +7,114 @@ // The following is an example using the Planck MIT layout // The first section contains all of the arguements // The second converts the arguments into a two-dimensional array -#define KEYMAP( \ - k00, k01, k02, \ - k10, k11 \ +#define KEYMAP_EXTENDED( \ + k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ + k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ + k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ + k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ + k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ + k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ ) \ { \ - { k00, k01, k02 }, \ - { k10, KC_NO, k11 }, \ + { k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C },\ + { k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C },\ + { k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C },\ + { k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C },\ + { k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C },\ + { k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C },\ } +#define KEYMAP_LEFT( \ + k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ + k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ + k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ + k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ + k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ + k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ +) \ +{ \ + { k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C },\ + { k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C },\ + { k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C },\ + { k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C },\ + { k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C },\ + { k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C },\ +} + +#define KEYMAP_RIGHT( \ + k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ + k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ + k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ + k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ + k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ + k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ +) \ +{ \ + { k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C },\ + { k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C },\ + { k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C },\ + { k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C },\ + { k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C },\ + { k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C },\ +} + +#ifdef MATRIX_EXTENDED +#define KEYMAP( \ + k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ + k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ + k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ + k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ + k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ + k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ +) \ +KEYMAP_EXTENDED( \ + k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ + k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ + k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ + k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ + k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ + k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ +) +#endif + +#ifdef MATRIX_LEFT +#define KEYMAP( \ + k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ + k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ + k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ + k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ + k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ + k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ +) \ +KEYMAP_LEFT( \ + k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ + k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ + k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ + k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ + k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ + k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ +) +#endif + +#ifdef MATRIX_RIGHT +#define KEYMAP( \ + k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ + k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ + k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ + k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ + k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ + k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ +) \ +KEYMAP_RIGHT( \ + k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ + k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ + k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ + k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ + k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ + k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ +) + +#endif + + #endif From 705c775a4a433249081321cea0c2def2627817dc Mon Sep 17 00:00:00 2001 From: IBNobody Date: Sun, 21 Aug 2016 22:05:55 -0500 Subject: [PATCH 09/20] Nightly Only major change to qmk was the addition of A0-A7 pins for the AT90USB --- .../vision_division/Potential Layouts.txt | 84 +++++++++ keyboards/vision_division/config.h | 44 +---- .../vision_division/keymaps/default/config.h | 36 +++- .../vision_division/keymaps/default/keymap.c | 28 ++- keyboards/vision_division/matrix_types.h | 167 ++++++++++++++++++ keyboards/vision_division/vision_division.h | 114 ------------ quantum/config_common.h | 9 + 7 files changed, 321 insertions(+), 161 deletions(-) create mode 100644 keyboards/vision_division/Potential Layouts.txt create mode 100644 keyboards/vision_division/matrix_types.h diff --git a/keyboards/vision_division/Potential Layouts.txt b/keyboards/vision_division/Potential Layouts.txt new file mode 100644 index 000000000..f715ac8c6 --- /dev/null +++ b/keyboards/vision_division/Potential Layouts.txt @@ -0,0 +1,84 @@ +/* Numeric Max / Numeric Normal - Full Grid + * .-----------------------------------. .--------------------------------------------------------------_--------------------------------------------------------------. .-----------------------------------. + * | | | | | | | | | | | | | | | | | | | | | | | | | + * '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' + * .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. + * | | | | | | | | | | | | | | | | | | | | | | | | | + * |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------| + * | | | | | | | | | | | | | | | | | | | | | | | | | + * |--------+--------+--------+--------| o |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------| + * | | | | | o | | | | | | | | | | | | | | | | | | | | + * |--------+--------+--------+--------| o |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------| + * | | | | | | | | | | | | | | | | | | | | | | | | | + * |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------| + * | | | | | | | | | | | | | | | | | | | | | | | | | + * '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' + */ + +//* Numeric Max / Homing Normal - Full Grid + * .-----------------------------------. .--------------------------------------------------------------_--------------------------------------------------------------. .--------------------------. + * | | | | | | | | | | | | | | | | | | | | | | | | + * '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '--------------------------' + * .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .--------------------------. + * | | | | | | | | | | | | | | | | | | | | | | | | + * |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------| + * | | | | | | | | | | | | | | | | | | | | | | | | + * |--------+--------+--------+--------| o |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------| + * | | | | | o | | | | | | | | | | | | | | | | | | | + * |--------+--------+--------+--------| o |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------| + * | | | | | | | | | | | | | | | | | | | | | | | | + * |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------| + * | | | | | | | | | | | | | | | | | | | | | | | | + * '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '--------------------------' + */ + +//* Numeric Max / Homing Normal - Traditional + * .-----------------------------------. .-----------------------------------. .-----------------_-----------------. .-----------------------------------. .--------------------------. + * | | | | | | | | | | | | | | | | | | | | | | | | + * '-----------------------------------' '-----------------------------------' '-----------------------------------' '-----------------------------------' '--------------------------' + * .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .--------------------------. + * | | | | | | | | | | | | | | | | | | | | | | | | + * |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------| + * | | | | | | | | | | | | | | | | | | | | | | | | + * |--------+--------+--------+ | o |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| '--------+--------+--------' + * | | | | | o | | | | | | | | | | | | | | | + * |--------+--------+--------+--------| o |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| .--------. + * | | | | | | | | | | | | | | | | | | | | + * |--------+--------+--------+ | |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| .--------+--------+--------. + * | | | | | | | | | | | | | | | | | | | | | | + * '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '--------------------------' + */ + +/* Numeric Max / Numeric Normal + * .-----------------------------------. .--------------------------------------------------------------_--------------------------------------------------------------. .-----------------------------------. + * | | | | | | | | | | | | | | | | | | | | | | | | | + * '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' + * .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. + * | | | | | | 1U / 2U | | | | | | | | | | | 1U / 2U | | | | | | + * |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------| + * | 1U | | | 1U | | | | | | | | | | | | | | | | | 1U | | | 1U | + * | / +--------+--------+ / | o |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| | / +--------+--------+ / | + * | 2U | | | 2U | o | 1U / 2U | | | | | | | | | | | | | 2U | | | 2U | + * |--------+--------+--------+--------| o |-----------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| |--------+--------+--------+--------| + * | | | | | | 1U / 2U | | | | | | | | | | | 1U / 2U | | | | | | + * | '--------+--------' | |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| | '--------+--------' | + * | 1U / 2UH / 2UV | 1U / 2UH / 2UV | | | | | | | | 1U / 2U | | | | | | | | 1U / 2UH / 2UV | 1U / 2UH / 2UV | + * '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' + */ + +/* Numeric Max / Numeric Max + * .-----------------------------------. .-----------------------------------------------------------------------_-----------------------------------------------------------------------. .-----------------------------------. + * | | | | | | | | | | | | | | | | | | | | | | | | | | | + * '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' + * .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. + * | | | | | | 1U / 2U | | | | | | | | | | | | | 1U / 2U | | | | | | + * |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------| + * | 1U | | | 1U | | | | | | | | | | | | | | | | | | | 1U | | | 1U | + * | / +--------+--------+ / | o |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| | / +--------+--------+ / | + * | 2U | | | 2U | o | 1U / 2U | | | | | | | | | | | | | | | 2U | | | 2U | + * |--------+--------+--------+--------| o |-----------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| |--------+--------+--------+--------| + * | | | | | | 1U / 2U | | | | | | | | | | | | | 1U / 2U | | | | | | + * | '--------+--------' | |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| | '--------+--------' | + * | 1U / 2UH / 2UV | 1U / 2UH / 2UV | | | | | | | | 1U / 2U | 1U / 2U | | | | | | | | 1U / 2UH / 2UV | 1U / 2UH / 2UV | + * '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' + */ diff --git a/keyboards/vision_division/config.h b/keyboards/vision_division/config.h index 1faea335a..37b834973 100644 --- a/keyboards/vision_division/config.h +++ b/keyboards/vision_division/config.h @@ -20,52 +20,12 @@ along with this program. If not, see . #include "config_common.h" -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x2525 -#define DEVICE_VER 0x0001 -#define MANUFACTURER You -#define PRODUCT Vision Division -#define DESCRIPTION Split or Full Keyboard -#define MATRIX_EXTENDED +// Due to the configurability of this keyboard, matrix sizes are determined in the keymap's config.h -/* key matrix size */ -#ifdef MATRIX_EXTENDED - #define MATRIX_ROWS 6 - #define MATRIX_COLS 24 -#else - #define MATRIX_ROWS 6 - #define MATRIX_COLS 12 -#endif - -/* - * Keyboard Matrix Assignments - * - * Change this to how you wired your keyboard - * COLS: AVR pins used for columns, left to right - * ROWS: AVR pins used for rows, top to bottom - * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) - * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) - * -*/ - -#ifdef MATRIX_EXTENDED - // Note that the extended colums are reversed because the second PCB has col 1 on the far right. - #define MATRIX_ROW_PINS { C2, C3, F4, F5, F6, F7 } - #define MATRIX_COL_PINS { C1, C0, E1, E0, F3, F2, F1, F0, B0, B1, B2, B3, E6, A4, A0, A1, A5, A2, A6, A3, A7, C4, C5, C7} -#else #ifdef MATRIX_LEFT - #define MATRIX_ROW_PINS { C2, C3, F4, F5, F6, F7 } - #define MATRIX_COL_PINS { C1, C0, E1, E0, F3, F2, F1, F0, B0, B1, B2, B3 } - - - #define MATRIX_COL_PINS { B3, B2, B1, B0, F0, F1, F2, F3, E0, E1, C0, C1 } -#endif - -#define UNUSED_PINS /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW - + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 diff --git a/keyboards/vision_division/keymaps/default/config.h b/keyboards/vision_division/keymaps/default/config.h index df06a2620..c005aa8c5 100644 --- a/keyboards/vision_division/keymaps/default/config.h +++ b/keyboards/vision_division/keymaps/default/config.h @@ -2,7 +2,41 @@ #define CONFIG_USER_H #include "../../config.h" +#include "matrix_types.h" -// place overrides here + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID GET_PID(NUMERIC_MAX_TEENSY, NUMERIC_MAX) +#define DEVICE_VER 0x0001 +#define MANUFACTURER IBNobody +#define PRODUCT Vision Division +#define DESCRIPTION Full / Split Keyboard + + +#define MATRIX_ROWS 6 +#define MATRIX_ROW_PINS { C2, C3, F4, F5, F6, F7 } + +#define MATRIX_COLS GET_MATRIX_COLS(NUMERIC_MAX_TEENSY, NUMERIC_MAX) +#define MATRIX_COL_PINS GET_MATRIX_COL_PINS(NUMERIC_MAX_TEENSY, NUMERIC_MAX) + +#define UNUSED_PINS + +#define KEYMAP( \ + k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C, \ + k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C, \ + k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C, \ + k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C, \ + k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C, \ + k601, k602, k603, k604, k605, k606, k607, k608, k609, k60A, k60B, k60C, k611, k612, k613, k614, k615, k616, k617, k618, k619, k61A, k61B, k61C \ +) \ +KEYMAP_MASTER(NUMERIC_MAX_TEENSY, NUMERIC_MAX, \ + k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C, \ + k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C, \ + k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C, \ + k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C, \ + k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C, \ + k601, k602, k603, k604, k605, k606, k607, k608, k609, k60A, k60B, k60C, k611, k612, k613, k614, k615, k616, k617, k618, k619, k61A, k61B, k61C \ +) \ #endif \ No newline at end of file diff --git a/keyboards/vision_division/keymaps/default/keymap.c b/keyboards/vision_division/keymaps/default/keymap.c index 599c2cb52..3fddee78b 100644 --- a/keyboards/vision_division/keymaps/default/keymap.c +++ b/keyboards/vision_division/keymaps/default/keymap.c @@ -1,10 +1,30 @@ #include "vision_division.h" + + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP( /* Base */ - KC_A, KC_1, KC_H, \ - KC_TAB, KC_SPC \ -), + + [0] = KEYMAP( \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_A, KC_B, KC_C, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_A, KC_B, KC_C, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_A, KC_B, KC_C, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 \ +) + +/* + KC_VOLU, KC_MUTE, KC_VOLU, KC_F24, KC_F20, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 k119, k11A, k11B, k11C, \ + KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, k219, k21A, k21B, k21C, \ + KC_KP_7, KC_KP_8, KC_KP_9, KC_F23, KC_F19, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, k319, k31A, k31B, k31C, \ + KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_F18, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP, k419, k41A, k41B, k41C, \ + KC_KP_1, KC_KP_2, KC_KP_3, KC_F22, KC_F17, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN, k519, k51A, k51B, k51C. \ + KC_KP_0, KC_F21, KC_PDOT, KC_PENT, KC_F16, KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC, KC_SPC, M_LOWER, OS_SHFT, KC_RALT, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, k619, k61A, k61B, k61C \ + + ) //-----, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, + +*/ }; const uint16_t PROGMEM fn_actions[] = { diff --git a/keyboards/vision_division/matrix_types.h b/keyboards/vision_division/matrix_types.h new file mode 100644 index 000000000..d40b2079a --- /dev/null +++ b/keyboards/vision_division/matrix_types.h @@ -0,0 +1,167 @@ +#ifndef MATRIX_TYPES_H +#define MATRIX_TYPES_H + +// Because the vision/division keyboard allows for multiple PCB configurations, the configuration +// can get tricky. The PCB itself has 12 columns, but to achieve a full sized 14-column keyboard +// with a 4-column numeric pad on the left and a 3-column homing key cluster on the right, the +// right PCB must have its rightmost column cut off. Also either the rightmost two columns on the +// left PCB or the leftmost two columns on the right PCB need to be cut away. +// +// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +// Left Numeric Max = 1 2 3 4 _ 5 6 7 8 9 0 A B C +// Left Homing Max = 2 3 4 _ 5 6 7 8 9 0 A B C +// Left Numeric Extended = 1 2 3 4 _ 5 6 7 8 9 0 A B +// Left Homing Extended = 2 3 4 _ 5 6 7 8 9 0 A B +// Left Numeric Normal = 1 2 3 4 _ 5 6 7 8 9 0 A +// Left Homing Normal = 2 3 4 _ 5 6 7 8 9 0 A +// Right Numeric Max = 1 2 3 4 5 6 7 8 _ 9 A B C +// Right Homing Max = 1 2 3 4 5 6 7 8 _ 9 A B +// Right Numeric Extended = 2 3 4 5 6 7 8 _ 9 A B C +// Right Homing Extended = 2 3 4 5 6 7 8 _ 9 A B +// Right Numeric Normal = 3 4 5 6 7 8 _ 9 A B C +// Right Homing Normal = 3 4 5 6 7 8 _ 9 A B +// +// +// A full keyboard would look like this: +// +// _Left_Numeric_Max__________|_Right_Homing_Normal +// 1 2 3 4 _ 5 6 7 8 9 0 A B C|3 4 5 6 7 8 _ 9 A B +// +// The ideal full keyboard would use a normal and max rather than two extended because the max +// size allows for a centered 2U space key. + + +#define MATRIX_TYPE_ABSENT 0 +#define MATRIX_TYPE_NUMERIC_MAX 1 +#define MATRIX_TYPE_HOMING_MAX 2 +#define MATRIX_TYPE_NUMERIC_EXTENDED 3 +#define MATRIX_TYPE_HOMING_EXTENDED 4 +#define MATRIX_TYPE_NUMERIC_NORMAL 5 +#define MATRIX_TYPE_HOMING_NORMAL 6 +#define MATRIX_TYPE_NUMERIC_MAX_TEENSY 7 +#define MATRIX_TYPE_HOMING_MAX_TEENSY 8 +#define MATRIX_TYPE_NUMERIC_EXTENDED_TEENSY 9 +#define MATRIX_TYPE_HOMING_EXTENDED_TEENSY 10 +#define MATRIX_TYPE_NUMERIC_NORMAL_TEENSY 11 +#define MATRIX_TYPE_HOMING_NORMAL_TEENSY 12 + + +// Column Length + +#define MATRIX_COLS_ABSENT 0 +#define MATRIX_COLS_NUMERIC_MAX 12 +#define MATRIX_COLS_HOMING_MAX 11 +#define MATRIX_COLS_NUMERIC_EXTENDED 11 +#define MATRIX_COLS_HOMING_EXTENDED 10 +#define MATRIX_COLS_NUMERIC_NORMAL 10 +#define MATRIX_COLS_HOMING_NORMAL 9 +#define MATRIX_COLS_NUMERIC_MAX_TEENSY 12 +#define MATRIX_COLS_HOMING_MAX_TEENSY 11 +#define MATRIX_COLS_NUMERIC_EXTENDED_TEENSY 11 +#define MATRIX_COLS_HOMING_EXTENDED_TEENSY 10 +#define MATRIX_COLS_NUMERIC_NORMAL_TEENSY 10 +#define MATRIX_COLS_HOMING_NORMAL_TEENSY 9 + +// Left PCB Pin assignments + +#define MATRIX_COL_PINS_LEFT_ABSENT + +#define MATRIX_COL_PINS_LEFT_NUMERIC_MAX C7, C5, C4, A7, A3, A6, A2, A5, A1, A0, A4, E6 +#define MATRIX_COL_PINS_LEFT_HOMING_MAX C5, C4, A7, A3, A6, A2, A5, A1, A0, A4, E6 +#define MATRIX_COL_PINS_LEFT_NUMERIC_EXTENDED C7, C5, C4, A7, A3, A6, A2, A5, A1, A0, A4 +#define MATRIX_COL_PINS_LEFT_HOMING_EXTENDED C5, C4, A7, A3, A6, A2, A5, A1, A0, A4 +#define MATRIX_COL_PINS_LEFT_NUMERIC_NORMAL C7, C5, C4, A7, A3, A6, A2, A5, A1, A0 +#define MATRIX_COL_PINS_LEFT_HOMING_NORMAL C5, C4, A7, A3, A6, A2, A5, A1, A0 + +#define MATRIX_COL_PINS_LEFT_NUMERIC_MAX_TEENSY C1, C0, E1, E0, F3, F2, F1, F0, B0, B1, B2, B3 +#define MATRIX_COL_PINS_LEFT_HOMING_MAX_TEENSY C0, E1, E0, F3, F2, F1, F0, B0, B1, B2, B3 +#define MATRIX_COL_PINS_LEFT_NUMERIC_EXTENDED_TEENSY C1, C0, E1, E0, F3, F2, F1, F0, B0, B1, B2 +#define MATRIX_COL_PINS_LEFT_HOMING_EXTENDED_TEENSY C0, E1, E0, F3, F2, F1, F0, B0, B1, B2 +#define MATRIX_COL_PINS_LEFT_NUMERIC_NORMAL_TEENSY C1, C0, E1, E0, F3, F2, F1, F0, B0, B1 +#define MATRIX_COL_PINS_LEFT_HOMING_NORMAL_TEENSY C0, E1, E0, F3, F2, F1, F0, B0, B1 + +// Right PCB Pin assignments + +#define MATRIX_COL_PINS_RIGHT_ABSENT + +#define MATRIX_COL_PINS_RIGHT_NUMERIC_MAX E6, A4, A0, A1, A5, A2, A6, A3, A7, C4, C5, C7 +#define MATRIX_COL_PINS_RIGHT_HOMING_MAX E6, A4, A0, A1, A5, A2, A6, A3, A7, C4, C5 +#define MATRIX_COL_PINS_RIGHT_NUMERIC_EXTENDED A4, A0, A1, A5, A2, A6, A3, A7, C4, C5, C7 +#define MATRIX_COL_PINS_RIGHT_HOMING_EXTENDED A4, A0, A1, A5, A2, A6, A3, A7, C4, C5 +#define MATRIX_COL_PINS_RIGHT_NUMERIC_NORMAL A0, A1, A5, A2, A6, A3, A7, C4, C5, C7 +#define MATRIX_COL_PINS_RIGHT_HOMING_NORMAL A0, A1, A5, A2, A6, A3, A7, C4, C5 + +#define MATRIX_COL_PINS_RIGHT_NUMERIC_MAX_TEENSY B3, B2, B1, B0, F0, F1, F2, F3, E0, E1, C0, C1 +#define MATRIX_COL_PINS_RIGHT_HOMING_MAX_TEENSY B3, B2, B1, B0, F0, F1, F2, F3, E0, E1, C0 +#define MATRIX_COL_PINS_RIGHT_NUMERIC_EXTENDED_TEENSY B2, B1, B0, F0, F1, F2, F3, E0, E1, C0, C1 +#define MATRIX_COL_PINS_RIGHT_HOMING_EXTENDED_TEENSY B2, B1, B0, F0, F1, F2, F3, E0, E1, C0 +#define MATRIX_COL_PINS_RIGHT_NUMERIC_NORMAL_TEENSY B1, B0, F0, F1, F2, F3, E0, E1, C0, C1 +#define MATRIX_COL_PINS_RIGHT_HOMING_NORMAL_TEENSY B1, B0, F0, F1, F2, F3, E0, E1, C0 + +// Fetch Macros + +#define GET_PID(LEFT_TYPE, RIGHT_TYPE) ( ( ( MATRIX_TYPE_ ## LEFT_TYPE ) << 8 ) + ( MATRIX_TYPE_ ## RIGHT_TYPE ) ) +#define GET_MATRIX_COL(TYPE) MATRIX_COLS_ ## TYPE +#define GET_MATRIX_COLS(LEFT_TYPE, RIGHT_TYPE) ( ( GET_MATRIX_COL(LEFT_TYPE) ) + ( GET_MATRIX_COL(RIGHT_TYPE) ) ) +#define GET_MATRIX_COL_PINS(LEFT_TYPE, RIGHT_TYPE) { MATRIX_COL_PINS_LEFT_ ## LEFT_TYPE, MATRIX_COL_PINS_RIGHT_ ## RIGHT_TYPE } + +// Specialized Row Macros + +#define KEYMAP_ROW_LEFT_ABSENT( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) + +#define KEYMAP_ROW_LEFT_NUMERIC_MAX( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C +#define KEYMAP_ROW_LEFT_HOMING_MAX( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C +#define KEYMAP_ROW_LEFT_NUMERIC_EXTENDED( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B +#define KEYMAP_ROW_LEFT_HOMING_EXTENDED( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B +#define KEYMAP_ROW_LEFT_NUMERIC_NORMAL( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A +#define KEYMAP_ROW_LEFT_HOMING_NORMAL( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k02, k03, k04, k05, k06, k07, k08, k09, k0A +#define KEYMAP_ROW_LEFT_NUMERIC_MAX_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C +#define KEYMAP_ROW_LEFT_HOMING_MAX_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C +#define KEYMAP_ROW_LEFT_NUMERIC_EXTENDED_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B +#define KEYMAP_ROW_LEFT_HOMING_EXTENDED_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B +#define KEYMAP_ROW_LEFT_NUMERIC_NORMAL_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A +#define KEYMAP_ROW_LEFT_HOMING_NORMAL_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k02, k03, k04, k05, k06, k07, k08, k09, k0A + +#define KEYMAP_ROW_RIGHT_ABSENT( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) + +#define KEYMAP_ROW_RIGHT_NUMERIC_MAX( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C +#define KEYMAP_ROW_RIGHT_HOMING_MAX( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B +#define KEYMAP_ROW_RIGHT_NUMERIC_EXTENDED( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C +#define KEYMAP_ROW_RIGHT_HOMING_EXTENDED( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B +#define KEYMAP_ROW_RIGHT_NUMERIC_NORMAL( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C +#define KEYMAP_ROW_RIGHT_HOMING_NORMAL( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k03, k04, k05, k06, k07, k08, k09, k0A, k0B +#define KEYMAP_ROW_RIGHT_NUMERIC_MAX_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C +#define KEYMAP_ROW_RIGHT_HOMING_MAX_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B +#define KEYMAP_ROW_RIGHT_NUMERIC_EXTENDED_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C +#define KEYMAP_ROW_RIGHT_HOMING_EXTENDED_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B +#define KEYMAP_ROW_RIGHT_NUMERIC_NORMAL_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C +#define KEYMAP_ROW_RIGHT_HOMING_NORMAL_TEENSY( k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C) k03, k04, k05, k06, k07, k08, k09, k0A, k0B + +// Changable Row Macro + +#define KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, \ + k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ +) \ +KEYMAP_ROW_LEFT_ ## LEFT_TYPE(k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C), KEYMAP_ROW_RIGHT_ ## RIGHT_TYPE(k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C) + +// Changable Master Macro + +#define KEYMAP_MASTER(LEFT_TYPE, RIGHT_TYPE, \ + k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C, \ + k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C, \ + k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C, \ + k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C, \ + k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C, \ + k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ +) \ +{ \ + { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C ) },\ + { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C ) },\ + { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C ) },\ + { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C ) },\ + { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C ) },\ + { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C ) },\ +} + + +#endif // MATRIX_TYPES_H \ No newline at end of file diff --git a/keyboards/vision_division/vision_division.h b/keyboards/vision_division/vision_division.h index deeb85c1f..a1f3195e9 100644 --- a/keyboards/vision_division/vision_division.h +++ b/keyboards/vision_division/vision_division.h @@ -3,118 +3,4 @@ #include "quantum.h" -// This a shortcut to help you visually see your layout. -// The following is an example using the Planck MIT layout -// The first section contains all of the arguements -// The second converts the arguments into a two-dimensional array -#define KEYMAP_EXTENDED( \ - k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ - k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ - k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ - k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ - k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ - k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ -) \ -{ \ - { k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C },\ - { k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C },\ - { k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C },\ - { k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C },\ - { k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C },\ - { k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C },\ -} - -#define KEYMAP_LEFT( \ - k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ - k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ - k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ - k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ - k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ - k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ -) \ -{ \ - { k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C },\ - { k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C },\ - { k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C },\ - { k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C },\ - { k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C },\ - { k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C },\ -} - -#define KEYMAP_RIGHT( \ - k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ - k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ - k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ - k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ - k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ - k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ -) \ -{ \ - { k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C },\ - { k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C },\ - { k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C },\ - { k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C },\ - { k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C },\ - { k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C },\ -} - -#ifdef MATRIX_EXTENDED -#define KEYMAP( \ - k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ - k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ - k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ - k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ - k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ - k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ -) \ -KEYMAP_EXTENDED( \ - k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ - k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ - k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ - k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ - k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ - k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ -) -#endif - -#ifdef MATRIX_LEFT -#define KEYMAP( \ - k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ - k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ - k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ - k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ - k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ - k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ -) \ -KEYMAP_LEFT( \ - k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ - k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ - k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ - k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ - k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ - k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ -) -#endif - -#ifdef MATRIX_RIGHT -#define KEYMAP( \ - k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ - k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ - k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ - k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ - k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ - k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ -) \ -KEYMAP_RIGHT( \ - k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \ - k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k110, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C \ - k200, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k210, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C \ - k300, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k310, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C \ - k400, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k410, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C \ - k500, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k510, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C \ -) - -#endif - - #endif diff --git a/quantum/config_common.h b/quantum/config_common.h index 09a4fe701..7ef4b23d4 100644 --- a/quantum/config_common.h +++ b/quantum/config_common.h @@ -45,6 +45,15 @@ #define F5 0xF5 #define F6 0xF6 #define F7 0xF7 +#define A0 0xA0 +#define A1 0xA1 +#define A2 0xA2 +#define A3 0xA3 +#define A4 0xA4 +#define A5 0xA5 +#define A6 0xA6 +#define A7 0xA7 + /* USART configuration */ #ifdef BLUETOOTH_ENABLE From 06c82a063bd668cb0b5b80d455c6fd7384131c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Werner?= Date: Tue, 23 Aug 2016 12:15:29 +0200 Subject: [PATCH 10/20] Fixed wrong keycode in default keymap Where I used KC_MENU I should have used KC_APP instead. --- keyboards/kitten_paw/keymaps/default/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/kitten_paw/keymaps/default/keymap.c b/keyboards/kitten_paw/keymaps/default/keymap.c index f67235745..64aa672d0 100644 --- a/keyboards/kitten_paw/keymaps/default/keymap.c +++ b/keyboards/kitten_paw/keymaps/default/keymap.c @@ -11,7 +11,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, KC_END,KC_PGDN, KC_P7, KC_P8, KC_P9,KC_PPLS, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3,KC_PENT, \ - KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT, KC_P0,KC_PDOT) + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT, KC_P0,KC_PDOT) }; const uint16_t PROGMEM fn_actions[] = { From 6a61c89477678e3df9aba9189b3dd67fc24e94ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Werner?= Date: Tue, 23 Aug 2016 13:20:59 +0200 Subject: [PATCH 11/20] added my personal keymap I ported my keymap from tmk to QMK. --- keyboards/kitten_paw/keymaps/ickerwx/config.h | 31 +++ keyboards/kitten_paw/keymaps/ickerwx/keymap.c | 220 ++++++++++++++++++ 2 files changed, 251 insertions(+) create mode 100644 keyboards/kitten_paw/keymaps/ickerwx/config.h create mode 100644 keyboards/kitten_paw/keymaps/ickerwx/keymap.c diff --git a/keyboards/kitten_paw/keymaps/ickerwx/config.h b/keyboards/kitten_paw/keymaps/ickerwx/config.h new file mode 100644 index 000000000..04a2d253c --- /dev/null +++ b/keyboards/kitten_paw/keymaps/ickerwx/config.h @@ -0,0 +1,31 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#undef MOUSEKEY_MOVE_MAX +#define MOUSEKEY_MOVE_MAX 127 +#undef MOUSEKEY_WHEEL_MAX +#define MOUSEKEY_WHEEL_MAX 110 +#undef MOUSEKEY_MOVE_DELTA +#define MOUSEKEY_MOVE_DELTA 5 +#undef MOUSEKEY_WHEEL_DELTA +#define MOUSEKEY_WHEEL_DELTA 1 +#undef MOUSEKEY_DELAY +#define MOUSEKEY_DELAY 50 +#undef MOUSEKEY_INTERVAL +#define MOUSEKEY_INTERVAL 20 +#undef MOUSEKEY_MAX_SPEED +#define MOUSEKEY_MAX_SPEED 4 +#undef MOUSEKEY_TIME_TO_MAX +#define MOUSEKEY_TIME_TO_MAX 30 +#undef MOUSEKEY_WHEEL_MAX_SPEED +#define MOUSEKEY_WHEEL_MAX_SPEED 3 +#undef MOUSEKEY_WHEEL_TIME_TO_MAX +#define MOUSEKEY_WHEEL_TIME_TO_MAX 1000 +#undef ONESHOT_TIMEOUT +#define ONESHOT_TIMEOUT 500 +#undef TAPPING_TOGGLE +#define TAPPING_TOGGLE 2 + +#endif diff --git a/keyboards/kitten_paw/keymaps/ickerwx/keymap.c b/keyboards/kitten_paw/keymaps/ickerwx/keymap.c new file mode 100644 index 000000000..276fc30a8 --- /dev/null +++ b/keyboards/kitten_paw/keymaps/ickerwx/keymap.c @@ -0,0 +1,220 @@ +#include "kitten_paw.h" +#include "mousekey.h" + +#define _______ KC_TRNS +#define XXXXXXX KC_NO +#define LC LCTL +#define KC_SLCT KC_SELECT + +enum layers { + DEFAULT, + PROG1, + PROG2, + MEDIA, + MOUSE1, + MOUSE2, + MISC, +}; + +enum function_id { + LSHFT_PAREN, + RSHFT_PAREN, + LCTRL_BRACKET, + RCTRL_BRACKET, + LALT_CURLY, + RALT_CURLY, + CTRL_CLICK +}; + +enum macro_id { + GRV, + CFLEX +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [DEFAULT] = KEYMAP(\ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL,KC_BSPC, KC_INS,KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, KC_DEL, KC_END,KC_PGDN, KC_P7, KC_P8, KC_P9,KC_PPLS, \ + F(0), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ + F(8),KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT, KC_SLSH, F(9), KC_UP, KC_P1, KC_P2, KC_P3,KC_PENT, \ + F(1),KC_LGUI, F(3), LT(MISC, KC_SPC), F(4), F(5), LT(MEDIA, KC_APP), F(2), KC_LEFT,KC_DOWN,KC_RGHT, KC_P0,KC_PDOT), + /* Layer 1: Programming Layer 1, emulating US layout */ + [PROG1] = KEYMAP(\ + KC_ESC,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______,_______,_______, \ + M(GRV),_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, KC_SLSH, S(KC_0), _______, _______,_______,_______, _______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______, KC_Z,_______,_______,_______, _______,RALT(KC_8),RALT(KC_9),RALT(KC_MINS), _______,_______,_______, _______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,S(KC_COMM),S(KC_BSLS), _______, _______,_______,_______, \ + MO(PROG2),_______, KC_Y,_______,_______,_______,_______,_______,_______,_______, _______, S(KC_7), MO(PROG2), _______, _______,_______,_______,_______, \ + _______,_______,_______, _______, _______, _______, _______, _______, _______,_______,_______, _______,_______), + /* Layer 2: programming layer 2 + all keys that are not FN keys are sent as LSFT+key on this layer + */ + [PROG2] = KEYMAP(\ + _______, _______, _______,_______,_______,_______, _______,_______, _______,_______, _______, _______, _______, _______,_______,_______, \ +RALT(KC_RBRC), _______,RALT(KC_Q),KC_BSLS,_______,_______,M(CFLEX),S(KC_6),S(KC_RBRC),S(KC_8), S(KC_9), S(KC_SLSH), KC_RBRC, _______, _______,_______,_______, _______,_______,_______,_______, \ + _______, _______, _______,_______,_______,_______, _______,_______, _______,_______, _______, RALT(KC_7),RALT(KC_0),RALT(KC_NUBS), _______,_______,_______, _______,_______,_______,_______, \ + _______, _______, _______,_______,_______,_______, _______,_______, _______,_______, S(KC_DOT), S(KC_2), _______, _______,_______,_______, \ + _______,S(KC_NUBS), _______,_______,_______,_______, _______,_______, _______,KC_NUBS,S(KC_NUBS), S(KC_MINS), _______, _______, _______,_______,_______,_______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______,_______,_______, _______,_______), \ + /* Layer 3: media layer */ + [MEDIA] = KEYMAP(\ + KC_PWR,KC_SLEP,KC_WAKE,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, KC_MPRV,KC_MPLY,KC_MNXT, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, KC_VOLD,KC_MUTE,KC_VOLU, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, KC_EJCT, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,_______,XXXXXXX, KC_MRWD,KC_MSTP,KC_MFFD, XXXXXXX,XXXXXXX), + /* Layer 4: Mouse layer */ + [MOUSE1] = KEYMAP(\ + F(6),XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,KC_BSPC, KC_INS,KC_HOME,KC_PGUP, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,KC_BTN4, KC_WH_D, KC_MS_U, KC_WH_U, XXXXXXX, KC_Y,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, KC_DEL, KC_END,KC_PGDN, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ + F(0),KC_BTN5, KC_MS_L, KC_MS_D, KC_MS_R, F(7),KC_WH_L,KC_WH_D,KC_WH_U, KC_WH_R, XXXXXXX,XXXXXXX, KC_BTN1, XXXXXXX,XXXXXXX,XXXXXXX, \ + MO(MOUSE2),XXXXXXX,LC(KC_Y),LC(KC_X),LC(KC_C),LC(KC_V),XXXXXXX,KC_BTN2,KC_BTN3,LC(KC_PGUP),LC(KC_PGDN),XXXXXXX, KC_RSFT, KC_UP, XXXXXXX,XXXXXXX,XXXXXXX,KC_PENT, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_BTN1, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT, XXXXXXX,XXXXXXX), + /* Layer 5: Mouse layer 2*/ + [MOUSE2] = KEYMAP(\ + _______,_______,_______, _______, _______, _______,_______,_______,_______, _______, _______,_______,_______, _______,_______,_______, \ + _______,_______,_______, _______, _______, _______,_______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______, _______,_______,_______,_______, \ + _______,_______,KC_BTN2, KC_WH_U, KC_BTN3, _______,_______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______, _______,_______,_______,_______, \ + _______,_______,KC_WH_L, KC_WH_D, KC_WH_R, _______,KC_MS_L,KC_MS_D,KC_MS_U, KC_MS_R, _______,_______, _______, _______,_______,_______, \ + _______,_______,_______, _______, _______, _______,_______,_______,_______, _______, _______,_______, _______, _______, _______,_______,_______,_______, \ + _______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______, _______,_______), + /* Layer 6: Misc layer */ + [MISC] = KEYMAP(\ + XXXXXXX, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,KC_SLCT,LC(KC_W), KC_UP, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,KC_BSPC, KC_DEL, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX,KC_HOME,KC_PGDN,KC_PGUP, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, \ + KC_LSFT,XXXXXXX,LC(KC_Y),LC(KC_X),LC(KC_C),LC(KC_V), KC_SPC, KC_END,XXXXXXX,LC(KC_PGUP),LC(KC_PGDN),XXXXXXX, KC_RSFT, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ + KC_LCTL,KC_LGUI, KC_LALT, LT(MISC, KC_SPC), KC_RALT,KC_RGUI, KC_APP,KC_RCTL, XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX), +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_TAP_TOGGLE(MOUSE1), // toggle enable mouse layer (4) + [1] = ACTION_FUNCTION_TAP(LCTRL_BRACKET), // tap to print [ + [2] = ACTION_FUNCTION_TAP(RCTRL_BRACKET), // tap to print ] + [3] = ACTION_FUNCTION_TAP(LALT_CURLY), // tap to print { + [4] = ACTION_FUNCTION_TAP(RALT_CURLY), // tap to print } + [5] = ACTION_LAYER_TAP_TOGGLE(PROG1), // toggle programming layer 1 (1) + [6] = ACTION_LAYER_SET_CLEAR(DEFAULT), + [7] = ACTION_FUNCTION_TAP(CTRL_CLICK), + [8] = ACTION_FUNCTION_TAP(LSHFT_PAREN), // tap to print ( + [9] = ACTION_FUNCTION_TAP(RSHFT_PAREN), // tap to print ) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case GRV: // macro to print accent grave + return (record->event.pressed ? + MACRO( D(LSFT), T(EQL), U(RALT), T(SPC), END) : + MACRO_NONE ); + case CFLEX: // print accent circonflex + return (record->event.pressed ? + MACRO( T(GRV), T(SPC), END ) : + MACRO_NONE ); + } + return MACRO_NONE; +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} + +void tap_helper(keyrecord_t *record, uint16_t orig_mod, uint16_t macro_mod, uint16_t macro_kc ) { + if (record->event.pressed) { + if (record->tap.count > 0 && !record->tap.interrupted) { + if (record->tap.interrupted) { + register_mods(MOD_BIT(orig_mod)); + } + } else { + register_mods(MOD_BIT(orig_mod)); + } + } else { + if (record->tap.count > 0 && !(record->tap.interrupted)) { + add_weak_mods(MOD_BIT(macro_mod)); + send_keyboard_report(); + register_code(macro_kc); + unregister_code(macro_kc); + del_weak_mods(MOD_BIT(macro_mod)); + send_keyboard_report(); + record->tap.count = 0; // ad hoc: cancel tap + } else { + unregister_mods(MOD_BIT(orig_mod)); + } + } +} + +/* if LCTRL is tabbed, print (, or ) if RCTRL is tabbed, same for LALT/RALT and [/] */ +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + // The code is copied from keymap_hasu.c in the tmk keyboards hhkb folder + switch (id) { + case LCTRL_BRACKET: + tap_helper(record, KC_LCTL, KC_RALT, KC_8); + break; + case RCTRL_BRACKET: + tap_helper(record, KC_RCTL, KC_RALT, KC_9); + break; + case LALT_CURLY: + tap_helper(record, KC_LALT, KC_RALT, KC_7); + break; + case RALT_CURLY: + tap_helper(record, KC_RALT, KC_RALT, KC_0); + break; + case LSHFT_PAREN: + tap_helper(record, KC_LSFT, KC_LSFT, KC_8); + break; + case RSHFT_PAREN: + tap_helper(record, KC_RSFT, KC_LSFT, KC_9); + break; + case CTRL_CLICK: + if (record->event.pressed) { + mousekey_clear(); + register_mods(MOD_BIT(KC_LCTL)); + send_keyboard_report(); + wait_ms(5); + mousekey_on(KC_BTN1); + mousekey_send(); + wait_ms(10); + mousekey_off(KC_BTN1); + mousekey_send(); + wait_ms(5); + unregister_mods(MOD_BIT(KC_LCTL)); + send_keyboard_report(); + } + break; + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + uint8_t layer; + layer = biton32(layer_state); + if (layer == PROG2) { + if (keycode >= KC_A && keycode <= KC_EXSEL && \ + !( // do not send LSFT + these keycodes, they are needed for emulating the US layout + keycode == KC_NONUS_BSLASH || + keycode == KC_RBRC || + keycode == KC_BSLS || + keycode == KC_GRV + )) { + if (record->event.pressed) { + register_mods(MOD_LSFT); + } else { + unregister_mods(MOD_LSFT); + } + } + } + return true; +} From 6c2b7f359cfe5122631d8772f8766c08465949c8 Mon Sep 17 00:00:00 2001 From: IBNobody Date: Tue, 23 Aug 2016 20:47:35 -0500 Subject: [PATCH 12/20] Fixed line ending --- tmk_core/rules.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index 86ad90f5d..d2350f27c 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -532,4 +532,4 @@ 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 \ -all-keyboards-defaults-% all-keyboards-% all-keymaps-% \ No newline at end of file +all-keyboards-defaults-% all-keyboards-% all-keymaps-% From a902206735972a15063d8d9852a87041d82d6e7b Mon Sep 17 00:00:00 2001 From: IBNobody Date: Tue, 23 Aug 2016 23:05:35 -0500 Subject: [PATCH 13/20] Nightly Prep for Vision build --- keyboards/atomic/keymaps/pvc/keymap.c | 32 +- keyboards/planck/keymaps/pvc/keymap.c | 20 +- .../vision_division/keymaps/default/Makefile | 4 +- .../vision_division/keymaps/default/config.h | 19 +- .../vision_division/keymaps/default/keymap.c | 632 +++++++++++++++++- 5 files changed, 652 insertions(+), 55 deletions(-) diff --git a/keyboards/atomic/keymaps/pvc/keymap.c b/keyboards/atomic/keymaps/pvc/keymap.c index f16ec8a6e..b02e89d2c 100644 --- a/keyboards/atomic/keymaps/pvc/keymap.c +++ b/keyboards/atomic/keymaps/pvc/keymap.c @@ -154,7 +154,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* UPPER * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. - * | PRINT | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | NUM LK | / | * | | NUM LK | SCR LK | XXXXXX . PAUSE | + * | PRINT | BR TOG | BR SP+ | BR SP- | BR RST | XXXXXX | XXXXXX | NUM LK | / | * | | NUM LK | SCR LK | XXXXXX . PAUSE | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| * | | F1 | F2 | F3 | F4 | | | 7 | 8 | 9 | - | | | | INS | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| @@ -180,9 +180,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| * | | $ | { | [ | ( | % | # | ) | ] | } | @ | | | | INS | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| - * | | ^ | * | + | - | ; | : | _ | ' | " | ` | | XXXXXX . | HOME | + * | | ^ | * | + | - | / | \ | _ | ' | " | ` | | XXXXXX . | HOME | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| - * | | | | & | ! | ~ | / | \ | = | < | > | ? | XXXXXX . | | END | + * | | | | & | ! | ~ | ; | : | = | < | > | ? | XXXXXX . | | END | * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| * | | | | | | | | | | | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' @@ -191,16 +191,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_LOWER] = { // LOWER { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ________________ }, { _______, KC_DLR, KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT, _______, _______, _______, KC_INS }, - { _______, KC_CIRC, KC_ASTR, KC_PPLS, KC_PMNS, KC_SCLN, KC_COLN, KC_UNDS, KC_QUOT, KC_DQT, KC_GRV, _______, ________________, KC_HOME }, - { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SLSH, KC_BSLS, KC_EQL, KC_LT, KC_GT, KC_QUES, ________________, _______, KC_END }, + { _______, KC_CIRC, KC_ASTR, KC_PPLS, KC_PMNS, KC_SLSH, KC_BSLS, KC_UNDS, KC_QUOT, KC_DQT, KC_GRV, _______, ________________, KC_HOME }, + { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SCLN, KC_COLN, KC_EQL, KC_LT, KC_GT, KC_QUES, ________________, _______, KC_END }, { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______ }, }, +/* FUNCTION + * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. + * | NUM LK | | | | | | | | | | | | | XXXXXX . | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | SCR LK | F13 | F14 | F15 | F16 | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| + * | CAP LK | F17 | F18 | F19 | F20 | | | | | | | | XXXXXX . | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| + * | | F21 | F22 | F23 | F24 | | | | | | | XXXXXX . | VOL UP | MUTE | + * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| + * | | | | | | PLAY/PAUSE | | | | | | PTRACK | VOL DN | NTRACK | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + [LAYER_FUNCTION] = { // FUNCTION - { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ________________ }, - { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, _______, KC_PAUS }, - { KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_PSCR }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_VOLU, KC_MUTE }, + { KC_NLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX }, + { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX }, + { KC_CAPS, KC_F17, KC_F18, KC_F19, KC_F20, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX, XXXXXXX }, + { _______, KC_F21, KC_F22, KC_F23, KC_F24, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ________________, KC_VOLU, KC_MUTE }, { _______, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT }, }, diff --git a/keyboards/planck/keymaps/pvc/keymap.c b/keyboards/planck/keymaps/pvc/keymap.c index 2fc5f0da1..0bb7f0def 100644 --- a/keyboards/planck/keymaps/pvc/keymap.c +++ b/keyboards/planck/keymaps/pvc/keymap.c @@ -166,9 +166,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * .-----------------------------------------------------------------------------------------------------------. * | | $ | { | [ | ( | % | # | ) | ] | } | @ | PG UP | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | ^ | * | + | - | ; | : | _ | ' | " | ` | PG DN | + * | | ^ | * | + | - | / | \ | _ | ' | " | ` | PG DN | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | | | & | ! | ~ | / | \ | = | < | > | ? | HOME | + * | | | | & | ! | ~ | ; | : | = | < | > | ? | HOME | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| * | | | | | | | | | | | | END | * '-----------------------------------------------------------------------------------------------------------' @@ -176,27 +176,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_LOWER] = { // LOWER { _______, KC_DLR, KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT, KC_PGUP }, - { _______, KC_CIRC, KC_ASTR, KC_PPLS, KC_PMNS, KC_SCLN, KC_COLN, KC_UNDS, KC_QUOT, KC_DQT, KC_GRV, KC_PGDN }, - { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SLSH, KC_BSLS, KC_EQL, KC_LT, KC_GT, KC_QUES, KC_HOME }, + { _______, KC_CIRC, KC_ASTR, KC_PPLS, KC_PMNS, KC_SLSH, KC_BSLS, KC_UNDS, KC_QUOT, KC_DQT, KC_GRV, KC_PGDN }, + { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SCLN, KC_COLN, KC_EQL, KC_LT, KC_GT, KC_QUES, KC_HOME }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END }, }, /* FUNCTION * .-----------------------------------------------------------------------------------------------------------. - * | NUM LK | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | PAUSE | + * | NUM LK | F13 | F14 | F15 | F16 | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | PAUSE | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | CAP LK | F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | PRINT | + * | CAP LK | F17 | F18 | F19 | F20 | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | PRINT | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | SCR LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MUTE | + * | SCR LK | F21 | F22 | F23 | F24 | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MUTE | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | LCTRL | LWIN | FN | LALT | UPPER | PLAY | PLAY | LOWER | VOL UP | VOL DN | NEXT | PREV | * '-----------------------------------------------------------------------------------------------------------' */ [LAYER_FUNCTION] = { // FUNCTION - { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_PAUS }, - { KC_CAPS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_PSCR }, - { KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE }, + { KC_NLCK, KC_F13, KC_F14, KC_F15, KC_F16, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PAUS }, + { KC_CAPS, KC_F17, KC_F18, KC_F19, KC_F20, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PSCR }, + { KC_SLCK, KC_F21, KC_F22, KC_F23, KC_F24, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE }, { _______, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, KC_VOLU, KC_VOLD, KC_MPRV, KC_MNXT }, }, diff --git a/keyboards/vision_division/keymaps/default/Makefile b/keyboards/vision_division/keymaps/default/Makefile index 43fee2668..393a9e23a 100644 --- a/keyboards/vision_division/keymaps/default/Makefile +++ b/keyboards/vision_division/keymaps/default/Makefile @@ -1,11 +1,11 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) +CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality diff --git a/keyboards/vision_division/keymaps/default/config.h b/keyboards/vision_division/keymaps/default/config.h index c005aa8c5..34eaaff5b 100644 --- a/keyboards/vision_division/keymaps/default/config.h +++ b/keyboards/vision_division/keymaps/default/config.h @@ -22,7 +22,7 @@ #define UNUSED_PINS -#define KEYMAP( \ +/*#define KEYMAP( \ k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C, \ k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C, \ k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C, \ @@ -37,6 +37,23 @@ KEYMAP_MASTER(NUMERIC_MAX_TEENSY, NUMERIC_MAX, \ k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C, \ k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C, \ k601, k602, k603, k604, k605, k606, k607, k608, k609, k60A, k60B, k60C, k611, k612, k613, k614, k615, k616, k617, k618, k619, k61A, k61B, k61C \ +)*/ + +#define KEYMAP( \ + k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, \ + k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, \ + k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, \ + k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, \ + k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, \ + k601, k602, k603, k604, k605, k606, k607, k608, k609, k60A, k611, k612, k613, k614, k615, k616, k617, k618, k619, k61A, k61B \ ) \ +KEYMAP_MASTER(NUMERIC_NORMAL, HOMING_MAX_TEENSY, \ + k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, KC_NO, KC_NO, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, KC_NO, \ + k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, KC_NO, KC_NO, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, KC_NO, \ + k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, KC_NO, KC_NO, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, KC_NO, \ + k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, KC_NO, KC_NO, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, KC_NO, \ + k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, KC_NO, KC_NO, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, KC_NO, \ + k601, k602, k603, k604, k605, k606, k607, k608, k609, k60A, KC_NO, KC_NO, k611, k612, k613, k614, k615, k616, k617, k618, k619, k61A, k61B, KC_NO \ +) #endif \ No newline at end of file diff --git a/keyboards/vision_division/keymaps/default/keymap.c b/keyboards/vision_division/keymaps/default/keymap.c index 3fddee78b..b8cef9c75 100644 --- a/keyboards/vision_division/keymaps/default/keymap.c +++ b/keyboards/vision_division/keymaps/default/keymap.c @@ -1,64 +1,630 @@ #include "vision_division.h" +#include "action_layer.h" +#include "eeconfig.h" +#include "led.h" + +#ifdef AUDIO_ENABLE + #include "audio.h" + #include "song_list.h" +#endif + +#define LAYER_QWERTY 0 +#define LAYER_COLEMAK 1 +#define LAYER_DVORAK 2 +#define LAYER_UPPER 3 +#define LAYER_LOWER 4 +#define LAYER_FUNCTION 5 +#define LAYER_MOUSE 6 +#define LAYER_ADJUST 7 + +#define MACRO_QWERTY 0 +#define MACRO_COLEMAK 1 +#define MACRO_DVORAK 2 +#define MACRO_UPPER 3 +#define MACRO_LOWER 4 +#define MACRO_FUNCTION 5 +#define MACRO_MOUSE 6 +#define MACRO_TIMBRE_1 7 +#define MACRO_TIMBRE_2 8 +#define MACRO_TIMBRE_3 9 +#define MACRO_TIMBRE_4 10 +#define MACRO_TEMPO_U 11 +#define MACRO_TEMPO_D 12 +#define MACRO_TONE_DEFAULT 13 +#define MACRO_MUSIC_TOGGLE 14 +#define MACRO_AUDIO_TOGGLE 16 +#define MACRO_INC_VOICE 18 +#define MACRO_DEC_VOICE 19 +#define MACRO_BACKLIGHT 20 +#define MACRO_BREATH_TOGGLE 21 +#define MACRO_BREATH_SPEED_INC 23 +#define MACRO_BREATH_SPEED_DEC 24 +#define MACRO_BREATH_DEFAULT 25 + +#define M_QWRTY M(MACRO_QWERTY) +#define M_COLMK M(MACRO_COLEMAK) +#define M_DVORK M(MACRO_DVORAK) +#define M_UPPER M(MACRO_UPPER) +#define M_LOWER M(MACRO_LOWER) +#define M_FUNCT M(MACRO_FUNCTION) +#define M_MOUSE M(MACRO_MOUSE) +#define TIMBR_1 M(MACRO_TIMBRE_1) +#define TIMBR_2 M(MACRO_TIMBRE_2) +#define TIMBR_3 M(MACRO_TIMBRE_3) +#define TIMBR_4 M(MACRO_TIMBRE_4) +#define TMPO_UP M(MACRO_TEMPO_U) +#define TMPO_DN M(MACRO_TEMPO_D) +#define TMPO_DF M(MACRO_TONE_DEFAULT) +#define M_BACKL M(MACRO_BACKLIGHT) +#define M_BRTOG M(MACRO_BREATH_TOGGLE) +#define M_BSPDU M(MACRO_BREATH_SPEED_INC) +#define M_BSPDD M(MACRO_BREATH_SPEED_DEC) +#define M_BDFLT M(MACRO_BREATH_DEFAULT) +#define VC_UP M(MACRO_INC_VOICE) +#define VC_DOWN M(MACRO_DEC_VOICE) +#define SC_UNDO LCTL(KC_Z) +#define SC_REDO LCTL(KC_Y) +#define SC_CUT LCTL(KC_X) +#define SC_COPY LCTL(KC_C) +#define SC_PSTE LCTL(KC_V) +#define SC_SELA LCTL(KC_A) +#define SC_SAVE LCTL(KC_S) +#define SC_OPEN LCTL(KC_O) +#define SC_ACLS LALT(KC_F4) +#define SC_CCLS LCTL(KC_F4) + +#define OS_SHFT KC_FN0 + +#define _______ KC_TRNS +#define XXXXXXX KC_NO +#define ________________ _______, _______ +#define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = KEYMAP( \ - KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_A, KC_B, KC_C, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ - KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ - KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_A, KC_B, KC_C, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ - KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ - KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_A, KC_B, KC_C, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ - KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 \ + +KEYMAP( \ + KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \ + KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, KC_TAB, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, KC_BSLS, KC_DEL, KC_END, KC_PGDN, \ + KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_CAPS, KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, \ + KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, KC_LSFT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, XXXXXXX, KC_UP, XXXXXXX, \ + KC_KP_0, KC_KP_0, KC_PDOT, KC_PENT, KC_LCTL, KC_LCTL, XXXXXXX, KC_LALT, KC_LGUI, XXXXXXX, KC_SPC, KC_SPC, XXXXXXX, OS_SHFT, KC_RALT, KC_APP, KC_RCTL, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ ) -/* - KC_VOLU, KC_MUTE, KC_VOLU, KC_F24, KC_F20, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 k119, k11A, k11B, k11C, \ - KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, k219, k21A, k21B, k21C, \ - KC_KP_7, KC_KP_8, KC_KP_9, KC_F23, KC_F19, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, k319, k31A, k31B, k31C, \ - KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_F18, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP, k419, k41A, k41B, k41C, \ - KC_KP_1, KC_KP_2, KC_KP_3, KC_F22, KC_F17, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN, k519, k51A, k51B, k51C. \ - KC_KP_0, KC_F21, KC_PDOT, KC_PENT, KC_F16, KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC, KC_SPC, M_LOWER, OS_SHFT, KC_RALT, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, k619, k61A, k61B, k61C \ - ) //-----, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, -------, +// [LAYER_QWERTY] = { // QWERTY +// { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC }, +// { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, +// { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP }, +// { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN }, +// { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC, KC_SPC, M_LOWER, OS_SHFT, KC_RALT, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, +// }, + + +// /* Numeric Max / Homing Normal - Traditional +// * .-----------------------------------. .-----------------------------------. .-----------------_-----------------. .-----------------------------------. .--------------------------. +// * | | | | | | | | | | | | | | | | | | | | | | | | +// * '-----------------------------------' '-----------------------------------' '-----------------------------------' '-----------------------------------' '--------------------------' +// * .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .--------------------------. +// * | | | | | | ESC | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | | | | | | +// * |--------+--------+--------+--------| | -------+ -------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------| +// * | | | | | | TAB | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | | | | | | +// * |--------+--------+--------+ | o | -------+ -------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| '--------+--------+--------' +// * | | | | | o | CAPS | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | | +// * |--------+--------+--------+--------| o | -------+ -------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---+--------| .--------. +// * | | | | | | LSHIFT | LSHIFT | Z | X | C | V | B | N | M | , | . | / | XXXXXX | | | | +// * |--------+--------+--------+ | | -------+ -------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+--------+--------| .--------+--------+--------. +// * | | | | | LCTRL | LCTRL | LWIN | FN | LALT | UPPER | XXXXXX . SPACE | LOWER | SHIFT | RALT | APP | RCTRL | | | | | | +// * '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '--------------------------' +// */ + + +// /* QWERTY +// * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. +// * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| +// * | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | DEL | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| +// * | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | XXXXXX . ENTER | PG UP | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| +// * | LSHIFT | Z | X | C | V | B | N | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN | +// * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| +// * | LCTRL | LWIN | FN | LALT | UPPER | XXXXXX . SPACE | LOWER | SHIFT | RALT | APP | RCTRL | LEFT | DOWN | RIGHT | +// * '--------------------------------------------------------------------------------------------------------------------------------------' +// */ + +// [LAYER_QWERTY] = { // QWERTY +// { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC }, +// { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, +// { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP }, +// { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN }, +// { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC, KC_SPC, M_LOWER, OS_SHFT, KC_RALT, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, +// }, + +// /* COLEMAK +// * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. +// * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| +// * | TAB | Q | W | F | P | G | J | L | U | Y | ; | [ | ] | \ | DEL | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| +// * | BACKSP | A | R | S | T | D | H | N | E | I | O | ' | XXXXXX . ENTER | PG UP | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| +// * | LSHIFT | Z | X | C | V | B | K | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN | +// * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| +// * | LCTRL | LWIN | FN | LALT | UPPER | XXXXXX . SPACE | LOWER | SHIFT | RALT | APP | RCTRL | LEFT | DOWN | RIGHT | +// * '--------------------------------------------------------------------------------------------------------------------------------------' +// */ + +// [LAYER_COLEMAK] = { // COLEMAK +// { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC }, +// { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, +// { KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP }, +// { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN }, +// { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC, KC_SPC, M_LOWER, OS_SHFT, KC_RALT, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, +// }, + +// /* DVORAK +// * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. +// * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | [ | ] | XXXXXX . BACKSP | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| +// * | TAB | ' | , | . | P | Y | F | G | C | R | L | / | = | \ | DEL | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| +// * | CAPS | A | O | E | U | I | D | H | T | N | S | - | XXXXXX . ENTER | PG UP | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| +// * | LSHIFT | ; | Q | J | K | X | B | M | W | V | Z | XXXXXX . RSHIFT | UP | PG DN | +// * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| +// * | LCTRL | LWIN | FN | LALT | UPPER | XXXXXX . SPACE | LOWER | SHIFT | RALT | APP | RCTRL | LEFT | DOWN | RIGHT | +// * '--------------------------------------------------------------------------------------------------------------------------------------' +// */ + +// [LAYER_DVORAK] = { // DVORAK +// { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_BSPC }, +// { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, KC_DEL }, +// { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_ENT, KC_PGUP }, +// { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN }, +// { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC, KC_SPC, M_LOWER, OS_SHFT, KC_RALT, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, +// }, + +// /* UPPER +// * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. +// * | PRINT | BR TOG | BR SP+ | BR SP- | BR RST | XXXXXX | XXXXXX | NUM LK | / | * | | NUM LK | SCR LK | XXXXXX . PAUSE | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| +// * | | F1 | F2 | F3 | F4 | | | 7 | 8 | 9 | - | | | | INS | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| +// * | CAP LK | F5 | F6 | F7 | F8 | | | 4 | 5 | 6 | + | | XXXXXX . | HOME | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| +// * | | F9 | F10 | F11 | F12 | | | 1 | 2 | 3 | ENTER | XXXXXX . | | END | +// * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| +// * | | | | | | 0 | | RALT | . | ENTER | | | | | +// * '--------------------------------------------------------------------------------------------------------------------------------------' +// */ + +// [LAYER_UPPER] = { // UPPER +// { KC_PSCR, M_BRTOG, M_BSPDU, M_BSPDD, M_BDFLT, XXXXXXX, XXXXXXX, KC_NLCK, KC_PSLS, KC_PAST, XXXXXXX, XXXXXXX, KC_SLCK, KC_PAUS, KC_PAUS }, +// { _______, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______, _______, _______, KC_INS }, +// { KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______, ________________, KC_HOME }, +// { _______, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, ________________, _______, KC_END }, +// { _______, _______, _______, _______, _______, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, _______, _______, _______, _______ }, +// }, + +// /* LOWER +// * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. +// * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX . BACKSP | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| +// * | | $ | { | [ | ( | % | # | ) | ] | } | @ | | | | INS | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| +// * | | ^ | * | + | - | / | \ | _ | ' | " | ` | | XXXXXX . | HOME | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| +// * | | | | & | ! | ~ | ; | : | = | < | > | ? | XXXXXX . | | END | +// * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| +// * | | | | | | | | | | | | | | | +// * '--------------------------------------------------------------------------------------------------------------------------------------' +// */ + +// [LAYER_LOWER] = { // LOWER +// { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ________________ }, +// { _______, KC_DLR, KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT, _______, _______, _______, KC_INS }, +// { _______, KC_CIRC, KC_ASTR, KC_PPLS, KC_PMNS, KC_SLSH, KC_BSLS, KC_UNDS, KC_QUOT, KC_DQT, KC_GRV, _______, ________________, KC_HOME }, +// { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SCLN, KC_COLN, KC_EQL, KC_LT, KC_GT, KC_QUES, ________________, _______, KC_END }, +// { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______ }, +// }, + +// /* FUNCTION +// * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. +// * | NUM LK | | | | | | | | | | | | | XXXXXX . | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| +// * | SCR LK | F13 | F14 | F15 | F16 | | | | | | | | | | | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| +// * | CAP LK | F17 | F18 | F19 | F20 | | | | | | | | XXXXXX . | | +// * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| +// * | | F21 | F22 | F23 | F24 | | | | | | | XXXXXX . | VOL UP | MUTE | +// * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------| +// * | | | | | | PLAY/PAUSE | | | | | | PTRACK | VOL DN | NTRACK | +// * '--------------------------------------------------------------------------------------------------------------------------------------' +// */ + +// [LAYER_FUNCTION] = { // FUNCTION +// { KC_NLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX }, +// { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX }, +// { KC_CAPS, KC_F17, KC_F18, KC_F19, KC_F20, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX, XXXXXXX }, +// { _______, KC_F21, KC_F22, KC_F23, KC_F24, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ________________, KC_VOLU, KC_MUTE }, +// { _______, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT }, +// }, + +// #ifdef MOUSEKEY_ENABLE + +// [LAYER_MOUSE] = { // MOUSE +// { _______, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX }, +// { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX }, +// { XXXXXXX, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX, KC_WH_U }, +// { _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ________________, KC_MS_U, KC_WH_D }, +// { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }, +// }, + +// #endif + +// [LAYER_ADJUST] = { // ADJUST +// { _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, _______, _______, MU_TOG, AU_TOG, ________________ }, +// { _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, +// { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______ }, +// { _______, _______, _______, _______, M_BACKL, RESET, _______, M_MOUSE, _______, _______, _______, ________________, MUV_IN, _______ }, +// { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, MUV_DE, _______ }, +// }, + + +// /* +// [LAYER_EMPTY] = { // LAYER +// { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________ }, +// { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, +// { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______ }, +// { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______, _______ }, +// { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______ }, +// }, +// */ -*/ }; -const uint16_t PROGMEM fn_actions[] = { +#ifdef AUDIO_ENABLE +float tone_my_startup[][2] = SONG(ODE_TO_JOY); +float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY); + +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); + +float tone_audio_on[][2] = SONG(CLOSE_ENCOUNTERS_5_NOTE); +float tone_music_on[][2] = SONG(DOE_A_DEER); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); + +float tone_caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND); +float tone_caps_off[][2] = SONG(CAPS_LOCK_OFF_SOUND); +float tone_numlk_on[][2] = SONG(NUM_LOCK_ON_SOUND); +float tone_numlk_off[][2] = SONG(NUM_LOCK_OFF_SOUND); +float tone_scroll_on[][2] = SONG(SCROLL_LOCK_ON_SOUND); +float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND); + +#endif /* AUDIO_ENABLE */ + +void persistant_default_layer_set(uint16_t default_layer) +{ + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_MODS_ONESHOT(MOD_LSFT), }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } + + // MACRODOWN only works in this function + switch(id) + { + + // case MACRO_BREATH_TOGGLE: + // if (record->event.pressed) + // { + // breathing_toggle(); + // } + // break; + + // case MACRO_BREATH_SPEED_INC: + // if (record->event.pressed) + // { + // breathing_speed_inc(1); + // } + // break; + + // case MACRO_BREATH_SPEED_DEC: + // if (record->event.pressed) + // { + // breathing_speed_dec(1); + // } + // break; + + // case MACRO_BREATH_DEFAULT: + // if (record->event.pressed) + // { + // breathing_defaults(); + // } + // break; + + case MACRO_QWERTY: + if (record->event.pressed) + { + persistant_default_layer_set(1UL<event.pressed) + { + persistant_default_layer_set(1UL<event.pressed) + { + persistant_default_layer_set(1UL<event.pressed) + { + layer_on(LAYER_UPPER); + // breathing_speed_set(2); + // breathing_pulse(); + update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST); + } + else + { + layer_off(LAYER_UPPER); + update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST); + } + break; + + case MACRO_LOWER: + if (record->event.pressed) + { + layer_on(LAYER_LOWER); + // breathing_speed_set(2); + // breathing_pulse(); + update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST); + } + else + { + layer_off(LAYER_LOWER); + update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST); + } + break; + + case MACRO_FUNCTION: + if (record->event.pressed) + { + // breathing_speed_set(3); + // breathing_enable(); + layer_on(LAYER_FUNCTION); + } + else + { + // breathing_speed_set(1); + // breathing_self_disable(); + layer_off(LAYER_FUNCTION); + } + break; + +#ifdef MOUSEKEY_ENABLE + + case MACRO_MOUSE: + if (record->event.pressed) + { + layer_invert(LAYER_MOUSE); + } + break; + +#endif /* MOUSEKEY_ENABLE */ + +#ifdef AUDIO_ENABLE + + case MACRO_TIMBRE_1: + if (record->event.pressed) set_timbre(TIMBRE_12); + break; + + case MACRO_TIMBRE_2: + if (record->event.pressed) set_timbre(TIMBRE_25); + break; + + case MACRO_TIMBRE_3: + if (record->event.pressed) set_timbre(TIMBRE_50); + break; + + case MACRO_TIMBRE_4: + if (record->event.pressed) set_timbre(TIMBRE_75); + break; + + case MACRO_TEMPO_U: + if (record->event.pressed) increase_tempo(10); + break; + + case MACRO_TEMPO_D: + if (record->event.pressed) decrease_tempo(10); + break; + + case MACRO_TONE_DEFAULT: + if (record->event.pressed) + { + set_timbre(TIMBRE_DEFAULT); + set_tempo(TEMPO_DEFAULT); + } + break; + +/* + case MACRO_AUDIO_TOGGLE: + if (record->event.pressed) + { + if (is_audio_on()) + { + audio_off(); + } + else + { + audio_on(); + PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO); + } + } + break; + + case MACRO_MUSIC_TOGGLE: + if (record->event.pressed) + { + if (IS_LAYER_ON(LAYER_MUSIC)) + { + layer_off(LAYER_MUSIC); + stop_all_notes(); + } + else + { + PLAY_NOTE_ARRAY(tone_music_on, false, STACCATO); + layer_on(LAYER_MUSIC); + } + } + break; + case MACRO_INC_VOICE: + if (record->event.pressed) + { + #ifdef AUDIO_ENABLE + voice_iterate(); + PLAY_NOTE_ARRAY(music_scale, false, STACCATO); + #endif + } + break; + + case MACRO_DEC_VOICE: + if (record->event.pressed) + { + #ifdef AUDIO_ENABLE + voice_deiterate(); + PLAY_NOTE_ARRAY(music_scale, false, STACCATO); + #endif + } + break; +*/ + +#endif /* AUDIO_ENABLE */ + +#ifdef BACKLIGHT_ENABLE + case MACRO_BACKLIGHT: + if (record->event.pressed) + { + backlight_step(); + } +#endif + + default: + break; + + } return MACRO_NONE; }; -void matrix_init_user(void) { +#ifdef AUDIO_ENABLE +void matrix_init_user(void) +{ + set_voice(default_voice); + startup_user(); + println("Matrix Init"); } -void matrix_scan_user(void) { +void led_set_user(uint8_t usb_led) +{ + static uint8_t old_usb_led = 0; + _delay_ms(10); // gets rid of tick + + if (!is_playing_notes()) + { + if ((usb_led & (1< Date: Wed, 24 Aug 2016 23:58:59 -0500 Subject: [PATCH 14/20] Added replicaJunction keymap --- .../atreus-replica-base-colemakdh.png | Bin 0 -> 76319 bytes .../replicaJunction/atreus-replica-extend.png | Bin 0 -> 91555 bytes .../atreus-replica-function.png | Bin 0 -> 92516 bytes .../replicaJunction/atreus-replica-game.png | Bin 0 -> 72509 bytes .../replicaJunction/atreus-replica-num.png | Bin 0 -> 73171 bytes .../atreus/keymaps/replicaJunction/config.h | 94 +++++++++++++++ .../atreus/keymaps/replicaJunction/keymap.c | 107 ++++++++++++++++++ .../atreus/keymaps/replicaJunction/readme.md | 57 ++++++++++ 8 files changed, 258 insertions(+) create mode 100644 keyboards/atreus/keymaps/replicaJunction/atreus-replica-base-colemakdh.png create mode 100644 keyboards/atreus/keymaps/replicaJunction/atreus-replica-extend.png create mode 100644 keyboards/atreus/keymaps/replicaJunction/atreus-replica-function.png create mode 100644 keyboards/atreus/keymaps/replicaJunction/atreus-replica-game.png create mode 100644 keyboards/atreus/keymaps/replicaJunction/atreus-replica-num.png create mode 100644 keyboards/atreus/keymaps/replicaJunction/config.h create mode 100644 keyboards/atreus/keymaps/replicaJunction/keymap.c create mode 100644 keyboards/atreus/keymaps/replicaJunction/readme.md diff --git a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-base-colemakdh.png b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-base-colemakdh.png new file mode 100644 index 0000000000000000000000000000000000000000..4640f9f529970fed031da9e838cfbc95a172bdf2 GIT binary patch literal 76319 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�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 literal 0 HcmV?d00001 diff --git a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-extend.png b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-extend.png new file mode 100644 index 0000000000000000000000000000000000000000..08c2e6140cb1594e342bf796c6dcf6fddac6f90c GIT binary patch literal 91555 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 literal 0 HcmV?d00001 diff --git a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-function.png b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-function.png new file mode 100644 index 0000000000000000000000000000000000000000..34ad03decdb6024bdf993a03a77e44d09321d887 GIT binary patch literal 92516 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%0AytmHdgUeV%1ts&F`4>-bE~a@7O% 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 z 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 Z_T|KT2`$y%0DTb)OG#cGRv~K~@IPb$@2&s< literal 0 HcmV?d00001 diff --git a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-game.png b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-game.png new file mode 100644 index 0000000000000000000000000000000000000000..14ae35b54eaacb30f5b43e80b5babc47a3b2a014 GIT binary patch literal 72509 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 literal 0 HcmV?d00001 diff --git a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-num.png b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-num.png new file mode 100644 index 0000000000000000000000000000000000000000..6598acb27b7f815ab068dec204de4b644674ff5e GIT binary patch literal 73171 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∈k%TRU1;Kr50XWtUs3X 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 U(up^cVgWxxeN$Yiu4CAL0hsD`0RR91 literal 0 HcmV?d00001 diff --git a/keyboards/atreus/keymaps/replicaJunction/config.h b/keyboards/atreus/keymaps/replicaJunction/config.h new file mode 100644 index 000000000..437aa662c --- /dev/null +++ b/keyboards/atreus/keymaps/replicaJunction/config.h @@ -0,0 +1,94 @@ +/* +Config file - Atreus QMK with replicaJunction layout + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Technomancy +#define PRODUCT Atreus +#define DESCRIPTION q.m.k. keyboard firmware for Atreus + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 11 + +// Change this to how you wired your keyboard +// COLS: Left to right, ROWS: Top to bottom +#if defined(ATREUS_ASTAR) +# define MATRIX_ROW_PINS { D0, D1, D3, D2 } +# define MATRIX_COL_PINS { D7, C6, B5, B4, E6, D4, B6, F6, F7, D6, B7 } +# define UNUSED_PINS +#elif defined(ATREUS_TEENSY2) +# define MATRIX_ROW_PINS { D0, D1, D2, D3 } +# define MATRIX_COL_PINS { F6, F5, F4, B7, B6, B5, B4, B3, B2, B1, B0 } +# define UNUSED_PINS +#endif + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +//#define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +// Default: 5 +#define DEBOUNCING_DELAY 6 + +// I don't have any locking keys, so I don't need these features + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +//#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +//#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* Prevent modifiers from sticking when switching layers */ +#define PREVENT_STUCK_MODIFIERS + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/atreus/keymaps/replicaJunction/keymap.c b/keyboards/atreus/keymaps/replicaJunction/keymap.c new file mode 100644 index 000000000..52d3677fa --- /dev/null +++ b/keyboards/atreus/keymaps/replicaJunction/keymap.c @@ -0,0 +1,107 @@ +/* + * Keyboard: Atreus + * Keymap: replicaJunction + * Version: 0.3 + * + * This keymap is designed to complement my Ergodox keyboard layout, found in keyboards/ergodox_ez. + * The Atreus keyboard is a 40% board whose design was heavily influenced by the Ergodox. I now + * have both keyboards, so I've designed these layouts in an effort to make switching between the + * two as easy as possible. + * + * Clearly, the Atreus is the limiting factor in this equation, so I've taken heavy advantage of + * function and dual-role keys. + * + * The default key layout in this keymap is Colemak-ModDH. Information on that layout can be found + * here: https://colemakmods.github.io/mod-dh/ + */ + +#include "atreus.h" + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. + +// Note that whatever is set as layer 0 will be the default layer of the keyboard. + +#define _CO 0 // Colemak +#define _QW 1 // QWERTY +#define _GA 2 // Gaming +#define _EX 3 // Extend +#define _NU 4 // Numpad +#define _FN 5 // Function + +// Some quick aliases, just to make it look pretty +#define _______ KC_TRNS +#define KCX_CA LCTL(KC_LALT) +#define KCX_CS LCTL(KC_LSFT) +#define KCX_CSA LCTL(LSFT(KC_LALT)) +#define KCX_LST LSFT(KC_TAB) +#define KX_COPY LCTL(KC_C) +#define KX_CUT LCTL(KC_X) +#define KX_PAST LCTL(KC_V) +#define KX_UNDO LCTL(KC_Z) + +; // This doesn't do anything. It's just for VSCode because its syntax highlighting is weird for the above #define statements. + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_CO] = KEYMAP( + KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, + KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, + SFT_T(KC_Z), KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, SFT_T(KC_SLSH), + KC_ESC, KC_LGUI, KC_TAB, KC_LALT, KC_BSPC, CTL_T(KC_DEL), ALT_T(KC_ENT), LT(_NU, KC_SPC), MO(_EX), KC_MINS, KC_QUOT, KC_EQL +), + +[_QW] = KEYMAP( /* Qwerty */ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, + SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH), + KC_ESC, KC_LGUI, KC_TAB, KC_LALT, KC_BSPC, CTL_T(KC_DEL), ALT_T(KC_ENT), LT(_NU, KC_SPC), MO(_EX), KC_MINS, KC_QUOT, KC_EQL +), + +[_EX] = KEYMAP( /* Extend */ + KC_CAPS, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_DEL, + _______, KC_LGUI, KC_LALT, KC_LCTL, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_BSPC, + _______, KX_CUT, KX_COPY, _______, KX_PAST, _______, KC_TAB, KCX_LST, _______, KC_INSERT, + _______, _______, _______, _______, _______, _______, _______, KC_SPC, _______, _______, _______, KC_PSCR +), + +[_NU] = KEYMAP( /* Numbers and symbols */ + KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_AMPR, KC_SLSH, KC_7, KC_8, KC_9, KC_ASTR, + KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_TILD, KC_PIPE, KC_4, KC_5, KC_6, KC_MINS, + KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_GRV, KC_BSLS, KC_1, KC_2, KC_3, KC_PLUS, + _______, TG(_GA), _______, MO(_FN), _______, _______, _______, _______, KC_0, KC_DOT, KC_EQL, _______ +), + +[_FN] = KEYMAP( /* Functions */ + KC_DEL, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, KC_F7, KC_F8, KC_F9, KC_F10, + KC_BSPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, _______, KC_F4, KC_F5, KC_F6, KC_F11, + _______, KC_VOLU, KC_MUTE, KC_VOLD, KC_MPLY, _______, KC_F1, KC_F2, KC_F3, KC_F12, + _______, _______, _______, _______, KC_MSTP, _______, _______, _______, KC_NO, DF(_CO), DF(_QW), RESET +), + +[_GA] = KEYMAP( /* Gaming */ + _______, _______, _______, _______, _______, _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, + _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, + KC_Z, _______, _______, _______, _______, KC_BTN3, _______, KC_MS_D, _______, _______, + _______, TG(_GA), _______, KC_LSFT, KC_SPC, KC_BSPC, KC_BTN2, KC_BTN1, _______, _______, _______, _______ +)}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/atreus/keymaps/replicaJunction/readme.md b/keyboards/atreus/keymaps/replicaJunction/readme.md new file mode 100644 index 000000000..21af48e8f --- /dev/null +++ b/keyboards/atreus/keymaps/replicaJunction/readme.md @@ -0,0 +1,57 @@ +# replicaJunction - Atreus Layout # + +This layout is designed to make the absolute most out of the Atreus 40% keyboard. + +I was enchanted with the idea of the Atreus keyboard after using my Ergodox for several months. I wanted something of a similar form factor that was easily portable, so I could bring and transport a keyboard to my workplace without much hassle. After building the Atreus keyboard, though, I realized very quickly that the 40% form factor requires a lot more creativity than a full-size keyboard (even one as strangely-shaped as the Ergodox). + +The default Atreus keyboard layout provides all the necessary keys in order to function with the keyboard, but as a programmer, I needed quicker access to just about everything. I noticed that the default layer didn't include any dual-role keys, and so I started on my journey to build my perfect layout for the Atreus. + +I won't claim that this layout is perfect for everyone. It does make several significant changes from the "normal" Atreus layout. In my own use, though, I've found this keyboard turbocharges my Atreus, and gives it the power of a full-size keyboard without the size. + +## Base Layer ## + +![Atreus base layout](atreus-replica-base-colemakdh.png) + +The letters on this layout are arranged in the [Colemak Mod-DH layout](https://colemakmods.github.io/mod-dh/). + +Note that there are four dual-purpose keys: Shift (Backspace), Ctrl (Delete), Alt (Enter), and Space (Number layer). In QMK, these dual-role keys can be made to hold their primary key by double-tapping the key and holding on the second tap. For example, if I wanted to insert a long string of Spaces, I would tap the Space key, then tap it again and hold. A single press and hold would trigger the secondary function of the key instead. + +The secondary Alt on the left bottom row exists to provide a single-hand Alt+Tab shortcut, which would take two rows otherwise. + +## Extend Layer ## + +![Atreus extend layer](atreus-replica-extend.png) + +This layout is designed primarily for keyboard navigation. Arrow keys are easily accessible under the right hand (a welcome change from the original Atreus layout, which places them under the left hand), along with Home/End and PgUp/PgDn. + +Modifiers are also placed under the home row of the left hand. One of the single keyboard actions I use most is Shift+Ctrl+Left/Right to select a whole word; this layer makes those keypresses simple by adding the Ctrl key in an easy-to-reach location. + +For the common Ctrl shortcuts, I also added some hotkeys to this layer over the letter keys they are associated with. This gives the Extend key some extra utility by letting it "feel" like a Ctrl key in some cases. + +The Space key exists to prevent going from this layer directly into the Number layer. Similarly, the Shift key on the left pinky helps make sure that the normal letter (Z) doesn't fire. + +## Number and Symbol Layer ## + +![Atreus number and symbol layer](atreus-replica-num.png) + +This layer provides the only way of accessing number keys on this keyboard, since it's too small for its own number row. Note that even though they are laid out in the number pad fashion, they send the "regular" number keystrokes. Games and programs that specifically use NumPad keys are not supported in this layout at the moment. + +This layer also provides plenty of symbol shortcuts. Most of these can be accessed through other means (like Shift+8 for the asterisk), but having shortcut keys to them makes for one less keypress, which adds up quickly when using these symbols on a regular basis. I've been through many revisions of this concept on my Ergodox as well as the Atreus, and I've finally arrived at this layout as the one that provides the symbols I need most frequently in places I can think to expect them. The Ordinary layout from the Ergodox-EZ keyboard in this repository was a large influence in this design. + +## Function Layer ## + +![Atreus function layer](atreus-replica-function.png) + +Function keys (F1-F12) are on this layer, as well as some more generic "functions" such as media keys. I've also set up a mirror image of the arrows from the Extend layer in case I need to use these with my left hand, but I don't do this very often. + +The reset key is on this layer, as well as a toggle from Colemak to QWERTY and back. The QWERTY layer is not currently documented, but it is functionally identical to the base layer except for letter positions. + +## Gaming Layer ## + +![Atreus gaming layer](atreus-replica-game.png) + +This is a small layer developed to allow some simple gameplay without a mouse. This layer is a toggle (from the Number layer), so it is designed to stay on while in use. + +The keys on the left hand bring Space into the left thumb's reach, as well as overriding the dual-role Shift with its standard function (Z in both QWERTY and in Colemak). This allows easy Shift presses without blocking the Z key, commonly used in games. + +I would probably not consider this a hard-core gaming keyboard, and this layout does have the huge problem of blocking access to the number keys, but for more casual games, it plays quite well. I've used it quite a bit on Minecraft, for example, and I'm quite pleased with it. \ No newline at end of file From 936a26d04ffa12801031c058f27e221174e3fabd Mon Sep 17 00:00:00 2001 From: IBNobody Date: Thu, 25 Aug 2016 00:15:41 -0500 Subject: [PATCH 15/20] Added pin support for A0-A7 Vision Division - It works! --- keyboards/vision_division/config.h | 2 +- .../vision_division/keymaps/default/Makefile | 2 +- .../vision_division/keymaps/default/config.h | 6 +++--- quantum/config_common.h | 16 ++++++++-------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/keyboards/vision_division/config.h b/keyboards/vision_division/config.h index 37b834973..f50378ffa 100644 --- a/keyboards/vision_division/config.h +++ b/keyboards/vision_division/config.h @@ -24,7 +24,7 @@ along with this program. If not, see . /* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW +#define DIODE_DIRECTION ROW2COL // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING diff --git a/keyboards/vision_division/keymaps/default/Makefile b/keyboards/vision_division/keymaps/default/Makefile index 393a9e23a..ecbe7e1ab 100644 --- a/keyboards/vision_division/keymaps/default/Makefile +++ b/keyboards/vision_division/keymaps/default/Makefile @@ -10,7 +10,7 @@ COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 +AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. diff --git a/keyboards/vision_division/keymaps/default/config.h b/keyboards/vision_division/keymaps/default/config.h index 34eaaff5b..16740fb15 100644 --- a/keyboards/vision_division/keymaps/default/config.h +++ b/keyboards/vision_division/keymaps/default/config.h @@ -7,7 +7,7 @@ /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED -#define PRODUCT_ID GET_PID(NUMERIC_MAX_TEENSY, NUMERIC_MAX) +#define PRODUCT_ID GET_PID(NUMERIC_NORMAL, HOMING_MAX_TEENSY) #define DEVICE_VER 0x0001 #define MANUFACTURER IBNobody #define PRODUCT Vision Division @@ -17,8 +17,8 @@ #define MATRIX_ROWS 6 #define MATRIX_ROW_PINS { C2, C3, F4, F5, F6, F7 } -#define MATRIX_COLS GET_MATRIX_COLS(NUMERIC_MAX_TEENSY, NUMERIC_MAX) -#define MATRIX_COL_PINS GET_MATRIX_COL_PINS(NUMERIC_MAX_TEENSY, NUMERIC_MAX) +#define MATRIX_COLS GET_MATRIX_COLS(NUMERIC_NORMAL, HOMING_MAX_TEENSY) +#define MATRIX_COL_PINS GET_MATRIX_COL_PINS(NUMERIC_NORMAL, HOMING_MAX_TEENSY) #define UNUSED_PINS diff --git a/quantum/config_common.h b/quantum/config_common.h index 7ef4b23d4..8ed5f4a10 100644 --- a/quantum/config_common.h +++ b/quantum/config_common.h @@ -45,14 +45,14 @@ #define F5 0xF5 #define F6 0xF6 #define F7 0xF7 -#define A0 0xA0 -#define A1 0xA1 -#define A2 0xA2 -#define A3 0xA3 -#define A4 0xA4 -#define A5 0xA5 -#define A6 0xA6 -#define A7 0xA7 +#define A0 0x00 +#define A1 0x01 +#define A2 0x02 +#define A3 0x03 +#define A4 0x04 +#define A5 0x05 +#define A6 0x06 +#define A7 0x07 /* USART configuration */ From 601feed87e3ab303fbc7b5987dd6d451b6fa3453 Mon Sep 17 00:00:00 2001 From: JeeBak Kim Date: Tue, 23 Aug 2016 20:08:06 -0700 Subject: [PATCH 16/20] [jd45] Add "jeebak" keymap folder as a copy of the "default" folder --- keyboards/jd45/keymaps/jeebak/keymap.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 keyboards/jd45/keymaps/jeebak/keymap.c diff --git a/keyboards/jd45/keymaps/jeebak/keymap.c b/keyboards/jd45/keymaps/jeebak/keymap.c new file mode 100644 index 000000000..95abb1505 --- /dev/null +++ b/keyboards/jd45/keymaps/jeebak/keymap.c @@ -0,0 +1,17 @@ +#include "jd45.h" + +/* this keymap is to provide a basic keyboard layout for testing the matrix + * for more practical and complicated keymap refer to other keymaps in the same folder + */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( + ESC, Q, W, E, R, T, Y, U, I, O, P, QUOT, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, ENT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, + PAUSE, LCTL, LALT, DEL, SPC, DEL, LEFT, UP, DOWN, RIGHT ), +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; From 9c0c8c307d36aa7a1909718e5da58a0eb8fcedb6 Mon Sep 17 00:00:00 2001 From: JeeBak Kim Date: Tue, 23 Aug 2016 20:56:19 -0700 Subject: [PATCH 17/20] [jd45] Port jeebak's planck keymap to jd45 --- keyboards/jd45/keymaps/jeebak/config.h | 16 + keyboards/jd45/keymaps/jeebak/keymap.c | 424 +++++++++++++++++++++++- keyboards/jd45/keymaps/jeebak/readme.md | 129 +++++++ 3 files changed, 560 insertions(+), 9 deletions(-) create mode 100644 keyboards/jd45/keymaps/jeebak/config.h create mode 100644 keyboards/jd45/keymaps/jeebak/readme.md diff --git a/keyboards/jd45/keymaps/jeebak/config.h b/keyboards/jd45/keymaps/jeebak/config.h new file mode 100644 index 000000000..53a1f0a30 --- /dev/null +++ b/keyboards/jd45/keymaps/jeebak/config.h @@ -0,0 +1,16 @@ +#include "../../config.h" + +/** + *JD45 keymap definition macro + */ +#define KEYMAP_JD45( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ + K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ + K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ + K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ +) { \ + { K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13 }, \ + { K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, KC_NO }, \ + { K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, KC_NO }, \ + { K38, K39, K40, K41, K42, KC_NO, K43, KC_NO, K44, K45, K46, K47, KC_NO } \ +} diff --git a/keyboards/jd45/keymaps/jeebak/keymap.c b/keyboards/jd45/keymaps/jeebak/keymap.c index 95abb1505..ac3e010a9 100644 --- a/keyboards/jd45/keymaps/jeebak/keymap.c +++ b/keyboards/jd45/keymaps/jeebak/keymap.c @@ -1,17 +1,423 @@ #include "jd45.h" -/* this keymap is to provide a basic keyboard layout for testing the matrix - * for more practical and complicated keymap refer to other keymaps in the same folder +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _PLOVER 5 +#define _TOUCHCURSOR 6 +#define _MOUSECURSOR 7 +#define _ADJUST 16 + +// Keycodes +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + PLOVER, + LOWER, + RAISE, + BACKLIT, + EXT_PLV +}; + +enum macro_keycodes { + KC_ALT_TAB, + KC_CMD_TAB, + KC_CTL_TAB, + KC_CMD_SLSH, + KC_AG_FIND, + KC_AG_AGAIN, + KC_AG_UNDO, + KC_AG_CUT, + KC_AG_COPY, + KC_AG_PASTE, + KC_AG_DESK_L, + KC_AG_DESK_R, + KC_AG_TAB_C, + KC_AG_TAB_N, + KC_AG_TAB_R, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Custom macros +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper +#define GUI_SEM GUI_T(KC_SCLN) // Tap for Semicolon, hold for GUI +#define ALT_QUO ALT_T(KC_QUOT) // Tap for Quote, hold for Alt +// Requires KC_TRNS/_______ for the trigger key in the destination layer +#define LT_TC LT(_TOUCHCURSOR, KC_SPC) // L-ayer T-ap T-ouch C-ursor +#define LT_MC(kc) LT(_MOUSECURSOR, kc) // L-ayer T-ap M-ouse C-ursor +#define ALT_TAB M(KC_ALT_TAB) // Macro for Alt-Tab +#define CMD_TAB M(KC_CMD_TAB) // Macro for Cmd-Tab +#define CTL_TAB M(KC_CTL_TAB) // Macro for Ctl-Tab +#define CMD_SLSH M(KC_CMD_SLSH) // Macro for Cmd-Slash (personal shortcut to toggle iTerm2 visibility) +#define AG_FIND M(KC_AG_FIND) // Macros for Cmd-[x] vs Ctrl-[x] based on current AG_NORM or AG_SWAP settings +#define AG_AGAIN M(KC_AG_AGAIN) +#define AG_UNDO M(KC_AG_UNDO) +#define AG_CUT M(KC_AG_CUT) +#define AG_COPY M(KC_AG_COPY) +#define AG_PASTE M(KC_AG_PASTE) +#define AG_D_L M(KC_AG_DESK_L) // For Virtual Desktop Switching: Left, and +#define AG_D_R M(KC_AG_DESK_R) // Right +#define AG_T_C M(KC_AG_TAB_C) // For Chrome, etc. Tab Close, +#define AG_T_N M(KC_AG_TAB_N) // Tab New, and +#define AG_T_R M(KC_AG_TAB_R) // Tab Reopen Closed + +/* Qwerty + * + * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + * |Hyper/Tab| Q | W | E | R | T | Y | U | I | O | P | [ | Bksp | + * |---------`------`------`------`------`------`------`------`------`------`------`------`------| + * | Ctrl/Esc | A | S | MC/D | F | G | H | J | K | L |GUI/; | Alt/" | + * |----------`------`------`------`------`------`------`------`------`------`------`------------| + * | Shift | Z | X | C | V | B | N | M | , | . | / | Sft/Ent | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + * | RGUI | Alt | GUI | Lower | TC/Space | TC/Space | Raise | Vol- | Vol+ | Play | + * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP( - ESC, Q, W, E, R, T, Y, U, I, O, P, QUOT, BSPC, - TAB, A, S, D, F, G, H, J, K, L, SCLN, ENT, - LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, - PAUSE, LCTL, LALT, DEL, SPC, DEL, LEFT, UP, DOWN, RIGHT ), +[_QWERTY] = KEYMAP_JD45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ + HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_BSPC, +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ + CTL_ESC , KC_A, KC_S,LT_MC(KC_D), KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, GUI_SEM, ALT_QUO , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + KC_RGUI , KC_LALT , KC_LGUI , LOWER , LT_TC , LT_TC , RAISE , KC_VOLD , KC_VOLU , KC_MPLY), +/*`----------+-----------+-----------+-----------+----^^^----+----^^^----+-----------+-----------+-----------+--------'*/ + +/* Colemak + * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + * |Hyper/Tab| Q | W | F | P | G | J | L | U | Y | ; | [ | Bksp | + * |---------`------`------`------`------`------`------`------`------`------`------`------`------| + * | Ctrl/Esc | A | R | MC/S | T | D | H | N | E | I | O | " | + * |----------`------`------`------`------`------`------`------`------`------`------`------------| + * | Shift | Z | X | C | V | B | K | M | , | . | / | Sft/Ent | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + * | RGUI | Alt | GUI | Lower | TC/Space | TC/Space | Raise | Vol- | Vol+ | Play | + * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' + */ +[_COLEMAK] = KEYMAP_JD45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ + HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_BSPC, +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ + CTL_ESC , KC_A, KC_R,LT_MC(KC_S), KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + KC_RGUI , KC_LALT , KC_LGUI , LOWER , LT_TC , LT_TC , RAISE , KC_VOLD , KC_VOLU , KC_MPLY), +/*`----------+-----------+-----------+-----------+----^^^----+----^^^----+-----------+-----------+-----------+--------'*/ + +/* Dvorak + * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + * |Hyper/Tab| " | , | . | P | Y | F | G | C | R | L | / | Bksp | + * |---------`------`------`------`------`------`------`------`------`------`------`------`------| + * | Ctrl/Esc | A | O | MC/E | U | I | D | H | T | N | S | / | + * |----------`------`------`------`------`------`------`------`------`------`------`------------| + * | Shift | ; | Q | J | K | X | B | M | W | V | Z | Sft/Ent | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + * | RGUI | Alt | GUI | Lower | TC/Space | TC/Space | Raise | Vol- | Vol+ | Play | + * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' + */ +[_DVORAK] = KEYMAP_JD45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ + HPR_TAB,KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_BSPC, +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ + CTL_ESC , KC_A, KC_O,LT_MC(KC_E), KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + KC_LSFT , KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + KC_RGUI , KC_LALT , KC_LGUI , LOWER , LT_TC , LT_TC , RAISE , KC_VOLD , KC_VOLU , KC_MPLY), +/*`----------+-----------+-----------+-----------+----^^^----+----^^^----+-----------+-----------+-----------+--------'*/ + +/* Lower + * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | Bksp | + * |---------`------`------`------`------`------`------`------`------`------`------`------`------| + * | [ | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | "|" | + * |----------`------`------`------`------`------`------`------`------`------`------`------------| + * | ] | F7 | F8 | F9 | F10 | F11 | F12 | - | = | [ | ] | \ | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + * | Brite | | | | | | | Prev | Next | Mute | + * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' + */ +[_LOWER] = KEYMAP_JD45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ + KC_TILD,KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, KC_BSPC, +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ + KC_LBRC , KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + KC_RBRC , KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + BACKLIT , _______, _______, _______, _______ , _______ , _______, KC_MPRV, KC_MNXT, KC_MUTE), +/*`----------+-----------+-----------+-----------+----^^^----+----^^^----+-----------+-----------+-----------+--------'*/ + +/* Raise + * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | Bksp | + * |---------`------`------`------`------`------`------`------`------`------`------`------`------| + * | $ | 4 | 5 | 6 | . | + | . | 4 | 5 | 6 | * | "|" | + * |----------`------`------`------`------`------`------`------`------`------`------`------------| + * | = | 7 | 8 | 9 | 0 | - | . | 1 | 2 | 3 | / | \ | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + * | Brite | | | | | | | Prev | Next | Mute | + * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' + */ +[_RAISE] = KEYMAP_JD45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ + KC_0 , KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, KC_BSPC, +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ + KC_DLR , KC_4, KC_5, KC_6, KC_DOT, KC_PLUS, KC_DOT, KC_4, KC_5, KC_6, KC_ASTR, KC_PIPE , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + KC_EQL , KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_DOT, KC_1, KC_2, KC_3, KC_SLSH, KC_BSLS , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + BACKLIT , _______, _______, _______, _______ , _______ , _______, KC_MPRV, KC_MNXT, KC_MUTE), +/*`----------+-----------+-----------+-----------+----^^^----+----^^^----+-----------+-----------+-----------+--------'*/ + +/* TouchCursor layer (http://martin-stone.github.io/touchcursor/) plus personal customizations + * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + * | AltTab |CmdTab|CtlTab| GUI |Shift | ~ |Insert| Home | Up | End | Bksp | | | + * |---------`------`------`------`------`------`------`------`------`------`------`------`------| + * | | Alt |Space |Tab_C | Find |Again | PgUp | Left | Down |Right |Desk_L| Desk_R | + * |----------`------`------`------`------`------`------`------`------`------`------`------------| + * | | Undo | Cut | Copy |Paste | ` | PgDn | Del |Tab_N |Tab_R |iTerm2| | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + * | | | | | | | | | | | + * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' + * + * The KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, KC_FIND, and KC_AGAIN keycodes don't + * seem to work on Mac. Presumably they'll work under Windows. + */ + +[_TOUCHCURSOR] = KEYMAP_JD45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ + ALT_TAB,CMD_TAB, CTL_TAB, KC_LGUI, KC_LSFT, KC_TILD, KC_INS, KC_HOME, KC_UP, KC_END, KC_BSPC, _______, _______, +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ + _______ ,KC_LALT, KC_SPC, AG_T_C, AG_FIND,AG_AGAIN, KC_PGUP, KC_LEFT, KC_DOWN, KC_RGHT, AG_D_L, AG_D_R , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + _______ ,AG_UNDO, AG_CUT, AG_COPY,AG_PASTE, KC_GRV, KC_PGDN, KC_DEL, AG_T_N, AG_T_R,CMD_SLSH, _______ , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + _______ , _______, _______, _______, _______ , _______ , _______, _______, _______, _______), +/*`----------+-----------+-----------+-----------+----^^^----+----^^^----+-----------+-----------+-----------+--------'*/ + +/* Mouse Layer + * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + * | | |ACCL0 | | | | |WHL_L | Up |WHL_R | BTN2 | | | + * |---------`------`------`------`------`------`------`------`------`------`------`------`------| + * | |ACCL2 | BTN2 | | BTN1 |ACCL1 |WHL_Up| Left | Down |Right | BTN4 | BTN5 | + * |----------`------`------`------`------`------`------`------`------`------`------`------------| + * | | | | | BTN3 | |WHL_Dn| BTN1 | | | BTN3 | | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + * | | | | | | | | | | | + * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' + */ + +[_MOUSECURSOR] = KEYMAP_JD45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ + _______,_______, KC_ACL0, _______, _______, _______, _______, KC_WH_L, KC_MS_U, KC_WH_R, KC_BTN2, _______, _______, +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ + _______ ,KC_ACL2, KC_BTN2, _______, KC_BTN1, KC_ACL1, KC_WH_U, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN4, KC_BTN5 , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + _______ ,_______, _______, _______, KC_BTN3, _______, KC_WH_D, KC_BTN1, _______, _______, KC_BTN3, _______ , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______), +/*`----------+-----------+-----------+-----------+----^^^----+----^^^----+-----------+-----------+-----------+--------'*/ + +/* Plover layer (http://opensteno.org) + * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + * | # | # | # | # | # | # | # | # | # | # | # | # | # | + * |---------`------`------`------`------`------`------`------`------`------`------`------`------| + * | | S | T | P | H | * | * | F | P | L | T | D | + * |----------`------`------`------`------`------`------`------`------`------`------`------------| + * | TogOut | S | K | W | R | * | * | R | B | G | S | Z | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + * | Exit | | A | O | | | E | U | | | + * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' + */ + +[_PLOVER] = KEYMAP_JD45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ + KC_1 , KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 , +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ + XXXXXXX , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + XXXXXXX , KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + EXT_PLV , XXXXXXX, KC_C, KC_V, XXXXXXX , XXXXXXX , KC_N, KC_M, XXXXXXX, XXXXXXX), +/*`----------+-----------+-----------+-----------+----^^^----+----^^^----+-----------+-----------+-----------+--------'*/ + +/* Adjust (Lower + Raise) + * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + * | | | | | | | | | | | | | Del | + * |---------`------`------`------`------`------`------`------`------`------`------`------`------| + * | | | | | |AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * |----------`------`------`------`------`------`------`------`------`------`------`------------| + * | | | | | | | | | | | | | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + * | | | | | | | | | | Reset | + * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' + */ +[_ADJUST] = KEYMAP_JD45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ + _______,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL , +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ + _______ ,_______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______ , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + _______ ,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + _______ , _______, _______, _______, _______ , _______ , _______, _______, _______, RESET) +/*`----------+-----------+-----------+-----------+----^^^----+----^^^----+-----------+-----------+-----------+--------'*/ }; -const uint16_t PROGMEM fn_actions[] = { +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} -}; +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + case PLOVER: + if (record->event.pressed) { + layer_off(_RAISE); + layer_off(_LOWER); + layer_off(_ADJUST); + layer_on(_PLOVER); + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + } + return false; + break; + case EXT_PLV: + if (record->event.pressed) { + layer_off(_PLOVER); + } + return false; + break; + } + return true; +} + +/* + * Macro definition + */ +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + + bool use_cmd = true; // Use, for example, Cmd-Tab, Cmd-C, Cmd-V, etc. + // Compare to MAGIC_SWAP_ALT_GUI and MAGIC_UNSWAP_ALT_GUI configs, set in: + // quantum/quantum.c + if(keymap_config.swap_lalt_lgui == 1 && keymap_config.swap_ralt_rgui == 1) { + use_cmd = false; // ... or, Alt-Tab, Ctrl-C, Ctrl-V, etc. + } + + switch (id) { + case KC_ALT_TAB: + if(use_cmd) { return (record->event.pressed ? MACRO( D(LALT), D(TAB), END ) : MACRO( U(TAB), END )); } + else { return (record->event.pressed ? MACRO( D(LGUI), D(TAB), END ) : MACRO( U(TAB), END )); } + case KC_CMD_TAB: + if(use_cmd) { return (record->event.pressed ? MACRO( D(LGUI), D(TAB), END ) : MACRO( U(TAB), END )); } + else { return (record->event.pressed ? MACRO( D(LALT), D(TAB), END ) : MACRO( U(TAB), END )); } + + case KC_CTL_TAB: + return (record->event.pressed ? MACRO( D(LCTRL), D(TAB), END ) : MACRO( U(TAB), END )); + case KC_CMD_SLSH: + return (record->event.pressed ? MACRO( D(LGUI), D(SLSH),END ) : MACRO( U(SLSH),END )); + + case KC_AG_FIND: + return use_cmd ? MACRODOWN( D(LGUI), T(F), END ) : MACRODOWN( D(LCTRL), T(F), END ); + case KC_AG_AGAIN: + return use_cmd ? MACRODOWN( D(LGUI), T(G), END ) : MACRODOWN( D(LCTRL), T(G), END ); + case KC_AG_UNDO: + return use_cmd ? MACRODOWN( D(LGUI), T(Z), END ) : MACRODOWN( D(LCTRL), T(Z), END ); + case KC_AG_CUT: + return use_cmd ? MACRODOWN( D(LGUI), T(X), END ) : MACRODOWN( D(LCTRL), T(X), END ); + case KC_AG_COPY: + return use_cmd ? MACRODOWN( D(LGUI), T(C), END ) : MACRODOWN( D(LCTRL), T(C), END ); + case KC_AG_PASTE: + return use_cmd ? MACRODOWN( D(LGUI), T(V), END ) : MACRODOWN( D(LCTRL), T(V), END ); + + case KC_AG_DESK_L: + return use_cmd ? MACRODOWN( D(LGUI), D(LCTRL), T(SCLN), END ) : MACRODOWN( D(LALT), D(LCTRL), T(SCLN), END ); + case KC_AG_DESK_R: + return use_cmd ? MACRODOWN( D(LGUI), D(LCTRL), T(QUOT), END ) : MACRODOWN( D(LALT), D(LCTRL), T(QUOT), END ); + + case KC_AG_TAB_C: + return use_cmd ? MACRODOWN( D(LGUI), T(W), END ) : MACRODOWN( D(LCTRL), T(W), END ); + case KC_AG_TAB_N: + return use_cmd ? MACRODOWN( D(LGUI), T(T), END ) : MACRODOWN( D(LCTRL), T(T), END ); + case KC_AG_TAB_R: + return use_cmd ? MACRODOWN( D(LGUI), D(LSHIFT), T(T), END ) : MACRODOWN( D(LCTRL), D(LSHIFT), T(T), END ); + } + + return MACRO_NONE; +} diff --git a/keyboards/jd45/keymaps/jeebak/readme.md b/keyboards/jd45/keymaps/jeebak/readme.md new file mode 100644 index 000000000..2e45a46d9 --- /dev/null +++ b/keyboards/jd45/keymaps/jeebak/readme.md @@ -0,0 +1,129 @@ +jeebak's JD45 layout +======================= +NOTE: This is a port of jeebak's planck layout, for jd45. + +This WIP keymap attempts to minimize fingers straying away from the home row. +To aid in this endeavor, when additional modifyer keys to switch layers are +needed, they will be mapped to home row keys. The `keymap.c` file will contain +the exact changes. The diagrams in this README shows the highlights of the +changes from the default mappings. + +I also decided to change all calls to `persistant_default_layer_set()` to +`default_layer_set()` since this is my personal perference. + +## Macros +``` +#define ALT_TAB M(KC_ALT_TAB) +``` + +## Base Layers (Qwerty/Colemak/Dvorak) +These base layers are mostly the same as the default mappings. The interesting +changes are shown below. + +- The `Ctrl/Esc`, will emit an `Escape` when tapped, and act as a `Control` key when held, +- `GUI/;` as `;` and `GUI`, +- `Alt/"` as `"` and `Alt`, +- `Sft/Ent` as `Enter` and `Shift`, and +- `Hyper/Tab` as `Tab` and `Hyper` + +A `TODO` item is to see if it can also act as a `CapsLock` when double-tapped. +The arrow keys, which have been moved to the +[TouchCursor](http://martin-stone.github.io/touchcursor/) layer, have been +replaced with the Media keys as shown. The `MC/kc` key activates the +`MouseCursor` layer when held, and emits the corresponding `kc` for its layer, +when tapped. +``` + ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + |Hyper/Tab| Q | W | E | R | T | Y | U | I | O | P | [ | Bksp | + |---------`------`------`------`------`------`------`------`------`------`------`------`------| + | Ctrl/Esc | A | S | MC/D | F | G | H | J | K | L |GUI/; | Alt/" | + |----------`------`------`------`------`------`------`------`------`------`------`------------| + | Shift | Z | X | C | V | B | N | M | , | . | / | Sft/Ent | + |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + | RGUI | Alt | GUI | Lower | TC/Space | TC/Space | Raise | Vol- | Vol+ | Play | + `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' +``` + +## Lower Layer (Symbols and Function Keys) +The symbols and functions keys are essentially the same as the default mapping. +The most notable changes are that the symbol keys from the `RAISE` layer have +been moved here. The remaining Media keys replace those that are now on the +base layers. The `BACKLIT` key has also been moved here. +``` + ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | Bksp | + |---------`------`------`------`------`------`------`------`------`------`------`------`------| + | [ | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | "|" | + |----------`------`------`------`------`------`------`------`------`------`------`------------| + | ] | F7 | F8 | F9 | F10 | F11 | F12 | - | = | [ | ] | \ | + |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + | Brite | | | | | | | Prev | Next | Mute | + `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' +``` + +## Raise Layer (Numbers and Arithmetic Operators) +All of the numbers and arithmetic operators are available on this layer. Some +keys are duplicated for the convenience of their positions. The `0` and `$` +keys at the far left are for quick access to beginning and end of line in vim. +``` + ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | Bksp | + |---------`------`------`------`------`------`------`------`------`------`------`------`------| + | $ | 4 | 5 | 6 | . | + | . | 4 | 5 | 6 | * | "|" | + |----------`------`------`------`------`------`------`------`------`------`------`------------| + | = | 7 | 8 | 9 | 0 | - | . | 1 | 2 | 3 | / | \ | + |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + | Brite | | | | | | | Prev | Next | Mute | + `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' +``` + +## TouchCursor layer plus personal customizations +[TouchCursor](http://martin-stone.github.io/touchcursor/) uses the `Space` key +as the modifier, with the `IJKL` home row keys representing the inverted-T of +the arrow keys. All of the default TouchCursor keymappings for the right hand +are represented below. My personalizations include all of the keys shown for +the left hand. Having the `Alt` and `Shift` keys (as well as the `Control` key +from the base layers) readily accessible from the home row allows quick word +jumps and highlighting when used in conjunction with the arrow keys. The +`Alt-Tab` macro is not only useful under Windows, but also under Mac when used +with alternative switchers like [HyperSwitch](https://bahoom.com/hyperswitch). +The `Cmd-Tab` and `Ctrl-Tab` sequences are duplicated for easy access while in +this layer. The `KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, KC_FIND,` and `KC_AGAIN` +keycodes do not seem to work. There are macros in place that'll "automatically" +choose the correct version (`Cmd-Tab` vs. `Alt-Tab`, `Cmd-C` vs. `Ctrl-C`, +etc.) depending on which layout you've currently selected (`AG_NORM` or +`AG_SWAP`) in the `_ADJUST` layer. The `Desk_L` and `Desk_R` macros are what I +use to switch between Virtual Desktops Left/Right. The `Tab_C`, `Tab_N` and +`Tab_R` are for "Close Tab," "New Tab" and "Reopen Closed Tab" for apps such as +Google Chrome. +``` + ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + | AltTab |CmdTab|CtlTab| GUI |Shift | ~ |Insert| Home | Up | End | Bksp | | | + |---------`------`------`------`------`------`------`------`------`------`------`------`------| + | | Alt |Space |Tab_C | Find |Again | PgUp | Left | Down |Right |Desk_L| Desk_R | + |----------`------`------`------`------`------`------`------`------`------`------`------------| + | | Undo | Cut | Copy |Paste | ` | PgDn | Del |Tab_N |Tab_R |iTerm2| | + |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + | | | | | | | | | | | + `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' +``` + +## Mouse Layer +The Mouse layer, closely mimics the layout/behaviour of the TouchCursor layer. +The `D` key (on QWERTY) is used to activate this layer. All 16 keycodes for the +mouse from the `doc/keycode.txt` file are represented, and logically located, +IMHO. The left and right click buttons are duplicated; on the right hand side, +for a quick click here and there, and again on the left hand side for when the +buttons need to be held for dragging things or highlighting text, thus allowing +the right hand to be free to use the up/down/left/right actions. +``` + ,---------+------+------+------+------+------+------+------+------+------+------+------+------. + | | |ACCL0 | | | | |WHL_L | Up |WHL_R | BTN2 | | | + |---------`------`------`------`------`------`------`------`------`------`------`------`------| + | |ACCL2 | BTN2 | | BTN1 |ACCL1 |WHL_Up| Left | Down |Right | BTN4 | BTN5 | + |----------`------`------`------`------`------`------`------`------`------`------`------------| + | | | | | BTN3 | |WHL_Dn| BTN1 | | | BTN3 | | + |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------| + | | | | | | | | | | | + `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' +``` From 94597a27c5d138eb269d864c57e2de89207f7f91 Mon Sep 17 00:00:00 2001 From: JeeBak Kim Date: Thu, 25 Aug 2016 03:06:42 -0700 Subject: [PATCH 18/20] Make the "extra" key in the top row another backspace --- keyboards/jd45/keymaps/jeebak/keymap.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/keyboards/jd45/keymaps/jeebak/keymap.c b/keyboards/jd45/keymaps/jeebak/keymap.c index ac3e010a9..8d26cbde1 100644 --- a/keyboards/jd45/keymaps/jeebak/keymap.c +++ b/keyboards/jd45/keymaps/jeebak/keymap.c @@ -78,7 +78,7 @@ enum macro_keycodes { /* Qwerty * * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. - * |Hyper/Tab| Q | W | E | R | T | Y | U | I | O | P | [ | Bksp | + * |Hyper/Tab| Q | W | E | R | T | Y | U | I | O | P | Bksp | Bksp | * |---------`------`------`------`------`------`------`------`------`------`------`------`------| * | Ctrl/Esc | A | S | MC/D | F | G | H | J | K | L |GUI/; | Alt/" | * |----------`------`------`------`------`------`------`------`------`------`------`------------| @@ -91,7 +91,7 @@ enum macro_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = KEYMAP_JD45( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ - HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_BSPC, + HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ CTL_ESC , KC_A, KC_S,LT_MC(KC_D), KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, GUI_SEM, ALT_QUO , /*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ @@ -102,7 +102,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Colemak * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. - * |Hyper/Tab| Q | W | F | P | G | J | L | U | Y | ; | [ | Bksp | + * |Hyper/Tab| Q | W | F | P | G | J | L | U | Y | ; | Bksp | Bksp | * |---------`------`------`------`------`------`------`------`------`------`------`------`------| * | Ctrl/Esc | A | R | MC/S | T | D | H | N | E | I | O | " | * |----------`------`------`------`------`------`------`------`------`------`------`------------| @@ -113,7 +113,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_COLEMAK] = KEYMAP_JD45( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ - HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_BSPC, + HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ CTL_ESC , KC_A, KC_R,LT_MC(KC_S), KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT , /*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ @@ -124,7 +124,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Dvorak * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. - * |Hyper/Tab| " | , | . | P | Y | F | G | C | R | L | / | Bksp | + * |Hyper/Tab| " | , | . | P | Y | F | G | C | R | L | Bksp | Bksp | * |---------`------`------`------`------`------`------`------`------`------`------`------`------| * | Ctrl/Esc | A | O | MC/E | U | I | D | H | T | N | S | / | * |----------`------`------`------`------`------`------`------`------`------`------`------------| @@ -135,7 +135,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_DVORAK] = KEYMAP_JD45( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ - HPR_TAB,KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_BSPC, + HPR_TAB,KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ CTL_ESC , KC_A, KC_O,LT_MC(KC_E), KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH , /*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ @@ -146,7 +146,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Lower * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | Bksp | + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | Bksp | * |---------`------`------`------`------`------`------`------`------`------`------`------`------| * | [ | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | "|" | * |----------`------`------`------`------`------`------`------`------`------`------`------------| @@ -157,7 +157,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_LOWER] = KEYMAP_JD45( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ - KC_TILD,KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, KC_BSPC, + KC_TILD,KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ KC_LBRC , KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE , /*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ @@ -168,7 +168,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Raise * ,---------+------+------+------+------+------+------+------+------+------+------+------+------. - * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | Bksp | + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | Bksp | * |---------`------`------`------`------`------`------`------`------`------`------`------`------| * | $ | 4 | 5 | 6 | . | + | . | 4 | 5 | 6 | * | "|" | * |----------`------`------`------`------`------`------`------`------`------`------`------------| @@ -179,7 +179,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_RAISE] = KEYMAP_JD45( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ - KC_0 , KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, KC_BSPC, + KC_0 , KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ KC_DLR , KC_4, KC_5, KC_6, KC_DOT, KC_PLUS, KC_DOT, KC_4, KC_5, KC_6, KC_ASTR, KC_PIPE , /*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ From 1bbd3c1eea78abf0b36a289fb37f80dfc4f9c8bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Werner?= Date: Thu, 25 Aug 2016 12:25:57 +0200 Subject: [PATCH 19/20] fixed defaulf keymap, added my own keymap now the LEDs are working like they should --- keyboards/kitten_paw/Makefile | 2 +- keyboards/kitten_paw/keymaps/ickerwx/keymap.c | 128 ++++++++++-------- .../kitten_paw/keymaps/ickerwx/readme.md | 18 +++ keyboards/kitten_paw/kitten_paw.c | 17 ++- keyboards/kitten_paw/kitten_paw.h | 11 ++ keyboards/kitten_paw/led.c | 47 ------- keyboards/kitten_paw/matrix.c | 3 +- 7 files changed, 122 insertions(+), 104 deletions(-) create mode 100644 keyboards/kitten_paw/keymaps/ickerwx/readme.md delete mode 100644 keyboards/kitten_paw/led.c diff --git a/keyboards/kitten_paw/Makefile b/keyboards/kitten_paw/Makefile index 912292173..3b5585ed6 100644 --- a/keyboards/kitten_paw/Makefile +++ b/keyboards/kitten_paw/Makefile @@ -69,7 +69,7 @@ BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE ?= no # Audio output on port C6 CUSTOM_MATRIX = yes -SRC += matrix.c led.c +SRC += matrix.c ifndef QUANTUM_DIR include ../../Makefile diff --git a/keyboards/kitten_paw/keymaps/ickerwx/keymap.c b/keyboards/kitten_paw/keymaps/ickerwx/keymap.c index 276fc30a8..9a00c80dc 100644 --- a/keyboards/kitten_paw/keymaps/ickerwx/keymap.c +++ b/keyboards/kitten_paw/keymaps/ickerwx/keymap.c @@ -3,8 +3,14 @@ #define _______ KC_TRNS #define XXXXXXX KC_NO -#define LC LCTL +#define C(kc) LCTL(KC_##kc) +#define RA(kc) RALT(KC_##kc) #define KC_SLCT KC_SELECT +#define MEDAPP LT(MEDIA, KC_APP) +#undef S +#define S(kc) LSFT(KC_##kc) + +uint8_t current_layer_global = 255; enum layers { DEFAULT, @@ -33,75 +39,75 @@ enum macro_id { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [DEFAULT] = KEYMAP(\ - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL,KC_BSPC, KC_INS,KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, KC_DEL, KC_END,KC_PGDN, KC_P7, KC_P8, KC_P9,KC_PPLS, \ - F(0), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ - F(8),KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT, KC_SLSH, F(9), KC_UP, KC_P1, KC_P2, KC_P3,KC_PENT, \ - F(1),KC_LGUI, F(3), LT(MISC, KC_SPC), F(4), F(5), LT(MEDIA, KC_APP), F(2), KC_LEFT,KC_DOWN,KC_RGHT, KC_P0,KC_PDOT), - /* Layer 1: Programming Layer 1, emulating US layout */ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL,KC_BSPC, KC_INS,KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, KC_END,KC_PGDN, KC_P7, KC_P8, KC_P9,KC_PPLS, \ + F(0), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ + F(8),KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH, F(9), KC_UP, KC_P1, KC_P2, KC_P3,KC_PENT, \ + F(1),KC_LGUI, F(3), LT(MISC, KC_SPC), F(4), F(5), MEDAPP, F(2), KC_LEFT,KC_DOWN,KC_RGHT, KC_P0,KC_PDOT), + /* Layer 1: Programming Layer 1, emulating US l ayout */ [PROG1] = KEYMAP(\ - KC_ESC,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______,_______,_______, \ - M(GRV),_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, KC_SLSH, S(KC_0), _______, _______,_______,_______, _______,_______,_______,_______, \ - _______,_______,_______,_______,_______,_______, KC_Z,_______,_______,_______, _______,RALT(KC_8),RALT(KC_9),RALT(KC_MINS), _______,_______,_______, _______,_______,_______,_______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,S(KC_COMM),S(KC_BSLS), _______, _______,_______,_______, \ - MO(PROG2),_______, KC_Y,_______,_______,_______,_______,_______,_______,_______, _______, S(KC_7), MO(PROG2), _______, _______,_______,_______,_______, \ - _______,_______,_______, _______, _______, _______, _______, _______, _______,_______,_______, _______,_______), + KC_ESC,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, \ + M(GRV),_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,KC_SLSH, S(0),_______, _______,_______,_______, _______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______, KC_Z,_______,_______,_______,_______, RA(8), RA(9),RA(MINS), _______,_______,_______, _______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,S(COMM),S(BSLS), _______, _______,_______,_______, \ + MO(PROG2),_______, KC_Y,_______,_______,_______,_______,_______,_______,_______,_______, S(7), MO(PROG2), _______, _______,_______,_______,_______, \ + _______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______, _______,_______), /* Layer 2: programming layer 2 all keys that are not FN keys are sent as LSFT+key on this layer */ [PROG2] = KEYMAP(\ - _______, _______, _______,_______,_______,_______, _______,_______, _______,_______, _______, _______, _______, _______,_______,_______, \ -RALT(KC_RBRC), _______,RALT(KC_Q),KC_BSLS,_______,_______,M(CFLEX),S(KC_6),S(KC_RBRC),S(KC_8), S(KC_9), S(KC_SLSH), KC_RBRC, _______, _______,_______,_______, _______,_______,_______,_______, \ - _______, _______, _______,_______,_______,_______, _______,_______, _______,_______, _______, RALT(KC_7),RALT(KC_0),RALT(KC_NUBS), _______,_______,_______, _______,_______,_______,_______, \ - _______, _______, _______,_______,_______,_______, _______,_______, _______,_______, S(KC_DOT), S(KC_2), _______, _______,_______,_______, \ - _______,S(KC_NUBS), _______,_______,_______,_______, _______,_______, _______,KC_NUBS,S(KC_NUBS), S(KC_MINS), _______, _______, _______,_______,_______,_______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______,_______,_______, _______,_______), \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, \ + RA(RBRC),_______, RA(Q),KC_BSLS,_______,_______,M(CFLEX), S(6),S(RBRC), S(8), S(9),S(SLSH),KC_RBRC,_______, _______,_______,_______, _______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, RA(7), RA(0),RA(NUBS), _______,_______,_______, _______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, S(DOT), S(2), _______, _______,_______,_______, \ + _______,S(NUBS),_______,_______,_______,_______,_______,_______,_______,KC_NUBS,S(NUBS),S(MINS), _______, _______, _______,_______,_______,_______, \ + _______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______, _______,_______), /* Layer 3: media layer */ - [MEDIA] = KEYMAP(\ - KC_PWR,KC_SLEP,KC_WAKE,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, \ - XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, KC_MPRV,KC_MPLY,KC_MNXT, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ - XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, KC_VOLD,KC_MUTE,KC_VOLU, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ - XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, \ - XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, KC_EJCT, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ - XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,_______,XXXXXXX, KC_MRWD,KC_MSTP,KC_MFFD, XXXXXXX,XXXXXXX), + [MEDIA] = KEYMAP(\ + KC_PWR,KC_SLEP,KC_WAKE,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, KC_MPRV,KC_MPLY,KC_MNXT, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, KC_VOLD,KC_MUTE,KC_VOLU, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, KC_EJCT, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ + XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,_______,XXXXXXX, KC_MRWD,KC_MSTP,KC_MFFD, XXXXXXX,XXXXXXX), /* Layer 4: Mouse layer */ [MOUSE1] = KEYMAP(\ - F(6),XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, \ - XXXXXXX,KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,KC_BSPC, KC_INS,KC_HOME,KC_PGUP, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ - XXXXXXX,KC_BTN4, KC_WH_D, KC_MS_U, KC_WH_U, XXXXXXX, KC_Y,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, KC_DEL, KC_END,KC_PGDN, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ - F(0),KC_BTN5, KC_MS_L, KC_MS_D, KC_MS_R, F(7),KC_WH_L,KC_WH_D,KC_WH_U, KC_WH_R, XXXXXXX,XXXXXXX, KC_BTN1, XXXXXXX,XXXXXXX,XXXXXXX, \ - MO(MOUSE2),XXXXXXX,LC(KC_Y),LC(KC_X),LC(KC_C),LC(KC_V),XXXXXXX,KC_BTN2,KC_BTN3,LC(KC_PGUP),LC(KC_PGDN),XXXXXXX, KC_RSFT, KC_UP, XXXXXXX,XXXXXXX,XXXXXXX,KC_PENT, \ - KC_LCTL,KC_LGUI,KC_LALT, KC_BTN1, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT, XXXXXXX,XXXXXXX), + F(6),_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, \ + _______,KC_ACL0,KC_ACL1,KC_ACL2,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, _______,_______,_______,_______, \ + _______,KC_BTN4,KC_WH_D,KC_MS_U,KC_WH_U,_______, C(Z),_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, _______,_______,_______,_______, \ + _______,KC_BTN5,KC_MS_L,KC_MS_D,KC_MS_R, F(7),KC_WH_L,KC_WH_D,KC_WH_U,KC_WH_R,_______,_______, _______, _______,_______,_______, \ + MO(MOUSE2),_______, C(Y), C(X), C(C), C(V),_______,KC_BTN2,KC_BTN3,C(PGUP),C(PGDN),_______, KC_RSFT, _______, _______,_______,_______,_______, \ + KC_LCTL,_______,KC_LALT, KC_BTN1, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, _______,_______,_______, _______,_______), /* Layer 5: Mouse layer 2*/ [MOUSE2] = KEYMAP(\ - _______,_______,_______, _______, _______, _______,_______,_______,_______, _______, _______,_______,_______, _______,_______,_______, \ - _______,_______,_______, _______, _______, _______,_______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______, _______,_______,_______,_______, \ - _______,_______,KC_BTN2, KC_WH_U, KC_BTN3, _______,_______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______, _______,_______,_______,_______, \ - _______,_______,KC_WH_L, KC_WH_D, KC_WH_R, _______,KC_MS_L,KC_MS_D,KC_MS_U, KC_MS_R, _______,_______, _______, _______,_______,_______, \ - _______,_______,_______, _______, _______, _______,_______,_______,_______, _______, _______,_______, _______, _______, _______,_______,_______,_______, \ - _______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______, _______,_______), + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, _______,_______,_______,_______, \ + _______,_______,KC_BTN2,KC_WH_U,KC_BTN3,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, _______,_______,_______,_______, \ + _______,_______,KC_WH_L,KC_WH_D,KC_WH_R,_______,KC_MS_L,KC_MS_D,KC_MS_U,KC_MS_R,_______,_______, _______, _______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______,_______,_______, \ + _______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______, _______,_______), /* Layer 6: Misc layer */ [MISC] = KEYMAP(\ - XXXXXXX, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, XXXXXXX,XXXXXXX,XXXXXXX, \ - XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ - XXXXXXX,KC_SLCT,LC(KC_W), KC_UP, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,KC_BSPC, KC_DEL, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ - XXXXXXX,XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX,KC_HOME,KC_PGDN,KC_PGUP, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, \ - KC_LSFT,XXXXXXX,LC(KC_Y),LC(KC_X),LC(KC_C),LC(KC_V), KC_SPC, KC_END,XXXXXXX,LC(KC_PGUP),LC(KC_PGDN),XXXXXXX, KC_RSFT, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, \ - KC_LCTL,KC_LGUI, KC_LALT, LT(MISC, KC_SPC), KC_RALT,KC_RGUI, KC_APP,KC_RCTL, XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX), + _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, _______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, _______,_______,_______,_______, \ + _______,KC_SLCT, C(W), KC_UP,_______,_______,_______,_______,KC_BSPC, KC_DEL,_______,_______,_______,_______, _______,_______,_______, _______,_______,_______,_______, \ + _______,_______,KC_LEFT,KC_DOWN,KC_RGHT,_______,KC_HOME,KC_PGDN,KC_PGUP,_______,_______,_______, _______, _______,_______,_______, \ + KC_LSFT,_______, C(Y), C(X), C(C), C(V), KC_SPC, KC_END,_______,C(PGUP),C(PGDN),_______, _______, _______, _______,_______,_______,_______, \ + _______,_______,_______, LT(MISC, KC_SPC), _______,_______,_______,_______, _______,_______,_______, _______,_______), }; const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_TAP_TOGGLE(MOUSE1), // toggle enable mouse layer (4) - [1] = ACTION_FUNCTION_TAP(LCTRL_BRACKET), // tap to print [ - [2] = ACTION_FUNCTION_TAP(RCTRL_BRACKET), // tap to print ] - [3] = ACTION_FUNCTION_TAP(LALT_CURLY), // tap to print { - [4] = ACTION_FUNCTION_TAP(RALT_CURLY), // tap to print } - [5] = ACTION_LAYER_TAP_TOGGLE(PROG1), // toggle programming layer 1 (1) + [0] = ACTION_LAYER_TAP_TOGGLE(MOUSE1), // tap-toggle mouse layer (4) + [1] = ACTION_FUNCTION_TAP(LCTRL_BRACKET), // tap to print [ + [2] = ACTION_FUNCTION_TAP(RCTRL_BRACKET), // tap to print ] + [3] = ACTION_FUNCTION_TAP(LALT_CURLY), // tap to print { + [4] = ACTION_FUNCTION_TAP(RALT_CURLY), // tap to print } + [5] = ACTION_LAYER_TAP_TOGGLE(PROG1), // tap-toggle programming layer 1 [6] = ACTION_LAYER_SET_CLEAR(DEFAULT), [7] = ACTION_FUNCTION_TAP(CTRL_CLICK), - [8] = ACTION_FUNCTION_TAP(LSHFT_PAREN), // tap to print ( - [9] = ACTION_FUNCTION_TAP(RSHFT_PAREN), // tap to print ) + [8] = ACTION_FUNCTION_TAP(LSHFT_PAREN), // tap to print ( + [9] = ACTION_FUNCTION_TAP(RSHFT_PAREN), // tap to print ) }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) @@ -126,7 +132,22 @@ void matrix_init_user(void) { } void matrix_scan_user(void) { + uint8_t layer; + layer = biton32(layer_state); + if (current_layer_global != layer) { + current_layer_global = layer; + + // unset CAPSLOCK and SCROLL LOCK LEDs + led_set_kb(host_keyboard_leds() & ~(1<event.pressed) { register_mods(MOD_LSFT); } else { diff --git a/keyboards/kitten_paw/keymaps/ickerwx/readme.md b/keyboards/kitten_paw/keymaps/ickerwx/readme.md new file mode 100644 index 000000000..0d23be4ea --- /dev/null +++ b/keyboards/kitten_paw/keymaps/ickerwx/readme.md @@ -0,0 +1,18 @@ +# My personal keymap for the Kitten Paw controller + +This keymap only works correctly when you have your OS configured with a German keymap. Use the keymap however you like. It's most likely a living thing that will never be quite finished. + +## Description of the layers +Layer 0 (DEFAULT) works just like you would expect a keyboard to work, mostly, except: +Caps Lock switches to the mouse layer, RGUI and APP are switches to the programming layer and media layer. +Mouse and programming layer switches can be held or double-tapped to lock. +Holding space switches to the MISC layer where I currently accumulate useful shortcuts. +Tapping left and right Shift, Ctrl and Alt will send (), [] and {} respectively. + +Layers 1 and 2 (PROG1 and PROG2) emulate the US layout while still using a German OS keymap setting. I was annoyed of having to change the OS settings every time I wanted to use the US layout for coding, so I made these layers to behave just like the US layout even though the OS still uses German. The shift keys were a bit tricky, I had to use them as MO(PROG2) switches, so to get the actual expected behavior I enable LSFT for almost every keypress on PROG2 in ```process_record_user```. Since the shift keys are MO() function keys, they do not print () at the moment, which sucks. I'm working on it. + +Layer 3 (MEDIA) just has a couple of media keys on it, mainly around the cursor keys and nav key cluster. + +Layers 4 and 5 (MOUSE1 and MOUSE2) are mouse layers. Move the cursor using ESDF, scroll using HJKL, Space for left click, N and M for right and middle click. There's more, look at the keymap. + +Layer 6 is a layer I don't have a good name for, so I call it MISC. You'll find cursor keys at ESDF, other navigation keys around the HJKL cluster and F12 to F24 on the F-keys. For now. \ No newline at end of file diff --git a/keyboards/kitten_paw/kitten_paw.c b/keyboards/kitten_paw/kitten_paw.c index 8713baf43..92f64b06b 100644 --- a/keyboards/kitten_paw/kitten_paw.c +++ b/keyboards/kitten_paw/kitten_paw.c @@ -4,7 +4,6 @@ void matrix_init_kb(void) { // put your keyboard start-up code here // runs once when the firmware starts up - matrix_init_quantum(); matrix_init_user(); } @@ -12,7 +11,6 @@ void matrix_scan_kb(void) { // put your looping keyboard code here // runs every cycle (a lot) - matrix_scan_quantum(); matrix_scan_user(); } @@ -25,6 +23,21 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { void led_set_kb(uint8_t usb_led) { // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + CONFIG_LED_IO; + CONFIG_LED_IO; + print_dec(usb_led); + if (usb_led & (1< - - 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 . -*/ - -#include -#include "stdint.h" -#include "led.h" - -/* LED pin configuration - * - * Scroll Lock PC5 - * Caps Lock PC6 - * Num Lock PB7 - * - */ -void led_set(uint8_t usb_led) { - DDRB |= (1<<7); - DDRC |= (1<<5) | (1<<6); - - if (usb_led & (1< Date: Thu, 25 Aug 2016 08:16:18 -0500 Subject: [PATCH 20/20] Fixed naming of Analog pins to differentiate them from DIO pins used by Quantum Matrix --- keyboards/lets_split/pro_micro.h | 64 ++++++++++++++++---------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/keyboards/lets_split/pro_micro.h b/keyboards/lets_split/pro_micro.h index 09e219b7b..f9e7ed75d 100644 --- a/keyboards/lets_split/pro_micro.h +++ b/keyboards/lets_split/pro_micro.h @@ -111,18 +111,18 @@ static const uint8_t SCK = 15; // Mapping of analog pins as digital I/O // A6-A11 share with digital pins -static const uint8_t A0 = 18; -static const uint8_t A1 = 19; -static const uint8_t A2 = 20; -static const uint8_t A3 = 21; -static const uint8_t A4 = 22; -static const uint8_t A5 = 23; -static const uint8_t A6 = 24; // D4 -static const uint8_t A7 = 25; // D6 -static const uint8_t A8 = 26; // D8 -static const uint8_t A9 = 27; // D9 -static const uint8_t A10 = 28; // D10 -static const uint8_t A11 = 29; // D12 +static const uint8_t ADC0 = 18; +static const uint8_t ADC1 = 19; +static const uint8_t ADC2 = 20; +static const uint8_t ADC3 = 21; +static const uint8_t ADC4 = 22; +static const uint8_t ADC5 = 23; +static const uint8_t ADC6 = 24; // D4 +static const uint8_t ADC7 = 25; // D6 +static const uint8_t ADC8 = 26; // D8 +static const uint8_t ADC9 = 27; // D9 +static const uint8_t ADC10 = 28; // D10 +static const uint8_t ADC11 = 29; // D12 #define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0)) #define digitalPinToPCICRbit(p) 0 @@ -220,26 +220,26 @@ const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PC, // D5 - PC6 PD, // D6 - PD7 PE, // D7 - PE6 - + PB, // D8 - PB4 PB, // D9 - PB5 PB, // D10 - PB6 PB, // D11 - PB7 PD, // D12 - PD6 PC, // D13 - PC7 - + PB, // D14 - MISO - PB3 PB, // D15 - SCK - PB1 PB, // D16 - MOSI - PB2 PB, // D17 - SS - PB0 - + PF, // D18 - A0 - PF7 PF, // D19 - A1 - PF6 PF, // D20 - A2 - PF5 PF, // D21 - A3 - PF4 PF, // D22 - A4 - PF1 PF, // D23 - A5 - PF0 - + PD, // D24 - PD5 PD, // D25 / D6 - A7 - PD7 PB, // D26 / D8 - A8 - PB4 @@ -257,26 +257,26 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { _BV(6), // D5 - PC6 _BV(7), // D6 - PD7 _BV(6), // D7 - PE6 - + _BV(4), // D8 - PB4 _BV(5), // D9 - PB5 _BV(6), // D10 - PB6 _BV(7), // D11 - PB7 _BV(6), // D12 - PD6 _BV(7), // D13 - PC7 - + _BV(3), // D14 - MISO - PB3 _BV(1), // D15 - SCK - PB1 _BV(2), // D16 - MOSI - PB2 _BV(0), // D17 - SS - PB0 - + _BV(7), // D18 - A0 - PF7 _BV(6), // D19 - A1 - PF6 _BV(5), // D20 - A2 - PF5 _BV(4), // D21 - A3 - PF4 _BV(1), // D22 - A4 - PF1 _BV(0), // D23 - A5 - PF0 - + _BV(5), // D24 - PD5 _BV(7), // D25 / D6 - A7 - PD7 _BV(4), // D26 / D8 - A8 - PB4 @@ -286,24 +286,24 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { }; const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { - NOT_ON_TIMER, + NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, TIMER0B, /* 3 */ NOT_ON_TIMER, TIMER3A, /* 5 */ TIMER4D, /* 6 */ - NOT_ON_TIMER, - - NOT_ON_TIMER, + NOT_ON_TIMER, + + NOT_ON_TIMER, TIMER1A, /* 9 */ TIMER1B, /* 10 */ TIMER0A, /* 11 */ - - NOT_ON_TIMER, + + NOT_ON_TIMER, TIMER4A, /* 13 */ - - NOT_ON_TIMER, + + NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, @@ -324,11 +324,11 @@ const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { const uint8_t PROGMEM analog_pin_to_channel_PGM[] = { 7, // A0 PF7 ADC7 - 6, // A1 PF6 ADC6 - 5, // A2 PF5 ADC5 + 6, // A1 PF6 ADC6 + 5, // A2 PF5 ADC5 4, // A3 PF4 ADC4 - 1, // A4 PF1 ADC1 - 0, // A5 PF0 ADC0 + 1, // A4 PF1 ADC1 + 0, // A5 PF0 ADC0 8, // A6 D4 PD4 ADC8 10, // A7 D6 PD7 ADC10 11, // A8 D8 PB4 ADC11