summaryrefslogtreecommitdiffstats
path: root/keyboards/dztech
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/dztech')
-rw-r--r--keyboards/dztech/dz40rgb/bootloader_defs.h7
-rw-r--r--keyboards/dztech/dz40rgb/chconf.h520
-rw-r--r--keyboards/dztech/dz40rgb/config.h34
-rw-r--r--keyboards/dztech/dz40rgb/dz40rgb.c297
-rw-r--r--keyboards/dztech/dz40rgb/dz40rgb.h27
-rw-r--r--keyboards/dztech/dz40rgb/halconf.h388
-rw-r--r--keyboards/dztech/dz40rgb/keymaps/default/config.h3
-rw-r--r--keyboards/dztech/dz40rgb/keymaps/default/keymap.c75
-rw-r--r--keyboards/dztech/dz40rgb/keymaps/split_space/config.h5
-rw-r--r--keyboards/dztech/dz40rgb/keymaps/split_space/keymap.c102
-rw-r--r--keyboards/dztech/dz40rgb/mcuconf.h257
-rw-r--r--keyboards/dztech/dz40rgb/rules.mk57
-rw-r--r--keyboards/dztech/dz60rgb/config.h8
-rw-r--r--keyboards/dztech/dz60rgb/dz60rgb.c588
-rw-r--r--keyboards/dztech/dz60rgb/dz60rgb.h56
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/ansi/config.h4
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/ansi/keymap.c83
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/default/config.h3
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/default/keymap.c2
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/hhkb/config.h4
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/hhkb/keymap.c84
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/hhkb_iso/config.h4
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/hhkb_iso/keymap.c84
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/iso/config.h4
-rw-r--r--keyboards/dztech/dz60rgb/keymaps/iso/keymap.c83
25 files changed, 2771 insertions, 8 deletions
diff --git a/keyboards/dztech/dz40rgb/bootloader_defs.h b/keyboards/dztech/dz40rgb/bootloader_defs.h
new file mode 100644
index 0000000000..3b0e9d20a6
--- /dev/null
+++ b/keyboards/dztech/dz40rgb/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:
+ * 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 0x1FFFD800
diff --git a/keyboards/dztech/dz40rgb/chconf.h b/keyboards/dztech/dz40rgb/chconf.h
new file mode 100644
index 0000000000..1d9f12ff1f
--- /dev/null
+++ b/keyboards/dztech/dz40rgb/chconf.h
@@ -0,0 +1,520 @@
+/*
+ ChibiOS - Copyright (C) 2006..2016 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/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_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#define CH_CFG_ST_RESOLUTION 32
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#define CH_CFG_ST_FREQUENCY 100000
+
+/**
+ * @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.
+ */
+#define CH_CFG_ST_TIMEDELTA 2
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_TIME_QUANTUM 0
+
+/**
+ * @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.
+ */
+#define CH_CFG_MEMCORE_SIZE 0
+
+/**
+ * @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.
+ */
+#define CH_CFG_NO_IDLE_THREAD FALSE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_OPTIMIZE_SPEED TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_USE_TM TRUE
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_REGISTRY TRUE
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_WAITEXIT TRUE
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_SEMAPHORES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_MUTEXES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_CONDVARS TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_EVENTS TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_MESSAGES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MESSAGES_PRIORITY TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MAILBOXES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MEMCORE TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_HEAP TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MEMPOOLS TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_DYNAMIC TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#define CH_DBG_STATISTICS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_CHECKS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_ASSERTS FALSE
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+
+/**
+ * @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.
+ */
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_STACK_CHECK TRUE
+
+/**
+ * @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.
+ */
+#define CH_DBG_FILL_THREADS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_THREADS_PROFILING FALSE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @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 chThdInit() API.
+ *
+ * @note It is invoked from within @p chThdInit() 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/dztech/dz40rgb/config.h b/keyboards/dztech/dz40rgb/config.h
new file mode 100644
index 0000000000..2ac7fbdc87
--- /dev/null
+++ b/keyboards/dztech/dz40rgb/config.h
@@ -0,0 +1,34 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x1220
+#define DEVICE_VER 0x0001
+#define MANUFACTURER DZTECH
+#define PRODUCT DZ40RGB
+#define DESCRIPTION DZ40 ARM RGB keyboard
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 12
+
+#define MATRIX_ROW_PINS { B13, B12, A2, A1 }
+#define MATRIX_COL_PINS {A6, A7, B0, B1, C15, C14, C13, B9, B8, A8, B14, B15 }
+
+/* #define UNUSED_PINS {A0,A1,A2, A3,A4,A9,A10,C15,A13,A14,B2}*/
+
+#define DIODE_DIRECTION COL2ROW
+
+#define DEBOUNCE 3
+#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
+#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended
+#define RGB_MATRIX_SKIP_FRAMES 0
+#define RGB_MATRIX_KEYPRESSES
+#define DISABLE_RGB_MATRIX_SPLASH
+#define DISABLE_RGB_MATRIX_MULTISPLASH
+#define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#define DRIVER_ADDR_1 0b1010000
+#define DRIVER_ADDR_2 0b1010000 // this is here for compliancy reasons.
+
+#define DRIVER_COUNT 2
+
diff --git a/keyboards/dztech/dz40rgb/dz40rgb.c b/keyboards/dztech/dz40rgb/dz40rgb.c
new file mode 100644
index 0000000000..b1a03760f8
--- /dev/null
+++ b/keyboards/dztech/dz40rgb/dz40rgb.c
@@ -0,0 +1,297 @@
+#include "dz40rgb.h"
+#include "config.h"
+#if defined (split_space)
+const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
+/* Refer to IS31 manual for these locations
+ * driver
+ * | R location
+ * | | G location
+ * | | | B location
+ * | | | | */
+ {0, K_12, J_12, L_12},
+ {0, K_11, J_11, L_11},
+ {0, K_10, J_10, L_10},
+ {0, K_9, J_9, L_9},
+ {0, K_8, J_8, L_8},
+ {0, K_7, J_7, L_7},
+ {0, K_6, J_6, L_6},
+ {0, K_5, J_5, L_5},
+ {0, K_4, J_4, L_4},
+ {0, K_3, J_3, L_3},
+ {0, K_2, J_2, L_2},
+ {0, K_1, J_1, L_1},
+
+ {0, K_13, J_13, L_13},
+ {0, K_14, J_14, L_14},
+
+ {0, H_12, G_12, I_12},
+ {0, H_11, G_11, I_11},
+ {0, H_10, G_10, I_10},
+ {0, H_9, G_9, I_9},
+ {0, H_8, G_8, I_8},
+ {0, H_7, G_7, I_7},
+ {0, H_6, G_6, I_6},
+ {0, H_5, G_5, I_5},
+ {0, H_4, G_4, I_4},
+ {0, H_3, G_3, I_3},
+ {0, H_2, G_2, I_2},
+ {0, H_1, G_1, I_1},
+
+ {0, H_13, G_13, I_13},
+ {0, H_14, G_14, I_14},
+
+ {0, E_12, D_12, F_12},
+ {0, E_11, D_11, F_11},
+ {0, E_10, D_10, F_10},
+ {0, E_9, D_9, F_9},
+ {0, E_8, D_8, F_8},
+ {0, E_7, D_7, F_7},
+ {0, E_6, D_6, F_6},
+ {0, E_5, D_5, F_5},
+ {0, E_4, D_4, F_4},
+ {0, E_3, D_3, F_3},
+ {0, E_2, D_2, F_2},
+ {0, E_1, D_1, F_1},
+
+ {0, E_13, D_13, F_13},
+ {0, E_14, D_14, F_14},
+
+ {0, B_12, A_12, C_12},
+ {0, B_11, A_11, C_11},
+ {0, B_10, A_10, C_10},
+ {0, B_9, A_9, C_9},
+ {0, B_8, A_8, C_8},
+ {0, B_7, A_7, C_7},
+ {0, B_6, A_6, C_6},
+ {0, B_5, A_5, C_5},
+ {0, B_4, A_4, C_4},
+ {0, B_3, A_3, C_3},
+ {0, B_2, A_2, C_2},
+ {0, B_1, A_1, C_1}
+
+};
+
+const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = {
+
+ {{0|(11<<4)}, {20.36*11, 0}, 1},
+ {{0|(10<<4)}, {20.36*10, 0}, 1},
+ {{0|(9<<4)}, {20.36*9, 0}, 1},
+ {{0|(8<<4)}, {20.36*8, 0}, 1},
+ {{0|(7<<4)}, {20.36*7, 0}, 1},
+ {{0|(6<<4)}, { 20.36*6, 0}, 1},
+ {{0|(5<<4)}, { 20.36*5, 0}, 1},
+ {{0|(4<<4)}, { 20.36*4, 0}, 1},
+ {{0|(3<<4)}, { 20.36*3, 0}, 1},
+ {{0|(2<<4)}, { 20.36*2, 0}, 1},
+ {{0|(1<<4)}, { 20.36*1, 0}, 1},
+ {{0|(0<<4)}, { 20.36*0, 0}, 1},
+
+ {{0|(12<<4)}, {20.36*11, 21.33*0.5}, 1},
+ {{0|(13<<4)}, {20.36*0,21.33*0.5}, 1},
+
+ {{1|(11<<4)}, {20.36*11, 21.33}, 1},
+ {{1|(10<<4)}, {20.36*10, 21.33}, 0},
+ {{1|(9<<4)}, {20.36*9, 21.33}, 0},
+ {{1|(8<<4)}, {20.36*8, 21.33}, 0},
+ {{1|(7<<4)}, {20.36*7, 21.33}, 0},
+ {{1|(6<<4)}, { 20.36*6, 21.33}, 0},
+ {{1|(5<<4)}, { 20.36*5, 21.33}, 0},
+ {{1|(4<<4)}, { 20.36*4, 21.33}, 0},
+ {{1|(3<<4)}, { 20.36*3, 21.33}, 0},
+ {{1|(2<<4)}, { 20.36*2, 21.33}, 0},
+ {{1|(1<<4)}, { 20.36*1, 21.33}, 0},
+ {{1|(0<<4)}, { 20.36*0, 21.33}, 1},
+
+ {{1|(12<<4)}, {20.36*11, 21.33*1.5}, 1},
+ {{1|(13<<4)}, {20.36*0,21.33*1.5}, 1},
+
+ {{2|(11<<4)}, {20.36*11, 21.33*2}, 1},
+ {{2|(10<<4)}, {20.36*10, 21.33*2}, 0},
+ {{2|(9<<4)}, {20.36*9, 21.33*2}, 0},
+ {{2|(8<<4)}, {20.36*8, 21.33*2}, 0},
+ {{2|(7<<4)}, {20.36*7, 21.33*2}, 0},
+ {{2|(6<<4)}, { 20.36*6, 21.33*2}, 0},
+ {{2|(5<<4)}, { 20.36*5, 21.33*2}, 0},
+ {{2|(4<<4)}, { 20.36*4, 21.33*2}, 0},
+ {{2|(3<<4)}, { 20.36*3, 21.33*2}, 0},
+ {{2|(2<<4)}, { 20.36*2, 21.33*2}, 0},
+ {{2|(1<<4)}, { 20.36*1, 21.33*2}, 0},
+ {{2|(0<<4)}, { 20.36*0, 21.33*2}, 1},
+
+ {{2|(12<<4)}, {20.36*11, 21.33*2.5}, 1},
+ {{2|(13<<4)}, {20.36*0,21.33*2.5}, 1},
+
+ {{3|(11<<4)}, {20.36*11, 21.33*3}, 1},
+ {{3|(10<<4)}, {20.36*10, 21.33*3}, 1},
+ {{3|(9<<4)}, {20.36*9, 21.33*3}, 1},
+ {{3|(8<<4)}, {20.36*8, 21.33*3}, 1},
+ {{3|(7<<4)}, {20.36*7, 21.33*3}, 1},
+ {{3|(6<<4)}, { 20.36*6, 21.33*3}, 1},
+ {{3|(5<<4)}, { 20.36*5, 21.33*3}, 1},
+ {{3|(4<<4)}, { 20.36*4, 21.33*3}, 1},
+ {{3|(3<<4)}, { 20.36*3, 21.33*3}, 1},
+ {{3|(2<<4)}, { 20.36*2, 21.33*3}, 1},
+ {{3|(1<<4)}, { 20.36*1, 21.33*3}, 1},
+ {{3|(0<<4)}, { 20.36*0, 21.33*3}, 1}
+
+};
+#else
+const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
+/* Refer to IS31 manual for these locations
+ * driver
+ * | R location
+ * | | G location
+ * | | | B location
+ * | | | | */
+ {0, K_12, J_12, L_12},
+ {0, K_11, J_11, L_11},
+ {0, K_10, J_10, L_10},
+ {0, K_9, J_9, L_9},
+ {0, K_8, J_8, L_8},
+ {0, K_7, J_7, L_7},
+ {0, K_6, J_6, L_6},
+ {0, K_5, J_5, L_5},
+ {0, K_4, J_4, L_4},
+ {0, K_3, J_3, L_3},
+ {0, K_2, J_2, L_2},
+ {0, K_1, J_1, L_1},
+
+ {0, K_13, J_13, L_13},
+ {0, K_14, J_14, L_14},
+
+ {0, H_12, G_12, I_12},
+ {0, H_11, G_11, I_11},
+ {0, H_10, G_10, I_10},
+ {0, H_9, G_9, I_9},
+ {0, H_8, G_8, I_8},
+ {0, H_7, G_7, I_7},
+ {0, H_6, G_6, I_6},
+ {0, H_5, G_5, I_5},
+ {0, H_4, G_4, I_4},
+ {0, H_3, G_3, I_3},
+ {0, H_2, G_2, I_2},
+ {0, H_1, G_1, I_1},
+
+ {0, H_13, G_13, I_13},
+ {0, H_14, G_14, I_14},
+
+ {0, E_12, D_12, F_12},
+ {0, E_11, D_11, F_11},
+ {0, E_10, D_10, F_10},
+ {0, E_9, D_9, F_9},
+ {0, E_8, D_8, F_8},
+ {0, E_7, D_7, F_7},
+ {0, E_6, D_6, F_6},
+ {0, E_5, D_5, F_5},
+ {0, E_4, D_4, F_4},
+ {0, E_3, D_3, F_3},
+ {0, E_2, D_2, F_2},
+ {0, E_1, D_1, F_1},
+
+ {0, E_13, D_13, F_13},
+ {0, E_14, D_14, F_14},
+
+ {0, B_12, A_12, C_12},
+ {0, B_11, A_11, C_11},
+ {0, B_10, A_10, C_10},
+ {0, B_9, A_9, C_9},
+ {0, B_8, A_8, C_8},
+ {0, B_13, A_13, C_13},
+ {0, B_5, A_5, C_5},
+ {0, B_4, A_4, C_4},
+ {0, B_3, A_3, C_3},
+ {0, B_2, A_2, C_2},
+ {0, B_1, A_1, C_1}
+
+};
+
+const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = {
+
+ {{0|(11<<4)}, {20.36*11, 0}, 1},
+ {{0|(10<<4)}, {20.36*10, 0}, 1},
+ {{0|(9<<4)}, {20.36*9, 0}, 1},
+ {{0|(8<<4)}, {20.36*8, 0}, 1},
+ {{0|(7<<4)}, {20.36*7, 0}, 1},
+ {{0|(6<<4)}, { 20.36*6, 0}, 1},
+ {{0|(5<<4)}, { 20.36*5, 0}, 1},
+ {{0|(4<<4)}, { 20.36*4, 0}, 1},
+ {{0|(3<<4)}, { 20.36*3, 0}, 1},
+ {{0|(2<<4)}, { 20.36*2, 0}, 1},
+ {{0|(1<<4)}, { 20.36*1, 0}, 1},
+ {{0|(0<<4)}, { 20.36*0, 0}, 1},
+
+ {{0|(12<<4)}, {20.36*11, 21.33*0.5}, 1},
+ {{0|(13<<4)}, {20.36*0,21.33*0.5}, 1},
+
+ {{1|(11<<4)}, {20.36*11, 21.33}, 1},
+ {{1|(10<<4)}, {20.36*10, 21.33}, 0},
+ {{1|(9<<4)}, {20.36*9, 21.33}, 0},
+ {{1|(8<<4)}, {20.36*8, 21.33}, 0},
+ {{1|(7<<4)}, {20.36*7, 21.33}, 0},
+ {{1|(6<<4)}, { 20.36*6, 21.33}, 0},
+ {{1|(5<<4)}, { 20.36*5, 21.33}, 0},
+ {{1|(4<<4)}, { 20.36*4, 21.33}, 0},
+ {{1|(3<<4)}, { 20.36*3, 21.33}, 0},
+ {{1|(2<<4)}, { 20.36*2, 21.33}, 0},
+ {{1|(1<<4)}, { 20.36*1, 21.33}, 0},
+ {{1|(0<<4)}, { 20.36*0, 21.33}, 1},
+
+ {{1|(12<<4)}, {20.36*11, 21.33*1.5}, 1},
+ {{1|(13<<4)}, {20.36*0,21.33*1.5}, 1},
+
+ {{2|(11<<4)}, {20.36*11, 21.33*2}, 1},
+ {{2|(10<<4)}, {20.36*10, 21.33*2}, 0},
+ {{2|(9<<4)}, {20.36*9, 21.33*2}, 0},
+ {{2|(8<<4)}, {20.36*8, 21.33*2}, 0},
+ {{2|(7<<4)}, {20.36*7, 21.33*2}, 0},
+ {{2|(6<<4)}, { 20.36*6, 21.33*2}, 0},
+ {{2|(5<<4)}, { 20.36*5, 21.33*2}, 0},
+ {{2|(4<<4)}, { 20.36*4, 21.33*2}, 0},
+ {{2|(3<<4)}, { 20.36*3, 21.33*2}, 0},
+ {{2|(2<<4)}, { 20.36*2, 21.33*2}, 0},
+ {{2|(1<<4)}, { 20.36*1, 21.33*2}, 0},
+ {{2|(0<<4)}, { 20.36*0, 21.33*2}, 1},
+
+ {{2|(12<<4)}, {20.36*11, 21.33*2.5}, 1},
+ {{2|(13<<4)}, {20.36*0,21.33*2.5}, 1},
+
+ {{3|(11<<4)}, {20.36*11, 21.33*3}, 1},
+ {{3|(10<<4)}, {20.36*10, 21.33*3}, 1},
+ {{3|(9<<4)}, {20.36*9, 21.33*3}, 1},
+ {{3|(8<<4)}, {20.36*8, 21.33*3}, 1},
+ {{3|(7<<4)}, {20.36*7, 21.33*3}, 1},
+ {{3|(6<<4)}, { 20.36*5.5, 21.33*3}, 1},
+ {{3|(4<<4)}, { 20.36*4, 21.33*3}, 1},
+ {{3|(3<<4)}, { 20.36*3, 21.33*3}, 1},
+ {{3|(2<<4)}, { 20.36*2, 21.33*3}, 1},
+ {{3|(1<<4)}, { 20.36*1, 21.33*3}, 1},
+ {{3|(0<<4)}, { 20.36*0, 21.33*3}, 1}
+
+};
+#endif
+
+
+void matrix_init_kb(void) {
+ matrix_init_user();
+}
+
+
+void matrix_scan_kb(void) {
+ matrix_scan_user();
+}
+
+
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+ retu