Browse Source

Added WS2812 support for KC60 (#419)

* Added WS2812 support for KC60

* Reorganized WS2812 support into its own keymap

* Fixed relative link in README

* Moved WS2812 mention in README to the bottom

* Fixed titling in WS2812 README

* Reverted KC60 Makefile and default keymap back

* Moved RGB specific config.h to ws2812 keymap folder
Stanley Lai 9 years ago
parent
commit
3302258abd

+ 1 - 2
keyboard/kc60/Makefile

@@ -27,7 +27,7 @@
 # make flip-ee = Download the eeprom file to the device, using Atmel FLIP
 # make flip-ee = Download the eeprom file to the device, using Atmel FLIP
 #                (must have Atmel FLIP installed).
 #                (must have Atmel FLIP installed).
 #
 #
-# make debug = Start either simulavr or avarice as specified for debugging, 
+# make debug = Start either simulavr or avarice as specified for debugging,
 #              with avr-gdb or avr-insight as the front end for debugging.
 #              with avr-gdb or avr-insight as the front end for debugging.
 #
 #
 # make filename.s = Just compile filename.c into the assembler code only.
 # make filename.s = Just compile filename.c into the assembler code only.
@@ -111,4 +111,3 @@ AUDIO_ENABLE ?= no           # Audio output on port C6
 ifndef QUANTUM_DIR
 ifndef QUANTUM_DIR
 	include ../../Makefile
 	include ../../Makefile
 endif
 endif
-

+ 6 - 3
keyboard/kc60/README.md

@@ -2,12 +2,10 @@ KC60 (version 2.0) keyboard firmware
 ======================
 ======================
 
 
 ## Quantum MK Firmware
 ## Quantum MK Firmware
-
 For the full Quantum feature list, see [the parent README.md](/README.md).
 For the full Quantum feature list, see [the parent README.md](/README.md).
 
 
 ## Building
 ## Building
-
+Download or clone the whole firmware and navigate to the keyboard/kc60 folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
-Download or clone the whole firmware and navigate to the keyboard/kc60 folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. 
 
 
 Depending on which keymap you would like to use, you will have to compile slightly differently.
 Depending on which keymap you would like to use, you will have to compile slightly differently.
 
 
@@ -22,3 +20,8 @@ To build the firmware binary hex file with a keymap just do `make` with `KEYMAP`
 $ make KEYMAP=[default|jack|<name>]
 $ make KEYMAP=[default|jack|<name>]
 ```
 ```
 Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
 Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
+
+## WS2812 Support
+![Image of KC60 with RGB Underglow](keymaps/ws2812/ws2812_example.jpg)
+
+Build with WS2812 Support by running `make KEYMAP=ws2812`.

+ 1 - 1
keyboard/kc60/config.h

@@ -45,7 +45,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 // Possible pins for columns include: F1  F0  E6  D7  D6  D4  C7  C6  B7  B5  B4  B3  B1  B0
 // Possible pins for columns include: F1  F0  E6  D7  D6  D4  C7  C6  B7  B5  B4  B3  B1  B0
 // Pins for rows include:  D0  D1  F6  F7  D5
 // Pins for rows include:  D0  D1  F6  F7  D5
-// KC60 Version 2 
+// KC60 Version 2
 #define MATRIX_ROW_PINS { D0, D1, F6, F7, D5 }
 #define MATRIX_ROW_PINS { D0, D1, F6, F7, D5 }
 #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B7, D4, B1, B0, B5, B4, D7, D6, B3 }
 #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B7, D4, B1, B0, B5, B4, D7, D6, B3 }
 #define UNUSED_PINS
 #define UNUSED_PINS

+ 2 - 2
keyboard/kc60/kc60.c

@@ -62,7 +62,7 @@ void backlight_init_ports()
   DDRB |= (1<<6);
   DDRB |= (1<<6);
   PORTB &= ~(1<<6);
   PORTB &= ~(1<<6);
 
 
-  // Use full 16-bit resolution. 
+  // Use full 16-bit resolution.
   ICR1 = 0xFFFF;
   ICR1 = 0xFFFF;
 
 
   // I could write a wall of text here to explain... but TL;DW
   // I could write a wall of text here to explain... but TL;DW
@@ -99,7 +99,7 @@ void backlight_set(uint8_t level)
     // Set the brightness
     // Set the brightness
     CHANNEL = 0xFFFF;
     CHANNEL = 0xFFFF;
   }
   }
