summaryrefslogtreecommitdiffstats
path: root/keyboards/clueboard/66_hotswap
diff options
context:
space:
mode:
authorskullydazed <skullydazed@users.noreply.github.com>2019-02-23 17:25:25 -0800
committerMechMerlin <30334081+mechmerlin@users.noreply.github.com>2019-02-23 17:25:25 -0800
commit0f62383be57d2e3dacc79a76973295c73e805038 (patch)
treeed61dd8da62da9198c0a8268e2235a15f7014e46 /keyboards/clueboard/66_hotswap
parent539a6fc8255b5a9f0173dca0b9b6bd94c12a51f4 (diff)
Clueboard 66% Hotswap Support (#5204)
* Initial Clueboard 66% arm support * Fix LAYOUT_66_ansi * wip * Bring this branch up to date with led_matrix * Get Clueboard 66% hotswap working with led_matrix * stm32 cleanup * Fix compiling for clueboard 66% hotswap prototype * Reduce the size of the prototype firmware
Diffstat (limited to 'keyboards/clueboard/66_hotswap')
-rw-r--r--keyboards/clueboard/66_hotswap/66_hotswap.h4
-rw-r--r--keyboards/clueboard/66_hotswap/config.h1
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/chconf.h520
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/config.h158
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/gen1.c227
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/gen1.h104
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/halconf.h388
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/info.json11
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/led.c21
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/matrix.c160
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/mcuconf.h257
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/rules.mk70
-rw-r--r--keyboards/clueboard/66_hotswap/keymaps/default/keymap.c93
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/config.h55
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/prototype.c63
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/prototype.h86
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/rules.mk24
17 files changed, 2099 insertions, 143 deletions
diff --git a/keyboards/clueboard/66_hotswap/66_hotswap.h b/keyboards/clueboard/66_hotswap/66_hotswap.h
index 9367c26337..a1ea44841f 100644
--- a/keyboards/clueboard/66_hotswap/66_hotswap.h
+++ b/keyboards/clueboard/66_hotswap/66_hotswap.h
@@ -3,3 +3,7 @@
#ifdef KEYBOARD_clueboard_66_hotswap_gen1
#include "gen1.h"
#endif
+
+#ifdef KEYBOARD_clueboard_66_hotswap_prototype
+ #include "prototype.h"
+#endif
diff --git a/keyboards/clueboard/66_hotswap/config.h b/keyboards/clueboard/66_hotswap/config.h
index 88adb57378..2c265c9470 100644
--- a/keyboards/clueboard/66_hotswap/config.h
+++ b/keyboards/clueboard/66_hotswap/config.h
@@ -16,7 +16,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
-
#include "config_common.h"
/* USB Device descriptor parameter */
diff --git a/keyboards/clueboard/66_hotswap/gen1/chconf.h b/keyboards/clueboard/66_hotswap/gen1/chconf.h
new file mode 100644
index 0000000000..1d9f12ff1f
--- /dev/null
+++ b/keyboards/clueboard/66_hotswap/gen1/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/clueboard/66_hotswap/gen1/config.h b/keyboards/clueboard/66_hotswap/gen1/config.h
index d5d36d4a1c..6b0cfb60b5 100644
--- a/keyboards/clueboard/66_hotswap/gen1/config.h
+++ b/keyboards/clueboard/66_hotswap/gen1/config.h
@@ -1,44 +1,146 @@
-#pragma once
+/*
+ * Copyright 2017 skully <skullydazed@gmail.com>
+ *
+ * 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"
-#define PRODUCT_ID 0x2390
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xC1ED
+#define PRODUCT_ID 0x2391
#define DEVICE_VER 0x0001
+#define MANUFACTURER Clueboard
+
+/* 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
/* key matrix size */
#define MATRIX_ROWS 10
#define MATRIX_COLS 8
-/* ROWS: Top to bottom, COLS: Left to right
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
*/
-#define MATRIX_ROW_PINS { B2, C7, C6, B6, B5, B0, B3, D5, D3, D2 }
-#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, E6, B1 }
-#define UNUSED_PINS
+#define MATRIX_ROW_PINS { B11, A6, A3, A2, A1, B5, B6, C15, C14, C13 }
+#define MATRIX_COL_PINS { B10, B2, B1, B0, A7, B4, B3, B7 }
+#define UNUSED_PINS { A0, A8, A15, B12, B13, B14, B15 }
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 6
-/* Speaker configuration
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+//#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+//#define LOCKING_RESYNC_ENABLE
+
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
*/
-#define B7_AUDIO
-#define NO_MUSIC_MODE
-#define AUDIO_CLICKY
+//#define FORCE_NKRO
+
+/* key combination for magic key command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
-/* Backlight configuration
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
*/
-#define BACKLIGHT_LEVELS 1
-/* Underlight configuration
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+/*
+ * MIDI options
*/
-#define RGB_DI_PIN D7
-#define RGBLED_NUM 26 // Number of LEDs
-#define RGBLIGHT_HUE_STEP 32
-#define RGBLIGHT_SAT_STEP 17
-#define RGBLIGHT_VAL_STEP 17
-
-#define RGBLIGHT_ANIMATIONS
-#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
-#define RGBLIGHT_EFFECT_BREATHE_MAX 200
-#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 666*2
-#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1
-#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 4 // How many LEDs wide to light up
-#define RGBLIGHT_EFFECT_KNIGHT_OFFSET 16 // The led to start at
-#define RGBLIGHT_EFFECT_KNIGHT_LED_NUM 8 // How many LEDs to travel
-#define RGBLIGHT_EFFECT_SNAKE_LENGTH 4 // How many LEDs wide to light up
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+ /* Backlight configuration
+ */
+#define BACKLIGHT_LEVELS 10
+
+// This is a 7-bit address, that gets left-shifted and bit 0
+// set to 0 for write, 1 for read (as per I2C protocol)
+// The address will vary depending on your wiring:
+// 0b1110100 AD <-> GND
+// 0b1110111 AD <-> VCC
+// 0b1110101 AD <-> SCL
+// 0b1110110 AD <-> SDA
+#define LED_DRIVER_ADDR_1 0b1110100
+#define I2C1_BANK GPIOB
+#define I2C1_SCL 8
+#define I2C1_SDA 9
+
+#define LED_DRIVER_COUNT 1
+#define LED_DRIVER_LED_COUNT 71
diff --git a/keyboards/clueboard/66_hotswap/gen1/gen1.c b/keyboards/clueboard/66_hotswap/gen1/gen1.c
index 01f74bc50b..c70f223756 100644
--- a/keyboards/clueboard/66_hotswap/gen1/gen1.c
+++ b/keyboards/clueboard/66_hotswap/gen1/gen1.c
@@ -1,63 +1,186 @@
+/* Copyright 2017 Clueboard <info@clueboard.co>
+ *
+ * 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 "gen1.h"
-#include <avr/io.h>
-#include "backlight.h"
-#include "print.h"
+#include "is31fl3731-simple.h"
void matrix_init_kb(void) {
- // put your keyboard start-up code here
- // runs once when the firmware starts up
- matrix_init_user();
- led_init_ports();
-
- // JTAG disable for PORT F. write JTD bit twice within four cycles.
- MCUCR |= (1<<JTD);
- MCUCR |= (1<<JTD);
}
-
void matrix_scan_kb(void) {
- matrix_scan_user();
}
-void backlight_init_ports(void) {
- print("init_backlight_pin()\n");
- // Set our LED pins as output
- DDRD |= (1<<0); // Esc
- DDRD |= (1<<4); // Page Up
- DDRD |= (1<<1); // Arrows
-
- // Set our LED pins low
- PORTD &= ~(1<<0); // Esc
- PORTD &= ~(1<<4); // Page Up
- PORTD &= ~(1<<1); // Arrows
-}
+#ifdef LED_MATRIX_ENABLE
+const is31_led g_is31_leds[LED_DRIVER_LED_COUNT] = {
+/* Refer to IS31 manual for these locations
+ * driver
+ * | LED address
+ * | | */
+ {0, C1_1}, // k00 KC_GESC
+ {0, C1_2}, // k01 KC_1
+ {0, C1_3}, // k02 KC_2
+ {0, C1_4}, // k03 KC_3
+ {0, C1_5}, // k04 KC_4
+ {0, C1_6}, // k05 KC_5
+ {0, C1_7}, // k06 KC_6
+ {0, C1_8}, // k07 KC_7
+ {0, C1_9}, // k50 KC_8
+ {0, C1_10}, // k51 KC_9
+ {0, C1_11}, // k52 KC_0
+ {0, C1_12}, // k53 KC_MINS
+ {0, C1_13}, // k54 KC_EQL
+ {0, C1_14}, // k55 KC_BSPC
+ {0, C1_15}, // k57 KC_PGUP
+ {0, C2_1}, // k10 KC_TAB
+ {0, C2_2}, // k11 KC_Q
+ {0, C2_3}, // k12 KC_W
+ {0, C2_4}, // k13 KC_E
+ {0, C2_5}, // k14 KC_R
+ {0, C2_6}, // k15 KC_T
+ {0, C2_7}, // k16 KC_Y
+ {0, C2_8}, // k17 KC_U
+ {0, C2_9}, // k60 KC_I
+ {0, C2_10}, // k61 KC_O
+ {0, C2_11}, // k62 KC_P
+ {0, C2_12}, // k63 KC_LBRC
+ {0, C2_13}, // k64 KC_RBRC
+ {0, C2_14}, // k65 KC_BSLS
+ {0, C2_15}, // k67 KC_PGDN
+ {0, C3_1}, // k20 KC_CAPS
+ {0, C3_2}, // k21 KC_A
+ {0, C3_3}, // k22 KC_S
+ {0, C3_4}, // k23 KC_D
+ {0, C3_5}, // k24 KC_F
+ {0, C3_6}, // k25 KC_G
+ {0, C3_7}, // k26 KC_H
+ {0, C3_8}, // k27 KC_J
+ {0, C3_9}, // k70 KC_K
+ {0, C3_10}, // k71 KC_L
+ {0, C3_11}, // k72 KC_SCLN
+ {0, C3_12}, // k73 KC_QUOT
+ {0, C3_14}, // k75 KC_ENT
+ {0, C4_1}, // k30 KC_LSFT
+ {0, C4_3}, // k32 KC_Z
+ {0, C4_4}, // k33 KC_X
+ {0, C4_5}, // k34 KC_C
+ {0, C4_6}, // k35 KC_V
+ {0, C4_7}, // k36 KC_B
+ {0, C4_8}, // k37 KC_N
+ {0, C4_9}, // k80 KC_M
+ {0, C4_10}, // k81 KC_COMM
+ {0, C4_11}, // k82 KC_DOT
+ {0, C4_12}, // k83 KC_SLSH
+ {0, C4_13}, // k85 KC_RSFT
+ {0, C4_14}, // k86 KC_UP
+ {0, C5_1}, // k40 KC_LCTL
+ {0, C5_2}, // k41 KC_LGUI
+ {0, C5_3}, // k42 KC_LALT
+ {0, C5_4}, // Unassociated between LALT and SPACE_2.75
+ {0, C5_5}, // k45 KC_SPC SPACE_2.75
+ {0, C5_6}, // k45 KC_SPC SPACE_6.75
+ {0, C5_7}, // k46 KC_SPC SPACE_2.25
+ {0, C5_8}, // Unassociated between SPACE_2.25 and SPACE_1.25
+ {0, C5_9}, // k90 KC_RGUI
+ {0, C5_10}, // k92 KC_RALT
+ {0, C5_11}, // k93 MO(_FL)
+ {0, C5_12}, // k94 KC_RCTL
+ {0, C5_13}, // k95 KC_LEFT
+ {0, C5_14}, // k96 KC_DOWN
+ {0, C5_15} // k97 KC_RGHT
+};
-void backlight_set(uint8_t level) {
- if ( level == 0 ) {
- // Turn off light
- PORTD |= (1<<0); // Esc
- PORTD |= (1<<4); // Page Up
- PORTD |= (1<<1); // Arrows
- } else {
- // Turn on light
- PORTD &= ~(1<<0); // Esc
- PORTD &= ~(1<<4); // Page Up
- PORTD &= ~(1<<1); // Arrows
- }
-}
+const led_matrix g_leds[LED_DRIVER_LED_COUNT] = {
-void led_init_ports() {
- // * Set our LED pins as output
- DDRB |= (1<<4);
-}
+ /*{row | col << 4}
+ | LED_ROW_COL(row, col)
+ | | modifier
+ | | | */
+ {{0|(1<<4)}, {0, 0}, 1}, // k00 KC_GESC
+ {{0|(2<<4)}, {14.45, 0}, 0}, // k01 KC_1
+ {{0|(3<<4)}, {28.9, 0}, 0}, // k02 KC_2
+ {{0|(4<<4)}, {43.35, 0}, 0}, // k03 KC_3
+ {{0|(5<<4)}, {57.8, 0}, 0}, // k04 KC_4
+ {{0|(6<<4)}, {72.25, 0}, 0}, // k05 KC_5
+ {{0|(7<<4)}, {86.7, 0}, 0}, // k06 KC_6
+ {{0|(8<<4)}, {101.2, 0}, 0}, // k07 KC_7
+ {{0|(9<<4)}, {115.6, 0}, 0}, // k50 KC_8
+ {{0|(10<<4)}, {130, 0}, 0}, // k51 KC_9
+ {{0|(11<<4)}, {144.5, 0}, 0}, // k52 KC_0
+ {{0|(12<<4)}, {159, 0}, 0}, // k53 KC_MINS
+ {{0|(13<<4)}, {173.4, 0}, 0}, // k54 KC_EQL
+ {{0|(14<<4)}, {195.1, 0}, 1}, // k55 KC_BSPC
+ {{0|(15<<4)}, {224, 0}, 1}, // k57 KC_PGUP
-void led_set_kb(uint8_t usb_led) {
- DDRB |= (1<<4);
- if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
- // Turn capslock on
- PORTB |= (1<<4);
- } else {
- // Turn c