]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Clueboard 66% Hotswap Support (#5204)
authorskullydazed <skullydazed@users.noreply.github.com>
Sun, 24 Feb 2019 01:25:25 +0000 (17:25 -0800)
committerMechMerlin <30334081+mechmerlin@users.noreply.github.com>
Sun, 24 Feb 2019 01:25:25 +0000 (17:25 -0800)
* 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

17 files changed:
keyboards/clueboard/66_hotswap/66_hotswap.h
keyboards/clueboard/66_hotswap/config.h
keyboards/clueboard/66_hotswap/gen1/chconf.h [new file with mode: 0644]
keyboards/clueboard/66_hotswap/gen1/config.h
keyboards/clueboard/66_hotswap/gen1/gen1.c
keyboards/clueboard/66_hotswap/gen1/gen1.h
keyboards/clueboard/66_hotswap/gen1/halconf.h [new file with mode: 0644]
keyboards/clueboard/66_hotswap/gen1/info.json [new file with mode: 0644]
keyboards/clueboard/66_hotswap/gen1/led.c [new file with mode: 0644]
keyboards/clueboard/66_hotswap/gen1/matrix.c [new file with mode: 0644]
keyboards/clueboard/66_hotswap/gen1/mcuconf.h [new file with mode: 0644]
keyboards/clueboard/66_hotswap/gen1/rules.mk
keyboards/clueboard/66_hotswap/keymaps/default/keymap.c
keyboards/clueboard/66_hotswap/prototype/config.h [new file with mode: 0644]
keyboards/clueboard/66_hotswap/prototype/prototype.c [new file with mode: 0644]
keyboards/clueboard/66_hotswap/prototype/prototype.h [new file with mode: 0644]
keyboards/clueboard/66_hotswap/prototype/rules.mk [new file with mode: 0644]

index 9367c26337ba5f1828c287c6854bf96a94cc5eaf..a1ea44841f3a159443d35fe49216f1e4b0471ef3 100644 (file)
@@ -3,3 +3,7 @@
 #ifdef KEYBOARD_clueboard_66_hotswap_gen1
     #include "gen1.h"
 #endif
+
+#ifdef KEYBOARD_clueboard_66_hotswap_prototype
+    #include "prototype.h"
+#endif
index 88adb57378d34c91cf4a0678a97c2c9a72aaf84c..2c265c9470ad8b7cf7ee547a82eb96a983929022 100644 (file)
@@ -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 (file)
index 0000000..1d9f12f
--- /dev/null
@@ -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 */
+
+/** @} */
index d5d36d4a1c2e02b8c7eca4e01e5ca5a511bf202d..6b0cfb60b53cf48c6357dee48403b0d2ded2ea63 100644 (file)
-#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
index 01f74bc50bcbb56e991f7408576f594a24daaa30..c70f223756caf5b7e4360a0ec8af90d1e73459db 100644 (file)
+/* 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 capslock off
-        PORTB &= ~(1<<4);
-    }
-}
+    {{1|(0<<4)},   {3.6125, 16}, 1},     // k10 KC_TAB
+    {{1|(1<<4)},   {21.675, 16}, 0},     // k11 KC_Q
+    {{1|(2<<4)},   {36.125, 16}, 0},     // k12 KC_W
+    {{1|(3<<4)},   {50.575, 16}, 0},     // k13 KC_E
+    {{1|(4<<4)},   {65.025, 16}, 0},     // k14 KC_R
+    {{1|(5<<4)},   {79.475, 16}, 0},     // k15 KC_T
+    {{1|(6<<4)},   {93.925, 16}, 0},     // k16 KC_Y
+    {{1|(7<<4)},   {108.375, 16}, 0},    // k17 KC_U
+    {{1|(8<<4)},   {122.825, 16}, 0},    // k60 KC_I
+    {{1|(9<<4)},   {137.275, 16}, 0},    // k61 KC_O
+    {{1|(10<<4)},  {151.725, 16}, 0},    // k62 KC_P
+    {{1|(11<<4)},  {166.175, 16}, 0},    // k63 KC_LBRC
+    {{1|(12<<4)},  {180.625, 16}, 0},    // k64 KC_RBRC
+    {{1|(13<<4)},  {198.6875, 16}, 1},   // k65 KC_BSLS
+    {{1|(14<<4)},  {224, 16}, 1},        // k67 KC_PGDN
+
+    {{2|(0<<4)},   {5.41875, 32}, 1},    // k20 KC_CAPS
+    {{2|(1<<4)},   {25.2875, 32}, 0},    // k21 KC_A
+    {{2|(2<<4)},   {39.7375, 32}, 0},    // k22 KC_S
+    {{2|(3<<4)},   {54.1875, 32}, 0},    // k23 KC_D
+    {{2|(4<<4)},   {68.6375, 32}, 0},    // k24 KC_F
+    {{2|(5<<4)},   {83.0875, 32}, 0},    // k25 KC_G
+    {{2|(6<<4)},   {97.5375, 32}, 0},    // k26 KC_H
+    {{2|(7<<4)},   {111.9875, 32}, 0},   // k27 KC_J
+    {{2|(8<<4)},   {126.4375, 32}, 0},   // k70 KC_K
+    {{2|(9<<4)},   {140.8875, 32}, 0},   // k71 KC_L
+    {{2|(10<<4)},  {155.3375, 32}, 0},   // k72 KC_SCLN
+    {{2|(11<<4)},  {169.7875, 32}, 0},   // k73 KC_QUOT
+    {{2|(12<<4)},  {184.2375, 32}, 1},   // k75 KC_ENT
+
+    {{3|(0<<4)},   {16.25625, 48}, 1},   // k30 KC_LSFT
+    {{3|(1<<4)},   {32.5125, 48}, 0},    // k32 KC_Z
+    {{3|(2<<4)},   {46.9625, 48}, 0},    // k33 KC_X
+    {{3|(3<<4)},   {61.4125, 48}, 0},    // k34 KC_C
+    {{3|(4<<4)},   {75.8625, 48}, 0},    // k35 KC_V
+    {{3|(5<<4)},   {90.3125, 48}, 0},    // k36 KC_B
+    {{3|(6<<4)},   {104.7625, 48}, 0},   // k37 KC_N
+    {{3|(7<<4)},   {119.2125, 48}, 0},   // k80 KC_M
+    {{3|(8<<4)},   {133.6625, 48}, 0},   // k81 KC_COMM
+    {{3|(9<<4)},   {148.1125, 48}, 0},   // k82 KC_DOT
+    {{3|(10<<4)},  {162.5625, 48}, 0},   // k83 KC_SLSH
+    {{3|(11<<4)},  {187.85, 48}, 1},     // k85 KC_RSFT
+    {{3|(12<<4)},  {209.525, 48}, 1},    // k86 KC_UP
+
+    {{4|(0<<4)},   {9.03125, 64}, 1},    // k40 KC_LCTL
+    {{4|(1<<4)},   {27.09375, 64}, 1},   // k41 KC_LGUI
+    {{4|(2<<4)},   {45.15625, 64}, 1},   // k42 KC_LALT
+    {{4|(3<<4)},   {59.45, 64}, 1},      // Unassociated between LALT and SPACE_2.75
+    {{4|(4<<4)},   {73.9, 64}, 1},       // k45 KC_SPC SPACE_2.75
+    {{4|(5<<4)},   {88.35, 64}, 1},      // k45 KC_SPC SPACE_6.25
+    {{4|(6<<4)},   {102.8, 64}, 1},      // k46 KC_SPC SPACE_2.25
+    {{4|(7<<4)},   {117.40625, 64}, 1},  // Unassociated between SPACE_2.25 and SPACE_2.75
+    {{4|(8<<4)},   {135.46875, 64}, 1},  // k90 KC_RGUI
+    {{4|(9<<4)},   {153.53125, 64}, 1},  // k92 KC_RALT
+    {{4|(10<<4)},  {167.98125, 64}, 1},  // k93 MO(_FL)
+    {{4|(11<<4)},  {186.04375, 64}, 1},  // k94 KC_RCTL
+    {{4|(12<<4)},  {195.075, 64}, 1},    // k95 KC_LEFT
+    {{4|(13<<4)},  {209.525, 64}, 1},    // k96 KC_DOWN
+    {{4|(14<<4)},  {224, 64}, 1}         // k97 KC_RGHT
+};
+#endif
index e71994f9c0dc5054b037a67a969820bd7e739fdb..05adf49831e26cab04594822197c1ec74fb70601 100644 (file)
@@ -1,67 +1,89 @@
+/* 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/>.
+ */
 #pragma once
 #include "quantum.h"
 
+/*
+ * These are shortcuts to help you work with the various layout options. If your 
+ * keymap works with one of the LAYOUT_...() macros you are encouraged to use that
+ * and to contribute your keymap to the corresponding layout in 
+ * `qmk_firmware/layouts/community`.
+ */
+
 /* Clueboard matrix layout
  * ,-----------------------------------------------------------.  ,---.
- * | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54|     56|  | 57|
+ * | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54|   56  |  | 57|
  * |-----------------------------------------------------------|  |---|
  * |   10| 11| 12| 13| 14| 15| 16| 17| 60| 61| 62| 63| 64|   65|  | 67|
  * |-----------------------------------------------------------|  `---'
  * |    20| 21| 22| 23| 24| 25| 26| 27| 70| 71| 72| 73|      75|
- * |-------------------------------------------------------------.
- * |      30| 32| 33| 34| 35| 36| 37| 80| 81| 82| 83|      85| 86|
- * |-----------------------------------------------------------------.
- * |  40|  41|  42|        45|      46|  90|  92| 93|  94| 95| 96| 97|
- * `-----------------------------------------------------------------'
+ * |--------------------------------------------------------------.
+ * |  30    | 32| 33| 34| 35| 36| 37| 80| 81| 82| 83|      85  |86|
+ * |------------------------------------------------------------------.
+ * |  40| 41|  42|        45|       46|   90|  92|  93|  94| 95|96| 97|
+ * `------------------------------------------------------------------'
  * ,-----------------------------------------------------------.  ,---.
  * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backsp |  |Ins|
  * |-----------------------------------------------------------|  |---|
  * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|    \|  |Del|
  * |-----------------------------------------------------------|  `---'
  * |Caps  |  A|  S|  D|  F|  G|  H|  J|  k|  L|  ;|  '|Enter   |
- * |-------------------------------------------------------------.
- * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift   |Up |
- * |-----------------------------------------------------------------.
- * |Ctrl|Alt |Gui |     Space|   Space|Gui |Alt |Fn |Ctrl|Lft|Dwn|Rgt|
- * `-----------------------------------------------------------------'
+ * |--------------------------------------------------------------.
+ * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|    Shift| Up|
+ * |------------------------------------------------------------------.
+ * |Ctrl|Alt|Gui |     Space|  Space|Gui |Alt |Fn  |Ctrl|Left|Down|Rgt|
+ * `------------------------------------------------------------------'
  */
 // The first section contains all of the arguments
 // The second converts the arguments into a two-dimensional array
 
 #define LAYOUT( \
-    k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54,    k56,   k57, \
-    k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64,    k65,   k67, \
-    k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73,         k75,        \
-    k30,      k32, k33, k34, k35, k36, k37, k80, k81, k82, k83,      k85, k86,      \
-    k40, k41, k42,           k45, k46,      k90,      k92, k93, k94, k95, k96, k97  \
+    k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54,    k55,   k57, \
+    k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65,      k67, \
+    k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73,    k75, \
+    k30,      k32, k33, k34, k35, k36, k37, k80, k81, k82, k83,      k85, k86, \
+    k40, k41, k42,           k45, k46,      k90,      k92, k93, k94, k95, k96, k97 \
 ) { \
-    { k00,    k01,    k02,    k03,    k04,    k05,    k06,    k07   }, \
-    { k10,    k11,    k12,    k13,    k14,    k15,    k16,    k17   }, \
-    { k20,    k21,    k22,    k23,    k24,    k25,    k26,    k27   }, \
-    { k30,    KC_NO,  k32,    k33,    k34,    k35,    k36,    k37   }, \
-    { k40,    k41,    k42,    KC_NO,  KC_NO,  k45,    k46,    KC_NO }, \
-    { k50,    k51,    k52,    k53,    k54,    KC_NO,  k56,    k57   }, \
-    { k60,    k61,    k62,    k63,    k64,    k65,    KC_NO,  k67   }, \
-    { k70,    k71,    k72,    k73,    KC_NO,  k75,    KC_NO,  KC_NO }, \
-    { k80,    k81,    k82,    k83,    KC_NO,  k85,    k86,    KC_NO }, \
-    { k90,    KC_NO,  k92,    k93,    k94,    k95,    k96,    k97   }  \
+    { k00, k01, k02, k03, k04, k05, k06, k07 }, \
+    { k10, k11, k12, k13, k14, k15, k16, k17 }, \
+    { k20, k21, k22, k23, k24, k25, k26, k27 }, \
+    { k30, KC_NO, k32, k33, k34, k35, k36, k37 }, \
+    { k40, k41, k42, KC_NO, KC_NO, k45, k46, KC_NO }, \
+    { k50, k51, k52, k53, k54, k55, KC_NO, k57 }, \
+    { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
+    { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
+    { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
+    { k90, KC_NO, k92, k93, k94, k95, k96, k97 }  \
 }
 
 #define LAYOUT_66_ansi( \
-    k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54,    k56,   k57, \
-    k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64,    k65,   k67, \
-    k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73,         k75,        \
-    k30,      k32, k33, k34, k35, k36, k37, k80, k81, k82, k83,      k85, k86,      \
-    k40, k41, k42,                k46,                k92, k93, k94, k95, k96, k97  \
+    k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54,    k55,   k57, \
+    k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65,      k67, \
+    k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73,    k75, \
+    k30,      k32, k33, k34, k35, k36, k37, k80, k81, k82, k83,    k85,   k86, \
+    k40, k41, k42,                k46,                k92, k93, k94, k95, k96, k97 \
 ) { \
-    { k00,    k01,    k02,    k03,    k04,    k05,    k06,    k07   }, \
-    { k10,    k11,    k12,    k13,    k14,    k15,    k16,    k17   }, \
-    { k20,    k21,    k22,    k23,    k24,    k25,    k26,    k27   }, \
-    { k30,    KC_NO,  k32,    k33,    k34,    k35,    k36,    k37   }, \
-    { k40,    k41,    k42,    KC_NO,  KC_NO,  KC_NO,  k46,    KC_NO }, \
-    { k50,    k51,    k52,    k53,    k54,    KC_NO,  k56,    k57   }, \
-    { k60,    k61,    k62,    k63,    k64,    k65,    KC_NO,  k67   }, \
-    { k70,    k71,    k72,    k73,    KC_NO,  k75,    KC_NO,  KC_NO }, \
-    { k80,    k81,    k82,    k83,    KC_NO,  k85,    k86,    KC_NO }, \
-    { KC_NO,  KC_NO,  k92,    k93,    k94,    k95,    k96,    k97   }  \
+    { k00, k01, k02, k03, k04, k05, k06, k07 }, \
+    { k10, k11, k12, k13, k14, k15, k16, k17 }, \
+    { k20, k21, k22, k23, k24, k25, k26, k27 }, \
+    { k30, KC_NO, k32, k33, k34, k35, k36, k37 }, \
+    { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO }, \
+    { k50, k51, k52, k53, k54, k55, KC_NO, k57 }, \
+    { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
+    { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
+    { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
+    { KC_NO, KC_NO, k92, k93, k94, k95, k96, k97 }  \
 }
diff --git a/keyboards/clueboard/66_hotswap/gen1/halconf.h b/keyboards/clueboard/66_hotswap/gen1/halconf.h
new file mode 100644 (file)
index 0000000..eda293c
--- /dev/null
@@ -0,0 +1,388 @@
+/*
+    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/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
+
+#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 DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC                 TRUE
+#endif
+
+/**
+ * @brief   Enables the EXT subsystem.
+ */
+#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)
+#define HAL_USE_EXT                 FALSE
+#endif
+
+/**
+ * @brief   Enables the GPT subsystem.
+ */
+#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
+#define HAL_USE_GPT                 TRUE
+#endif
+
+/**
+ * @brief   Enables the I2C subsystem.
+ */
+#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
+#define HAL_USE_I2C                 TRUE
+#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 QSPI subsystem.
+ */
+#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__)
+#define HAL_USE_QSPI                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 SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI                 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
+
+/*===========================================================================*/
+/* 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
+
+/*===========================================================================*/
+/* 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 an event sources for incoming packets.
+ */
+#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
+
+/*===========================================================================*/
+/* 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 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
+
+/*===========================================================================*/
+/* 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
+
+#endif /* HALCONF_H */
+
+/** @} */
diff --git a/keyboards/clueboard/66_hotswap/gen1/info.json b/keyboards/clueboard/66_hotswap/gen1/info.json
new file mode 100644 (file)
index 0000000..bab110f
--- /dev/null
@@ -0,0 +1,11 @@
+{
+  "layouts": {
+    "LAYOUT": {
+      "layout": [{"x": 0, "y": 0, "w": 1, "label": "GRAVE"}, {"x": 1, "y": 0, "w": 1, "label": "1"}, {"x": 2, "y": 0, "w": 1, "label": "2"}, {"x": 3, "y": 0, "w": 1, "label": "3"}, {"x": 4, "y": 0, "w": 1, "label": "4"}, {"x": 5, "y": 0, "w": 1, "label": "5"}, {"x": 6, "y": 0, "w": 1, "label": "6"}, {"x": 7, "y": 0, "w": 1, "label": "7"}, {"x": 8, "y": 0, "w": 1, "label": "8"}, {"x": 9, "y": 0, "w": 1, "label": "9"}, {"x": 10, "y": 0, "w": 1, "label": "0"}, {"x": 11, "y": 0, "w": 1, "label": "DASH"}, {"x": 12, "y": 0, "w": 1, "label": "EQUALSIGN"}, {"x": 13, "y": 0, "w": 1, "label": "YEN"}, {"x": 14, "y": 0, "w": 1, "label": "BACKSPACE"}, {"x": 15.5, "y": 0, "w": 1, "label": "PAGEUP"}, {"x": 0, "y": 1, "w": 1.5, "label": "TAB"}, {"x": 1.5, "y": 1, "w": 1, "label": "Q"}, {"x": 2.5, "y": 1, "w": 1, "label": "W"}, {"x": 3.5, "y": 1, "w": 1, "label": "E"}, {"x": 4.5, "y": 1, "w": 1, "label": "R"}, {"x": 5.5, "y": 1, "w": 1, "label": "T"}, {"x": 6.5, "y": 1, "w": 1, "label": "Y"}, {"x": 7.5, "y": 1, "w": 1, "label": "U"}, {"x": 8.5, "y": 1, "w": 1, "label": "I"}, {"x": 9.5, "y": 1, "w": 1, "label": "O"}, {"x": 10.5, "y": 1, "w": 1, "label": "P"}, {"x": 11.5, "y": 1, "w": 1, "label": "LBRACKET"}, {"x": 12.5, "y": 1, "w": 1, "label": "RBRACKET"}, {"x": 13.5, "y": 1, "w": 1.5, "label": "BACKSLASH"}, {"x": 15.5, "y": 1, "w": 1, "label": "PAGEDOWN"}, {"x": 0, "y": 2, "w": 1.75, "label": "CAPSLOCK"}, {"x": 1.75, "y": 2, "w": 1, "label": "A"}, {"x": 2.75, "y": 2, "w": 1, "label": "S"}, {"x": 3.75, "y": 2, "w": 1, "label": "D"}, {"x": 4.75, "y": 2, "w": 1, "label": "F"}, {"x": 5.75, "y": 2, "w": 1, "label": "G"}, {"x": 6.75, "y": 2, "w": 1, "label": "H"}, {"x": 7.75, "y": 2, "w": 1, "label": "J"}, {"x": 8.75, "y": 2, "w": 1, "label": "K"}, {"x": 9.75, "y": 2, "w": 1, "label": "L"}, {"x": 10.75, "y": 2, "w": 1, "label": "SEMICOLON"}, {"x": 11.75, "y": 2, "w": 1, "label": "QUOTE"}, {"x": 13.75, "y": 2, "w": 1.25, "label": "ENTER"}, {"x": 0, "y": 3, "w": 1.25, "label": "LSHIFT"}, {"x": 2.25, "y": 3, "w": 1, "label": "Z"}, {"x": 3.25, "y": 3, "w": 1, "label": "X"}, {"x": 4.25, "y": 3, "w": 1, "label": "C"}, {"x": 5.25, "y": 3, "w": 1, "label": "V"}, {"x": 6.25, "y": 3, "w": 1, "label": "B"}, {"x": 7.25, "y": 3, "w": 1, "label": "N"}, {"x": 8.25, "y": 3, "w": 1, "label": "M"}, {"x": 9.25, "y": 3, "w": 1, "label": "COMMA"}, {"x": 10.25, "y": 3, "w": 1, "label": "PERIOD"}, {"x": 11.25, "y": 3, "w": 1, "label": "SLASH"}, {"x": 13.25, "y": 3, "w": 1.25, "label": "RSHIFT"}, {"x": 14.5, "y": 3, "w": 1, "label": "UP"}, {"x": 0, "y": 4, "w": 1.25, "label": "LCTRL"}, {"x": 1.25, "y": 4, "w": 1, "label": "LALT"}, {"x": 2.25, "y": 4, "w": 1.25, "label": "LCMD"}, {"x": 3.5, "y": 4, "w": 1.25, "label": "MUHENKAN"}, {"x": 4.75, "y": 4, "w": 2, "label": "SPACE1"}, {"x": 6.75, "y": 4, "w": 2, "label": "SPACE2"}, {"x": 8.75, "y": 4, "w": 1.25, "label": "HENKAN"}, {"x": 10, "y": 4, "w": 1.25, "label": "RCMD"}, {"x": 11.25, "y": 4, "w": 1, "label": "RCTRL"}, {"x": 12.25, "y": 4, "w": 1.25, "label": "FN"}, {"x": 13.5, "y": 4, "w": 1, "label": "LEFT"}, {"x": 14.5, "y": 4, "w": 1, "label": "DOWN"}, {"x": 15.5, "y": 4, "w": 1, "label": "RIGHT"}]
+    },
+
+    "LAYOUT_66_ansi": {
+      "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"x":15.5, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"x":15.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.25}, {"x":14.5, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4}, {"label":"Menu", "x":12.25, "y":4, "w":1.25}, {"x":13.5, "y":4}, {"x":14.5, "y":4}, {"x":15.5, "y":4}]
+    }
+  }
+}
diff --git a/keyboards/clueboard/66_hotswap/gen1/led.c b/keyboards/clueboard/66_hotswap/gen1/led.c
new file mode 100644 (file)
index 0000000..efbf532
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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/>.
+*/
+
+#include "hal.h"
+#include "backlight.h"
+#include "led.h"
+#include "printf.h"
diff --git a/keyboards/clueboard/66_hotswap/gen1/matrix.c b/keyboards/clueboard/66_hotswap/gen1/matrix.c
new file mode 100644 (file)
index 0000000..c3e59b5
--- /dev/null
@@ -0,0 +1,160 @@
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+#include "hal.h"
+#include "timer.h"
+#include "wait.h"
+#include "printf.h"
+#include "backlight.h"
+#include "matrix.h"
+#include "action.h"
+#include "keycode.h"
+#include <string.h>
+
+/*
+ * #define MATRIX_ROW_PINS { PB11, PA6, PA3, PA2, PA1, PB5, PB6, PC15, PC14, PC13 }
+ * #define MATRIX_COL_PINS { PB10, PB2, PB1, PB0, PA7, PB4, PB3, PB7 }
+ */
+/* matrix state(1:on, 0:off) */
+static matrix_row_t matrix[MATRIX_ROWS];
+static matrix_row_t matrix_debouncing[MATRIX_COLS];
+static bool debouncing = false;
+static uint16_t debouncing_time = 0;
+
+__attribute__ ((weak))
+void matrix_init_user(void) {}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {}
+
+__attribute__ ((weak))
+void matrix_init_kb(void) {
+  matrix_init_user();
+}
+
+__attribute__ ((weak))
+void matrix_scan_kb(void) {
+  matrix_scan_user();
+}
+
+void matrix_init(void) {
+    printf("matrix init\n");
+    //debug_matrix = true;
+
+    // actual matrix setup
+    palSetPadMode(GPIOB, 10, PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOB, 2, PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOB, 1,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOB, 0,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOA, 7,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOB, 4,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOB, 3,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOB, 7,  PAL_MODE_OUTPUT_PUSHPULL);
+
+    palSetPadMode(GPIOB, 11, PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOA, 6,  PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOA, 3,  PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOA, 2, PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOA, 1, PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOB, 5, PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOB, 6, PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOC, 15,  PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOC, 14,  PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOC, 13,  PAL_MODE_INPUT_PULLDOWN);
+
+    memset(matrix, 0, MATRIX_ROWS * sizeof(matrix_row_t));
+    memset(matrix_debouncing, 0, MATRIX_COLS * sizeof(matrix_row_t));
+
+    matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void) {
+    // actual matrix
+    for (int col = 0; col < MATRIX_COLS; col++) {
+        matrix_row_t data = 0;
+
+        // strobe col { PB10, PB2, PB1, PB0, PA7, PB4, PB3, PB7 }
+        switch (col) {
+            case 0: palSetPad(GPIOB, 10); break;
+            case 1: palSetPad(GPIOB, 2); break;
+            case 2: palSetPad(GPIOB, 1); break;
+            case 3: palSetPad(GPIOB, 0); break;
+            case 4: palSetPad(GPIOA, 7); break;
+            case 5: palSetPad(GPIOB, 4); break;
+            case 6: palSetPad(GPIOB, 3); break;
+            case 7: palSetPad(GPIOB, 7); break;
+        }
+
+        // need wait to settle pin state
+        wait_us(20);
+
+        // read row data { PB11, PA6, PA3, PA2, PA1, PB5, PB6, PC15, PC14, PC13 }
+        data = (
+            (palReadPad(GPIOB, 11) << 0 ) |
+            (palReadPad(GPIOA, 6)  << 1 ) |
+            (palReadPad(GPIOA, 3)  << 2 ) |
+            (palReadPad(GPIOA, 2) << 3 ) |
+            (palReadPad(GPIOA, 1) << 4 ) |
+            (palReadPad(GPIOB, 5) << 5 ) |
+            (palReadPad(GPIOB, 6) << 6 ) |
+            (palReadPad(GPIOC, 15)  << 7 ) |
+            (palReadPad(GPIOC, 14)  << 8 ) |
+            (palReadPad(GPIOC, 13)  << 9 )
+        );
+
+        // unstrobe  col { B11, B10, B2, B1, A7, B0 }
+        switch (col) {
+            case 0: palClearPad(GPIOB, 10); break;
+            case 1: palClearPad(GPIOB, 2); break;
+            case 2: palClearPad(GPIOB, 1); break;
+            case 3: palClearPad(GPIOB, 0); break;
+            case 4: palClearPad(GPIOA, 7); break;
+            case 5: palClearPad(GPIOB, 4); break;
+            case 6: palClearPad(GPIOB, 3); break;
+            case 7: palClearPad(GPIOB, 7); break;
+        }
+
+        if (matrix_debouncing[col] != data) {
+            matrix_debouncing[col] = data;
+            debouncing = true;
+            debouncing_time = timer_read();
+        }
+    }
+
+    if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
+        for (int row = 0; row < MATRIX_ROWS; row++) {
+            matrix[row] = 0;
+            for (int col = 0; col < MATRIX_COLS; col++) {
+                matrix[row] |= ((matrix_debouncing[col] & (1 << row) ? 1 : 0) << col);
+            }
+        }
+        debouncing = false;
+    }
+
+    matrix_scan_quantum();
+
+    return 1;
+}
+
+bool matrix_is_on(uint8_t row, uint8_t col) {
+    return (matrix[row] & (1<<col));
+}
+
+matrix_row_t matrix_get_row(uint16_t row) {
+    return matrix[row];
+}
+
+void matrix_print(void) {
+    printf("\nr/c 01234567\n");
+    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+        printf("%X0: ", row);
+        matrix_row_t data = matrix_get_row(row);
+        for (int col = 0; col < MATRIX_COLS; col++) {
+            if (data & (1<<col))
+                printf("1");
+            else
+                printf("0");
+        }
+        printf("\n");
+    }
+}
diff --git a/keyboards/clueboard/66_hotswap/gen1/mcuconf.h b/keyboards/clueboard/66_hotswap/gen1/mcuconf.h
new file mode 100644 (file)
index 0000000..226da48
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+    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.
+*/
+
+#ifndef MCUCONF_H
+#define MCUCONF_H
+
+/*
+ * STM32F3xx 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:
+ * 15...0       Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3        Lowest...Highest.
+ */
+
+#define STM32F3xx_MCUCONF
+
+/*
+ * 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_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                  9
+#define STM32_HPRE                          STM32_HPRE_DIV1
+#define STM32_PPRE1                         STM32_PPRE1_DIV2
+#define STM32_PPRE2                         STM32_PPRE2_DIV2
+#define STM32_MCOSEL                        STM32_MCOSEL_NOCLOCK
+#define STM32_ADC12PRES                     STM32_ADC12PRES_DIV1
+#define STM32_ADC34PRES                     STM32_ADC34PRES_DIV1
+#define STM32_USART1SW                      STM32_USART1SW_PCLK
+#define STM32_USART2SW                      STM32_USART2SW_PCLK
+#define STM32_USART3SW                      STM32_USART3SW_PCLK
+#define STM32_UART4SW                       STM32_UART4SW_PCLK
+#define STM32_UART5SW                       STM32_UART5SW_PCLK
+#define STM32_I2C1SW                        STM32_I2C1SW_SYSCLK
+#define STM32_I2C2SW                        STM32_I2C2SW_SYSCLK
+#define STM32_TIM1SW                        STM32_TIM1SW_PCLK2
+#define STM32_TIM8SW                        STM32_TIM8SW_PCLK2
+#define STM32_RTCSEL                        STM32_RTCSEL_LSI
+#define STM32_USB_CLOCK_REQUIRED            TRUE
+#define STM32_USBPRE                        STM32_USBPRE_DIV1P5
+
+#undef STM32_HSE_BYPASS
+// #error "oh no"
+// #endif
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_DUAL_MODE                 FALSE
+#define STM32_ADC_COMPACT_SAMPLES           FALSE
+#define STM32_ADC_USE_ADC1                  FALSE
+#define STM32_ADC_USE_ADC2                  FALSE
+#define STM32_ADC_USE_ADC3                  FALSE
+#define STM32_ADC_USE_ADC4                  FALSE
+#define STM32_ADC_ADC1_DMA_STREAM           STM32_DMA_STREAM_ID(1, 1)
+#define STM32_ADC_ADC2_DMA_STREAM           STM32_DMA_STREAM_ID(2, 1)
+#define STM32_ADC_ADC3_DMA_STREAM           STM32_DMA_STREAM_ID(2, 5)
+#define STM32_ADC_ADC4_DMA_STREAM           STM32_DMA_STREAM_ID(2, 2)
+#define STM32_ADC_ADC1_DMA_PRIORITY         2
+#define STM32_ADC_ADC2_DMA_PRIORITY         2
+#define STM32_ADC_ADC3_DMA_PRIORITY         2
+#define STM32_ADC_ADC4_DMA_PRIORITY         2
+#define STM32_ADC_ADC12_IRQ_PRIORITY        5
+#define STM32_ADC_ADC3_IRQ_PRIORITY         5
+#define STM32_ADC_ADC4_IRQ_PRIORITY         5
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY     5
+#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY     5
+#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY     5
+#define STM32_ADC_ADC4_DMA_IRQ_PRIORITY     5
+#define STM32_ADC_ADC12_CLOCK_MODE          ADC_CCR_CKMODE_AHB_DIV1
+#define STM32_ADC_ADC34_CLOCK_MODE          ADC_CCR_CKMODE_AHB_DIV1
+
+/*
+ * CAN driver system settings.
+ */
+#define STM32_CAN_USE_CAN1                  FALSE
+#define STM32_CAN_CAN1_IRQ_PRIORITY         11
+
+/*
+ * DAC driver system settings.
+ */
+#define STM32_DAC_DUAL_MODE                 FALSE
+#define STM32_DAC_USE_DAC1_CH1              TRUE
+#define STM32_DAC_USE_DAC1_CH2              TRUE
+#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY     10
+#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY     10
+#define STM32_DAC_DAC1_CH1_DMA_PRIORITY     2
+#define STM32_DAC_DAC1_CH2_DMA_PRIORITY     2
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI1_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI2_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI3_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI4_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI5_9_IRQ_PRIORITY      6
+#define STM32_EXT_EXTI10_15_IRQ_PRIORITY    6
+#define STM32_EXT_EXTI16_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI17_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI18_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI19_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI20_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI30_32_IRQ_PRIORITY    6
+#define STM32_EXT_EXTI33_IRQ_PRIORITY       6
+
+/*
+ * 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_TIM4                  FALSE
+#define STM32_GPT_USE_TIM6                  TRUE
+#define STM32_GPT_USE_TIM7                  TRUE
+#define STM32_GPT_USE_TIM8                  TRUE
+#define STM32_GPT_TIM1_IRQ_PRIORITY         7
+#define STM32_GPT_TIM2_IRQ_PRIORITY         7
+#define STM32_GPT_TIM3_IRQ_PRIORITY         7
+#define STM32_GPT_TIM4_IRQ_PRIORITY         7
+#define STM32_GPT_TIM6_IRQ_PRIORITY         7
+#define STM32_GPT_TIM7_IRQ_PRIORITY         7
+#define STM32_GPT_TIM8_IRQ_PRIORITY         7
+
+/*
+ * 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         10
+#define STM32_I2C_I2C2_IRQ_PRIORITY         10
+#define STM32_I2C_USE_DMA                   TRUE
+#define STM32_I2C_I2C1_DMA_PRIORITY         1
+#define STM32_I2C_I2C2_DMA_PRIORITY         1
+#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_USE_TIM4                  FALSE
+#define STM32_ICU_USE_TIM8                  FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY         7
+#define STM32_ICU_TIM2_IRQ_PRIORITY         7
+#define STM32_ICU_TIM3_IRQ_PRIORITY         7
+#define STM32_ICU_TIM4_IRQ_PRIORITY         7
+#define STM32_ICU_TIM8_IRQ_PRIORITY         7
+
+/*
+ * 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_USE_TIM4                  FALSE
+#define STM32_PWM_USE_TIM8                  FALSE
+#define STM32_PWM_TIM1_IRQ_PRIORITY         7
+#define STM32_PWM_TIM2_IRQ_PRIORITY         7
+#define STM32_PWM_TIM3_IRQ_PRIORITY         7
+#define STM32_PWM_TIM4_IRQ_PRIORITY         7
+#define STM32_PWM_TIM8_IRQ_PRIORITY         7
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1             FALSE
+#define STM32_SERIAL_USE_USART2             FALSE
+#define STM32_SERIAL_USE_USART3             FALSE
+#define STM32_SERIAL_USE_UART4              FALSE
+#define STM32_SERIAL_USE_UART5              FALSE
+#define STM32_SERIAL_USART1_PRIORITY        12
+#define STM32_SERIAL_USART2_PRIORITY        12
+#define STM32_SERIAL_USART3_PRIORITY        12
+#define STM32_SERIAL_UART4_PRIORITY         12
+#define STM32_SERIAL_UART5_PRIORITY         12
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1                  FALSE
+#define STM32_SPI_USE_SPI2                  FALSE
+#define STM32_SPI_USE_SPI3                  FALSE
+#define STM32_SPI_SPI1_DMA_PRIORITY         1
+#define STM32_SPI_SPI2_DMA_PRIORITY         1
+#define STM32_SPI_SPI3_DMA_PRIORITY         1
+#define STM32_SPI_SPI1_IRQ_PRIORITY         10
+#define STM32_SPI_SPI2_IRQ_PRIORITY         10
+#define STM32_SPI_SPI3_IRQ_PRIORITY         10
+#define STM32_SPI_DMA_ERROR_HOOK(spip)      osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY               8
+#define STM32_ST_USE_TIMER                  2
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1               FALSE
+#define STM32_UART_USE_USART2               FALSE
+#define STM32_UART_USE_USART3               FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY      12
+#define STM32_UART_USART2_IRQ_PRIORITY      12
+#define STM32_UART_USART3_IRQ_PRIORITY      12
+#define STM32_UART_USART1_DMA_PRIORITY      0
+#define STM32_UART_USART2_DMA_PRIORITY      0
+#define STM32_UART_USART3_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_HP_IRQ_PRIORITY      13
+#define STM32_USB_USB1_LP_IRQ_PRIORITY      14
+
+/*
+ * WDG driver system settings.
+ */
+#define STM32_WDG_USE_IWDG                  FALSE
+
+#endif /* MCUCONF_H */
index 887592b37320966a9e1d74ad52e119a2c2c590bc..6b1ee92c180af5d25d7712f577d4069976b0bf67 100644 (file)
@@ -1,24 +1,58 @@
-EXTRAFLAGS += -flto
-LAYOUTS = 66_ansi
-MCU = atmega32u4
-F_CPU = 16000000
-ARCH = AVR8
-F_USB = $(F_CPU)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
+# project specific files
+SRC =  led.c
+LAYOUTS += 66_ansi
+
+## chip/board settings
+# - the next two should match the directories in
+#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+MCU_FAMILY = STM32
+MCU_SERIES = STM32F3xx
+
+# Linker script to use
+# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+#   or <this_dir>/ld/
+MCU_LDSCRIPT = STM32F303xC
+
+# Startup code to use
+#  - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
+MCU_STARTUP = stm32f3xx
+
+# Board: it should exist either in <chibios>/os/hal/boards/
+#  or <this_dir>/boards
+BOARD = GENERIC_STM32_F303XC
+
+# Cortex version
+MCU  = cortex-m4
+
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+ARMV = 7
+
+USE_FPU = yes
+
+# Vector table for application
+# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
+# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
+# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000
+OPT_DEFS =
+
+# Options to pass to dfu-util when flashing
+DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
+
+# LED Configuration
+LED_MATRIX_ENABLE = IS31FL3731
 
 # Build Options
 #   comment out to disable the options.
 #
 BACKLIGHT_ENABLE = yes
-BOOTMAGIC_ENABLE = no
-MOUSEKEY_ENABLE = no
-EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
-COMMAND_ENABLE = no
-NKRO_ENABLE = yes
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.)
+MOUSEKEY_ENABLE = yes  # Mouse keys
+EXTRAKEY_ENABLE = yes  # Audio control and System control
+CONSOLE_ENABLE = yes   # Console for debug
+COMMAND_ENABLE = yes    # Commands for debug and configuration
+#SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes          # USB Nkey Rollover
+#CUSTOM_MATRIX = yes # Custom matrix file
 AUDIO_ENABLE = yes
-RGBLIGHT_ENABLE = yes
-MIDI_ENABLE = no
-UNICODE_ENABLE = no
-BLUETOOTH_ENABLE = no
+# SERIAL_LINK_ENABLE = yes
index 94f2ec0c400a9eaa263fe83dba5d22e5b28d5044..6451cf0370bc33a311b70910c6f72d17d8ffa154 100644 (file)
@@ -6,6 +6,30 @@
 #define _FL 1
 #define _CL 2
 
+enum custom_keycodes {
+    S_BSKTC = SAFE_RANGE,
+    S_ODEJY,
+    S_RCKBY,
+    S_DOEDR,
+    S_SCALE,
+    S_ONEUP,
+    S_COIN,
+    S_SONIC,
+    S_ZELDA
+};
+
+#ifdef AUDIO_ENABLE
+  float song_basketcase[][2] = SONG(BASKET_CASE);
+  float song_ode_to_joy[][2]  = SONG(ODE_TO_JOY);
+  float song_rock_a_bye_baby[][2]  = SONG(ROCK_A_BYE_BABY);
+  float song_doe_a_deer[][2]  = SONG(DOE_A_DEER);
+  float song_scale[][2]  = SONG(MUSIC_SCALE_SOUND);
+  float song_coin[][2]  = SONG(COIN_SOUND);
+  float song_one_up[][2]  = SONG(ONE_UP_SOUND);
+  float song_sonic_ring[][2]  = SONG(SONIC_RING);
+  float song_zelda_puzzle[][2]  = SONG(ZELDA_PUZZLE);
+#endif
+
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   /* Keymap _BL: Base Layer (Default Layer)
    */
@@ -28,9 +52,72 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   /* Keymap _CL: Control layer
    */
 [_CL] = LAYOUT(
-  BL_STEP,RGB_M_P,RGB_M_B,RGB_M_R,RGB_M_SW,RGB_M_SN,RGB_M_K,RGB_M_X,RGB_M_G,_______,_______,_______,_______,   RGB_TOG,           RGB_VAI, \
-  _______,_______,_______,_______,RESET,  _______,_______,_______,_______,_______,_______,_______,_______,_______,                RGB_VAD, \
+  BL_STEP,S_ONEUP,S_SCALE,RGB_M_R,RGB_M_SW,RGB_M_SN,RGB_M_K,RGB_M_X,RGB_M_G,_______,_______,_______,_______,   BL_TOGG,           BL_INC, \
+  _______,_______,_______,_______,RESET,  _______,_______,_______,_______,_______,_______,_______,_______,_______,                BL_DEC, \
   _______,_______,MO(_CL),_______,_______,_______,_______,_______,_______,_______,_______,_______,    _______,                             \
   _______,        _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,        _______,        RGB_SAI,         \
-  _______,_______,_______,                RGB_MOD,RGB_MOD,                        _______,_______,MO(_FL),_______,RGB_HUD,RGB_SAD,RGB_HUI),
+  _______,_______,_______,                BL_BRTG,BL_BRTG,                        _______,_______,MO(_FL),_______,RGB_HUD,RGB_SAD,RGB_HUI),
 };
