summaryrefslogtreecommitdiff
path: root/keyboards
diff options
context:
space:
mode:
authorDonald Kjer <don.kjer@gmail.com>2021-01-25 09:30:17 -0800
committerGitHub <noreply@github.com>2021-01-26 04:30:17 +1100
commit88ca4ec2cbbe004cb51f36311f7490537128bce0 (patch)
tree08aaf7ac539180194443b358d1c61ceb1ede03e5 /keyboards
parent2a34e07ff97ffe9b845b87b4177a139cc2054e30 (diff)
downloadqmk_firmware-88ca4ec2cbbe004cb51f36311f7490537128bce0.tar.gz
qmk_firmware-88ca4ec2cbbe004cb51f36311f7490537128bce0.zip
Add support for the DURGOD Taurus K320 keyboard (#11399)
* Initial support for Durgod K320 with BootMagic Lite - Adding missing files - Add Unicode Map Support & new user keymap - Remove personalized features from Default keymap - Added Unicode Map to both Default and kuenhlee keymap.c - Updated readme.md - Added additional Fn Shortcut keys * Additional support for Durgod K320 - Simplifying default keymap - Renaming durgod_k320 => durgod/k320 - Removing copy of ST_NUCLEO64_F070RB from K320. Replacing with local board.h - Adding Mac keyboard layout for K320 as alternative via Fn+F12 - Implementing Windows Key lock on K320 - Cleaning up duplicated core functionality - Adding default_toggle_mac_windows keymap with: - Ability to toggle between Windows and MacOS layout - Mac Media Lock functionality. * Updating K320 keymap readme Co-authored-by: kuenhlee <eos.camera.lee@gmail.com>
Diffstat (limited to 'keyboards')
-rw-r--r--keyboards/durgod/k320/board.h23
-rw-r--r--keyboards/durgod/k320/bootloader_defs.h7
-rw-r--r--keyboards/durgod/k320/chconf.h714
-rw-r--r--keyboards/durgod/k320/config.h53
-rw-r--r--keyboards/durgod/k320/halconf.h525
-rw-r--r--keyboards/durgod/k320/info.json462
-rw-r--r--keyboards/durgod/k320/k320.c42
-rw-r--r--keyboards/durgod/k320/k320.h44
-rw-r--r--keyboards/durgod/k320/keymaps/default/keymap.c97
-rw-r--r--keyboards/durgod/k320/keymaps/default/readme.md14
-rw-r--r--keyboards/durgod/k320/keymaps/default_toggle_mac_windows/keymap.c373
-rw-r--r--keyboards/durgod/k320/keymaps/default_toggle_mac_windows/readme.md64
-rw-r--r--keyboards/durgod/k320/keymaps/kuenhlee/keymap.c154
-rw-r--r--keyboards/durgod/k320/keymaps/kuenhlee/readme.md38
-rw-r--r--keyboards/durgod/k320/keymaps/kuenhlee/rules.mk4
-rw-r--r--keyboards/durgod/k320/mcuconf.h176
-rw-r--r--keyboards/durgod/k320/readme.md60
-rw-r--r--keyboards/durgod/k320/rules.mk27
18 files changed, 2877 insertions, 0 deletions
diff --git a/keyboards/durgod/k320/board.h b/keyboards/durgod/k320/board.h
new file mode 100644
index 0000000000..17d08b17f1
--- /dev/null
+++ b/keyboards/durgod/k320/board.h
@@ -0,0 +1,23 @@
+/*
+Copyright 2021 Don Kjer
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#define STM32_HSECLK 12000000U
+#include_next <board.h>
+#undef STM32_HSE_BYPASS
+
diff --git a/keyboards/durgod/k320/bootloader_defs.h b/keyboards/durgod/k320/bootloader_defs.h
new file mode 100644
index 0000000000..02c48c4e6d
--- /dev/null
+++ b/keyboards/durgod/k320/bootloader_defs.h
@@ -0,0 +1,7 @@
+/* Address for jumping to bootloader on STM32 chips. */
+/* It is chip dependent, the correct number can be looked up here (page 175):
+ * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
+ * This also requires a patch to chibios:
+ * <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
+ */
+#define STM32_BOOTLOADER_ADDRESS 0x1FFFC800
diff --git a/keyboards/durgod/k320/chconf.h b/keyboards/durgod/k320/chconf.h
new file mode 100644
index 0000000000..8ac3a97e07
--- /dev/null
+++ b/keyboards/durgod/k320/chconf.h
@@ -0,0 +1,714 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file rt/templates/chconf.h
+ * @brief Configuration file template.
+ * @details A copy of this file must be placed in each project directory, it
+ * contains the application specific kernel settings.
+ *
+ * @addtogroup config
+ * @details Kernel related settings and hooks.
+ * @{
+ */
+
+#ifndef CHCONF_H
+#define CHCONF_H
+
+#define _CHIBIOS_RT_CONF_
+#define _CHIBIOS_RT_CONF_VER_6_0_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_ST_RESOLUTION)
+#define CH_CFG_ST_RESOLUTION 32
+#endif
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#if !defined(CH_CFG_ST_FREQUENCY)
+#define CH_CFG_ST_FREQUENCY 10000
+#endif
+
+/**
+ * @brief Time intervals data size.
+ * @note Allowed values are 16, 32 or 64 bits.
+ */
+#if !defined(CH_CFG_INTERVALS_SIZE)
+#define CH_CFG_INTERVALS_SIZE 32
+#endif
+
+/**
+ * @brief Time types data size.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_TIME_TYPES_SIZE)
+#define CH_CFG_TIME_TYPES_SIZE 32
+#endif
+
+/**
+ * @brief Time delta constant for the tick-less mode.
+ * @note If this value is zero then the system uses the classic
+ * periodic tick. This value represents the minimum number
+ * of ticks that is safe to specify in a timeout directive.
+ * The value one is not valid, timeouts are rounded up to
+ * this value.
+ */
+#if !defined(CH_CFG_ST_TIMEDELTA)
+#define CH_CFG_ST_TIMEDELTA 0
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel parameters and options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Round robin interval.
+ * @details This constant is the number of system ticks allowed for the
+ * threads before preemption occurs. Setting this value to zero
+ * disables the preemption for threads with equal priority and the
+ * round robin becomes cooperative. Note that higher priority
+ * threads can still preempt, the kernel is always preemptive.
+ * @note Disabling the round robin preemption makes the kernel more compact
+ * and generally faster.
+ * @note The round robin preemption is not supported in tickless mode and
+ * must be set to zero in that case.
+ */
+#if !defined(CH_CFG_TIME_QUANTUM)
+#define CH_CFG_TIME_QUANTUM 0
+#endif
+
+/**
+ * @brief Managed RAM size.
+ * @details Size of the RAM area to be managed by the OS. If set to zero
+ * then the whole available RAM is used. The core memory is made
+ * available to the heap allocator and/or can be used directly through
+ * the simplified core memory allocator.
+ *
+ * @note In order to let the OS manage the whole RAM the linker script must
+ * provide the @p __heap_base__ and @p __heap_end__ symbols.
+ * @note Requires @p CH_CFG_USE_MEMCORE.
+ */
+#if !defined(CH_CFG_MEMCORE_SIZE)
+#define CH_CFG_MEMCORE_SIZE 0
+#endif
+
+/**
+ * @brief Idle thread automatic spawn suppression.
+ * @details When this option is activated the function @p chSysInit()
+ * does not spawn the idle thread. The application @p main()
+ * function becomes the idle thread and must implement an
+ * infinite loop.
+ */
+#if !defined(CH_CFG_NO_IDLE_THREAD)
+#define CH_CFG_NO_IDLE_THREAD FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Performance options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief OS optimization.
+ * @details If enabled then time efficient rather than space efficient code
+ * is used when two possible implementations exist.
+ *
+ * @note This is not related to the compiler optimization options.
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_OPTIMIZE_SPEED)
+#define CH_CFG_OPTIMIZE_SPEED FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Subsystem options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_TM)
+#define CH_CFG_USE_TM FALSE
+#endif
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_REGISTRY)
+#define CH_CFG_USE_REGISTRY TRUE
+#endif
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_WAITEXIT)
+#define CH_CFG_USE_WAITEXIT TRUE
+#endif
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES)
+#define CH_CFG_USE_SEMAPHORES TRUE
+#endif
+
+/**
+ * @brief Semaphores queuing mode.
+ * @details If enabled then the threads are enqueued on semaphores by
+ * priority rather than in FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY)
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MUTEXES)
+#define CH_CFG_USE_MUTEXES TRUE
+#endif
+
+/**
+ * @brief Enables recursive behavior on mutexes.
+ * @note Recursive mutexes are heavier and have an increased
+ * memory footprint.
+ *
+ * @note The default is @p FALSE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE)
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+#endif
+
+/**
+ * @brief Conditional Variables APIs.
+ * @details If enabled then the conditional variables APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_CONDVARS)
+#define CH_CFG_USE_CONDVARS TRUE
+#endif
+
+/**
+ * @brief Conditional Variables APIs with timeout.
+ * @details If enabled then the conditional variables APIs with timeout
+ * specification are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_CONDVARS.
+ */
+#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)
+#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
+#endif
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_EVENTS)
+#define CH_CFG_USE_EVENTS TRUE
+#endif
+
+/**
+ * @brief Events Flags APIs with timeout.
+ * @details If enabled then the events APIs with timeout specification
+ * are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_EVENTS.
+ */
+#if !defined(CH_CFG_USE_EVENTS_TIMEOUT)
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MESSAGES)
+#define CH_CFG_USE_MESSAGES TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages queuing mode.
+ * @details If enabled then messages are served by priority rather than in
+ * FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_MESSAGES.
+ */
+#if !defined(CH_CFG_USE_MESSAGES_PRIORITY)
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mailboxes APIs.
+ * @details If enabled then the asynchronous messages (mailboxes) APIs are
+ * included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_MAILBOXES)
+#define CH_CFG_USE_MAILBOXES TRUE
+#endif
+
+/**
+ * @brief Core Memory Manager APIs.
+ * @details If enabled then the core memory manager APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMCORE)
+#define CH_CFG_USE_MEMCORE TRUE
+#endif
+
+/**
+ * @brief Heap Allocator APIs.
+ * @details If enabled then the memory heap allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ * @p CH_CFG_USE_SEMAPHORES.
+ * @note Mutexes are recommended.
+ */
+#if !defined(CH_CFG_USE_HEAP)
+#define CH_CFG_USE_HEAP FALSE
+#endif
+
+/**
+ * @brief Memory Pools Allocator APIs.
+ * @details If enabled then the memory pools allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMPOOLS)
+#define CH_CFG_USE_MEMPOOLS FALSE
+#endif
+
+/**
+ * @brief Objects FIFOs APIs.
+ * @details If enabled then the objects FIFOs APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_OBJ_FIFOS)
+#define CH_CFG_USE_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Pipes APIs.
+ * @details If enabled then the pipes APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_PIPES)
+#define CH_CFG_USE_PIPES FALSE
+#endif
+
+/**
+ * @brief Dynamic Threads APIs.
+ * @details If enabled then the dynamic threads creation APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_WAITEXIT.
+ * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
+ */
+#if !defined(CH_CFG_USE_DYNAMIC)
+#define CH_CFG_USE_DYNAMIC FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Objects factory options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Objects Factory APIs.
+ * @details If enabled then the objects factory APIs are included in the
+ * kernel.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_CFG_USE_FACTORY)
+#define CH_CFG_USE_FACTORY FALSE
+#endif
+
+/**
+ * @brief Maximum length for object names.
+ * @details If the specified length is zero then the name is stored by
+ * pointer but this could have unintended side effects.
+ */
+#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH)
+#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8
+#endif
+
+/**
+ * @brief Enables the registry of generic objects.
+ */
+#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)
+#define CH_CFG_FACTORY_OBJECTS_REGISTRY FALSE
+#endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS FALSE
+#endif
+
+/**
+ * @brief Enables factory for semaphores.
+ */
+#if !defined(CH_CFG_FACTORY_SEMAPHORES)
+#define CH_CFG_FACTORY_SEMAPHORES FALSE
+#endif
+
+/**
+ * @brief Enables factory for mailboxes.
+ */
+#if !defined(CH_CFG_FACTORY_MAILBOXES)
+#define CH_CFG_FACTORY_MAILBOXES FALSE
+#endif
+
+/**
+ * @brief Enables factory for objects FIFOs.
+ */
+#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+#define CH_CFG_FACTORY_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Enables factory for Pipes.
+ */
+#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_PIPES FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_STATISTICS)
+#define CH_DBG_STATISTICS FALSE
+#endif
+
+/**
+ * @brief Debug option, system state check.
+ * @details If enabled the correct call protocol for system APIs is checked
+ * at runtime.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, parameters checks.
+ * @details If enabled then the checks on the API functions input
+ * parameters are activated.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_CHECKS)
+#define CH_DBG_ENABLE_CHECKS FALSE
+#endif
+
+/**
+ * @brief Debug option, consistency checks.
+ * @details If enabled then all the assertions in the kernel code are
+ * activated. This includes consistency checks inside the kernel,
+ * runtime anomalies and port-defined checks.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_ASSERTS)
+#define CH_DBG_ENABLE_ASSERTS FALSE
+#endif
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_MASK)
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+#endif
+
+/**
+ * @brief Trace buffer entries.
+ * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
+ * different from @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_BUFFER_SIZE)
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+#endif
+
+/**
+ * @brief Debug option, stack checks.
+ * @details If enabled then a runtime stack check is performed.
+ *
+ * @note The default is @p FALSE.
+ * @note The stack check is performed in a architecture/port dependent way.
+ * It may not be implemented or some ports.
+ * @note The default failure mode is to halt the system with the global
+ * @p panic_msg variable set to @p NULL.
+ */
+#if !defined(CH_DBG_ENABLE_STACK_CHECK)
+#define CH_DBG_ENABLE_STACK_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, stacks initialization.
+ * @details If enabled then the threads working area is filled with a byte
+ * value when a thread is created. This can be useful for the
+ * runtime measurement of the used stack.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_FILL_THREADS)
+#define CH_DBG_FILL_THREADS FALSE
+#endif
+
+/**
+ * @brief Debug option, threads profiling.
+ * @details If enabled then a field is added to the @p thread_t structure that
+ * counts the system ticks occurred while executing the thread.
+ *
+ * @note The default is @p FALSE.
+ * @note This debug option is not currently compatible with the
+ * tickless mode.
+ */
+#if !defined(CH_DBG_THREADS_PROFILING)
+#define CH_DBG_THREADS_PROFILING FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System structure extension.
+ * @details User fields added to the end of the @p ch_system_t structure.
+ */
+#define CH_CFG_SYSTEM_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief System initialization hook.
+ * @details User initialization code added to the @p chSysInit() function
+ * just before interrupts are enabled globally.
+ */
+#define CH_CFG_SYSTEM_INIT_HOOK() { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads descriptor structure extension.
+ * @details User fields added to the end of the @p thread_t structure.
+ */
+#define CH_CFG_THREAD_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief Threads initialization hook.
+ * @details User initialization code added to the @p _thread_init() function.
+ *
+ * @note It is invoked from within @p _thread_init() and implicitly from all
+ * the threads creation APIs.
+ */
+#define CH_CFG_THREAD_INIT_HOOK(tp) { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads finalization hook.
+ * @details User finalization code added to the @p chThdExit() API.
+ */
+#define CH_CFG_THREAD_EXIT_HOOK(tp) { \
+ /* Add threads finalization code here.*/ \
+}
+
+/**
+ * @brief Context switch hook.
+ * @details This hook is invoked just before switching between threads.
+ */
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \
+ /* Context switch code here.*/ \
+}
+
+/**
+ * @brief ISR enter hook.
+ */
+#define CH_CFG_IRQ_PROLOGUE_HOOK() { \
+ /* IRQ prologue code here.*/ \
+}
+
+/**
+ * @brief ISR exit hook.
+ */
+#define CH_CFG_IRQ_EPILOGUE_HOOK() { \
+ /* IRQ epilogue code here.*/ \
+}
+
+/**
+ * @brief Idle thread enter hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() { \
+ /* Idle-enter code here.*/ \
+}
+
+/**
+ * @brief Idle thread leave hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() { \
+ /* Idle-leave code here.*/ \
+}
+
+/**
+ * @brief Idle Loop hook.
+ * @details This hook is continuously invoked by the idle thread loop.
+ */
+#define CH_CFG_IDLE_LOOP_HOOK() { \
+ /* Idle loop code here.*/ \
+}
+
+/**
+ * @brief System tick event hook.
+ * @details This hook is invoked in the system tick handler immediately
+ * after processing the virtual timers queue.
+ */
+#define CH_CFG_SYSTEM_TICK_HOOK() { \
+ /* System tick event code here.*/ \
+}
+
+/**
+ * @brief System halt hook.
+ * @details This hook is invoked in case to a system halting error before
+ * the system is halted.
+ */
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \
+ /* System halt code here.*/ \
+}
+
+/**
+ * @brief Trace hook.
+ * @details This hook is invoked each time a new record is written in the
+ * trace buffer.
+ */
+#define CH_CFG_TRACE_HOOK(tep) { \
+ /* Trace code here.*/ \
+}
+
+/** @} */
+
+/*===========================================================================*/
+/* Port-specific settings (override port settings defaulted in chcore.h). */
+/*===========================================================================*/
+
+#endif /* CHCONF_H */
+
+/** @} */
diff --git a/keyboards/durgod/k320/config.h b/keyboards/durgod/k320/config.h
new file mode 100644
index 0000000000..70438900ee
--- /dev/null
+++ b/keyboards/durgod/k320/config.h
@@ -0,0 +1,53 @@
+/*
+Copyright 2021 kuenhlee and Don Kjer
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xD60D
+#define PRODUCT_ID 0x3200
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Hoksi Technology
+#define PRODUCT DURGOD Taurus K320 (QMK)
+
+/* key matrix size */
+#define MATRIX_ROWS 7
+#define MATRIX_COLS 16
+
+#define MATRIX_ROW_PINS { A0, A1, A2, A3, A4, A5, A6 }
+#define MATRIX_COL_PINS { C4, C5, B0, B1, B2, B10, B11, B12, B13, B14, B15, C6, C7, C10, C11, C12 }
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION ROW2COL
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 7
+
+/* Bootmagic Lite key configuration */
+#define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 0
+
+/* LED indicator pins */
+#define LED_CAPS_LOCK_PIN C9
+#define LED_SCROLL_LOCK_PIN A8
+#define LED_WIN_LOCK_PIN A9
+#define LED_MR_LOCK_PIN A10
+#define LED_PIN_ON_STATE 0
+
diff --git a/keyboards/durgod/k320/halconf.h b/keyboards/durgod/k320/halconf.h
new file mode 100644
index 0000000000..16f32117d5
--- /dev/null
+++ b/keyboards/durgod/k320/halconf.h
@@ -0,0 +1,525 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file templates/halconf.h
+ * @brief HAL configuration header.
+ * @details HAL configuration file, this file allows to enable or disable the
+ * various device drivers from your application. You may also use
+ * this file in order to override the device drivers default settings.
+ *
+ * @addtogroup HAL_CONF
+ * @{
+ */
+
+#ifndef HALCONF_H
+#define HALCONF_H
+
+#define _CHIBIOS_HAL_CONF_
+#define _CHIBIOS_HAL_CONF_VER_7_0_
+
+#include "mcuconf.h"
+
+/**
+ * @brief Enables the PAL subsystem.
+ */
+#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
+#define HAL_USE_PAL TRUE
+#endif
+
+/**
+ * @brief Enables the ADC subsystem.
+ */
+#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
+#define HAL_USE_ADC FALSE
+#endif
+
+/**
+ * @brief Enables the CAN subsystem.
+ */
+#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
+#define HAL_USE_CAN FALSE
+#endif
+
+/**
+ * @brief Enables the cryptographic subsystem.
+ */
+#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__)
+#define HAL_USE_CRY FALSE
+#endif
+
+/**
+ * @brief Enables the DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
+#endif
+
+/**
+ * @brief Enables the GPT subsystem.
+ */
+#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
+#define HAL_USE_GPT FALSE
+#endif
+
+/**
+ * @brief Enables the I2C subsystem.
+ */
+#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
+#define HAL_USE_I2C FALSE
+#endif
+
+/**
+ * @brief Enables the I2S subsystem.
+ */
+#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
+#define HAL_USE_I2S FALSE
+#endif
+
+/**
+ * @brief Enables the ICU subsystem.
+ */
+#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
+#define HAL_USE_ICU FALSE
+#endif
+
+/**
+ * @brief Enables the MAC subsystem.
+ */
+#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
+#define HAL_USE_MAC FALSE
+#endif
+
+/**
+ * @brief Enables the MMC_SPI subsystem.
+ */
+#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_MMC_SPI FALSE
+#endif
+
+/**
+ * @brief Enables the PWM subsystem.
+ */
+#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
+#define HAL_USE_PWM FALSE
+#endif
+
+/**
+ * @brief Enables the RTC subsystem.
+ */
+#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
+#define HAL_USE_RTC FALSE
+#endif
+
+/**
+ * @brief Enables the SDC subsystem.
+ */
+#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
+#define HAL_USE_SDC FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL subsystem.
+ */
+#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL over USB subsystem.
+ */
+#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL_USB FALSE
+#endif
+
+/**
+ * @brief Enables the SIO subsystem.
+ */
+#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__)
+#define HAL_USE_SIO FALSE
+#endif
+
+/**
+ * @brief Enables the SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI FALSE
+#endif
+
+/**
+ * @brief Enables the TRNG subsystem.
+ */
+#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
+#define HAL_USE_TRNG FALSE
+#endif
+
+/**
+ * @brief Enables the UART subsystem.
+ */
+#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
+#define HAL_USE_UART FALSE
+#endif
+
+/**
+ * @brief Enables the USB subsystem.
+ */
+#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
+#define HAL_USE_USB TRUE
+#endif
+
+/**
+ * @brief Enables the WDG subsystem.
+ */
+#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
+#define HAL_USE_WDG FALSE
+#endif
+
+/**
+ * @brief Enables the WSPI subsystem.
+ */
+#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__)
+#define HAL_USE_WSPI FALSE
+#endif
+
+/*===========================================================================*/
+/* PAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define PAL_USE_CALLBACKS FALSE
+#endif
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
+#define PAL_USE_WAIT FALSE
+#endif
+
+/*===========================================================================*/
+/* ADC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
+#define ADC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define ADC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* CAN driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Sleep mode related APIs inclusion switch.
+ */
+#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
+#define CAN_USE_SLEEP_MODE TRUE
+#endif
+
+/**
+ * @brief Enforces the driver to use direct callbacks rather than OSAL events.
+ */
+#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define CAN_ENFORCE_USE_CALLBACKS FALSE
+#endif
+
+/*===========================================================================*/
+/* CRY driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the SW fall-back of the cryptographic driver.
+ * @details When enabled, this option, activates a fall-back software
+ * implementation for algorithms not supported by the underlying
+ * hardware.
+ * @note Fall-back implementations may not be present for all algorithms.
+ */
+#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_USE_FALLBACK FALSE
+#endif
+
+/**
+ * @brief Makes the driver forcibly use the fall-back implementations.
+ */
+#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_ENFORCE_FALLBACK FALSE
+#endif
+
+/*===========================================================================*/
+/* DAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)
+#define DAC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define DAC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* I2C driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the mutual exclusion APIs on the I2C bus.
+ */
+#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define I2C_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* MAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the zero-copy API.
+ */
+#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
+#define MAC_USE_ZERO_COPY FALSE
+#endif
+
+/**
+ * @brief Enables an event sources for incoming packets.
+ */
+#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
+#define MAC_USE_EVENTS TRUE
+#endif
+
+/*===========================================================================*/
+/* MMC_SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ * This option is recommended also if the SPI driver does not
+ * use a DMA channel and heavily loads the CPU.
+ */
+#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)
+#define MMC_NICE_WAITING TRUE
+#endif
+
+/*===========================================================================*/
+/* SDC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Number of initialization attempts before rejecting the card.
+ * @note Attempts are performed at 10mS intervals.
+ */
+#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
+#define SDC_INIT_RETRY 100
+#endif
+
+/**
+ * @brief Include support for MMC cards.
+ * @note MMC support is not yet implemented so this option must be kept
+ * at @p FALSE.
+ */
+#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
+#define SDC_MMC_SUPPORT FALSE
+#endif
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ */
+#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
+#define SDC_NICE_WAITING TRUE
+#endif
+
+/**
+ * @brief OCR initialization constant for V20 cards.
+ */
+#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR_V20 0x50FF8000U
+#endif
+
+/**
+ * @brief OCR initialization constant for non-V20 cards.
+ */
+#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR 0x80100000U
+#endif
+
+/*===========================================================================*/
+/* SERIAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Default bit rate.
+ * @details Configuration parameter, this is the baud rate selected for the
+ * default configuration.
+ */
+#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
+#define SERIAL_DEFAULT_BITRATE 38400
+#endif
+
+/**
+ * @brief Serial buffers size.
+ * @details Configuration parameter, you can change the depth of the queue
+ * buffers depending on the requirements of your application.
+ * @note The default is 16 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_BUFFERS_SIZE 16
+#endif
+
+/*===========================================================================*/
+/* SERIAL_USB driver related setting. */
+/*===========================================================================*/
+
+/**
+ * @brief Serial over USB buffers size.
+ * @details Configuration parameter, the buffer size must be a multiple of
+ * the USB data endpoint maximum packet size.
+ * @note The default is 256 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE 1
+#endif
+
+/**
+ * @brief Serial over USB number of buffers.
+ * @note The default is 2 buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_NUMBER 2
+#endif
+
+/*===========================================================================*/
+/* SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
+#define SPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables circular transfers APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__)
+#define SPI_USE_CIRCULAR FALSE
+#endif
+
+
+/**
+ * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define SPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/**
+ * @brief Handling method for SPI CS line.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__)
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+#endif
+
+/*===========================================================================*/
+/* UART driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
+#define UART_USE_WAIT FALSE
+#endif
+
+/**
+ * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define UART_USE_MUTUAL_EXCLUSION FALSE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT TRUE
+#endif
+
+/*===========================================================================*/
+/* WSPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__)
+#define WSPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define WSPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+#endif /* HALCONF_H */
+
+/** @} */
diff --git a/keyboards/durgod/k320/info.json b/keyboards/durgod/k320/info.json
new file mode 100644
index 0000000000..0f0c584e62
--- /dev/null
+++ b/keyboards/durgod/k320/info.json
@@ -0,0 +1,462 @@
+{
+ "keyboard_name": "DURGOD Taurus K320",
+ "url": "https://www.durgod.com/page9?product_id=47&_l=en",
+ "maintainer": "dkjer",
+ "width": 18.25,
+ "height": 6.5,
+ "layouts": {
+ "LAYOUT_tkl_ansi": {
+ "layout": [
+ {
+ "label": "Esc",
+ "x": 0,
+ "y": 0
+ },
+ {
+ "label": "F1",
+ "x": 2,
+ "y": 0
+ },
+ {
+ "label": "F2",
+ "x": 3,
+ "y": 0
+ },
+ {
+ "label": "F3",
+ "x": 4,
+ "y": 0
+ },
+ {
+ "label": "F4",
+ "x": 5,
+ "y": 0
+ },
+ {
+ "label": "F5",
+ "x": 6.5,
+ "y": 0
+ },
+ {
+ "label": "F6",
+ "x": 7.5,
+ "y": 0
+ },
+ {
+ "label": "F7",
+ "x": 8.5,
+ "y": 0
+ },
+ {
+ "label": "F8",
+ "x": 9.5,
+ "y": 0
+ },
+ {
+ "label": "F9",
+ "x": 11,
+ "y": 0
+ },
+ {
+ "label": "F10",
+ "x": 12,
+ "y": 0
+ },
+ {
+ "label": "F11",
+ "x": 13,
+ "y": 0
+ },
+ {
+ "label": "F12",
+ "x": 14,
+ "y": 0
+ },
+ {
+ "label": "PrtSc",
+ "x": 15.25,
+ "y": 0
+ },
+ {
+ "label": "Scroll Lock",
+ "x": 16.25,
+ "y": 0
+ },
+ {
+ "label": "Pause",
+ "x": 17.25,
+ "y": 0
+ },
+ {
+ "label": "~",
+ "x": 0,
+ "y": 1.5
+ },
+ {
+ "label": "!",
+ "x": 1,
+ "y": 1.5
+ },
+ {
+ "label": "@",
+ "x": 2,
+ "y": 1.5
+ },
+ {
+ "label": "#",
+ "x": 3,
+ "y": 1.5
+ },
+ {
+ "label": "$",
+ "x": 4,
+ "y": 1.5
+ },
+ {
+ "label": "%",
+ "x": 5,
+ "y": 1.5
+ },
+ {
+ "label": "^",
+ "x": 6,
+ "y": 1.5
+ },
+ {
+ "label": "&",
+ "x": 7,
+ "y": 1.5
+ },
+ {
+ "label": "*",
+ "x": 8,
+ "y": 1.5
+ },
+ {
+ "label": "(",
+ "x": 9,
+ "y": 1.5
+ },
+ {
+ "label": ")",
+ "x": 10,
+ "y": 1.5
+ },
+ {
+ "label": "_",
+ "x": 11,
+ "y": 1.5
+ },
+ {
+ "label": "+",
+ "x": 12,
+ "y": 1.5
+ },
+ {
+ "label": "Backspace",
+ "x": 13,
+ "y": 1.5,
+ "w": 2
+ },
+ {
+ "label": "Insert",
+ "x": 15.25,
+ "y": 1.5
+ },
+ {
+ "label": "Home",
+ "x": 16.25,
+ "y": 1.5
+ },
+ {
+ "label": "PgUp",
+ "x": 17.25,
+ "y": 1.5
+ },
+ {
+ "label": "Tab",
+ "x": 0,
+ "y": 2.5,
+ "w": 1.5
+ },
+ {
+ "label": "Q",
+ "x": 1.5,
+ "y": 2.5
+ },
+ {
+ "label": "W",
+ "x": 2.5,
+ "y": 2.5
+ },
+ {
+ "label": "E",
+ "x": 3.5,
+ "y": 2.5
+ },
+ {
+ "label": "R",
+ "x": 4.5,
+ "y": 2.5
+ },
+ {
+ "label": "T",
+ "x": 5.5,
+ "y": 2.5
+ },
+ {
+ "label": "Y",
+ "x": 6.5,
+ "y": 2.5
+ },
+ {
+ "label": "U",
+ "x": 7.5,
+ "y": 2.5
+ },
+ {
+ "label": "I",
+ "x": 8.5,
+ "y": 2.5
+ },
+ {
+ "label": "O",
+ "x": 9.5,
+ "y": 2.5
+ },
+ {
+ "label": "P",
+ "x": 10.5,
+ "y": 2.5
+ },
+ {
+ "label": "{",
+ "x": 11.5,
+ "y": 2.5
+ },
+ {
+ "label": "}",
+ "x": 12.5,
+ "y": 2.5
+ },
+ {
+ "label": "|",
+ "x": 13.5,
+ "y": 2.5,
+ "w": 1.5
+ },
+ {
+ "label": "Delete",
+ "x": 15.25,
+ "y": 2.5
+ },
+ {
+ "label": "End",
+ "x": 16.25,
+ "y": 2.5
+ },
+ {
+ "label": "PgDn",
+ "x": 17.25,
+ "y": 2.5
+ },
+ {
+ "label": "Caps Lock",
+ "x": 0,
+ "y": 3.5,
+ "w": 1.75
+ },
+ {
+ "label": "A",
+ "x": 1.75,
+ "y": 3.5
+ },
+ {
+ "label": "S",
+ "x": 2.75,
+ "y": 3.5
+ },
+ {
+ "label": "D",
+ "x": 3.75,
+ "y": 3.5
+ },
+ {
+ "label": "F",
+ "x": 4.75,
+ "y": 3.5
+ },
+ {
+ "label": "G",
+ "x": 5.75,
+ "y": 3.5
+ },
+ {
+ "label": "H",
+ "x": 6.75,
+ "y": 3.5
+ },
+ {
+ "label": "J",
+ "x": 7.75,
+ "y": 3.5
+ },
+ {
+ "label": "K",
+ "x": 8.75,
+ "y": 3.5
+ },
+ {
+ "label": "L",
+ "x": 9.75,
+ "y": 3.5
+ },
+ {
+ "label": ":",
+ "x": 10.75,
+ "y": 3.5
+ },
+ {
+ "label": "\"",
+ "x": 11.75,
+ "y": 3.5
+ },
+ {
+ "label": "Enter",
+ "x": 12.75,
+ "y": 3.5,
+ "w": 2.25
+ },
+ {
+ "label": "Shift",
+ "x": 0,
+ "y": 4.5,
+ "w": 2.25
+ },
+ {
+ "label": "Z",
+ "x": 2.25,
+ "y": 4.5
+ },
+ {
+ "label": "X",
+ "x": 3.25,
+ "y": 4.5
+ },
+ {
+ "label": "C",
+ "x": 4.25,
+ "y": 4.5
+ },
+ {
+ "label": "V",
+ "x": 5.25,
+ "y": 4.5
+ },
+ {
+ "label": "B",
+ "x": 6.25,
+ "y": 4.5
+ },
+ {
+ "label": "N",
+ "x": 7.25,
+ "y": 4.5
+ },
+ {
+ "label": "M",
+ "x": 8.25,
+ "y": 4.5
+ },
+ {
+ "label": "<",
+ "x": 9.25,
+ "y": 4.5
+ },
+ {
+ "label": ">",
+ "x": 10.25,
+ "y": 4.5
+ },
+ {
+ "label": "?",
+ "x": 11.25,
+ "y": 4.5
+ },
+ {
+ "label": "Shift",
+ "x": 12.25,
+ "y": 4.5,
+ "w": 2.75
+ },
+ {
+ "label": "\u2191",
+ "x": 16.25,
+ "y": 4.5
+ },
+ {
+ "label": "Ctrl",
+ "x": 0,
+ "y": 5.5,
+ "w": 1.25
+ },
+ {
+ "label": "Win",
+ "x": 1.25,
+ "y": 5.5,
+ "w": 1.25
+ },
+ {
+ "label": "Alt",
+ "x": 2.5,
+ "y": 5.5,
+ "w": 1.25
+ },
+ {
+ "x": 3.75,
+ "y": 5.5,
+ "w": 6.25
+ },
+ {
+ "label": "Alt",
+ "x": 10,
+ "y": 5.5,
+ "w": 1.25
+ },
+ {
+ "label": "Fn",
+ "x": 11.25,
+ "y": 5.5,
+ "w": 1.25
+ },
+ {
+ "label": "Menu",
+ "x": 12.5,
+ "y": 5.5,
+ "w": 1.25
+ },
+ {
+ "label": "Ctrl",
+ "x": 13.75,
+ "y": 5.5,
+ "w": 1.25
+ },
+ {
+ "label": "\u2190",
+ "x": 15.25,
+ "y": 5.5
+ },
+ {
+ "label": "\u2193",
+ "x": 16.25,
+ "y": 5.5
+ },
+ {
+ "label": "\u2192",
+ "x": 17.25,
+ "y": 5.5
+ }
+ ]
+ }
+ }
+}
diff --git a/keyboards/durgod/k320/k320.c b/keyboards/durgod/k320/k320.c
new file mode 100644
index 0000000000..f5500ea830
--- /dev/null
+++ b/keyboards/durgod/k320/k320.c
@@ -0,0 +1,42 @@
+/* Copyright 2021 kuenhlee and Don Kjer
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "k320.h"
+
+/* Private Functions */
+void off_all_leds(void) {
+ writePinHigh(LED_CAPS_LOCK_PIN);
+ writePinHigh(LED_SCROLL_LOCK_PIN);
+ writePinHigh(LED_WIN_LOCK_PIN);
+ writePinHigh(LED_MR_LOCK_PIN);
+}
+
+void on_all_leds(void) {
+ writePinLow(LED_CAPS_LOCK_PIN);
+ writePinLow(LED_SCROLL_LOCK_PIN);
+ writePinLow(LED_WIN_LOCK_PIN);
+ writePinLow(LED_MR_LOCK_PIN);
+}
+
+/* WinLock and MR LEDs are non-standard. Need to override led init */
+void led_init_ports(void) {
+ setPinOutput(LED_CAPS_LOCK_PIN);
+ setPinOutput(LED_SCROLL_LOCK_PIN);
+ setPinOutput(LED_WIN_LOCK_PIN);
+ setPinOutput(LED_MR_LOCK_PIN);
+ off_all_leds();
+}
+
diff --git a/keyboards/durgod/k320/k320.h b/keyboards/durgod/k320/k320.h
new file mode 100644
index 0000000000..1f5b884a75
--- /dev/null
+++ b/keyboards/durgod/k320/k320.h
@@ -0,0 +1,44 @@
+/* Copyright 2021 kuenhlee and Don Kjer
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#include "quantum.h"
+
+/* Function Prototype */
+void off_all_leds(void);
+void on_all_leds(void);
+
+
+#define XXX KC_NO
+
+// This a shortcut to help you visually see your layout.
+#define LAYOUT_tkl_ansi( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, K1F, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, K3F, \
+ K40, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4D, K4E, K4F, \
+ K50, K51, K52, K56, K5A, K5B, K5C, K5D, K5E, K5F, \
+ K6F \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, XXX, K1E, K1F }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D, K3E, K3F }, \
+ { K40, XXX, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, XXX, K4D, K4E, K4F }, \
+ { K50, K51, K52, XXX, XXX, XXX, K56, XXX, XXX, XXX, K5A, K5B, K5C, K5D, K5E, K5F }, \
+ { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, K6F } \
+}
diff --git a/keyboards/durgod/k320/keymaps/default/keymap.c b/keyboards/durgod/k320/keymaps/default/keymap.c
new file mode 100644
index 0000000000..64b98acffc
--- /dev/null
+++ b/keyboards/durgod/k320/keymaps/default/keymap.c
@@ -0,0 +1,97 @@
+/* Copyright 2021 kuenhlee and Don Kjer
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+// Layer shorthand
+enum _layer {
+ _BASE,
+ _FUNC
+};
+
+static bool win_key_locked = false;
+
+// Defines the keycodes used by our macros in process_record_user
+enum custom_keycodes {
+ KC_TGUI = SAFE_RANGE // Toggle between GUI Lock or Unlock
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Keymap _BASE: Base Layer (Default Layer)
+ * ,-----------------------------------------------------------. ,--------------.
+ * |Esc |f1| f2| f3| f4| | f5| f6| f7| f8| | f9|f10|f11|f12| |Prnt|ScLk|Paus|
+ * |-----------------------------------------------------------| |--------------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0| - | = |Backsp | | Ins|Home|PgUp|
+ * |-----------------------------------------------------------| |--------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | Del| End|PgDn|
+ * |-----------------------------------------------------------| `--------------'
+ * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |
+ * |-----------------------------------------------------------| ,----.
+ * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | | Up |
+ * |-----------------------------------------------------------| ,-------------.
+ * |Ctrl|Gui |Alt | Space |Alt |Func |App |Ctrl| |Lft| Dn |Rig |
+ * `-----------------------------------------------------------' `-------------'
+ */
+ [_BASE] = LAYOUT_tkl_ansi( /* Base Layer */
+ 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_PGUP,
+ 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_INS, KC_HOME,
+ 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_DEL, KC_END, KC_PGDN,
+ 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_ENT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FUNC),KC_APP, KC_RCTL, KC_LEFT, KC_DOWN,
+ KC_RGHT
+ ),
+ /* Keymap _FUNC: Function Layer
+ * ,-----------------------------------------------------------. ,--------------.
+ * | |Play|Stop|Prev|Next| |Mute|Vol+|Vol-| | | | | | | | | | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| `--------------'
+ * | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,----.
+ * | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,-------------.
+ * | |Lock| | | |Func | | | | | | |
+ * `-----------------------------------------------------------' `-------------'
+ */
+ [_FUNC] = LAYOUT_tkl_ansi( /* Function Layer */
+ _______, KC_MPLY, KC_MSTP, KC_MRWD, KC_MFFD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_TGUI, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______
+ )
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case KC_TGUI:
+ if (!record->event.pressed) {
+ // Toggle GUI lock on key release
+ win_key_locked = !win_key_locked;
+ writePin(LED_WIN_LOCK_PIN, !win_key_locked);
+ }
+ break;
+ case KC_LGUI:
+ if (win_key_locked) { return false; }
+ break;
+ }
+ return true;
+}
+
diff --git a/keyboards/durgod/k320/keymaps/default/readme.md b/keyboards/durgod/k320/keymaps/default/readme.md
new file mode 100644
index 0000000000..e26c79c8ae
--- /dev/null
+++ b/keyboards/durgod/k320/keymaps/default/readme.md
@@ -0,0 +1,14 @@
+# The default keymap for Durgod Taurus K320.
+
+Layer 0 : Standard ANSI 87 Keys TKL layout (Windows)
+
+Layer 1 : Media control and Windows lock key
+- Reusing Durgod's Original Media Control for Fn + F1 ~ Fn + F7
+- Fn + Windows to toggle Windows lock key functionality
+
+## Windows key lock
+
+You can hold down Fn + Windows key to disable the Windows key while in locked mode.
+The 'Lock' LED indicates if the Windows key is locked.
+
+This is similar to the stock K320 Windows key lock functionality.
diff --git a/keyboards/durgod/k320/keymaps/default_toggle_mac_windows/keymap.c b/keyboards/durgod/k320/keymaps/default_toggle_mac_windows/keymap.c
new file mode 100644
index 0000000000..7fcf52cfe0
--- /dev/null
+++ b/keyboards/durgod/k320/keymaps/default_toggle_mac_windows/keymap.c
@@ -0,0 +1,373 @@
+/* Copyright 2021 kuenhlee and Don Kjer
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+// Layer shorthand
+enum _layer {
+ _WBL,
+ _WFL,
+ _WSL,
+ _MBL,
+ _MFL,
+ _MSL
+};
+
+#ifndef DEFAULT_LAYOUT
+# define DEFAULT_LAYOUT _WBL // Change to _MBL to boot into Mac layout.
+#endif
+#ifndef ALT_LAYOUT
+# define ALT_LAYOUT _MBL // Layout to display 'MR' led when active.
+#endif
+
+static bool win_key_locked = false;
+static bool mac_media_locked = false;
+static bool win_appkey_pressed = false;
+static bool mac_fnkey_pressed = false;
+
+
+// Defines the keycodes used by our macros in process_record_user
+enum custom_keycodes {
+ KC_TGUI = SAFE_RANGE, // Toggle between GUI Lock or Unlock (Windows)
+ KC_TMED, // Toggle between Fx keys or Media keys (Mac)
+ KC_WFN, // Windows function key
+ KC_MFN, // Mac function key
+ MO_WSL, // Windows system key
+ MO_MSL, // Mac system key
+ DF_W2MBL, // Change layout from Windows to Mac
+ DF_M2WBL // Change layout from Mac to Windows
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Keymap _WBL: Windows Base Layer (Default Layer)
+ * ,-----------------------------------------------------------. ,--------------.
+ * |Esc |f1| f2| f3| f4| | f5| f6| f7| f8| | f9|f10|f11|f12| |Prnt|ScLk|Paus|
+ * |-----------------------------------------------------------| |--------------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0| - | = |Backsp | | Ins|Home|PgUp|
+ * |-----------------------------------------------------------| |--------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | Del| End|PgDn|
+ * |-----------------------------------------------------------| `--------------'
+ * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |
+ * |-----------------------------------------------------------| ,----.
+ * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | | Up |
+ * |-----------------------------------------------------------| ,-------------.
+ * |Ctrl|Gui |Alt | Space |Alt |Func |App|Ctrl | |Lft| Dn |Rig |
+ * `-----------------------------------------------------------' `-------------'
+ */
+ [_WBL] = LAYOUT_tkl_ansi( /* Windows Base Layer */
+ 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_PGUP,
+ 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_INS, KC_HOME,
+ 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_DEL, KC_END, KC_PGDN,
+ 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_ENT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_WFN, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN,
+ KC_RGHT
+ ),
+ /* Keymap _WFL: Windows Function Layer
+ * ,-----------------------------------------------------------. ,--------------.
+ * | |Play|Stop|Prev|Next| |Mute|Vol+|Vol-| | | | | | | | | | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| `--------------'
+ * | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,----.
+ * | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,-------------.
+ * | |Lock| | | |Func |Sys| | | | | |
+ * `-----------------------------------------------------------' `-------------'
+ */
+ [_WFL] = LAYOUT_tkl_ansi( /* Windows First Layer */
+ _______, KC_MPLY, KC_MSTP, KC_MRWD, KC_MFFD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_TGUI, _______, _______, _______, _______, MO_WSL, _______, _______, _______,
+ _______
+ ),
+ /* Keymap _WSL: Windows System Layer
+ * ,-----------------------------------------------------------. ,--------------.
+ * |Reset |Sleep| | |Power| | | | | | | | | |MAC| | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| `--------------'
+ * | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,----.
+ * | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,-------------.
+ * | | | | | |Func |Sys| | | | | |
+ * `-----------------------------------------------------------' `-------------'
+ */
+ [_WSL] = LAYOUT_tkl_ansi( /* Windows Second / System Layer */
+ RESET, KC_SLEP, XXXXXXX, XXXXXXX, KC_PWR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF_W2MBL, 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, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, DEBUG, 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,
+ XXXXXXX
+ ),
+
+ /* Keymap _MBL: Mac Base Layer (Alternate Layout)
+ * ,-----------------------------------------------------------. ,--------------.
+ * |Esc |f1| f2| f3| f4| | f5| f6| f7| f8| | f9|f10|f11|f12| | f13| f14| f15|
+ * |-----------------------------------------------------------| |--------------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0| - | = |Backsp | | Ins|Home|PgUp|
+ * |-----------------------------------------------------------| |--------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | Del| End|PgDn|
+ * |-----------------------------------------------------------| `--------------'
+ * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |
+ * |-----------------------------------------------------------| ,----.
+ * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | | Up |
+ * |-----------------------------------------------------------| ,-------------.
+ * |Ctrl|Alt |Gui | Space |Gui |Alt|Func |Ctrl | |Lft| Dn |Rig |
+ * `-----------------------------------------------------------' `-------------'
+ */
+ [_MBL] = LAYOUT_tkl_ansi( /* Mac Base Layer */
+ 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_F13, KC_F14, KC_F15,
+ 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_PGUP,
+ 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_INS, KC_HOME,
+ 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_DEL, KC_END, KC_PGDN,
+ 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_ENT, KC_UP,
+ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_MFN, KC_RCTL, KC_LEFT, KC_DOWN,
+ KC_RGHT
+ ),
+ /* Keymap _MFL: Mac Function Layer
+ * ,-----------------------------------------------------------. ,--------------.
+ * | |Bri-|Bri+|MCon|LPad| | | |Prv|Ply| |Nxt|Mute|Vol-|Vol+| |TMed| | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| `--------------'
+ * | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,----.
+ * | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,-------------.
+ * | | | | | |Sys|Func | | | | | |
+ * `-----------------------------------------------------------' `-------------'
+ */
+ [_MFL] = LAYOUT_tkl_ansi( /* Mac First Layer */
+ _______, KC_BRID, KC_BRIU, _______, _______, _______, _______, KC_MRWD, KC_MPLY, KC_MFFD, KC_MUTE, KC_VOLD, KC_VOLU, KC_TMED, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, MO_MSL, _______, _______, _______, _______,
+ _______
+ ),
+ /* Keymap _MSL: Mac System Layer
+ * ,-----------------------------------------------------------. ,--------------.
+ * |Reset | | | |Sleep| | | | | | | | | |WIN| | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| |--------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| `--------------'
+ * | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,----.
+ * | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,-------------.
+ * | | | | | |Sys|Func | | | | | |
+ * `-----------------------------------------------------------' `-------------'
+ */
+ [_MSL] = LAYOUT_tkl_ansi( /* Mac Second / System Layer */
+ RESET, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DF_M2WBL, 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, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, DEBUG, 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,
+ XXXXXXX
+ )
+};
+
+void unlock_win_key(void) {
+ win_key_locked = false;
+ mac_media_locked = false;
+ writePinHigh(LED_WIN_LOCK_PIN);
+}
+
+void toggle_lock_win_key(void) {
+ win_key_locked = !win_key_locked;
+ writePin(LED_WIN_LOCK_PIN, !win_key_locked);
+}
+
+void toggle_lock_media_key(void) {
+ mac_media_locked = !mac_media_locked;
+ writePin(LED_WIN_LOCK_PIN, !mac_media_locked);
+}
+
+#ifdef CONSOLE_ENABLE
+void dprint_global_layers(void) {
+ dprint("Global Layers:");
+ if (IS_LAYER_ON(_WFL)) { dprint(" _WFL"); }
+ if (IS_LAYER_ON(_WSL)) { dprint(" _WSL"); }
+ if (IS_LAYER_ON(_MFL)) { dprint(" _MFL"); }
+ if (IS_LAYER_ON(_MSL)) { dprint(" _MSL"); }
+ dprintf("\n");
+}
+
+void dprint_layers(layer_state_t state) {
+ dprint("Layers:");
+ if (IS_LAYER_ON_STATE(state, _WFL)) { dprint(" _WFL"); }
+ if (IS_LAYER_ON_STATE(state, _WSL)) { dprint(" _WSL"); }
+ if (IS_LAYER_ON_STATE(state, _MFL)) { dprint(" _MFL"); }
+ if (IS_LAYER_ON_STATE(state, _MSL)) { dprint(" _MSL"); }
+ dprintf("\n");
+}
+#endif
+
+layer_state_t default_layer_state_set_user(layer_state_t state) {
+#ifdef CONSOLE_ENABLE
+ dprintf("default_layer_state_set_user: 0x%x\n", state);
+ dprint_global_layers();
+#endif
+ // Disable windows key lock on default layer transition.
+ unlock_win_key();
+ win_appkey_pressed = false;
+ mac_fnkey_pressed = false;
+ writePin(LED_MR_LOCK_PIN, !IS_LAYER_ON_STATE(state, ALT_LAYOUT));
+ return state;
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+#ifdef CONSOLE_ENABLE
+ dprintf("layer_state_set_user: 0x%x\n", state);
+ dprint_layers(state);
+#endif
+ return state;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case KC_TGUI:
+ if (!record->event.pressed) {
+ // Toggle GUI lock on key release
+ toggle_lock_win_key();
+ }
+ break;
+ case KC_TMED:
+ // Only trigger when Fn key is also held down, to avoid accidental unlock.
+ if (!mac_fnkey_pressed) { return false; }
+ if (!record->event.pressed) {
+ // Toggle Media Lock on key release
+ toggle_lock_media_key();
+ }
+ break;
+ case KC_LGUI:
+ if (win_key_locked) { return false; }
+ break;
+ case KC_WFN:
+ // Like MO(_WFL), but also enables _WSL if KC_APP is already pressed down.
+ if (record->event.pressed) {
+ layer_on(_WFL);
+ if (win_appkey_pressed) {
+ // Also enable Secondary layer if App key is being held down.
+ win_appkey_pressed = false;
+ layer_on(_WSL);
+ }
+ } else {
+ if (IS_LAYER_ON(_WFL)) { layer_off(_WFL); }
+ if (IS_LAYER_ON(_MSL)) { layer_off(_MSL); }
+ }
+ break;
+ case KC_APP:
+ if (record->event.pressed) {
+ // Don't actually press down the app menu key
+ win_appkey_pressed = true;
+ } else {
+ if (IS_LAYER_ON(_WSL)) { layer_off(_WSL); }
+ if (IS_LAYER_ON(_MFL)) { layer_off(_MFL); }
+ if (win_appkey_pressed) {
+ win_appkey_pressed = false;
+ // Tap the KC_APP key on key release.
+ tap_code(KC_APP);
+ }
+ }
+ return false;
+ break;
+ case KC_MFN:
+ // Mac Fn key. Emit Fn keycode, and also transition layers similar to KC_WFN.
+ if (record->event.pressed) {
+ mac_fnkey_pressed = true;
+ layer_on(_MFL);
+ // Also enable Secondary layer if Right-Alt key is being held down.
+ if (get_mods() & MOD_BIT(KC_RALT)) {
+ layer_on(_MSL);
+ }
+ } else {
+ mac_fnkey_pressed = false;
+ if (!mac_media_locked) {
+ if (IS_LAYER_ON(_MFL)) { layer_off(_MFL); }
+ if (IS_LAYER_ON(_WSL)) { layer_off(_WSL); }
+ }
+ }
+ break;
+ case KC_RALT:
+ // Disable MSL/WFL layer on key-up.
+ if (!record->event.pressed) {
+ if (IS_LAYER_ON(_MSL)) { layer_off(_MSL); }
+ if (IS_LAYER_ON(_WFL)) { layer_off(_WFL); }
+ }
+ break;
+ case MO_WSL:
+ if (record->event.pressed) {
+ layer_on(_WSL);
+ } else {
+ if (IS_LAYER_ON(_WSL)) { layer_off(_WSL); }
+ if (IS_LAYER_ON(_MFL)) { layer_off(_MFL); }
+ }
+ break;
+ case MO_MSL:
+ if (record->event.pressed) {
+ layer_on(_MSL);
+ } else {
+ if (IS_LAYER_ON(_MSL)) { layer_off(_MSL); }
+ if (IS_LAYER_ON(_WFL)) { layer_off(_WFL); }
+ }
+ break;
+ case DF_W2MBL:
+ if (!record->event.pressed) {
+ // Switch base layer, but preserve first/secondary layers.
+ default_layer_set(1UL<<_MBL);
+ layer_state_set(1UL<<_MFL | 1UL<<_MSL);
+ }
+ break;
+ case DF_M2WBL:
+ if (!record->event.pressed) {
+ // Switch base layer, but preserve first/secondary layers.
+ default_layer_set(1UL<<_WBL);
+ layer_state_set(1UL<<_WFL | 1UL<<_WSL);
+ }
+ break;
+ case RESET:
+ if (record->event.pressed) {
+ // Flash LEDs to indicate bootloader mode is enabled.
+ on_all_leds();
+ }
+ break;
+ }
+ return true;
+}
+
+void keyboard_post_init_user(void) {
+ default_layer_set(1UL<<DEFAULT_LAYOUT);
+}
+
diff --git a/keyboards/durgod/k320/keymaps/default_toggle_mac_windows/readme.md b/keyboards/durgod/k320/keymaps/default_toggle_mac_windows/readme.md
new file mode 100644
index 0000000000..821c8b26a2
--- /dev/null
+++ b/keyboards/durgod/k320/keymaps/default_toggle_mac_windows/readme.md
@@ -0,0 +1,64 @@
+# A keymap for Durgod Taurus K320 that supports toggling between Mac and Windows
+
+Layer 0 : Standard ANSI 87 Keys TKL layout (Windows)
+
+Layer 1 : Media control and Windows lock key (Windows)
+- Reusing Durgod's Original Media Control for Fn + F1 ~ Fn + F7
+- Fn + Windows to toggle Windows lock key functionality
+
+Layer 2 : System layer (Windows)
+- Fn + Menu + Esc : Bootloader mode
+- Fn + Menu + F1 : System Sleep
+- Fn + Menu + F4 : Turning Off System
+- Fn + Menu + F12 : Switch to Mac layout
+
+Layer 3 : Mac 87 Keys TKL layout
+
+Layer 4 : Media control and Media lock key (Mac)
+ - Standard Mac Media keys for Fn + F1 ~ Fn + F12.
+ - Fn + F13 to toggle Media lock key functionality
+
+Layer 5 : System layer (Mac)
+- Fn + R-ALT + Esc : Bootloader mode
+- Fn + R-ALT + F4 : Shutdown/Sleep (Hold down on Mac)
+- Fn + R-ALT + F12 : Switch to Windows layout
+
+## Toggle between Mac and Windows layout
+
+You can switch between Mac and Windows layout by doing the following:
+- Hold down Fn + Menu (Windows Layout) or Fn + Right-Alt (Mac layout) (These are the same physical keys)
+- Press F12
+
+The 'M' led will be lit when you are using the alternate layout. By default Mac is the alternate layout.
+
+You can change the default & alternate layout by setting the following flags to either '_WBL'(Windows) or '_MBL' (Mac)
+- DEFAULT_LAYOUT (initial layout to use on boot)
+- ALT_LAYOUT (layout that will light the 'M' LED when active)
+
+For example, to configure Mac as the default layer, and Windows to be the alternate layout, compile with these flags:
+
+ make EXTRAFLAGS="-DDEFAULT_LAYOUT=_MBL -DALT_LAYOUT=_WBL" durgod/k320:default_toggle_mac_windows
+
+## Windows key lock
+
+In windows layout, you can hold down Fn + Windows key to disable the Windows key while in locked mode. The 'Lock' LED
+indicates if the Windows key is locked.
+
+This is similar to the stock K320 Windows key lock functionality.
+
+## Mac Media Lock
+
+To switch between Function row and Media row in Mac layout, press Fn + PrtSc. The 'Lock' LED indicator will be lit when in Media row mode.
+
+### Subsequent Flashing
+
+For repeating Flashing you have two options with this keymap:
+1. Use BootMagic
+- BootMagic Lite has been enabled with Assigned "Esc" key
+- Unplug USB Cable
+- Holding Esc Button
+- Plug in USB Cable, Keyboard should be in ST-Bootloader state
+2. Use key combination if using default keymap
+- Hold down Fn + Menu (Windows Layout) or Fn + Right-Alt (Mac layout) (These are the same physical keys)
+- Press Esc. Keyboard should go into booloader state.
+
diff --git a/keyboards/durgod/k320/keymaps/kuenhlee/keymap.c b/keyboards/durgod/k320/keymaps/kuenhlee/keymap.c
new file mode 100644
index 0000000000..6a42210f82
--- /dev/null
+++ b/keyboards/durgod/k320/keymaps/kuenhlee/keymap.c
@@ -0,0 +1,154 @@
+/* Copyright 2021 kuenhlee
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+// Layer shorthand
+#define _BL 0u
+#define _FL 1u // Multimedia Related, Virtual Desktop control
+#define _SL 2u // Just for System Related
+#define _UL 3u // Unicode Map
+
+#define KC_ADTP LGUI(LCTL(KC_D)) // Adding New Virtual Desktop
+#define KC_DDTP LGUI(LCTL(KC_F4)) // Deleting / Removing Current Virtual Desktop
+#define KC_NDTP LGUI(LCTL(KC_RGHT)) // Navigate to the Next Virtual Desktop
+#define KC_PDTP LGUI(LCTL(KC_LEFT)) // Navigate to the Previous Virtual Desktop
+#define KC_WINL LGUI(KC_LEFT) // Snap Windows to Left
+#define KC_WINR LGUI(KC_RGHT) // Snap Windows to Right
+#define KC_WINU LGUI(KC_UP) // Maximize the Window
+#define KC_WIND LGUI(KC_DOWN) // Minimize the desktop window
+#define KC_TASK LCTL(LSFT(KC_ESC)) // Launch Task Manager
+
+#define KC_FIND LCTL(LSFT(KC_F)) // Find In Files
+#define KC_STOP LCTL(LSFT(KC_HOME)) // Select from Cursor to Home
+#define KC_SEND LCTL(LSFT(KC_END)) // Select from Cursor to End
+
+// Defines the keycodes used by our macros in process_record_user
+enum custom_keycodes {
+ KC_TGUI = SAFE_RANGE // Toggle between GUI Lock or Unlock
+};
+
+// °±²³µ©ΩθΩ√∞∆≈≠→↓←↑≡■□●○∴«»÷≤≥Σ
+// Defines the Enumeration for Unicode Map
+enum unicode_names {
+ DEGR,
+ PONE,
+ POW2,
+ POW3,
+ MYU,
+ COPY,
+ THET,
+ OHM,
+ SQRT,
+ INFI,
+ DELT,
+ APPR,
+ NEQU,
+ RARR,
+ DARR,
+ LARR,
+ UARR,
+ SAME,
+ BSQR,
+ WSQR,
+ BDOT,
+ WDOT,
+ THFR,
+ DIV,
+ LTOE,
+ MTOE,
+ DLAR,
+ DRAR,
+ SUM,
+};
+
+const uint32_t PROGMEM unicode_map[] = {
+ [DEGR] = 0x00B0, // °
+ [PONE] = 0x00B1, // ±
+ [POW2] = 0x00B2, // ²
+ [POW3] = 0x00B3, // ³
+ [MYU] = 0x00B5, // µ
+ [COPY] = 0x00A9, // ©
+ [THET] = 0x03B8, // θ
+ [OHM] = 0x2126, // Ω
+ [SQRT] = 0x221A, // √
+ [INFI] = 0x221E, // ∞
+ [DELT] = 0x0394, // ∆
+ [APPR] = 0x2248, // ≈
+ [NEQU] = 0x2260, // ≠
+ [RARR] = 0x2192, // →
+ [DARR] = 0x2193, // ↓
+ [LARR] = 0x2190, // ←
+ [UARR] = 0x2191, // ↑
+ [SAME] = 0x2261, // ≡
+ [BSQR] = 0x25A0, // ■
+ [WSQR] = 0x25A1, // □
+ [BDOT] = 0x25CF, // ●
+ [WDOT] = 0x25CB, // ○
+ [THFR] = 0x2234, // ∴
+ [DIV] = 0x00F7, // ÷
+ [LTOE] = 0x2264, // ≤
+ [MTOE] = 0x2265, // ≥
+ [DLAR] = 0x00AB, // «
+ [DRAR] = 0x00BB, // »
+ [SUM] = 0x03A3 // Σ
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BL] = LAYOUT_tkl_ansi( /* Base Layer */
+ 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_PGUP,
+ 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_INS, KC_HOME,
+ 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_DEL, KC_END, KC_PGDN,
+ 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_ENT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN,
+ KC_RGHT
+ ),
+
+ [_FL] = LAYOUT_tkl_ansi( /* First Layer */
+ KC_TRNS, KC_MPLY, KC_MSTP, KC_MRWD, KC_MFFD, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_CALC, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PDTP,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TASK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MSEL, XXXXXXX, XXXXXXX, XXXXXXX, KC_ADTP, KC_STOP,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_FIND, KC_WHOM, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DDTP, KC_SEND, KC_NDTP,
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_MYCM, XXXXXXX, XXXXXXX, XXXXXXX, KC_MAIL, XXXXXXX, XXXXXXX, XXXXXXX, KC_MENU, XXXXXXX, KC_WINU,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MO(_SL), KC_TRNS, MO(_UL), XXXXXXX, KC_WINL, KC_WIND,
+ KC_WINR
+ ),
+
+ [_SL] = LAYOUT_tkl_ansi( /* Second Layer */
+ XXXXXXX, KC_SLEP, XXXXXXX, XXXXXXX, KC_PWR, 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, 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, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TRNS, KC_TRNS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX
+ ),
+
+ [_UL] = LAYOUT_tkl_ansi( /* Unicode Layer */
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ X(APPR), X(NEQU), X(POW2), X(POW3), XXXXXXX, XXXXXXX, X(BSQR), X(WSQR), X(INFI), X(BDOT), X(WDOT), XXXXXXX, X(PONE), XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, X(SUM), XXXXXXX, X(MYU), X(SAME), XXXXXXX, X(OHM), X(DLAR), X(DRAR), XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, X(SQRT), X(DELT), XXXXXXX, XXXXXXX, X(THFR), XXXXXXX, XXXXXXX, XXXXXXX, X(THET), X(DEGR), XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, X(COPY), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, X(LTOE), X(MTOE), X(DIV), XXXXXXX, XXXXXXX, X(UARR),
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TRNS, KC_TRNS, XXXXXXX, X(LARR), X(DARR),
+ X(RARR)
+ )
+};
+
+void matrix_init_user(void) {
+ set_unicode_input_mode(UC_WINC);
+}
diff --git a/keyboards/durgod/k320/keymaps/kuenhlee/readme.md b/keyboards/durgod/k320/keymaps/kuenhlee/readme.md
new file mode 100644
index 0000000000..60925e61cf
--- /dev/null
+++ b/keyboards/durgod/k320/keymaps/kuenhlee/readme.md
@@ -0,0 +1,38 @@
+# The kuenhlee keymap for Durgod Taurus K320.
+
+Layer 0 : Standard ANSI 87 Keys TKL layout
+------------------------------------------
+
+Layer 1 : Media control and Key Modifier for Virtual Desktop navagation
+-----------------------------------------------------------------------
+- Reusing Durgod's Original Media Control for Fn + F1 ~ Fn + F7
+ - Fn + F12 Remapped to Launch Calculator
+ - Fn + M To Launch Media Player
+ - Fn + P To Mail Client
+ - Fn + G To Launch Web Browswer / Nagivate to Homepage
+ - Fn + C To Launch My Computer
+ - Fn + T Launch Task Manager
+ - Fn + F Find in Files ( Notepad ++ )
+
+- Windows's Virtual Desktop Navigation
+ - Fn + Ins To add New Virtual Desktop
+ - Fn + Del To Delete / Remove Current Virtual Desktop
+ - Fn + PgUp Navigate to the Next Virtual Desktop
+ - Fn + PgDn Navigate to the Previous Virtual Desktop
+
+- Windows ShortKeys
+ - Fn + Left Snap Windows to Left
+ - Fn + Right Snap Windows to Right
+ - Fn + Up Maximize the Window
+ - Fn + Down Minimize the desktop window
+ - Fn + Home Select from Cursor to Home
+ - Fn + End Select from Cursor to End
+
+Layer 2 : Mainly for Windows Sleep and Shutdown
+-----------------------------------------------
+- Fn + R-ALT + F1 : System Sleep
+- Fn + R-ALT + F4 : Turning Off System
+
+Layer Unicode : Mainly for Predefined Unicode code to work with WinCompose
+--------------------------------------------------------------------------
+- °±²³µ©ΩθΩ√∞∆≈≠→↓←↑≡■□●○∴«»÷≤≥Σ \ No newline at end of file
diff --git a/keyboards/durgod/k320/keymaps/kuenhlee/rules.mk b/keyboards/durgod/k320/keymaps/kuenhlee/rules.mk
new file mode 100644
index 0000000000..b6a7e51c10
--- /dev/null
+++ b/keyboards/durgod/k320/keymaps/kuenhlee/rules.mk
@@ -0,0 +1,4 @@
+# Build Options
+# change yes to no to disable
+#
+UNICODEMAP_ENABLE = yes # Enable Unicode Map
diff --git a/keyboards/durgod/k320/mcuconf.h b/keyboards/durgod/k320/mcuconf.h
new file mode 100644
index 0000000000..6d67aa96aa
--- /dev/null
+++ b/keyboards/durgod/k320/mcuconf.h
@@ -0,0 +1,176 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+/*
+ * STM32F0xx drivers configuration.
+ * The following settings override the default settings present in
+ * the various device driver implementation headers.
+ * Note that the settings for each driver only have effect if the whole
+ * driver is enabled in halconf.h.
+ *
+ * IRQ priorities:
+ * 3...0 Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3 Lowest...Highest.
+ */
+
+#define STM32F0xx_MCUCONF
+// #define STM32F070xB
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT FALSE
+#define STM32_PVD_ENABLE FALSE
+#define STM32_PLS STM32_PLS_LEV0
+#define STM32_HSI_ENABLED TRUE
+#define STM32_HSI14_ENABLED TRUE
+#define STM32_HSI48_ENABLED FALSE
+#define STM32_LSI_ENABLED TRUE
+#define STM32_HSE_ENABLED TRUE
+#define STM32_LSE_ENABLED FALSE
+#define STM32_SW STM32_SW_PLL
+#define STM32_PLLSRC STM32_PLLSRC_HSE
+#define STM32_PREDIV_VALUE 1
+#define STM32_PLLMUL_VALUE 4
+#define STM32_HPRE STM32_HPRE_DIV1
+#define STM32_PPRE STM32_PPRE_DIV1
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_MCOSEL STM32_MCOSEL_SYSCLK
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_USBSW STM32_USBSW_PCLK
+#define STM32_CECSW STM32_CECSW_HSI
+#define STM32_I2C1SW STM32_I2C1SW_SYSCLK
+#define STM32_USART1SW STM32_USART1SW_PCLK
+#define STM32_RTCSEL STM32_RTCSEL_LSI
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1 FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY 2
+#define STM32_ADC_IRQ_PRIORITY 2
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI16_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI17_IRQ_PRIORITY 3
+
+/*
+ * GPT driver system settings.
+ */
+#define STM32_GPT_USE_TIM1 FALSE
+#define STM32_GPT_USE_TIM2 FALSE
+#define STM32_GPT_USE_TIM3 FALSE
+#define STM32_GPT_USE_TIM14 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY 2
+#define STM32_GPT_TIM2_IRQ_PRIORITY 2
+#define STM32_GPT_TIM3_IRQ_PRIORITY 2
+#define STM32_GPT_TIM14_IRQ_PRIORITY 2
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1 TRUE
+#define STM32_I2C_USE_I2C2 FALSE
+#define STM32_I2C_BUSY_TIMEOUT 50
+#define STM32_I2C_I2C1_IRQ_PRIORITY 3
+#define STM32_I2C_I2C2_IRQ_PRIORITY 3
+#define STM32_I2C_USE_DMA TRUE
+#define STM32_I2C_I2C1_DMA_PRIORITY 1
+#define STM32_I2C_I2C2_DMA_PRIORITY 1
+#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure")
+
+/*
+ * ICU driver system settings.
+ */
+#define STM32_ICU_USE_TIM1 FALSE
+#define STM32_ICU_USE_TIM2 FALSE
+#define STM32_ICU_USE_TIM3 FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY 3
+#define STM32_ICU_TIM2_IRQ_PRIORITY 3
+#define STM32_ICU_TIM3_IRQ_PRIORITY 3
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED FALSE
+#define STM32_PWM_USE_TIM1 FALSE
+#define STM32_PWM_USE_TIM2 FALSE
+#define STM32_PWM_USE_TIM3 FALSE
+#define STM32_PWM_TIM1_IRQ_PRIORITY 3
+#define STM32_PWM_TIM2_IRQ_PRIORITY 3
+#define STM32_PWM_TIM3_IRQ_PRIORITY 3
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1 FALSE
+#define STM32_SERIAL_USE_USART2 FALSE
+#define STM32_SERIAL_USART1_PRIORITY 3
+#define STM32_SERIAL_USART2_PRIORITY 3
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1 FALSE
+#define STM32_SPI_USE_SPI2 FALSE
+#define STM32_SPI_SPI1_DMA_PRIORITY 1
+#define STM32_SPI_SPI2_DMA_PRIORITY 1
+#define STM32_SPI_SPI1_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 2
+#define STM32_ST_USE_TIMER 3
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1 FALSE
+#define STM32_UART_USE_USART2 FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY 3
+#define STM32_UART_USART2_IRQ_PRIORITY 3
+#define STM32_UART_USART1_DMA_PRIORITY 0
+#define STM32_UART_USART2_DMA_PRIORITY 0
+#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_USB1 TRUE
+#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE
+#define STM32_USB_USB1_LP_IRQ_PRIORITY 3
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/durgod/k320/readme.md b/keyboards/durgod/k320/readme.md
new file mode 100644
index 0000000000..839a2c74ab
--- /dev/null
+++ b/keyboards/durgod/k320/readme.md
@@ -0,0 +1,60 @@
+# K320
+
+This is a standard fixed ANSI TKL from off the shelf Durgod Taurus K320 without Backlight.
+
+* Keyboard Maintainer: [dkjer](https://github.com/dkjer)
+* Hardware Supported: Durgod Taurus K320 board with STM32F070RBT6
+* Hardware Availability: https://www.durgod.com/page9?product_id=47&_l=en
+
+## Instructions
+
+### Build
+
+Make command example for this keyboard (after setting up your build environment):
+
+ make durgod/k320:default
+
+Flashing example for this keyboard:
+
+ make durgod/k320:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+### Initial Flash
+
+For first Flashing from initial Stock's Firmware
+
+1. Back up original Firmware Image:
+- Unplug
+- Short Boot0 to Vdd (See below)
+- Plug In USB
+- Make a Flash Image's Backup in case you wanted to restore the Keyboard to Stock's Image:
+ - Using DFUseDemo.exe from ST's STSW-STM32080: https://www.st.com/en/development-tools/stsw-stm32080.html
+ - Using dfu-util (thanks to [tylert](https://github.com/tylert) for instructions!):
+
+
+ dfu-util --list
+ dfu-util --alt 0 --dfuse-address 0x08000000 --upload ${OLD_STOCK_BIN}
+
+2. Flash the QMK Firmware Image.
+- Put board into Bootloader mode, using the same method as when backing up the original Firmware (above)
+- Here are a few options for performing the initial Flash:
+ - Using [QMK Toolbox](https://github.com/qmk/qmk_toolbox)
+ - Using DFuseDemo.exe if STTub30 driver is used.
+ - Using dfu-util:
+
+
+ dfu-util --alt 0 --dfuse-address 0x08000000 --upload ${NEW_QMK_BIN}
+
+You can short Boot0 to Vdd by shorting R21 to C27 on the sides closest to the processor, as shown:
+
+<img src="https://i.imgur.com/hvDnw5a.jpg" width="520" height="693" alt="Shorting Boot0 to Vdd on K320">
+
+### Subsequent Flashing
+
+For repeating Flashing you can use BootMagic:
+- BootMagic Lite has been enabled with Assigned "Esc" key
+- Unplug USB Cable
+- Holding Esc Button
+- Plug in USB Cable, Keyboard should be in ST-Bootloader state
+
diff --git a/keyboards/durgod/k320/rules.mk b/keyboards/durgod/k320/rules.mk
new file mode 100644
index 0000000000..3fb50bb8a4
--- /dev/null
+++ b/keyboards/durgod/k320/rules.mk
@@ -0,0 +1,27 @@
+# MCU name
+# Actually F070, but close enough
+MCU = STM32F072
+
+BOARD = ST_NUCLEO64_F070RB
+
+# Do not put the microcontroller into power saving mode
+OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # 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 = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+BLUETOOTH_ENABLE = no # Enable Bluetooth
+AUDIO_ENABLE = no # Audio output
+
+LAYOUTS = tkl_ansi