-  else        
+  else
   {
   {
     // Turn on PWM control of PB6
     // Turn on PWM control of PB6
     TCCR1A |= _BV(COM1B1);
     TCCR1A |= _BV(COM1B1);

BIN
keyboard/kc60/keymaps/default/compiled.hex


+ 63 - 0
keyboard/kc60/keymaps/ws2812/Makefile

@@ -0,0 +1,63 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+#                Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+#            have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+#             have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+#               (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+#                (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging,
+#              with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+#                   bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+KEYBOARD_LOCK_ENABLE ?= yes  # Allow locking of keyboard via magic key
+BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE ?= yes 			 # Enable WS2812 underglow RGB strip
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+
+ifndef QUANTUM_DIR
+	include ../../Makefile
+endif

+ 21 - 0
keyboard/kc60/keymaps/ws2812/README.md

@@ -0,0 +1,21 @@
+KC60 with WS2812 RGB Underglow
+======================
+
+![Image of KC60 with RGB Underglow](ws2812_example.jpg)
+
+## Quantum MK Firmware
+For the full Quantum feature list, see [the parent README.md](/README.md).
+
+## WS2812 Support
+By default, it is now setup for 16 LEDs on the PF5 breakout pin. See [included image](ws2812_wiring.jpg) for wiring reference.
+
+### Build
+To build this keymap with WS2812 enabled, simply run `make KEYMAP=ws2812`.
+
+### Reference Images
+![Wiring Reference](ws2812_wiring.jpg)
+![RGB Strip turned on](ws2812_underside-lit.jpg)
+![RGB Strip turned off](ws2812_underside.jpg)
+
+### Additional Credits
+Keymap based on work by [TerryMatthews](https://github.com/TerryMathews) for GH60 Satan.

BIN
keyboard/kc60/keymaps/ws2812/compiled.hex


+ 10 - 0
keyboard/kc60/keymaps/ws2812/config.h

@@ -0,0 +1,10 @@
+#include "../../config.h"
+
+/* WS2812B RGB Underglow LED */
+#define ws2812_PORTREG  PORTF
+#define ws2812_DDRREG   DDRF
+#define ws2812_pin PF5        // Based on wiring depicted in ws2812_wiring.jpg
+#define RGBLED_NUM 16         // Number of LEDs. Change this to match your use case.
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8

+ 161 - 0
keyboard/kc60/keymaps/ws2812/keymap.c

@@ -0,0 +1,161 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "kc60.h"
+
+// Used for SHIFT_ESC
+#define MODS_CTRL_MASK  (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _BL 0
+#define _FL 1
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  /* Keymap _BL: (Base Layer) Default Layer
+   * ,-----------------------------------------------------------.
+   * |Esc~| 1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backsp |
+   * |-----------------------------------------------------------|
+   * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \  |
+   * |-----------------------------------------------------------|
+   * |CAPS   |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return |
+   * |-----------------------------------------------------------|
+   * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift     |
+   * |-----------------------------------------------------------|
+   * |Ctrl|Gui |Alt |      Space            |Alt |Gui |FN  |Ctrl |
+   * `-----------------------------------------------------------'
+   */
+[_BL] = KEYMAP(
+  F(0),    KC_1,    KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   KC_MINS,  KC_EQL,  KC_BSPC, \
+  KC_TAB,  KC_Q,    KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,   KC_LBRC,  KC_RBRC, KC_BSLS, \
+  KC_CAPS, KC_A,    KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,KC_QUOT,  KC_NO,   KC_ENT,  \
+  KC_LSFT, KC_NO,   KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,  KC_NO,   KC_RSFT, \
+  KC_LCTL, KC_LGUI, KC_LALT,                KC_SPC,                                 KC_RALT,KC_RGUI, MO(_FL), KC_RCTL),
+
+  /* Keymap _FL: Function Layer
+   * ,-----------------------------------------------------------.
+   * |~ |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|   DEL  |
+   * |-----------------------------------------------------------|
+   * |     |   |UP |   |   |   |   |   |   |   |   |BL-|BL+|BL   |
+   * |-----------------------------------------------------------|
+   * |       |LFT|DWN|RGT|   |   |   |   |   |   |   |           |
+   * |-----------------------------------------------------------|
+   * |        |FN1|FN2|FN3|FN4|FN5|FN6|FN7|FN8|   |   |          |
+   * |-----------------------------------------------------------|
+   * |    |    |    |                        |    |    |    |RSET|
+   * `-----------------------------------------------------------'
+   */
+[_FL] = KEYMAP(
+  #ifdef RGBLIGHT_ENABLE
+  KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_DEL,  \
+  KC_TRNS, KC_TRNS, KC_UP,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC,  BL_INC,  BL_TOGG, \
+  KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+  KC_TRNS, KC_TRNS, F(1),    F(2),    F(3),    F(4),    F(5),    F(6),    F(7),    F(8),    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+  KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,                                     KC_TRNS, KC_TRNS, KC_TRNS, RESET),
+  #else
+  KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_DEL,  \
+  KC_TRNS, KC_TRNS, KC_UP,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC,  BL_INC,  BL_TOGG, \
+  KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+  KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,                                     KC_TRNS, KC_TRNS, KC_TRNS, RESET),
+  #endif
+};
+
+enum function_id {
+    SHIFT_ESC,
+    #ifdef RGBLIGHT_ENABLE
+    RGBLED_TOGGLE,
+    RGBLED_STEP_MODE,
+    RGBLED_INCREASE_HUE,
+    RGBLED_DECREASE_HUE,
+    RGBLED_INCREASE_SAT,
+    RGBLED_DECREASE_SAT,
+    RGBLED_INCREASE_VAL,
+    RGBLED_DECREASE_VAL
+    #endif
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+  [0]  = ACTION_FUNCTION(SHIFT_ESC),
+  #ifdef RGBLIGHT_ENABLE
+  [1]  = ACTION_FUNCTION(RGBLED_TOGGLE),
+  [2]  = ACTION_FUNCTION(RGBLED_STEP_MODE),
+  [3]  = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
+  [4]  = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
+  [5]  = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
+  [6]  = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
+  [7]  = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
+  [8]  = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
+  #endif
+};
+
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
+  static uint8_t shift_esc_shift_mask;
+  switch (id) {
+    case SHIFT_ESC:
+      shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
+      if (record->event.pressed) {
+        if (shift_esc_shift_mask) {
+          add_key(KC_GRV);
+          send_keyboard_report();
+        } else {
+          add_key(KC_ESC);
+          send_keyboard_report();
+        }
+      } else {
+        if (shift_esc_shift_mask) {
+          del_key(KC_GRV);
+          send_keyboard_report();
+        } else {
+          del_key(KC_ESC);
+          send_keyboard_report();
+        }
+      }
+      break;
+    //led operations
+    #ifdef RGBLIGHT_ENABLE
+    case RGBLED_TOGGLE:
+      if (record->event.pressed) {
+        rgblight_toggle();
+      }
+      break;
+    case RGBLED_INCREASE_HUE:
+      if (record->event.pressed) {
+        rgblight_increase_hue();
+      }
+      break;
+    case RGBLED_DECREASE_HUE:
+      if (record->event.pressed) {
+        rgblight_decrease_hue();
+      }
+      break;
+    case RGBLED_INCREASE_SAT:
+      if (record->event.pressed) {
+        rgblight_increase_sat();
+      }
+      break;
+    case RGBLED_DECREASE_SAT:
+      if (record->event.pressed) {
+        rgblight_decrease_sat();
+      }
+      break;
+    case RGBLED_INCREASE_VAL:
+      if (record->event.pressed) {
+        rgblight_increase_val();
+      }
+      break;
+    case RGBLED_DECREASE_VAL:
+      if (record->event.pressed) {
+        rgblight_decrease_val();
+      }
+      break;
+    case RGBLED_STEP_MODE:
+      if (record->event.pressed) {
+        rgblight_step();
+      }
+      break;
+    #endif
+  }
+}

BIN
keyboard/kc60/keymaps/ws2812/ws2812_example.jpg


BIN
keyboard/kc60/keymaps/ws2812/ws2812_underside-lit.jpg


BIN
keyboard/kc60/keymaps/ws2812/ws2812_underside.jpg


BIN
keyboard/kc60/keymaps/ws2812/ws2812_wiring.jpg