+
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+    switch (keycode) {
+        #ifdef AUDIO_ENABLE
+            case S_BSKTC:
+                if (record->event.pressed) {
+                    stop_all_notes();
+                    PLAY_SONG(song_basketcase);
+                }
+                return false;
+            case S_ODEJY:
+                if (record->event.pressed) {
+                    stop_all_notes();
+                    PLAY_SONG(song_ode_to_joy);
+                }
+                return false;
+            case S_RCKBY:
+                if (record->event.pressed) {
+                    stop_all_notes();
+                    PLAY_SONG(song_rock_a_bye_baby);
+                }
+                return false;
+            case S_DOEDR:
+                if (record->event.pressed) {
+                    stop_all_notes();
+                    PLAY_SONG(song_doe_a_deer);
+                }
+                return false;
+            case S_SCALE:
+                if (record->event.pressed) {
+                    stop_all_notes();
+                    PLAY_SONG(song_scale);
+                }
+                return false;
+            case S_ONEUP:
+                if (record->event.pressed) {
+                    stop_all_notes();
+                    PLAY_SONG(song_one_up);
+                }
+                return false;
+            case S_COIN:
+                if (record->event.pressed) {
+                    stop_all_notes();
+                    PLAY_SONG(song_coin);
+                }
+                return false;
+            case S_SONIC:
+                if (record->event.pressed) {
+                    stop_all_notes();
+                    PLAY_SONG(song_sonic_ring);
+                }
+                return false;
+            case S_ZELDA:
+                if (record->event.pressed) {
+                    stop_all_notes();
+                    PLAY_SONG(song_zelda_puzzle);
+                }
+                return false;
+        #endif
+    }
+    return true;
+}
diff --git a/keyboards/clueboard/66_hotswap/prototype/config.h b/keyboards/clueboard/66_hotswap/prototype/config.h
new file mode 100644 (file)
index 0000000..7679d08
--- /dev/null
@@ -0,0 +1,55 @@
+#pragma once
+#include "config_common.h"
+
+#define PRODUCT_ID      0x2390
+#define DEVICE_VER      0x0001
+
+/* key matrix size */
+#define MATRIX_ROWS 10
+#define MATRIX_COLS 8
+
+// ROWS: Top to bottom, COLS: Left to right
+/* Row pin configuration
+* row: 0  1  2  3  4  5  6  7  8  9
+* pin: B2 C7 C6 B6 B5 B0 B3 D5 D3 D2
+*/
+
+#define MATRIX_ROW_PINS { B2, C7, C6, B6, B5, B0, B3, D5, D3, D2 }
+/* Column pin configuration
+ * col: 0  1  2  3  4  5  6  7
+ * pin: F0 F1 F4 F5 F6 F7 E6 B1
+ */
+#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, E6, B1 }
+#define UNUSED_PINS
+
+/* Speaker configuration
+ */
+#define B7_AUDIO
+#define NO_MUSIC_MODE
+#define AUDIO_CLICKY
+
+/* Space savings
+ */
+#define NO_ACTION_TAPPING
+
+/* Backlight configuration
+ */
+#define BACKLIGHT_LEVELS 1
+
+/* Underlight configuration
+ */
+#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
diff --git a/keyboards/clueboard/66_hotswap/prototype/prototype.c b/keyboards/clueboard/66_hotswap/prototype/prototype.c
new file mode 100644 (file)
index 0000000..991d4b8
--- /dev/null
@@ -0,0 +1,63 @@
+#include "prototype.h"
+#include <avr/io.h>
+#include "backlight.h"
+#include "print.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
+}
+
+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
+    }
+}
+
+void led_init_ports() {
+    // * Set our LED pins as output
+    DDRB |= (1<<4);
+}
+
+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 capslock off
+        PORTB &= ~(1<<4);
+    }
+}
diff --git a/keyboards/clueboard/66_hotswap/prototype/prototype.h b/keyboards/clueboard/66_hotswap/prototype/prototype.h
new file mode 100644 (file)
index 0000000..b1d483b
--- /dev/null
@@ -0,0 +1,86 @@
+#pragma once
+#include "quantum.h"
+
+/* Clueboard matrix layout
+ * ,-----------------------------------------------------------.  ,---.
+ * | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54|   56  |  | 57|
+ * |-----------------------------------------------------------|  |---|
+ * |   10| 11| 12| 13| 14| 15| 16| 17| 60| 61| 62| 63| 64|   65|  | 67|
+ * |-----------------------------------------------------------|  `---'
+ * |    20| 21| 22| 23| 24| 25| 26| 27| 70| 71| 72| 73| 74|  75|
+ * |------------------------------------------------------------.
+ * |  30| 31| 32| 33| 34| 35| 36| 37| 80| 81| 82| 83| 84|  85|86|
+ * |------------------------------------------------------------------.
+ * |  40| 41|  42|  43|   45|       46|   90|  92|  93| 94| 95| 96| 97|
+ * `------------------------------------------------------------------'
+ * ,-----------------------------------------------------------.  ,---.
+ * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backsp |  |Ins|
+ * |-----------------------------------------------------------|  |---|
+ * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|    \|  |Del|
+ * |-----------------------------------------------------------|  `---'
+ * |Caps  |  A|  S|  D|  F|  G|  H|  J|  k|  L|  ;|  '|Enter   |
+ * |--------------------------------------------------------------.
+ * |Shift| \|  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|  \|Shift| Up|
+ * |------------------------------------------------------------------.
+ * |Ctrl|Alt|Gui |     Space|  Space|Gui |Alt |Fn  |Ctrl|Left|Down|Rgt|
+ * `------------------------------------------------------------------'
+ */
+// The first section contains all of the arguments
+// The second converts the arguments into a two-dimensional array
+
+#define LAYOUT_all( \
+    k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54,    k56,   k57, \
+    k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65,      k67, \
+    k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73,    k75, \
+    k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k84, k85, k86, \
+    k40, k41, k42,           k45, k46,      k90,      k92, k93, k94, k95, k96, k97 \
+) { \
+    { k00, k01, k02, k03, k04, k05, k06, k07 }, \
+    { k10, k11, k12, k13, k14, k15, k16, k17 }, \
+    { k20, k21, k22, k23, k24, k25, k26, k27 }, \
+    { k30, k31, k32, k33, k34, k35, k36, k37 }, \
+    { k40, k41, k42, KC_NO, KC_NO, k45, k46, KC_NO }, \
+    { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
+    { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
+    { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
+    { k80, k81, k82, k83, k84, k85, k86, KC_NO }, \
+    { k90, KC_NO, k92, k93, k94, k95, k96, k97 }  \
+}
+
+#define LAYOUT( \
+    k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54,    k56,   k57, \
+    k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65,      k67, \
+    k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73,    k75, \
+    k30,      k32, k33, k34, k35, k36, k37, k80, k81, k82, k83,      k85, k86, \
+    k40, k41, k42,           k45, k46,      k90,      k92, k93, k94, k95, k96, k97 \
+) { \
+    { k00, k01, k02, k03, k04, k05, k06, k07 }, \
+    { k10, k11, k12, k13, k14, k15, k16, k17 }, \
+    { k20, k21, k22, k23, k24, k25, k26, k27 }, \
+    { k30, KC_NO, k32, k33, k34, k35, k36, k37 }, \
+    { k40, k41, k42, KC_NO, KC_NO, k45, k46, KC_NO }, \
+    { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
+    { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
+    { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
+    { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
+    { k90, KC_NO, k92, k93, k94, k95, k96, k97 }  \
+}
+
+#define LAYOUT_66_ansi( \
+    k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54,    k56,   k57, \
+    k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65,      k67, \
+    k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73,    k75, \
+    k30,      k32, k33, k34, k35, k36, k37, k80, k81, k82, k83,    k85,   k86, \
+    k40, k41, k42,                k46,                k92, k93, k94, k95, k96, k97 \
+) { \
+    { k00, k01, k02, k03, k04, k05, k06, k07 }, \
+    { k10, k11, k12, k13, k14, k15, k16, k17 }, \
+    { k20, k21, k22, k23, k24, k25, k26, k27 }, \
+    { k30, KC_NO, k32, k33, k34, k35, k36, k37 }, \
+    { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO }, \
+    { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
+    { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
+    { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
+    { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
+    { KC_NO, KC_NO, k92, k93, k94, k95, k96, k97 }  \
+}
diff --git a/keyboards/clueboard/66_hotswap/prototype/rules.mk b/keyboards/clueboard/66_hotswap/prototype/rules.mk
new file mode 100644 (file)
index 0000000..887592b
--- /dev/null
@@ -0,0 +1,24 @@
+EXTRAFLAGS += -flto
+LAYOUTS = 66_ansi
+MCU = atmega32u4
+F_CPU = 16000000
+ARCH = AVR8
+F_USB = $(F_CPU)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+# Build Options
+#   comment out to disable the options.
+#
+BACKLIGHT_ENABLE = yes
+BOOTMAGIC_ENABLE = no
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = yes
+CONSOLE_ENABLE = yes
+COMMAND_ENABLE = no
+NKRO_ENABLE = yes
+AUDIO_ENABLE = yes
+RGBLIGHT_ENABLE = yes
+MIDI_ENABLE = no
+UNICODE_ENABLE = no
+BLUETOOTH_ENABLE = no