2
0
Просмотр исходного кода

Merge pull request #2 from jackhumbert/master

Pull from upstream
Joshua Colbeck 9 лет назад
Родитель
Сommit
68ceffe53e
82 измененных файлов с 2970 добавлено и 786 удалено
  1. 3 0
      .gitmodules
  2. 7 8
      Makefile
  3. 1 1
      keyboards/chibios_test/keymaps/default/keymap.c
  4. 0 16
      keyboards/clueboard/clueboard.c
  5. 4 68
      keyboards/clueboard/keymaps/default/keymap.c
  6. 6 64
      keyboards/clueboard/keymaps/max/keymap.c
  7. 2 3
      keyboards/clueboard/rev1/config.h
  8. 16 0
      keyboards/clueboard/rev1/rev1.c
  9. 2 3
      keyboards/clueboard/rev2/config.h
  10. 16 0
      keyboards/clueboard/rev2/rev2.c
  11. 1 1
      keyboards/clueboard/rev2/rev2.h
  12. 6 7
      keyboards/cluepad/config.h
  13. 7 64
      keyboards/cluepad/keymaps/default/keymap.c
  14. 112 0
      keyboards/gh60/keymaps/robotmaxtron/Makefile
  15. BIN
      keyboards/gh60/keymaps/robotmaxtron/WS2812-wiring.jpg
  16. 190 0
      keyboards/gh60/keymaps/robotmaxtron/config.h
  17. 226 0
      keyboards/gh60/keymaps/robotmaxtron/keymap.c
  18. 16 0
      keyboards/gh60/keymaps/robotmaxtron/readme.md
  19. 4 0
      keyboards/hhkb/Makefile
  20. 5 1
      keyboards/hhkb/config.h
  21. 27 0
      keyboards/hhkb/hhkb.h
  22. 1 0
      keyboards/hhkb/keymaps/jp/Makefile
  23. 58 0
      keyboards/hhkb/keymaps/jp/keymap.c
  24. 1 0
      keyboards/hhkb/keymaps/rdg_jp/Makefile
  25. 65 0
      keyboards/hhkb/keymaps/rdg_jp/keymap.c
  26. 12 0
      keyboards/infinity_ergodox/Makefile
  27. 113 0
      keyboards/infinity_ergodox/drivers/gdisp/IS31FL3731C/board_IS31FL3731C.h
  28. 2 0
      keyboards/infinity_ergodox/drivers/gdisp/IS31FL3731C/driver.mk
  29. 333 0
      keyboards/infinity_ergodox/drivers/gdisp/IS31FL3731C/gdisp_IS31FL3731C.c
  30. 36 0
      keyboards/infinity_ergodox/drivers/gdisp/IS31FL3731C/gdisp_lld_config.h
  31. 2 0
      keyboards/infinity_ergodox/drivers/gdisp/emulator_lcd/driver.mk
  32. 10 0
      keyboards/infinity_ergodox/drivers/gdisp/emulator_lcd/emulator_lcd.c
  33. 2 0
      keyboards/infinity_ergodox/drivers/gdisp/emulator_led/driver.mk
  34. 10 0
      keyboards/infinity_ergodox/drivers/gdisp/emulator_led/emulator_led.c
  35. 127 0
      keyboards/infinity_ergodox/drivers/gdisp/st7565ergodox/board_ST7565.h
  36. 2 0
      keyboards/infinity_ergodox/drivers/gdisp/st7565ergodox/driver.mk
  37. 292 0
      keyboards/infinity_ergodox/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c
  38. 26 0
      keyboards/infinity_ergodox/drivers/gdisp/st7565ergodox/gdisp_lld_config.h
  39. 37 0
      keyboards/infinity_ergodox/drivers/gdisp/st7565ergodox/st7565.h
  40. 331 0
      keyboards/infinity_ergodox/gfxconf.h
  41. 65 0
      keyboards/infinity_ergodox/infinity_ergodox.c
  42. 4 1
      keyboards/infinity_ergodox/keymaps/default/keymap.c
  43. 168 0
      keyboards/infinity_ergodox/keymaps/default/visualizer.c
  44. 1 1
      keyboards/kc60/Makefile
  45. 1 66
      keyboards/kc60/keymaps/stanleylai/keymap.c
  46. 2 3
      keyboards/kc60/keymaps/ws2812/config.h
  47. 1 64
      keyboards/kc60/keymaps/ws2812/keymap.c
  48. 2 3
      keyboards/lets_split/config.h
  49. 6 7
      keyboards/phantom/config.h
  50. 1 68
      keyboards/phantom/keymaps/default/keymap.c
  51. 1 1
      keyboards/phantom/led.c
  52. 3 3
      keyboards/planck/keymaps/experimental/Makefile
  53. 8 0
      keyboards/planck/keymaps/experimental/config.h
  54. 69 4
      keyboards/planck/keymaps/experimental/keymap.c
  55. 2 3
      keyboards/planck/keymaps/pvc/config.h
  56. 2 3
      keyboards/planck/keymaps/yang/config.h
  57. 5 61
      keyboards/planck/keymaps/yang/keymap.c
  58. 2 3
      keyboards/preonic/config.h
  59. 7 7
      keyboards/satan/config.h
  60. 1 67
      keyboards/satan/keymaps/default/keymap.c
  61. 116 0
      keyboards/satan/keymaps/poker/keymap.c
  62. 3 70
      keyboards/satan/keymaps/sethbc/keymap.c
  63. 20 0
      keyboards/satan/keymaps/stanleylai/config.h
  64. 84 0
      keyboards/satan/keymaps/stanleylai/keymap.c
  65. 1 0
      lib/ugfx
  66. 10 0
      quantum/keymap.h
  67. 1 1
      quantum/keymap_common.c
  68. 17 8
      quantum/light_ws2812.c
  69. 64 2
      quantum/quantum.c
  70. 19 4
      quantum/rgblight.c
  71. 5 2
      quantum/rgblight.h
  72. 1 1
      quantum/template/template.c
  73. 2 2
      quantum/visualizer/led_test.c
  74. 5 9
      quantum/visualizer/visualizer.c
  75. 0 2
      quantum/visualizer/visualizer.h
  76. 18 18
      quantum/visualizer/visualizer.mk
  77. 87 14
      readme.md
  78. 1 1
      tmk_core/common.mk
  79. 8 0
      tmk_core/common/keyboard.c
  80. 1 6
      tmk_core/common/keycode.h
  81. 15 0
      tmk_core/protocol/chibios/main.c
  82. 30 45
      tmk_core/rules.mk

+ 3 - 0
.gitmodules

@@ -4,3 +4,6 @@
 [submodule "lib/chibios-contrib"]
 	path = lib/chibios-contrib
 	url = https://github.com/ChibiOS/ChibiOS-Contrib.git
+[submodule "lib/ugfx"]
+	path = lib/ugfx
+	url = https://bitbucket.org/Tectu/ugfx

+ 7 - 8
Makefile

@@ -218,14 +218,6 @@ ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
 	VAPTH += $(SERIAL_PATH)
 endif
 
-ifeq ($(MASTER),right)	
-	OPT_DEFS += -DMASTER_IS_ON_RIGHT
-else 
-	ifneq ($(MASTER),left)
-$(error MASTER does not have a valid value(left/right))
-	endif
-endif
-
 # Optimize size but this may cause error "relocation truncated to fit"
 #EXTRALDFLAGS = -Wl,--relax
 
@@ -257,10 +249,17 @@ ifeq ($(PLATFORM),AVR)
 else ifeq ($(PLATFORM),CHIBIOS)
 	include $(TMK_PATH)/protocol/chibios.mk
 	include $(TMK_PATH)/chibios.mk
+	OPT_OS = chibios
 else
 	$(error Unknown platform)
 endif
 
+ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
+	VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer
+	VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer
+	include $(VISUALIZER_PATH)/visualizer.mk
+endif
+
 include $(TMK_PATH)/rules.mk
 
 GIT_VERSION := $(shell git describe --abbrev=6 --dirty --always --tags 2>/dev/null || date +"%Y-%m-%d-%H:%M:%S")

+ 1 - 1
keyboards/chibios_test/keymaps/default/keymap.c

@@ -18,7 +18,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "chibios_test.h"
 
 const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-    {{KC_CAPS}}, // test with KC_CAPS, KC_A, KC_BTLD
+    {{KC_CAPS}}, // test with KC_CAPS, KC_A, RESET
 };
 
 const uint16_t fn_actions[] = {

+ 0 - 16
keyboards/clueboard/clueboard.c

@@ -1,17 +1 @@
 #include "clueboard.h"
-
-void led_init_ports() {
-    // * Set our LED pins as output
-    DDRB |= (1<<4);
-}
-
-void led_set_kb(uint8_t usb_led) {
-    DDRF |= (1<<0);
-    if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
-        // Turn capslock on
-        PORTF |= (1<<0);
-    } else {
-        // Turn capslock off
-        PORTF &= ~(1<<0);
-    }
-}

+ 4 - 68
keyboards/clueboard/keymaps/default/keymap.c

@@ -67,11 +67,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    */
 [_RS] = KEYMAP(
   #ifdef RGBLIGHT_ENABLE
-  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, F(1),             F(7), \
-  KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                   F(8), \
+  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, RGB_TOG,             RGB_VAI, \
+  KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                   RGB_VAD, \
   KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                         \
-  MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  MO(_FL),          F(5),          \
-  KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,        F(2),   F(2),                            KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS, F(4),    F(6),    F(3)),
+  MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  MO(_FL),          RGB_SAI,          \
+  KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,        RGB_MOD,   RGB_MOD,                            KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS, RGB_HUD,    RGB_SAD,    RGB_HUI),
   #else
   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,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                   KC_TRNS, \
@@ -83,30 +83,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 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) {
@@ -132,49 +112,5 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
         }
       }
       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
   }
 }

+ 6 - 64
keyboards/clueboard/keymaps/max/keymap.c

@@ -66,78 +66,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    * `----------------------------------------------------------------------------------'
    */
 [_RS] = KEYMAP(
-  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, F(0),             F(6), \
-  KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                   F(7), \
+  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, RGB_TOG,             RGB_VAI, \
+  KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                   RGB_VAD, \
   KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                         \
-  MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  MO(_FL),          F(4),          \
-  KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,        F(1),   F(1),                            KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS, F(3),    F(5),    F(2)),
+  MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  MO(_FL),          RGB_SAI,          \
+  KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,        RGB_MOD,   RGB_MOD,                            KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS, RGB_HUD,    RGB_SAD,    RGB_HUI),
 };
 
-enum function_id {
-    RGBLED_TOGGLE,
-    RGBLED_STEP_MODE,
-    RGBLED_INCREASE_HUE,
-    RGBLED_DECREASE_HUE,
-    RGBLED_INCREASE_SAT,
-    RGBLED_DECREASE_SAT,
-    RGBLED_INCREASE_VAL,
-    RGBLED_DECREASE_VAL,
-};
+/*enum function_id {
+};*/
 
 const uint16_t PROGMEM fn_actions[] = {
-  [0]  = ACTION_FUNCTION(RGBLED_TOGGLE),
-  [1]  = ACTION_FUNCTION(RGBLED_STEP_MODE),
-  [2]  = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
-  [3]  = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
-  [4]  = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
-  [5]  = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
-  [6]  = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
-  [7]  = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
 };
 
 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
   switch (id) {
-    case RGBLED_TOGGLE:
-      //led operations
-      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;
   }
 }

+ 2 - 3
keyboards/clueboard/rev1/config.h

@@ -25,9 +25,8 @@
 
 /* Underlight configuration
  */
-#define ws2812_PORTREG PORTB
-#define ws2812_DDRREG DDRB
-#define ws2812_pin 2
+#define RGB_DI_PIN B2
+#define RGBLIGHT_TIMER
 #define RGBLED_NUM 14     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17

+ 16 - 0
keyboards/clueboard/rev1/rev1.c

@@ -1 +1,17 @@
 #include "rev1.h"
+
+void led_init_ports() {
+    // * Set our LED pins as output
+    DDRF |= (1<<0);
+}
+
+void led_set_kb(uint8_t usb_led) {
+    DDRF |= (1<<0);
+    if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+        // Turn capslock on
+        PORTF |= (1<<0);
+    } else {
+        // Turn capslock off
+        PORTF &= ~(1<<0);
+    }
+}

+ 2 - 3
keyboards/clueboard/rev2/config.h

@@ -29,9 +29,8 @@
 
 /* Underlight configuration
  */
-#define ws2812_PORTREG PORTD
-#define ws2812_DDRREG DDRD
-#define ws2812_pin 7
+#define RGB_DI_PIN D7
+#define RGBLIGHT_TIMER
 #define RGBLED_NUM 14     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17

+ 16 - 0
keyboards/clueboard/rev2/rev2.c

@@ -45,3 +45,19 @@ void backlight_set(uint8_t level) {
         PORTD &= ~(1<<4); // 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);
+    }
+}

+ 1 - 1
keyboards/clueboard/rev2/rev2.h

@@ -13,7 +13,7 @@
  * |------------------------------------------------------------.
  * |  30| 31| 32| 33| 34| 35| 36| 37| 80| 81| 82| 83| 84|  85|86|
  * |------------------------------------------------------------------.
- * |  40| 41|  42|  43|   45|       46|   90|  91|  92| 93| 94| 95| 96|
+ * |  40| 41|  42|  43|   45|       46|   90|  92|  93| 94| 95| 96| 97|
  * `------------------------------------------------------------------'
  * ,-----------------------------------------------------------.  ,---.
  * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Yen| BS|  |Ins|

+ 6 - 7
keyboards/cluepad/config.h

@@ -69,13 +69,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* Underlight configuration
  */
- #define ws2812_PORTREG PORTF
- #define ws2812_DDRREG DDRF
- #define ws2812_pin 6
- #define RGBLED_NUM 4     // Number of LEDs
- #define RGBLIGHT_HUE_STEP 10
- #define RGBLIGHT_SAT_STEP 17
- #define RGBLIGHT_VAL_STEP 17
+#define RGB_DI_PIN F6
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 4     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
 
 /*
  * Feature disable options

+ 7 - 64
keyboards/cluepad/keymaps/default/keymap.c

@@ -1,7 +1,6 @@
 #include "cluepad.h"
 
 #include "backlight.h"
-#include "rgblight.h"
 
 // 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.
@@ -46,77 +45,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    * '-------------------'
    */
 [_FL] = KEYMAP(
-  LT(_FL, KC_NLCK), KC_TRNS, KC_TRNS, F(0), \
-  KC_TRNS,          F(4),    KC_TRNS, F(6), \
-  F(3),             BL_STEP, F(2), \
-  KC_TRNS,          F(5),    KC_TRNS, F(7), \
-  F(1),                      KC_TRNS)
+  LT(_FL, KC_NLCK), KC_TRNS, KC_TRNS, RGB_TOG, \
+  KC_TRNS,          RGB_SAI,    KC_TRNS, RGB_VAI, \
+  RGB_HUD,             BL_STEP, RGB_HUI, \
+  KC_TRNS,          RGB_SAD,    KC_TRNS, RGB_VAD, \
+  RGB_MOD,                      KC_TRNS)
 };
 
-enum function_id {
-    RGBLED_TOGGLE,
-    RGBLED_STEP_MODE,
-    RGBLED_INCREASE_HUE,
-    RGBLED_DECREASE_HUE,
-    RGBLED_INCREASE_SAT,
-    RGBLED_DECREASE_SAT,
-    RGBLED_INCREASE_VAL,
-    RGBLED_DECREASE_VAL,
-};
+/*enum function_id {
+};*/
 
 const uint16_t PROGMEM fn_actions[] = {
-  [0]  = ACTION_FUNCTION(RGBLED_TOGGLE),
-  [1]  = ACTION_FUNCTION(RGBLED_STEP_MODE),
-  [2]  = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
-  [3]  = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
-  [4]  = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
-  [5]  = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
-  [6]  = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
-  [7]  = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
 };
 
 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
   switch (id) {
-    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;
   }
 }
 

+ 112 - 0
keyboards/gh60/keymaps/robotmaxtron/Makefile

@@ -0,0 +1,112 @@
+#----------------------------------------------------------------------------
+# 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".
+#----------------------------------------------------------------------------
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE ?= yes	# Breathing sleep LED during USB suspend
+NKRO_ENABLE ?= yes		# USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE ?= yes	# Enable keyboard backlight functionality
+# MIDI_ENABLE ?= YES		# MIDI controls
+# UNICODE_ENABLE ?= YES		# Unicode
+# BLUETOOTH_ENABLE ?= yes	# Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= yes          # Enable RGB Underglow
+
+ifndef QUANTUM_DIR
+	include ../../../../Makefile
+endif
+

BIN
keyboards/gh60/keymaps/robotmaxtron/WS2812-wiring.jpg


+ 190 - 0
keyboards/gh60/keymaps/robotmaxtron/config.h

@@ -0,0 +1,190 @@
+/*
+Copyright 2012 Jun Wako <wakojun@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/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID    0xFEED
+#define PRODUCT_ID   0x6060
+#define DEVICE_VER   0x0001
+#define MANUFACTURER    geekhack
+#define PRODUCT         GH60
+#define DESCRIPTION     t.m.k. keyboard firmware for GH60
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 14
+
+/*
+ * 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 { D0, D1, D2, D3, D5 }
+// Rev A
+// #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B0, B5, B4, D7, D6, B3 }
+// Rev B/C
+   #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCING_DELAY 5
+
+/* define if matrix has ghost (lacks anti-ghosting diodes) */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 3
+
+/* 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 FORCE_NKRO
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+#define IS_COMMAND() ( \
+  keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1     H
+//#define MAGIC_KEY_HELP2     SLASH
+//#define MAGIC_KEY_DEBUG     D
+//#define MAGIC_KEY_DEBUG_MATRIX  X
+//#define MAGIC_KEY_DEBUG_KBD   K
+//#define MAGIC_KEY_DEBUG_MOUSE  M
+//#define MAGIC_KEY_VERSION    V
+//#define MAGIC_KEY_STATUS     S
+//#define MAGIC_KEY_CONSOLE    C
+//#define MAGIC_KEY_LAYER0_ALT1  ESC
+//#define MAGIC_KEY_LAYER0_ALT2  GRAVE
+//#define MAGIC_KEY_LAYER0     0
+//#define MAGIC_KEY_LAYER1     1
+//#define MAGIC_KEY_LAYER2     2
+//#define MAGIC_KEY_LAYER3     3
+//#define MAGIC_KEY_LAYER4     4
+//#define MAGIC_KEY_LAYER5     5
+//#define MAGIC_KEY_LAYER6     6
+//#define MAGIC_KEY_LAYER7     7
+//#define MAGIC_KEY_LAYER8     8
+//#define MAGIC_KEY_LAYER9     9
+//#define MAGIC_KEY_BOOTLOADER   PAUSE
+//#define MAGIC_KEY_LOCK      CAPS
+//#define MAGIC_KEY_EEPROM     E
+//#define MAGIC_KEY_NKRO      N
+//#define MAGIC_KEY_SLEEP_LED   Z
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* 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
+
+/*
+ * RGB Underglow
+ * These settings are for the F4 by default:
+ * 
+ *
+ * #define ws2812_PORTREG  PORTF
+ * #define ws2812_DDRREG   DDRF
+ * #define ws2812_pin PF4
+ * #define RGBLED_NUM 14     // Number of LEDs
+ * #define RGBLIGHT_HUE_STEP 10
+ * #define RGBLIGHT_SAT_STEP 17
+ * #define RGBLIGHT_VAL_STEP 17
+ *
+ * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. 
+ * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. 
+ * For details, please check this keymap. keyboard/planck/keymaps/yang/keymap.c
+*/
+
+/* Deprecated code below
+#define ws2812_PORTREG  PORTF 
+#define ws2812_DDRREG   DDRF
+#define ws2812_pin PF4
+*/ 
+#define RGB_DI_PIN F4
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 8         // Number of LEDs
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+#endif

+ 226 - 0
keyboards/gh60/keymaps/robotmaxtron/keymap.c

@@ -0,0 +1,226 @@
+#include "gh60.h"
+#include "action_layer.h"
+
+#define _BL 0
+#define _AL 1
+#define _FL 2
+#define _UL 3
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+   /*
+   *  Base layer, pretty standard ANSI layout. 
+   * ,-----------------------------------------------------------.
+   * |FN12| 1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backsp |
+   * |-----------------------------------------------------------|
+   * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|    \|
+   * |-----------------------------------------------------------|
+   * |Caps/Fn|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return |
+   * |-----------------------------------------------------------|
+   * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift     |
+   * |-----------------------------------------------------------|
+   * |Ctrl|Gui |Alt |      Space             |Alt |Fn  |Menu|Ctrl|
+   * `-----------------------------------------------------------'
+   */
+	[_BL] = KEYMAP(
+        FN12,1,2,3,4,5,6,7,8,9,0,MINS,EQL,BSPC, \
+	TAB,Q,W,E,R,T,Y,U,I,O,P,LBRC,RBRC,BSLS, \
+        FN2,A,S,D,F,G,H,J,K,L,SCLN,QUOT,NO,ENT,  \
+        LSFT,NO,Z,X,C,V,B,N,M,COMM,DOT,SLSH,NO,RSFT, \
+        LCTL,LGUI,LALT,        SPC,      NO,RALT,FN0,APP, RCTL),
+   
+   /*  
+   * Locking arrow keys to WASD for when you need dedicated arrow keys
+   * ,-----------------------------------------------------------.
+   * |    |  |   |   |   |   |   |   |   |   |   |   |   |       |
+   * |-----------------------------------------------------------|
+   * |     |   |Up |   |   |   |   |   |   |   |   |   |   |     |
+   * |-----------------------------------------------------------|
+   * |       |Left|Down|Rght|   |   |   |   |   |   |   |   |    |
+   * |-----------------------------------------------------------|
+   * |        |   |   |   |   |   |   |   |   |   |   |          |
+   * |-----------------------------------------------------------|
+   * |    |    |    |                        |    |    |    |    |
+   * `-----------------------------------------------------------'
+   */
+	[_AL] = KEYMAP(
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
+        TRNS,TRNS,UP,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
+        TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,   \
+        TRNS,TRNS,TRNS,          TRNS,               TRNS,TRNS,TRNS,TRNS,TRNS),
+
+
+   /* 
+   * Primary function layer, mostly the same as the traditional Pok3r layout.
+   * ,-------------------------------------------------------------.
+   * |`~ | F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12|DEL   |
+   * |-------------------------------------------------------------|
+   * |    |_AL|   |   |  |  |Calc|PgUp|Up|PgDn|Ptscn|Srlck|Pause|  |
+   * |-------------------------------------------------------------|
+   * |      |   |   |   |   |   |Home|Left|Down|Rght|Ins|   |      |
+   * |-------------------------------------------------------------|
+   * |        |_UL|   |   |   |   |   |    |    |    |   |         |
+   * |-------------------------------------------------------------|
+   * |    |    |    |                          |    |    |    |    |
+   * `-------------------------------------------------------------'
+   */
+	[_FL] = KEYMAP(
+        GRAVE,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12, DELETE, \
+        TRNS,FN1,TRNS,TRNS,TRNS,TRNS,CALC,PGUP,UP,PGDN,PSCR,SLCK,PAUS,TRNS, \
+        TRNS,MUTE,_VOLDOWN,_VOLUP,TRNS,TRNS,HOME,LEFT,DOWN,RGHT,INS,TRNS,TRNS,TRNS, \
+        TRNS,TRNS,FN3,TRNS,TRNS,TRNS,TRNS,END,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
+        TRNS,TRNS,TRNS,          TRNS,               TRNS,TRNS,TRNS,TRNS,TRNS),
+   
+   /* 
+   * Locking layer for controlling the underglow.
+   * 
+   * ,-----------------------------------------------------------.
+   * |    |  |   |   |   |   |   |   |   |   |   |   |   |       |
+   * |-----------------------------------------------------------|
+   * |     |   |   |   |   |   |   |   |   |   |   |   |   |     |
+   * |-----------------------------------------------------------|
+   * |       |On|Mode|   |   |   |   |   |   |   |   |   |       |
+   * |-----------------------------------------------------------|
+   * |        |   |Hue+|Hue-|Sat+|Sat-|Val+|Val-|  |  |   |      |
+   * |-----------------------------------------------------------|
+   * |    |    |    |                        |    |    |    |    |
+   * `-----------------------------------------------------------'
+   */
+	[_UL] = KEYMAP(
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
+        TRNS,FN4,FN5,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
+        TRNS,TRNS,TRNS,FN6,FN7,FN8,FN9,FN10,FN11,TRNS,TRNS,TRNS,TRNS,TRNS,   \
+        TRNS,TRNS,TRNS,          TRNS,               TRNS,TRNS,TRNS,TRNS,TRNS),
+};
+
+enum function_id {
+    RGBLED_TOGGLE,
+    RGBLED_STEP_MODE,
+    RGBLED_INCREASE_HUE,
+    RGBLED_DECREASE_HUE,
+    RGBLED_INCREASE_SAT,
+    RGBLED_DECREASE_SAT,
+    RGBLED_INCREASE_VAL,
+    RGBLED_DECREASE_VAL,
+    SHIFT_ESC,
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [0]  = ACTION_LAYER_MOMENTARY(2),  // Momentary Fn overlay
+    [1]  = ACTION_LAYER_TOGGLE(1),     // Toggle Arrow Layer overlay
+    [2]  = ACTION_LAYER_TAP_KEY(2, KC_CAPS), // Tap to toggle caps lock and hold to activate function layer
+    [3]  = ACTION_LAYER_TOGGLE(3),     // Toggle Underglow Layer overlay
+    [4]  = ACTION_FUNCTION(RGBLED_TOGGLE), //Turn on/off underglow
+    [5]  = ACTION_FUNCTION(RGBLED_STEP_MODE), // Change underglow mode
+    [6]  = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
+    [7]  = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
+    [8]  = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
+    [9]  = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
+    [10] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
+    [11] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
+    [12] = ACTION_FUNCTION(SHIFT_ESC),
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function 
+      switch(id) {
+        case 0:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
+
+void matrix_scan_user(void) {
+
+// Layer LED indicators
+// ESC led on when in function layer, WASD cluster leds enabled when on arrow cluster
+    uint32_t layer = layer_state;
+    if (layer & (1<<1)) {
+        gh60_wasd_leds_on();
+    } else {
+        gh60_wasd_leds_off();
+    }
+
+    if (layer & (1<<2)) {
+        gh60_esc_led_on();
+    } else {
+        gh60_esc_led_off();
+    }
+};
+
+#define MODS_CTRL_MASK  (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
+
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
+  switch (id) {
+    case RGBLED_TOGGLE:
+      //led operations
+      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;
+    static uint8_t shift_esc_shift_mask;
+    // Shift + ESC = ~
+    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;
+    }
+};

+ 16 - 0
keyboards/gh60/keymaps/robotmaxtron/readme.md

@@ -0,0 +1,16 @@
+robotmaxtron's GH60 Layout
+=====================
+
+##Quantum MK Firmware
+For the full Quantum feature list, see the parent readme.md.
+
+* Standard ANSI layout with Pok3r styled function layers
+* ESC key led enables when on function layer
+* Lockable layer with arrow keys on WASD with backlighting to indicate locked on arrow layer
+* Neopixel/WS2812 RGB Underglow Support
+
+## Reference Images
+![Wiring Refererence] (WS2812-wiring.jpg)
+
+### Additional Credits
+Keymap has been based on various keymaps available from the QMK Repo for the GH60-SATAN and KC60 keyboards.

+ 4 - 0
keyboards/hhkb/Makefile

@@ -78,6 +78,10 @@ ifndef QUANTUM_DIR
 	include ../../Makefile
 endif
 
+ifneq (, $(findstring yes, $(HHKB_JP)))
+	OPT_DEFS += -DHHKB_JP
+endif
+
 debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION
 debug-on: all
 

+ 5 - 1
keyboards/hhkb/config.h

@@ -29,7 +29,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define DESCRIPTION     q.m.k keyboard firmware for HHKB
 
 /* key matrix size */
-#define MATRIX_ROWS 8
+#ifdef HHKB_JP
+#   define MATRIX_ROWS 16
+#else
+#   define MATRIX_ROWS 8
+#endif
 #define MATRIX_COLS 8
 
 #define TAPPING_TERM    200

+ 27 - 0
keyboards/hhkb/hhkb.h

@@ -21,4 +21,31 @@
     { K70, K71, K72, K73, K74, K75, K76, KC_NO }                               \
 }
 
+
+#define KEYMAP_JP(                                                             \
+    K02, K32, K62, K22, K12, K52, K72, KA2, K92, K82, KB2, KE2, KF2, KD2, KC2, \
+    K03, K63, K23, K13, K53, K73, KA3, K93, K83, KB3, KE3, KF3, KD3,           \
+    K06, K66, K26, K16, K56, K76, KA6, K96, K86, KB6, KE6, KF6, KD6, KC6,      \
+    K05, K65, K25, K15, K55, K75, KA5, K95, K85, KB5, KE5, KF5, KD5, KC5,      \
+    K04, K34, K64, K24, K14,      K74,      K94, K84, KB4, KE4, KF4, KD4, KC4) \
+{                                                                              \
+    { KC_NO, KC_NO, K02,   K03,   K04,   K05,   K06,   KC_NO },                \
+    { KC_NO, KC_NO, K12,   K13,   K14,   K15,   K16,   KC_NO },                \
+    { KC_NO, KC_NO, K22,   K23,   K24,   K25,   K26,   KC_NO },                \
+    { KC_NO, KC_NO, K32,   KC_NO, K34,   KC_NO, KC_NO, KC_NO },                \
+    { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO },                \
+    { KC_NO, KC_NO, K52,   K53,   KC_NO, K55,   K56,   KC_NO },                \
+    { KC_NO, KC_NO, K62,   K63,   K64,   K65,   K66,   KC_NO },                \
+    { KC_NO, KC_NO, K72,   K73,   K74,   K75,   K76,   KC_NO },                \
+    { KC_NO, KC_NO, K82,   K83,   K84,   K85,   K86,   KC_NO },                \
+    { KC_NO, KC_NO, K92,   K93,   K94,   K95,   K96,   KC_NO },                \
+    { KC_NO, KC_NO, KA2,   KA3,   KC_NO, KA5,   KA6,   KC_NO },                \
+    { KC_NO, KC_NO, KB2,   KB3,   KB4,   KB5,   KB6,   KC_NO },                \
+    { KC_NO, KC_NO, KC2,   KC_NO, KC4,   KC5,   KC6,   KC_NO },                \
+    { KC_NO, KC_NO, KD2,   KD3,   KD4,   KD5,   KD6,   KC_NO },                \
+    { KC_NO, KC_NO, KE2,   KE3,   KE4,   KE5,   KE6,   KC_NO },                \
+    { KC_NO, KC_NO, KF2,   KF3,   KF4,   KF5,   KF6,   KC_NO }                 \
+}
+
+
 #endif

+ 1 - 0
keyboards/hhkb/keymaps/jp/Makefile

@@ -0,0 +1 @@
+HHKB_JP=yes

+ 58 - 0
keyboards/hhkb/keymaps/jp/keymap.c

@@ -0,0 +1,58 @@
+#include "hhkb.h"
+
+#define _______ KC_TRNS
+
+
+/* Layer 0: HHKB JP
+ * ,-----------------------------------------------------------.
+ * |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9| 10|  -|  =|Yen|Bsp|
+ * |-----------------------------------------------------------|
+ * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|     |
+ * |------------------------------------------------------` Ent|
+ * |Ctrl  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|  `|    |
+ * |-----------------------------------------------------------|
+ * |Shft   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|  \| Up|Sft|
+ * |-----------------------------------------------------------|
+ * |   ||Ctl|Alt|Cmd|   |   Spc   |Bsp|   |   |   ||Lft|Dwn|Rgh|
+ * `-----------------------------------------------------------'
+ */
+
+/* Layer 1: HHKB mode (HHKB Fn)
+ * ,-----------------------------------------------------------.
+ * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
+ * |-----------------------------------------------------------|
+ * |Caps |   |   |   |   |   |   |   |Psc|Slk|Pus|Up |   |     |
+ * |------------------------------------------------------`    |
+ * |      |VoD|VoU|Mut|   |   |  *|  /|Hom|PgU|Lef|Rig|   |    |
+ * |-----------------------------------------------------------|
+ * |       |   |   |   |   |   |  +|  -|End|PgD|Dow|   |   |   |
+ * |-----------------------------------------------------------|
+ * |   ||   |   |   |   |         |   |   |   |   ||   |   |   |
+ * `-----------------------------------------------------------'
+ */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [0] = KEYMAP_JP(
+    KC_ESC,   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_JYEN,  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_LCTL,  KC_A,    KC_S,    KC_D,    KC_F,     KC_G,    KC_H,    KC_J,     KC_K,    KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT,
+    KC_LSFT,  KC_Z,    KC_X,    KC_C,    KC_V,     KC_B,    KC_N,    KC_M,  KC_COMM,  KC_DOT, KC_SLSH,   KC_RO,   KC_UP, KC_RSFT,
+    MO(1), KC_ZKHK, KC_LGUI, KC_LALT, KC_MHEN,         KC_SPC,    KC_HENK,  KC_KANA, KC_RALT,   MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+  ),
+
+  [1] = KEYMAP_JP(
+    KC_PWR,    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_INS,  KC_DEL,
+    KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS,   KC_UP, _______,
+    _______, KC_VOLD, KC_VOLU, KC_MUTE,  KC_PWR, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______, KC_PENT,
+    _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS,  KC_END, KC_PGDN, KC_DOWN, _______, _______, _______,
+    _______, _______, _______, _______, _______,     _______     , _______, _______, _______, _______, _______, _______, _______
+  )
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t macro_id, uint8_t opt) {
+  return MACRO_NONE;
+}
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};

+ 1 - 0
keyboards/hhkb/keymaps/rdg_jp/Makefile

@@ -0,0 +1 @@
+HHKB_JP=yes

+ 65 - 0
keyboards/hhkb/keymaps/rdg_jp/keymap.c

@@ -0,0 +1,65 @@
+#include "hhkb.h"
+
+#define _______ KC_TRNS
+
+enum {
+  ZER,
+  HDN,
+  OSY
+};
+
+
+#define CTL_ESC CTL_T(KC_ESC)
+#define SFT_BSP SFT_T(KC_BSPC)
+
+#define SCRNS3 LGUI(LCTL(LSFT(KC_3)))
+#define SCRNS4 LGUI(LCTL(LSFT(KC_4)))
+
+
+/* hhkb jp ~ layout
+ * ,-----------------------------------------------------------.
+ * |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9| 10|  -|  =|Yen|Bsp|
+ * |-----------------------------------------------------------|
+ * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|     |
+ * |------------------------------------------------------` Ent|
+ * |Ctrl  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|  `|    |
+ * |-----------------------------------------------------------|
+ * |Shft   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|  \| Up|Sft|
+ * |-----------------------------------------------------------|
+ * |   ||Ctl|Alt|Cmd|   |   Spc   |Bsp|   |   |   ||Lft|Dwn|Rgh|
+ * `-----------------------------------------------------------'
+ */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [ZER] = KEYMAP_JP(
+    KC_ESC,   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_INS,  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,
+    CTL_ESC,  KC_A,    KC_S,    KC_D,    KC_F,     KC_G,    KC_H,    KC_J,     KC_K,    KC_L, KC_SCLN, KC_QUOT,  KC_GRV, KC_ENT,
+    KC_LSFT,  KC_Z,    KC_X,    KC_C,    KC_V,     KC_B,    KC_N,    KC_M,  KC_COMM,  KC_DOT, KC_SLSH, KC_BSLS,   KC_UP, KC_RSFT,
+    MO(HDN),  KC_LCTL, KC_LALT, KC_LGUI, MO(HDN),      KC_SPC,    SFT_BSP,  MO(HDN), MO(OSY),   KC_NO, KC_LEFT, KC_DOWN, KC_RGHT
+  ),
+
+  [HDN] = KEYMAP_JP(
+    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_EXLM,   KC_AT, KC_HASH,  KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, _______,
+    _______, KC_TILD,  KC_GRV, KC_BSLS, KC_PIPE, KC_MINS, KC_LEFT, KC_DOWN,   KC_UP, KC_RGHT, KC_TILD,  KC_GRV, _______, _______,
+    _______, KC_VOLD, KC_VOLU, KC_MUTE,  KC_PWR, _______, _______,  KC_ENT, _______, _______, _______, _______, KC_PGUP, _______,
+    _______, _______, _______, _______, _______,     KC_UNDS     ,  KC_DEL, _______, _______, _______, KC_HOME, KC_PGDN, KC_END
+  ),
+
+  [OSY] = KEYMAP_JP(
+    _______, _______, _______,  SCRNS3,  SCRNS4, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______,      _______    , _______, _______, _______, _______, _______, _______, _______
+  )
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t macro_id, uint8_t opt) {
+  return MACRO_NONE;
+}
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};

+ 12 - 0
keyboards/infinity_ergodox/Makefile

@@ -67,6 +67,18 @@ SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
 NKRO_ENABLE ?= yes	    # USB Nkey Rollover
 CUSTOM_MATRIX ?= yes # Custom matrix file
 SERIAL_LINK_ENABLE = yes
+VISUALIZER_ENABLE ?= yes
+LCD_ENABLE ?= yes
+LED_ENABLE ?= yes
+LCD_BACKLIGHT_ENABLE ?= yes
+
+ifdef LCD_ENABLE
+include drivers/gdisp/st7565ergodox/driver.mk
+endif
+
+ifdef LED_ENABLE
+include drivers/gdisp/IS31FL3731C/driver.mk
+endif
 
 ifndef QUANTUM_DIR
 	include ../../Makefile

+ 113 - 0
keyboards/infinity_ergodox/drivers/gdisp/IS31FL3731C/board_IS31FL3731C.h

@@ -0,0 +1,113 @@
+/*
+Copyright 2016 Fred Sundvik <fsundvik@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/>.
+*/
+
+#ifndef _GDISP_LLD_BOARD_H
+#define _GDISP_LLD_BOARD_H
+
+static const I2CConfig i2ccfg = {
+  400000 // clock speed (Hz); 400kHz max for IS31
+};
+
+#define GDISP_SCREEN_WIDTH  7
+#define GDISP_SCREEN_HEIGHT 7
+
+static const uint8_t led_mask[] = {
+	0xFF, 0x00, /* C1-1 -> C1-16 */
+	0xFF, 0x00, /* C2-1 -> C2-16 */
+	0xFF, 0x00, /* C3-1 -> C3-16 */
+	0xFF, 0x00, /* C4-1 -> C4-16 */
+	0x3F, 0x00, /* C5-1 -> C5-16 */
+	0x00, 0x00, /* C6-1 -> C6-16 */
+	0x00, 0x00, /* C7-1 -> C7-16 */
+	0x00, 0x00, /* C8-1 -> C8-16 */
+	0x00, 0x00, /* C9-1 -> C9-16 */
+};
+
+// The address of the LED
+#define LA(c, r) (c + r * 16 )
+// Need to be an address that is not mapped, but inside the range of the controller matrix
+#define NA LA(8, 8)
+
+// The numbers in the comments are the led numbers DXX on the PCB
+// The mapping is taken from the schematic of left hand side
+static const uint8_t led_mapping[GDISP_SCREEN_HEIGHT][GDISP_SCREEN_WIDTH] = {
+//   45        44        43        42        41        40        39
+   { LA(1, 1), LA(1, 0), LA(0, 4), LA(0, 3), LA(0, 2), LA(0, 1), LA(0, 0)},
+//   52        51        50        49        48        47        46
+   { LA(2, 3), LA(2, 2), LA(2, 1), LA(2, 0), LA(1, 4), LA(1, 3), LA(1, 2) },
+//   58        57        56        55        54        53        N/A
+   { LA(3, 4), LA(3, 3), LA(3, 2), LA(3, 1), LA(3, 0), LA(2, 4), NA },
+//   67        66        65        64        63        62        61
+   { LA(5, 3), LA(5, 2), LA(5, 1), LA(5, 0), LA(4, 4), LA(4, 3), LA(4, 2) },
+//   76        75        74        73        72        60        59
+   { LA(7, 3), LA(7, 2), LA(7, 1), LA(7, 0), LA(6, 3), LA(4, 1), LA(4, 0) },
+//   N/A       N/A       N/A       N/A       N/A       N/A       68
+   { NA,       NA,       NA,       NA,       NA,       NA,       LA(5, 4) },
+//   N/A       N/A       N/A       N/A       71        70        69
+   { NA,       NA,       NA,       NA,       LA(6, 2), LA(6, 1), LA(6, 0) },
+};
+
+
+#define IS31_ADDR_DEFAULT 0x74 // AD connected to GND
+#define IS31_TIMEOUT 5000
+
+static GFXINLINE void init_board(GDisplay *g) {
+    (void) g;
+    /* I2C pins */
+    palSetPadMode(GPIOB, 0, PAL_MODE_ALTERNATIVE_2); // PTB0/I2C0/SCL
+    palSetPadMode(GPIOB, 1, PAL_MODE_ALTERNATIVE_2); // PTB1/I2C0/SDA
+    palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL);
+    palClearPad(GPIOB, 16);
+    /* start I2C */
+    i2cStart(&I2CD1, &i2ccfg);
+    // try high drive (from kiibohd)
+    I2CD1.i2c->C2 |= I2Cx_C2_HDRS;
+    // try glitch fixing (from kiibohd)
+    I2CD1.i2c->FLT = 4;
+}
+
+static GFXINLINE void post_init_board(GDisplay *g) {
+	(void) g;
+}
+
+static GFXINLINE const uint8_t* get_led_mask(GDisplay* g) {
+    (void) g;
+    return led_mask;
+}
+
+static GFXINLINE uint8_t get_led_address(GDisplay* g, uint16_t x, uint16_t y)
+{
+    (void) g;
+    return led_mapping[y][x];
+}
+
+static GFXINLINE void set_hardware_shutdown(GDisplay* g, bool shutdown) {
+    (void) g;
+    if(!shutdown) {
+        palSetPad(GPIOB, 16);
+    }
+    else {
+        palClearPad(GPIOB, 16);
+    }
+}
+
+static GFXINLINE void write_data(GDisplay *g, uint8_t* data, uint16_t length) {
+	(void) g;
+	i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, data, length, 0, 0, US2ST(IS31_TIMEOUT));
+}
+
+#endif /* _GDISP_LLD_BOARD_H */

+ 2 - 0
keyboards/infinity_ergodox/drivers/gdisp/IS31FL3731C/driver.mk

@@ -0,0 +1,2 @@
+GFXINC += drivers/gdisp/IS31FL3731C
+GFXSRC += drivers/gdisp/IS31FL3731C/gdisp_IS31FL3731C.c

+ 333 - 0
keyboards/infinity_ergodox/drivers/gdisp/IS31FL3731C/gdisp_IS31FL3731C.c

@@ -0,0 +1,333 @@
+/*
+Copyright 2016 Fred Sundvik <fsundvik@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 "gfx.h"
+
+#if GFX_USE_GDISP
+
+#define GDISP_DRIVER_VMT			GDISPVMT_IS31FL3731C_ERGODOX
+#include "drivers/gdisp/IS31FL3731C/gdisp_lld_config.h"
+#include "src/gdisp/gdisp_driver.h"
+
+#include "board_IS31FL3731C.h"
+
+/*===========================================================================*/
+/* Driver local definitions.                                                 */
+/*===========================================================================*/
+
+#ifndef GDISP_SCREEN_HEIGHT
+	#define GDISP_SCREEN_HEIGHT		9
+#endif
+#ifndef GDISP_SCREEN_WIDTH
+	#define GDISP_SCREEN_WIDTH		16
+#endif
+#ifndef GDISP_INITIAL_CONTRAST
+	#define GDISP_INITIAL_CONTRAST	0
+#endif
+#ifndef GDISP_INITIAL_BACKLIGHT
+	#define GDISP_INITIAL_BACKLIGHT	100
+#endif
+
+#define GDISP_FLG_NEEDFLUSH			(GDISP_FLG_DRIVER<<0)
+
+#define IS31_ADDR_DEFAULT 0x74
+
+#define IS31_REG_CONFIG  0x00
+// bits in reg
+#define IS31_REG_CONFIG_PICTUREMODE 0x00
+#define IS31_REG_CONFIG_AUTOPLAYMODE 0x08
+#define IS31_REG_CONFIG_AUDIOPLAYMODE 0x18
+// D2:D0 bits are starting frame for autoplay mode
+
+#define IS31_REG_PICTDISP 0x01 // D2:D0 frame select for picture mode
+
+#define IS31_REG_AUTOPLAYCTRL1 0x02
+// D6:D4 number of loops (000=infty)
+// D2:D0 number of frames to be used
+
+#define IS31_REG_AUTOPLAYCTRL2 0x03 // D5:D0 delay time (*11ms)
+
+#define IS31_REG_DISPLAYOPT 0x05
+#define IS31_REG_DISPLAYOPT_INTENSITY_SAME 0x20 // same intensity for all frames
+#define IS31_REG_DISPLAYOPT_BLINK_ENABLE 0x8
+// D2:D0 bits blink period time (*0.27s)
+
+#define IS31_REG_AUDIOSYNC 0x06
+#define IS31_REG_AUDIOSYNC_ENABLE 0x1
+
+#define IS31_REG_FRAMESTATE 0x07
+
+#define IS31_REG_BREATHCTRL1 0x08
+// D6:D4 fade out time (26ms*2^i)
+// D2:D0 fade in time (26ms*2^i)
+
+#define IS31_REG_BREATHCTRL2 0x09
+#define IS31_REG_BREATHCTRL2_ENABLE 0x10
+// D2:D0 extinguish time (3.5ms*2^i)
+
+#define IS31_REG_SHUTDOWN 0x0A
+#define IS31_REG_SHUTDOWN_OFF 0x0
+#define IS31_REG_SHUTDOWN_ON 0x1
+
+#define IS31_REG_AGCCTRL 0x0B
+#define IS31_REG_ADCRATE 0x0C
+
+#define IS31_COMMANDREGISTER 0xFD
+#define IS31_FUNCTIONREG 0x0B    // helpfully called 'page nine'
+#define IS31_FUNCTIONREG_SIZE 0xD
+
+#define IS31_FRAME_SIZE 0xB4
+
+#define IS31_PWM_REG 0x24
+#define IS31_PWM_SIZE 0x90
+
+#define IS31_LED_MASK_SIZE 0x12
+#define IS31_SCREEN_WIDTH 16
+
+#define IS31
+
+//Generated by http://jared.geek.nz/2013/feb/linear-led-pwm
+const unsigned char cie[256] = {
+    0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
+    3, 4, 4, 4, 4, 4, 4, 5, 5, 5,
+    5, 5, 6, 6, 6, 6, 6, 7, 7, 7,
+    7, 8, 8, 8, 8, 9, 9, 9, 10, 10,
+    10, 10, 11, 11, 11, 12, 12, 12, 13, 13,
+    13, 14, 14, 15, 15, 15, 16, 16, 17, 17,
+    17, 18, 18, 19, 19, 20, 20, 21, 21, 22,
+    22, 23, 23, 24, 24, 25, 25, 26, 26, 27,
+    28, 28, 29, 29, 30, 31, 31, 32, 32, 33,
+    34, 34, 35, 36, 37, 37, 38, 39, 39, 40,
+    41, 42, 43, 43, 44, 45, 46, 47, 47, 48,
+    49, 50, 51, 52, 53, 54, 54, 55, 56, 57,
+    58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
+    68, 70, 71, 72, 73, 74, 75, 76, 77, 79,
+    80, 81, 82, 83, 85, 86, 87, 88, 90, 91,
+    92, 94, 95, 96, 98, 99, 100, 102, 103, 105,
+    106, 108, 109, 110, 112, 113, 115, 116, 118, 120,
+    121, 123, 124, 126, 128, 129, 131, 132, 134, 136,
+    138, 139, 141, 143, 145, 146, 148, 150, 152, 154,
+    155, 157, 159, 161, 163, 165, 167, 169, 171, 173,
+    175, 177, 179, 181, 183, 185, 187, 189, 191, 193,
+    196, 198, 200, 202, 204, 207, 209, 211, 214, 216,
+    218, 220, 223, 225, 228, 230, 232, 235, 237, 240,
+    242, 245, 247, 250, 252, 255,
+};
+
+
+/*===========================================================================*/
+/* Driver local functions.                                                   */
+/*===========================================================================*/
+
+typedef struct{
+    uint8_t write_buffer_offset;
+    uint8_t write_buffer[IS31_FRAME_SIZE];
+    uint8_t frame_buffer[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH];
+    uint8_t page;
+}__attribute__((__packed__)) PrivData;
+
+// Some common routines and macros
+#define PRIV(g)                         ((PrivData*)g->priv)
+
+/*===========================================================================*/
+/* Driver exported functions.                                                */
+/*===========================================================================*/
+
+static GFXINLINE void write_page(GDisplay* g, uint8_t page) {
+    uint8_t tx[2] __attribute__((aligned(2)));
+    tx[0] = IS31_COMMANDREGISTER;
+    tx[1] = page;
+    write_data(g, tx, 2);
+}
+
+static GFXINLINE void write_register(GDisplay* g, uint8_t page, uint8_t reg, uint8_t data) {
+    uint8_t tx[2] __attribute__((aligned(2)));
+    tx[0] = reg;
+    tx[1] = data;
+    write_page(g, page);
+    write_data(g, tx, 2);
+}
+
+static GFXINLINE void write_ram(GDisplay *g, uint8_t page, uint16_t offset, uint16_t length) {
+    PRIV(g)->write_buffer_offset = offset;
+    write_page(g, page);
+    write_data(g, (uint8_t*)PRIV(g), length + 1);
+}
+
+LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
+	// The private area is the display surface.
+	g->priv = gfxAlloc(sizeof(PrivData));
+    __builtin_memset(PRIV(g), 0, sizeof(PrivData));
+	PRIV(g)->page = 0;
+
+	// Initialise the board interface
+	init_board(g);
+	gfxSleepMilliseconds(10);
+
+    // zero function page, all registers (assuming full_page is all zeroes)
+    write_ram(g, IS31_FUNCTIONREG, 0, IS31_FUNCTIONREG_SIZE);
+    set_hardware_shutdown(g, false);
+    gfxSleepMilliseconds(10);
+    // software shutdown
+    write_register(g, IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF);
+    gfxSleepMilliseconds(10);
+    // zero function page, all registers
+    write_ram(g, IS31_FUNCTIONREG, 0, IS31_FUNCTIONREG_SIZE);
+    gfxSleepMilliseconds(10);
+
+
+    // zero all LED registers on all 8 pages, and enable the mask
+    __builtin_memcpy(PRIV(g)->write_buffer, get_led_mask(g), IS31_LED_MASK_SIZE);
+    for(uint8_t i=0; i<8; i++) {
+        write_ram(g, i, 0, IS31_FRAME_SIZE);
+        gfxSleepMilliseconds(1);
+    }
+
+    // software shutdown disable (i.e. turn stuff on)
+    write_register(g, IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
+    gfxSleepMilliseconds(10);
+
+    // Finish Init
+    post_init_board(g);
+
+	/* Initialise the GDISP structure */
+	g->g.Width = GDISP_SCREEN_WIDTH;
+	g->g.Height = GDISP_SCREEN_HEIGHT;
+	g->g.Orientation = GDISP_ROTATE_0;
+	g->g.Powermode = powerOn;
+	g->g.Backlight = GDISP_INITIAL_BACKLIGHT;
+	g->g.Contrast = GDISP_INITIAL_CONTRAST;
+	return TRUE;
+}
+
+#if GDISP_HARDWARE_FLUSH
+	LLDSPEC void gdisp_lld_flush(GDisplay *g) {
+		// Don't flush if we don't need it.
+		if (!(g->flags & GDISP_FLG_NEEDFLUSH))
+			return;
+
+		PRIV(g)->page++;
+		PRIV(g)->page %= 2;
+		// TODO: some smarter algorithm for this
+		// We should run only one physical page at a time
+		// This way we don't need to send so much data, and
+		// we could use slightly less memory
+		uint8_t* src = PRIV(g)->frame_buffer;
+		for (int y=0;y<GDISP_SCREEN_HEIGHT;y++) {
+		    for (int x=0;x<GDISP_SCREEN_WIDTH;x++) {
+		        PRIV(g)->write_buffer[get_led_address(g, x, y)]=cie[*src];
+		        ++src;
+		    }
+		}
+        write_ram(g, PRIV(g)->page, IS31_PWM_REG, IS31_PWM_SIZE);
+        gfxSleepMilliseconds(1);
+        write_register(g, IS31_FUNCTIONREG, IS31_REG_PICTDISP, PRIV(g)->page);
+
+		g->flags &= ~GDISP_FLG_NEEDFLUSH;
+	}
+#endif
+
+#if GDISP_HARDWARE_DRAWPIXEL
+	LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
+		coord_t		x, y;
+
+		switch(g->g.Orientation) {
+		default:
+		case GDISP_ROTATE_0:
+			x = g->p.x;
+			y = g->p.y;
+			break;
+		case GDISP_ROTATE_180:
+			x = GDISP_SCREEN_WIDTH-1 - g->p.x;
+			y = g->p.y;
+			break;
+		}
+		PRIV(g)->frame_buffer[y * GDISP_SCREEN_WIDTH + x] = gdispColor2Native(g->p.color);
+		g->flags |= GDISP_FLG_NEEDFLUSH;
+	}
+#endif
+
+#if GDISP_HARDWARE_PIXELREAD
+	LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
+		coord_t		x, y;
+
+		switch(g->g.Orientation) {
+		default:
+		case GDISP_ROTATE_0:
+			x = g->p.x;
+			y = g->p.y;
+			break;
+		case GDISP_ROTATE_180:
+			x = GDISP_SCREEN_WIDTH-1 - g->p.x;
+			y = g->p.y;
+			break;
+		}
+		return gdispNative2Color(PRIV(g)->frame_buffer[y * GDISP_SCREEN_WIDTH + x]);
+	}
+#endif
+
+#if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
+	LLDSPEC void gdisp_lld_control(GDisplay *g) {
+		switch(g->p.x) {
+		case GDISP_CONTROL_POWER:
+			if (g->g.Powermode == (powermode_t)g->p.ptr)
+				return;
+			switch((powermode_t)g->p.ptr) {
+			case powerOff:
+			case powerSleep:
+			case powerDeepSleep:
+                write_register(g, IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF);
+				break;
+			case powerOn:
+                write_register(g, IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
+				break;
+			default:
+				return;
+			}
+			g->g.Powermode = (powermode_t)g->p.ptr;
+			return;
+
+		case GDISP_CONTROL_ORIENTATION:
+			if (g->g.Orientation == (orientation_t)g->p.ptr)
+				return;
+			switch((orientation_t)g->p.ptr) {
+			/* Rotation is handled by the drawing routines */
+			case GDISP_ROTATE_0:
+			case GDISP_ROTATE_180:
+				g->g.Height = GDISP_SCREEN_HEIGHT;
+				g->g.Width = GDISP_SCREEN_WIDTH;
+				break;
+			case GDISP_ROTATE_90:
+			case GDISP_ROTATE_270:
+				g->g.Height = GDISP_SCREEN_WIDTH;
+				g->g.Width = GDISP_SCREEN_HEIGHT;
+				break;
+			default:
+				return;
+			}
+			g->g.Orientation = (orientation_t)g->p.ptr;
+			return;
+
+		case GDISP_CONTROL_CONTRAST:
+			return;
+		}
+	}
+#endif // GDISP_NEED_CONTROL
+
+#endif // GFX_USE_GDISP

+ 36 - 0
keyboards/infinity_ergodox/drivers/gdisp/IS31FL3731C/gdisp_lld_config.h

@@ -0,0 +1,36 @@
+/*
+Copyright 2016 Fred Sundvik <fsundvik@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/>.
+*/
+
+#ifndef _GDISP_LLD_CONFIG_H
+#define _GDISP_LLD_CONFIG_H
+
+#if GFX_USE_GDISP
+
+/*===========================================================================*/
+/* Driver hardware support.                                                  */
+/*===========================================================================*/
+
+#define GDISP_HARDWARE_FLUSH			TRUE		// This controller requires flushing
+#define GDISP_HARDWARE_DRAWPIXEL		TRUE
+#define GDISP_HARDWARE_PIXELREAD		TRUE
+#define GDISP_HARDWARE_CONTROL			TRUE
+
+#define GDISP_LLD_PIXELFORMAT			GDISP_PIXELFORMAT_GRAY256
+
+#endif	/* GFX_USE_GDISP */
+
+#endif	/* _GDISP_LLD_CONFIG_H */

+ 2 - 0
keyboards/infinity_ergodox/drivers/gdisp/emulator_lcd/driver.mk

@@ -0,0 +1,2 @@
+GFXINC += drivers/gdisp/emulator_lcd
+GFXSRC += drivers/gdisp/emulator_lcd/emulator_lcd.c

+ 10 - 0
keyboards/infinity_ergodox/drivers/gdisp/emulator_lcd/emulator_lcd.c

@@ -0,0 +1,10 @@
+#define GDISP_DRIVER_VMT		    	GDISPVMT_EMULATOR_LCD_ERGODOX
+#define GDISP_HARDWARE_DRAWPIXEL		TRUE
+#define GDISP_HARDWARE_PIXELREAD		TRUE
+#define GDISP_HARDWARE_CONTROL			TRUE
+#define GDISP_LLD_PIXELFORMAT			GDISP_PIXELFORMAT_MONO
+#define GDISP_SCREEN_WIDTH		        128
+#define GDISP_SCREEN_HEIGHT		        32
+#define ROTATE_180_IS_FLIP
+
+#include "emulator/emulator_driver_impl.h"

+ 2 - 0
keyboards/infinity_ergodox/drivers/gdisp/emulator_led/driver.mk

@@ -0,0 +1,2 @@
+GFXINC += drivers/gdisp/emulator_led
+GFXSRC += drivers/gdisp/emulator_led/emulator_led.c

+ 10 - 0
keyboards/infinity_ergodox/drivers/gdisp/emulator_led/emulator_led.c

@@ -0,0 +1,10 @@
+#define GDISP_DRIVER_VMT			    GDISPVMT_EMULATOR_LED_ERGODOX
+#define GDISP_HARDWARE_DRAWPIXEL		TRUE
+#define GDISP_HARDWARE_PIXELREAD		TRUE
+#define GDISP_HARDWARE_CONTROL			TRUE
+#define GDISP_LLD_PIXELFORMAT			GDISP_PIXELFORMAT_MONO
+#define GDISP_SCREEN_WIDTH		        7
+#define GDISP_SCREEN_HEIGHT		        7
+#define ROTATE_180_IS_FLIP
+
+#include "emulator/emulator_driver_impl.h"

+ 127 - 0
keyboards/infinity_ergodox/drivers/gdisp/st7565ergodox/board_ST7565.h

@@ -0,0 +1,127 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ *              http://ugfx.org/license.html
+ */
+
+#ifndef _GDISP_LLD_BOARD_H
+#define _GDISP_LLD_BOARD_H
+
+#include "print.h"
+
+#define ST7565_LCD_BIAS         ST7565_LCD_BIAS_9 // actually 6
+#define ST7565_ADC              ST7565_ADC_NORMAL
+#define ST7565_COM_SCAN         ST7565_COM_SCAN_DEC
+#define ST7565_PAGE_ORDER       0,1,2,3
+/*
+ * Custom page order for several LCD boards, e.g. HEM12864-99
+ * #define ST7565_PAGE_ORDER       4,5,6,7,0,1,2,3
+ */
+
+#define ST7565_GPIOPORT GPIOC
+#define ST7565_PORT PORTC
+#define ST7565_A0_PIN 7
+#define ST7565_RST_PIN 8
+#define ST7565_MOSI_PIN 6
+#define ST7565_SLCK_PIN 5
+#define ST7565_SS_PIN 4
+
+#define palSetPadModeRaw(portname, bits) \
+    ST7565_PORT->PCR[ST7565_##portname##_PIN] = bits
+
+#define palSetPadModeNamed(portname, portmode) \
+    palSetPadMode(ST7565_GPIOPORT, ST7565_##portname##_PIN, portmode)
+
+#define ST7565_SPI_MODE PORTx_PCRn_DSE | PORTx_PCRn_MUX(2)
+// DSPI Clock and Transfer Attributes
+// Frame Size: 8 bits
+// MSB First
+// CLK Low by default
+static const SPIConfig spi1config = {
+	NULL,
+	/* HW dependent part.*/
+	ST7565_GPIOPORT,
+    ST7565_SS_PIN,
+    SPIx_CTARn_FMSZ(7)
+    | SPIx_CTARn_ASC(7)
+    | SPIx_CTARn_DT(7)
+    | SPIx_CTARn_CSSCK(7)
+    | SPIx_CTARn_PBR(0)
+    | SPIx_CTARn_BR(7)
+	//SPI_CR1_BR_0
+};
+
+static bool_t st7565_is_data_mode = 1;
+
+static GFXINLINE void init_board(GDisplay *g) {
+    (void) g;
+    palSetPadModeNamed(A0, PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN);
+    st7565_is_data_mode = 1;
+    palSetPadModeNamed(RST, PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPad(ST7565_GPIOPORT, ST7565_RST_PIN);
+    palSetPadModeRaw(MOSI, ST7565_SPI_MODE);
+    palSetPadModeRaw(SLCK, ST7565_SPI_MODE);
+    palSetPadModeRaw(SS, ST7565_SPI_MODE);
+
+    spiInit();
+    spiStart(&SPID1, &spi1config);
+    spiSelect(&SPID1);
+}
+
+static GFXINLINE void post_init_board(GDisplay *g) {
+	(void) g;
+}
+
+static GFXINLINE void setpin_reset(GDisplay *g, bool_t state) {
+    (void) g;
+    if (state) {
+        palClearPad(ST7565_GPIOPORT, ST7565_RST_PIN);
+    }
+    else {
+        palSetPad(ST7565_GPIOPORT, ST7565_RST_PIN);
+    }
+}
+
+static GFXINLINE void acquire_bus(GDisplay *g) {
+    (void) g;
+    // Only the LCD is using the SPI bus, so no need to acquire
+    // spiAcquireBus(&SPID1);
+}
+
+static GFXINLINE void release_bus(GDisplay *g) {
+    (void) g;
+    // Only the LCD is using the SPI bus, so no need to release
+    //spiReleaseBus(&SPID1);
+}
+
+static GFXINLINE void write_cmd(GDisplay *g, uint8_t cmd) {
+	(void) g;
+	if (st7565_is_data_mode) {
+	    // The sleeps need to be at lest 10 vs 25 ns respectively
+	    // So let's sleep two ticks, one tick might not be enough
+	    // if we are at the end of the tick
+	    chThdSleep(2);
+        palClearPad(ST7565_GPIOPORT, ST7565_A0_PIN);
+        chThdSleep(2);
+        st7565_is_data_mode = 0;
+	}
+	spiSend(&SPID1, 1, &cmd);
+}
+
+static GFXINLINE void write_data(GDisplay *g, uint8_t* data, uint16_t length) {
+	(void) g;
+	if (!st7565_is_data_mode) {
+	    // The sleeps need to be at lest 10 vs 25 ns respectively
+	    // So let's sleep two ticks, one tick might not be enough
+	    // if we are at the end of the tick
+	    chThdSleep(2);
+        palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN);
+	    chThdSleep(2);
+        st7565_is_data_mode = 1;
+	}
+	spiSend(&SPID1, length, data);
+}
+
+#endif /* _GDISP_LLD_BOARD_H */

+ 2 - 0
keyboards/infinity_ergodox/drivers/gdisp/st7565ergodox/driver.mk

@@ -0,0 +1,2 @@
+GFXINC += drivers/gdisp/st7565ergodox
+GFXSRC += drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c

+ 292 - 0
keyboards/infinity_ergodox/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c

@@ -0,0 +1,292 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ *              http://ugfx.org/license.html
+ */
+
+#include "gfx.h"
+
+#if GFX_USE_GDISP
+
+#define GDISP_DRIVER_VMT			GDISPVMT_ST7565_ERGODOX
+#include "drivers/gdisp/st7565ergodox/gdisp_lld_config.h"
+#include "src/gdisp/gdisp_driver.h"
+
+#include "board_ST7565.h"
+
+/*===========================================================================*/
+/* Driver local definitions.                                                 */
+/*===========================================================================*/
+
+#ifndef GDISP_SCREEN_HEIGHT
+	#define GDISP_SCREEN_HEIGHT		32
+#endif
+#ifndef GDISP_SCREEN_WIDTH
+	#define GDISP_SCREEN_WIDTH		128
+#endif
+#ifndef GDISP_INITIAL_CONTRAST
+	#define GDISP_INITIAL_CONTRAST	0
+#endif
+#ifndef GDISP_INITIAL_BACKLIGHT
+	#define GDISP_INITIAL_BACKLIGHT	100
+#endif
+
+#define GDISP_FLG_NEEDFLUSH			(GDISP_FLG_DRIVER<<0)
+
+#include "drivers/gdisp/st7565ergodox/st7565.h"
+
+/*===========================================================================*/
+/* Driver config defaults for backward compatibility.               	     */
+/*===========================================================================*/
+#ifndef ST7565_LCD_BIAS
+  #define ST7565_LCD_BIAS         ST7565_LCD_BIAS_7
+#endif
+#ifndef ST7565_ADC
+  #define ST7565_ADC              ST7565_ADC_NORMAL
+#endif
+#ifndef ST7565_COM_SCAN
+  #define ST7565_COM_SCAN         ST7565_COM_SCAN_INC
+#endif
+#ifndef ST7565_PAGE_ORDER
+  #define ST7565_PAGE_ORDER       0,1,2,3
+#endif
+
+/*===========================================================================*/
+/* Driver local functions.                                                   */
+/*===========================================================================*/
+
+typedef struct{
+    bool_t buffer2;
+    uint8_t ram[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH / 8];
+}PrivData;
+
+// Some common routines and macros
+#define PRIV(g)                         ((PrivData*)g->priv)
+#define RAM(g)							(PRIV(g)->ram)
+#define write_cmd2(g, cmd1, cmd2)		{ write_cmd(g, cmd1); write_cmd(g, cmd2); }
+#define write_cmd3(g, cmd1, cmd2, cmd3)	{ write_cmd(g, cmd1); write_cmd(g, cmd2); write_cmd(g, cmd3); }
+
+// Some common routines and macros
+#define delay(us)			gfxSleepMicroseconds(us)
+#define delay_ms(ms)		gfxSleepMilliseconds(ms)
+
+#define xyaddr(x, y)		((x) + ((y)>>3)*GDISP_SCREEN_WIDTH)
+#define xybit(y)			(1<<((y)&7))
+
+/*===========================================================================*/
+/* Driver exported functions.                                                */
+/*===========================================================================*/
+
+/*
+ * As this controller can't update on a pixel boundary we need to maintain the
+ * the entire display surface in memory so that we can do the necessary bit
+ * operations. Fortunately it is a small display in monochrome.
+ * 64 * 128 / 8 = 1024 bytes.
+ */
+
+LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
+	// The private area is the display surface.
+	g->priv = gfxAlloc(sizeof(PrivData));
+	PRIV(g)->buffer2 = false;
+
+	// Initialise the board interface
+	init_board(g);
+
+	// Hardware reset
+	setpin_reset(g, TRUE);
+	gfxSleepMilliseconds(20);
+	setpin_reset(g, FALSE);
+	gfxSleepMilliseconds(20);
+
+	acquire_bus(g);
+    write_cmd(g, ST7565_DISPLAY_OFF);
+	write_cmd(g, ST7565_LCD_BIAS);
+    write_cmd(g, ST7565_ADC);
+    write_cmd(g, ST7565_COM_SCAN);
+    
+    write_cmd(g, ST7565_START_LINE | 0);
+
+	write_cmd(g, ST7565_RESISTOR_RATIO | 0x6);
+
+	// turn on voltage converter (VC=1, VR=0, VF=0)
+	write_cmd(g, ST7565_POWER_CONTROL | 0x04);
+	delay_ms(50);
+
+	// turn on voltage regulator (VC=1, VR=1, VF=0)
+	write_cmd(g, ST7565_POWER_CONTROL | 0x06);
+	delay_ms(50);
+
+	// turn on voltage follower (VC=1, VR=1, VF=1)
+	write_cmd(g, ST7565_POWER_CONTROL | 0x07);
+	delay_ms(50);
+
+	write_cmd(g, 0xE2);
+    write_cmd(g, ST7565_COM_SCAN);
+	write_cmd2(g, ST7565_CONTRAST, GDISP_INITIAL_CONTRAST*64/101);
+	//write_cmd2(g, ST7565_CONTRAST, 0);
+	write_cmd(g, ST7565_DISPLAY_ON);
+	write_cmd(g, ST7565_ALLON_NORMAL);
+	write_cmd(g, ST7565_INVERT_DISPLAY);
+
+	write_cmd(g, ST7565_RMW);
+
+    // Finish Init
+    post_init_board(g);
+
+ 	// Release the bus
+	release_bus(g);
+
+	/* Initialise the GDISP structure */
+	g->g.Width = GDISP_SCREEN_WIDTH;
+	g->g.Height = GDISP_SCREEN_HEIGHT;
+	g->g.Orientation = GDISP_ROTATE_0;
+	g->g.Powermode = powerOn;
+	g->g.Backlight = GDISP_INITIAL_BACKLIGHT;
+	g->g.Contrast = GDISP_INITIAL_CONTRAST;
+	return TRUE;
+}
+
+#if GDISP_HARDWARE_FLUSH
+	LLDSPEC void gdisp_lld_flush(GDisplay *g) {
+		unsigned	p;
+
+		// Don't flush if we don't need it.
+		if (!(g->flags & GDISP_FLG_NEEDFLUSH))
+			return;
+
+		acquire_bus(g);
+		unsigned dstOffset = (PRIV(g)->buffer2 ? 4 : 0);
+		for (p = 0; p < 4; p++) {
+			write_cmd(g, ST7565_PAGE | (p + dstOffset));
+			write_cmd(g, ST7565_COLUMN_MSB | 0);
+			write_cmd(g, ST7565_COLUMN_LSB | 0);
+			write_cmd(g, ST7565_RMW);
+			write_data(g, RAM(g) + (p*GDISP_SCREEN_WIDTH), GDISP_SCREEN_WIDTH);
+		}
+		unsigned line = (PRIV(g)->buffer2 ? 32 : 0);
+        write_cmd(g, ST7565_START_LINE | line);
+        PRIV(g)->buffer2 = !PRIV(g)->buffer2;
+		release_bus(g);
+
+		g->flags &= ~GDISP_FLG_NEEDFLUSH;
+	}
+#endif
+
+#if GDISP_HARDWARE_DRAWPIXEL
+	LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
+		coord_t		x, y;
+
+		switch(g->g.Orientation) {
+		default:
+		case GDISP_ROTATE_0:
+			x = g->p.x;
+			y = g->p.y;
+			break;
+		case GDISP_ROTATE_90:
+			x = g->p.y;
+			y = GDISP_SCREEN_HEIGHT-1 - g->p.x;
+			break;
+		case GDISP_ROTATE_180:
+			x = GDISP_SCREEN_WIDTH-1 - g->p.x;
+			y = GDISP_SCREEN_HEIGHT-1 - g->p.y;
+			break;
+		case GDISP_ROTATE_270:
+			x = GDISP_SCREEN_HEIGHT-1 - g->p.y;
+			y = g->p.x;
+			break;
+		}
+		if (gdispColor2Native(g->p.color) != Black)
+			RAM(g)[xyaddr(x, y)] |= xybit(y);
+		else
+			RAM(g)[xyaddr(x, y)] &= ~xybit(y);
+		g->flags |= GDISP_FLG_NEEDFLUSH;
+	}
+#endif
+
+#if GDISP_HARDWARE_PIXELREAD
+	LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
+		coord_t		x, y;
+
+		switch(g->g.Orientation) {
+		default:
+		case GDISP_ROTATE_0:
+			x = g->p.x;
+			y = g->p.y;
+			break;
+		case GDISP_ROTATE_90:
+			x = g->p.y;
+			y = GDISP_SCREEN_HEIGHT-1 - g->p.x;
+			break;
+		case GDISP_ROTATE_180:
+			x = GDISP_SCREEN_WIDTH-1 - g->p.x;
+			y = GDISP_SCREEN_HEIGHT-1 - g->p.y;
+			break;
+		case GDISP_ROTATE_270:
+			x = GDISP_SCREEN_HEIGHT-1 - g->p.y;
+			y = g->p.x;
+			break;
+		}
+		return (RAM(g)[xyaddr(x, y)] & xybit(y)) ? White : Black;
+	}
+#endif
+
+#if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
+	LLDSPEC void gdisp_lld_control(GDisplay *g) {
+		switch(g->p.x) {
+		case GDISP_CONTROL_POWER:
+			if (g->g.Powermode == (powermode_t)g->p.ptr)
+				return;
+			switch((powermode_t)g->p.ptr) {
+			case powerOff:
+			case powerSleep:
+			case powerDeepSleep:
+				acquire_bus(g);
+				write_cmd(g, ST7565_DISPLAY_OFF);
+				release_bus(g);
+				break;
+			case powerOn:
+				acquire_bus(g);
+				write_cmd(g, ST7565_DISPLAY_ON);
+				release_bus(g);
+				break;
+			default:
+				return;
+			}
+			g->g.Powermode = (powermode_t)g->p.ptr;
+			return;
+
+		case GDISP_CONTROL_ORIENTATION:
+			if (g->g.Orientation == (orientation_t)g->p.ptr)
+				return;
+			switch((orientation_t)g->p.ptr) {
+			/* Rotation is handled by the drawing routines */
+			case GDISP_ROTATE_0:
+			case GDISP_ROTATE_180:
+				g->g.Height = GDISP_SCREEN_HEIGHT;
+				g->g.Width = GDISP_SCREEN_WIDTH;
+				break;
+			case GDISP_ROTATE_90:
+			case GDISP_ROTATE_270:
+				g->g.Height = GDISP_SCREEN_WIDTH;
+				g->g.Width = GDISP_SCREEN_HEIGHT;
+				break;
+			default:
+				return;
+			}
+			g->g.Orientation = (orientation_t)g->p.ptr;
+			return;
+
+		case GDISP_CONTROL_CONTRAST:
+            if ((unsigned)g->p.ptr > 100)
+            	g->p.ptr = (void *)100;
+			acquire_bus(g);
+			write_cmd2(g, ST7565_CONTRAST, ((((unsigned)g->p.ptr)<<6)/101) & 0x3F);
+			release_bus(g);
+            g->g.Contrast = (unsigned)g->p.ptr;
+			return;
+		}
+	}
+#endif // GDISP_NEED_CONTROL
+
+#endif // GFX_USE_GDISP

+ 26 - 0
keyboards/infinity_ergodox/drivers/gdisp/st7565ergodox/gdisp_lld_config.h

@@ -0,0 +1,26 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ *              http://ugfx.org/license.html
+ */
+
+#ifndef _GDISP_LLD_CONFIG_H
+#define _GDISP_LLD_CONFIG_H
+
+#if GFX_USE_GDISP
+
+/*===========================================================================*/
+/* Driver hardware support.                                                  */
+/*===========================================================================*/
+
+#define GDISP_HARDWARE_FLUSH			TRUE		// This controller requires flushing
+#define GDISP_HARDWARE_DRAWPIXEL		TRUE
+#define GDISP_HARDWARE_PIXELREAD		TRUE
+#define GDISP_HARDWARE_CONTROL			TRUE
+
+#define GDISP_LLD_PIXELFORMAT			GDISP_PIXELFORMAT_MONO
+
+#endif	/* GFX_USE_GDISP */
+
+#endif	/* _GDISP_LLD_CONFIG_H */

+ 37 - 0
keyboards/infinity_ergodox/drivers/gdisp/st7565ergodox/st7565.h

@@ -0,0 +1,37 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ *              http://ugfx.org/license.html
+ */
+
+#ifndef _ST7565_H
+#define _ST7565_H
+
+#define ST7565_CONTRAST             0x81
+#define ST7565_ALLON_NORMAL         0xA4
+#define ST7565_ALLON                0xA5
+#define ST7565_POSITIVE_DISPLAY     0xA6
+#define ST7565_INVERT_DISPLAY       0xA7
+#define ST7565_DISPLAY_OFF          0xAE
+#define ST7565_DISPLAY_ON           0xAF
+
+#define ST7565_LCD_BIAS_7           0xA3
+#define ST7565_LCD_BIAS_9           0xA2
+
+#define ST7565_ADC_NORMAL           0xA0
+#define ST7565_ADC_REVERSE          0xA1
+
+#define ST7565_COM_SCAN_INC         0xC0
+#define ST7565_COM_SCAN_DEC         0xC8
+
+#define ST7565_START_LINE           0x40
+#define ST7565_PAGE                 0xB0
+#define ST7565_COLUMN_MSB           0x10
+#define ST7565_COLUMN_LSB           0x00
+#define ST7565_RMW                  0xE0
+
+#define ST7565_RESISTOR_RATIO       0x20
+#define ST7565_POWER_CONTROL        0x28
+
+#endif /* _ST7565_H */

+ 331 - 0
keyboards/infinity_ergodox/gfxconf.h

@@ -0,0 +1,331 @@
+/**
+ * This file has a different license to the rest of the uGFX system.
+ * You can copy, modify and distribute this file as you see fit.
+ * You do not need to publish your source modifications to this file.
+ * The only thing you are not permitted to do is to relicense it
+ * under a different license.
+ */
+
+/**
+ * Copy this file into your project directory and rename it as gfxconf.h
+ * Edit your copy to turn on the uGFX features you want to use.
+ * The values below are the defaults.
+ *
+ * Only remove the comments from lines where you want to change the
+ * default value. This allows definitions to be included from
+ * driver makefiles when required and provides the best future
+ * compatibility for your project.
+ *
+ * Please use spaces instead of tabs in this file.
+ */
+
+#ifndef _GFXCONF_H
+#define _GFXCONF_H
+
+
+///////////////////////////////////////////////////////////////////////////
+// GOS - One of these must be defined, preferably in your Makefile       //
+///////////////////////////////////////////////////////////////////////////
+//#define GFX_USE_OS_CHIBIOS                           TRUE
+//#define GFX_USE_OS_FREERTOS                          FALSE
+//    #define GFX_FREERTOS_USE_TRACE                   FALSE
+//#define GFX_USE_OS_WIN32                             FALSE
+//#define GFX_USE_OS_LINUX                             FALSE
+//#define GFX_USE_OS_OSX                               FALSE
+//#define GFX_USE_OS_ECOS                              FALSE
+//#define GFX_USE_OS_RAWRTOS                           FALSE
+//#define GFX_USE_OS_ARDUINO                           FALSE
+//#define GFX_USE_OS_KEIL                              FALSE
+//#define GFX_USE_OS_CMSIS                             FALSE
+//#define GFX_USE_OS_RAW32                             FALSE
+//    #define INTERRUPTS_OFF()                         optional_code
+//    #define INTERRUPTS_ON()                          optional_code
+// These are not defined by default for some reason
+#define GOS_NEED_X_THREADS	FALSE
+#define GOS_NEED_X_HEAP		FALSE
+
+// Options that (should where relevant) apply to all operating systems
+    #define GFX_NO_INLINE                            FALSE
+//    #define GFX_COMPILER                             GFX_COMPILER_UNKNOWN
+//    #define GFX_CPU                                  GFX_CPU_UNKNOWN
+//    #define GFX_OS_HEAP_SIZE                         0
+//    #define GFX_OS_NO_INIT                           FALSE
+//    #define GFX_OS_INIT_NO_WARNING                   FALSE
+//    #define GFX_OS_PRE_INIT_FUNCTION                 myHardwareInitRoutine
+//    #define GFX_OS_EXTRA_INIT_FUNCTION               myOSInitRoutine
+//    #define GFX_OS_EXTRA_DEINIT_FUNCTION             myOSDeInitRoutine
+
+
+///////////////////////////////////////////////////////////////////////////
+// GDISP                                                                 //
+///////////////////////////////////////////////////////////////////////////
+#define GFX_USE_GDISP                                TRUE
+
+//#define GDISP_NEED_AUTOFLUSH                         FALSE
+//#define GDISP_NEED_TIMERFLUSH                        FALSE
+//#define GDISP_NEED_VALIDATION                        TRUE
+//#define GDISP_NEED_CLIP                              TRUE
+#define GDISP_NEED_CIRCLE                            TRUE
+#define GDISP_NEED_ELLIPSE                           TRUE
+#define GDISP_NEED_ARC                               TRUE
+#define GDISP_NEED_ARCSECTORS                        TRUE
+#define GDISP_NEED_CONVEX_POLYGON                    TRUE
+//#define GDISP_NEED_SCROLL                            FALSE
+#define GDISP_NEED_PIXELREAD                         TRUE
+#define GDISP_NEED_CONTROL                           TRUE
+//#define GDISP_NEED_QUERY                             FALSE
+//#define GDISP_NEED_MULTITHREAD                       FALSE
+//#define GDISP_NEED_STREAMING                         FALSE
+#define GDISP_NEED_TEXT                              TRUE
+//    #define GDISP_NEED_TEXT_WORDWRAP                 FALSE
+//    #define GDISP_NEED_ANTIALIAS                     FALSE
+//    #define GDISP_NEED_UTF8                          FALSE
+    #define GDISP_NEED_TEXT_KERNING                  TRUE
+//    #define GDISP_INCLUDE_FONT_UI1                   FALSE
+//    #define GDISP_INCLUDE_FONT_UI2                   FALSE		// The smallest preferred font.
+//    #define GDISP_INCLUDE_FONT_LARGENUMBERS          FALSE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANS10          FALSE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANS12          FALSE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANS16          FALSE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANS20          FALSE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANS24          FALSE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANS32          FALSE
+    #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12      TRUE
+//    #define GDISP_INCLUDE_FONT_FIXED_10X20           FALSE
+//    #define GDISP_INCLUDE_FONT_FIXED_7X14            FALSE
+    #define GDISP_INCLUDE_FONT_FIXED_5X8             TRUE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANS12_AA       FALSE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANS16_AA       FALSE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANS20_AA       FALSE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANS24_AA       FALSE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANS32_AA       FALSE
+//    #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12_AA   FALSE
+//    #define GDISP_INCLUDE_USER_FONTS                 FALSE
+
+//#define GDISP_NEED_IMAGE                             FALSE
+//    #define GDISP_NEED_IMAGE_NATIVE                  FALSE
+//    #define GDISP_NEED_IMAGE_GIF                     FALSE
+//    #define GDISP_NEED_IMAGE_BMP                     FALSE
+//        #define GDISP_NEED_IMAGE_BMP_1               FALSE
+//        #define GDISP_NEED_IMAGE_BMP_4               FALSE
+//        #define GDISP_NEED_IMAGE_BMP_4_RLE           FALSE
+//        #define GDISP_NEED_IMAGE_BMP_8               FALSE
+//        #define GDISP_NEED_IMAGE_BMP_8_RLE           FALSE
+//        #define GDISP_NEED_IMAGE_BMP_16              FALSE
+//        #define GDISP_NEED_IMAGE_BMP_24              FALSE
+//        #define GDISP_NEED_IMAGE_BMP_32              FALSE
+//    #define GDISP_NEED_IMAGE_JPG                     FALSE
+//    #define GDISP_NEED_IMAGE_PNG                     FALSE
+//    #define GDISP_NEED_IMAGE_ACCOUNTING              FALSE
+#ifdef EMULATOR
+#define GDISP_NEED_PIXMAP                            TRUE
+#endif
+//    #define GDISP_NEED_PIXMAP_IMAGE                  FALSE
+
+//#define GDISP_DEFAULT_ORIENTATION                    GDISP_ROTATE_LANDSCAPE    // If not defined the native hardware orientation is used.
+//#define GDISP_LINEBUF_SIZE                           128
+//#define GDISP_STARTUP_COLOR                          Black
+#define GDISP_NEED_STARTUP_LOGO                      FALSE
+
+//#define GDISP_TOTAL_DISPLAYS		                 2
+
+#ifndef EMULATOR
+#define GDISP_DRIVER_LIST                            GDISPVMT_ST7565_ERGODOX, GDISPVMT_IS31FL3731C_ERGODOX
+#else
+#define GDISP_DRIVER_LIST                            GDISPVMT_EMULATOR_LCD_ERGODOX, GDISPVMT_EMULATOR_LED_ERGODOX
+#endif
+
+    #ifdef GDISP_DRIVER_LIST
+        // For code and speed optimization define as TRUE or FALSE if all controllers have the same capability
+        #define GDISP_HARDWARE_STREAM_WRITE          FALSE
+        #define GDISP_HARDWARE_STREAM_READ           FALSE
+        #define GDISP_HARDWARE_STREAM_POS            FALSE
+        #define GDISP_HARDWARE_DRAWPIXEL             TRUE
+        #define GDISP_HARDWARE_CLEARS                FALSE
+        #define GDISP_HARDWARE_FILLS                 FALSE
+        #define GDISP_HARDWARE_BITFILLS              FALSE
+        #define GDISP_HARDWARE_SCROLL                FALSE
+        #define GDISP_HARDWARE_PIXELREAD             TRUE
+        #define GDISP_HARDWARE_CONTROL               TRUE
+        #define GDISP_HARDWARE_QUERY                 FALSE
+        #define GDISP_HARDWARE_CLIP                  FALSE
+
+        #define GDISP_PIXELFORMAT                    GDISP_PIXELFORMAT_RGB888
+    #endif
+
+// The custom format is not defined for some reason, so define it as error
+// so we don't get compiler warnings
+#define GDISP_PIXELFORMAT_CUSTOM GDISP_PIXELFORMAT_ERROR
+
+#define GDISP_USE_GFXNET                             FALSE
+//    #define GDISP_GFXNET_PORT                        13001
+//    #define GDISP_GFXNET_CUSTOM_LWIP_STARTUP         FALSE
+//    #define GDISP_DONT_WAIT_FOR_NET_DISPLAY          FALSE
+//    #define GDISP_GFXNET_UNSAFE_SOCKETS              FALSE
+
+
+///////////////////////////////////////////////////////////////////////////
+// GWIN                                                                  //
+///////////////////////////////////////////////////////////////////////////
+#define GFX_USE_GWIN                                 FALSE
+
+//#define GWIN_NEED_WINDOWMANAGER                      FALSE
+//    #define GWIN_REDRAW_IMMEDIATE                    FALSE
+//    #define GWIN_REDRAW_SINGLEOP                     FALSE
+//    #define GWIN_NEED_FLASHING                       FALSE
+//        #define GWIN_FLASHING_PERIOD                 250
+
+//#define GWIN_NEED_CONSOLE                            FALSE
+//    #define GWIN_CONSOLE_USE_HISTORY                 FALSE
+//        #define GWIN_CONSOLE_HISTORY_AVERAGING       FALSE
+//        #define GWIN_CONSOLE_HISTORY_ATCREATE        FALSE
+//    #define GWIN_CONSOLE_ESCSEQ                      FALSE
+//    #define GWIN_CONSOLE_USE_BASESTREAM              FALSE
+//    #define GWIN_CONSOLE_USE_FLOAT                   FALSE
+//#define GWIN_NEED_GRAPH                              FALSE
+//#define GWIN_NEED_GL3D                               FALSE
+
+//#define GWIN_NEED_WIDGET                             FALSE
+//#define GWIN_FOCUS_HIGHLIGHT_WIDTH                   1
+//    #define GWIN_NEED_LABEL                          FALSE
+//        #define GWIN_LABEL_ATTRIBUTE                 FALSE
+//    #define GWIN_NEED_BUTTON                         FALSE
+//        #define GWIN_BUTTON_LAZY_RELEASE             FALSE
+//    #define GWIN_NEED_SLIDER                         FALSE
+//        #define GWIN_SLIDER_NOSNAP                   FALSE
+//        #define GWIN_SLIDER_DEAD_BAND                5
+//        #define GWIN_SLIDER_TOGGLE_INC               20
+//    #define GWIN_NEED_CHECKBOX                       FALSE
+//    #define GWIN_NEED_IMAGE                          FALSE
+//        #define GWIN_NEED_IMAGE_ANIMATION            FALSE
+//    #define GWIN_NEED_RADIO                          FALSE
+//    #define GWIN_NEED_LIST                           FALSE
+//        #define GWIN_NEED_LIST_IMAGES                FALSE
+//    #define GWIN_NEED_PROGRESSBAR                    FALSE
+//        #define GWIN_PROGRESSBAR_AUTO                FALSE
+//    #define GWIN_NEED_KEYBOARD                       FALSE
+//        #define GWIN_KEYBOARD_DEFAULT_LAYOUT         VirtualKeyboard_English1
+//        #define GWIN_NEED_KEYBOARD_ENGLISH1          TRUE
+//    #define GWIN_NEED_TEXTEDIT                       FALSE
+//    #define GWIN_FLAT_STYLING                        FALSE
+//    #define GWIN_WIDGET_TAGS                         FALSE
+
+//#define GWIN_NEED_CONTAINERS                         FALSE
+//    #define GWIN_NEED_CONTAINER                      FALSE
+//    #define GWIN_NEED_FRAME                          FALSE
+//    #define GWIN_NEED_TABSET                         FALSE
+//        #define GWIN_TABSET_TABHEIGHT                18
+
+
+///////////////////////////////////////////////////////////////////////////
+// GEVENT                                                                //
+///////////////////////////////////////////////////////////////////////////
+#define GFX_USE_GEVENT                               TRUE
+
+//#define GEVENT_ASSERT_NO_RESOURCE                    FALSE
+//#define GEVENT_MAXIMUM_SIZE                          32
+//#define GEVENT_MAX_SOURCE_LISTENERS                  32
+
+
+///////////////////////////////////////////////////////////////////////////
+// GTIMER                                                                //
+///////////////////////////////////////////////////////////////////////////
+#define GFX_USE_GTIMER                               FALSE
+
+//#define GTIMER_THREAD_PRIORITY                       HIGH_PRIORITY
+//#define GTIMER_THREAD_WORKAREA_SIZE                  2048
+
+
+///////////////////////////////////////////////////////////////////////////
+// GQUEUE                                                                //
+///////////////////////////////////////////////////////////////////////////
+#define GFX_USE_GQUEUE                               FALSE
+
+//#define GQUEUE_NEED_ASYNC                            FALSE
+//#define GQUEUE_NEED_GSYNC                            FALSE
+//#define GQUEUE_NEED_FSYNC                            FALSE
+//#define GQUEUE_NEED_BUFFERS                          FALSE
+
+///////////////////////////////////////////////////////////////////////////
+// GINPUT                                                                //
+///////////////////////////////////////////////////////////////////////////
+#define GFX_USE_GINPUT                               FALSE
+
+//#define GINPUT_NEED_MOUSE                            FALSE
+//    #define GINPUT_TOUCH_STARTRAW                    FALSE
+//    #define GINPUT_TOUCH_NOTOUCH                     FALSE
+//    #define GINPUT_TOUCH_NOCALIBRATE                 FALSE
+//    #define GINPUT_TOUCH_NOCALIBRATE_GUI             FALSE
+//    #define GINPUT_MOUSE_POLL_PERIOD                 25
+//    #define GINPUT_MOUSE_CLICK_TIME                  300
+//    #define GINPUT_TOUCH_CXTCLICK_TIME               700
+//    #define GINPUT_TOUCH_USER_CALIBRATION_LOAD       FALSE
+//    #define GINPUT_TOUCH_USER_CALIBRATION_SAVE       FALSE
+//    #define GMOUSE_DRIVER_LIST                       GMOUSEVMT_Win32, GMOUSEVMT_Win32
+//#define GINPUT_NEED_KEYBOARD                         FALSE
+//    #define GINPUT_KEYBOARD_POLL_PERIOD              200
+//    #define GKEYBOARD_DRIVER_LIST                    GKEYBOARDVMT_Win32, GKEYBOARDVMT_Win32
+//    #define GKEYBOARD_LAYOUT_OFF                     FALSE
+//        #define GKEYBOARD_LAYOUT_SCANCODE2_US        FALSE
+//#define GINPUT_NEED_TOGGLE                           FALSE
+//#define GINPUT_NEED_DIAL                             FALSE
+
+
+///////////////////////////////////////////////////////////////////////////
+// GFILE                                                                 //
+///////////////////////////////////////////////////////////////////////////
+#define GFX_USE_GFILE                                FALSE
+
+//#define GFILE_NEED_PRINTG                            FALSE
+//#define GFILE_NEED_SCANG                             FALSE
+//#define GFILE_NEED_STRINGS                           FALSE
+//#define GFILE_NEED_FILELISTS                         FALSE
+//#define GFILE_NEED_STDIO                             FALSE
+//#define GFILE_NEED_NOAUTOMOUNT                       FALSE
+//#define GFILE_NEED_NOAUTOSYNC                        FALSE
+
+//#define GFILE_NEED_MEMFS                             FALSE
+//#define GFILE_NEED_ROMFS                             FALSE
+//#define GFILE_NEED_RAMFS                             FALSE
+//#define GFILE_NEED_FATFS                             FALSE
+//#define GFILE_NEED_NATIVEFS                          FALSE
+//#define GFILE_NEED_CHBIOSFS                          FALSE
+
+//#define GFILE_ALLOW_FLOATS                           FALSE
+//#define GFILE_ALLOW_DEVICESPECIFIC                   FALSE
+//#define GFILE_MAX_GFILES                             3
+
+///////////////////////////////////////////////////////////////////////////
+// GADC                                                                  //
+///////////////////////////////////////////////////////////////////////////
+#define GFX_USE_GADC                                 FALSE
+
+//#define GADC_MAX_LOWSPEED_DEVICES                    4
+
+
+///////////////////////////////////////////////////////////////////////////
+// GAUDIO                                                                //
+///////////////////////////////////////////////////////////////////////////
+#define GFX_USE_GAUDIO                               FALSE
+// There seems to be a bug in the ugfx code, the wrong define is used
+// So define it in order to avoid warnings
+#define GFX_USE_GAUDIN                               GFX_USE_GAUDIO
+//    #define GAUDIO_NEED_PLAY                         FALSE
+//    #define GAUDIO_NEED_RECORD                       FALSE
+
+
+///////////////////////////////////////////////////////////////////////////
+// GMISC                                                                 //
+///////////////////////////////////////////////////////////////////////////
+#define GFX_USE_GMISC                                TRUE
+
+//#define GMISC_NEED_ARRAYOPS                          FALSE
+//#define GMISC_NEED_FASTTRIG                          FALSE
+//#define GMISC_NEED_FIXEDTRIG                         FALSE
+//#define GMISC_NEED_INVSQRT                           FALSE
+//    #define GMISC_INVSQRT_MIXED_ENDIAN               FALSE
+//    #define GMISC_INVSQRT_REAL_SLOW                  FALSE
+#define GMISC_NEED_MATRIXFLOAT2D                     TRUE
+#define GMISC_NEED_MATRIXFIXED2D                     FALSE
+
+#endif /* _GFXCONF_H */

+ 65 - 0
keyboards/infinity_ergodox/infinity_ergodox.c

@@ -2,6 +2,7 @@
 #include "ch.h"
 #include "hal.h"
 #include "serial_link/system/serial_link.h"
+#include "lcd_backlight.h"
 
 void init_serial_link_hal(void) {
     PORTA->PCR[1] = PORTx_PCRn_PE | PORTx_PCRn_PS | PORTx_PCRn_PFE | PORTx_PCRn_MUX(2);
@@ -9,3 +10,67 @@ void init_serial_link_hal(void) {
     PORTE->PCR[0] = PORTx_PCRn_PE | PORTx_PCRn_PS | PORTx_PCRn_PFE | PORTx_PCRn_MUX(3);
     PORTE->PCR[1] = PORTx_PCRn_DSE | PORTx_PCRn_SRE | PORTx_PCRn_MUX(3);
 }
+
+#define RED_PIN 1
+#define GREEN_PIN 2
+#define BLUE_PIN 3
+#define CHANNEL_RED FTM0->CHANNEL[0]
+#define CHANNEL_GREEN FTM0->CHANNEL[1]
+#define CHANNEL_BLUE FTM0->CHANNEL[2]
+
+#define RGB_PORT PORTC
+#define RGB_PORT_GPIO GPIOC
+
+// Base FTM clock selection (72 MHz system clock)
+// @ 0xFFFF period, 72 MHz / (0xFFFF * 2) = Actual period
+// Higher pre-scalar will use the most power (also look the best)
+// Pre-scalar calculations
+// 0 -      72 MHz -> 549 Hz
+// 1 -      36 MHz -> 275 Hz
+// 2 -      18 MHz -> 137 Hz
+// 3 -       9 MHz ->  69 Hz (Slightly visible flicker)
+// 4 -   4 500 kHz ->  34 Hz (Visible flickering)
+// 5 -   2 250 kHz ->  17 Hz
+// 6 -   1 125 kHz ->   9 Hz
+// 7 - 562 500  Hz ->   4 Hz
+// Using a higher pre-scalar without flicker is possible but FTM0_MOD will need to be reduced
+// Which will reduce the brightness range
+#define PRESCALAR_DEFINE 0
+
+void lcd_backlight_hal_init(void) {
+	// Setup Backlight
+    SIM->SCGC6 |= SIM_SCGC6_FTM0;
+    FTM0->CNT = 0; // Reset counter
+
+	// PWM Period
+	// 16-bit maximum
+	FTM0->MOD = 0xFFFF;
+
+	// Set FTM to PWM output - Edge Aligned, Low-true pulses
+#define CNSC_MODE FTM_SC_CPWMS | FTM_SC_PS(4) | FTM_SC_CLKS(0)
+	CHANNEL_RED.CnSC = CNSC_MODE;
+	CHANNEL_GREEN.CnSC = CNSC_MODE;
+	CHANNEL_BLUE.CnSC = CNSC_MODE;
+
+	// System clock, /w prescalar setting
+	FTM0->SC = FTM_SC_CLKS(1) | FTM_SC_PS(PRESCALAR_DEFINE);
+
+	CHANNEL_RED.CnV = 0;
+	CHANNEL_GREEN.CnV = 0;
+	CHANNEL_BLUE.CnV = 0;
+
+	RGB_PORT_GPIO->PDDR |= (1 << RED_PIN);
+	RGB_PORT_GPIO->PDDR |= (1 << GREEN_PIN);
+	RGB_PORT_GPIO->PDDR |= (1 << BLUE_PIN);
+
+#define RGB_MODE PORTx_PCRn_SRE | PORTx_PCRn_DSE | PORTx_PCRn_MUX(4)
+    RGB_PORT->PCR[RED_PIN] = RGB_MODE;
+    RGB_PORT->PCR[GREEN_PIN] = RGB_MODE;
+    RGB_PORT->PCR[BLUE_PIN] = RGB_MODE;
+}
+
+void lcd_backlight_hal_color(uint16_t r, uint16_t g, uint16_t b) {
+	CHANNEL_RED.CnV = r;
+	CHANNEL_GREEN.CnV = g;
+	CHANNEL_BLUE.CnV = b;
+}

+ 4 - 1
keyboards/infinity_ergodox/keymaps/default/keymap.c

@@ -18,6 +18,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include "infinity_ergodox.h"
 
+// Workaround for old keymap format
+#define KC_RESET RESET
+
 const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     KEYMAP(  // layer 0 : default
         // left hand
@@ -63,7 +66,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
     KEYMAP(  // layer 2 : keyboard functions
         // left hand
-        BTLD,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+        RESET,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, FN3,
         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,

+ 168 - 0
keyboards/infinity_ergodox/keymaps/default/visualizer.c

@@ -0,0 +1,168 @@
+/*
+Copyright 2016 Fred Sundvik <fsundvik@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/>.
+*/
+
+// Currently we are assuming that both the backlight and LCD are enabled
+// But it's entirely possible to write a custom visualizer that use only
+// one of them
+#ifndef LCD_BACKLIGHT_ENABLE
+#error This visualizer needs that LCD backlight is enabled
+#endif
+
+#ifndef LCD_ENABLE
+#error This visualizer needs that LCD is enabled
+#endif
+
+#include "visualizer.h"
+#include "led_test.h"
+
+static const char* welcome_text[] = {"TMK", "Infinity Ergodox"};
+
+// Just an example how to write custom keyframe functions, we could have moved
+// all this into the init function
+bool display_welcome(keyframe_animation_t* animation, visualizer_state_t* state) {
+    (void)animation;
+    // Read the uGFX documentation for information how to use the displays
+    // http://wiki.ugfx.org/index.php/Main_Page
+    gdispClear(White);
+    // You can use static variables for things that can't be found in the animation
+    // or state structs
+    gdispDrawString(0, 3, welcome_text[0], state->font_dejavusansbold12, Black);
+    gdispDrawString(0, 15, welcome_text[1], state->font_dejavusansbold12, Black);
+    // Always remember to flush the display
+    gdispFlush();
+    // you could set the backlight color as well, but we won't do it here, since
+    // it's part of the following animation
+    // lcd_backlight_color(hue, saturation, intensity);
+    // We don't need constant updates, just drawing the screen once is enough
+    return false;
+}
+
+// Feel free to modify the animations below, or even add new ones if needed
+
+// Don't worry, if the startup animation is long, you can use the keyboard like normal
+// during that time
+static keyframe_animation_t startup_animation = {
+    .num_frames = 4,
+    .loop = false,
+    .frame_lengths = {0, gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(5000), 0},
+    .frame_functions = {
+            display_welcome,
+            keyframe_animate_backlight_color,
+            keyframe_no_operation,
+            enable_visualization
+    },
+};
+
+// The color animation animates the LCD color when you change layers
+static keyframe_animation_t color_animation = {
+    .num_frames = 2,
+    .loop = false,
+    // Note that there's a 200 ms no-operation frame,
+    // this prevents the color from changing when activating the layer
+    // momentarily
+    .frame_lengths = {gfxMillisecondsToTicks(200), gfxMillisecondsToTicks(500)},
+    .frame_functions = {keyframe_no_operation, keyframe_animate_backlight_color},
+};
+
+// The LCD animation alternates between the layer name display and a
+// bitmap that displays all active layers
+static keyframe_animation_t lcd_animation = {
+    .num_frames = 2,
+    .loop = true,
+    .frame_lengths = {gfxMillisecondsToTicks(2000), gfxMillisecondsToTicks(2000)},
+    .frame_functions = {keyframe_display_layer_text, keyframe_display_layer_bitmap},
+};
+
+static keyframe_animation_t suspend_animation = {
+    .num_frames = 3,
+    .loop = false,
+    .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0},
+    .frame_functions = {
+            keyframe_display_layer_text,
+            keyframe_animate_backlight_color,
+            keyframe_disable_lcd_and_backlight,
+    },
+};
+
+static keyframe_animation_t resume_animation = {
+    .num_frames = 5,
+    .loop = false,
+    .frame_lengths = {0, 0, gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(5000), 0},
+    .frame_functions = {
+            keyframe_enable_lcd_and_backlight,
+            display_welcome,
+            keyframe_animate_backlight_color,
+            keyframe_no_operation,
+            enable_visualization,
+    },
+};
+
+void initialize_user_visualizer(visualizer_state_t* state) {
+    // The brightness will be dynamically adjustable in the future
+    // But for now, change it here.
+    lcd_backlight_brightness(0x50);
+    state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0xFF);
+    state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF);
+    start_keyframe_animation(&startup_animation);
+    start_keyframe_animation(&led_test_animation);
+}
+
+void update_user_visualizer_state(visualizer_state_t* state) {
+    // Add more tests, change the colors and layer texts here
+    // Usually you want to check the high bits (higher layers first)
+    // because that's the order layers are processed for keypresses
+    // You can for check for example:
+    // state->status.layer
+    // state->status.default_layer
+    // state->status.leds (see led.h for available statuses)
+    if (state->status.layer & 0x8) {
+        state->target_lcd_color = LCD_COLOR(0xC0, 0xB0, 0xFF);
+        state->layer_text = "Numpad";
+    }
+    else if (state->status.layer & 0x4) {
+        state->target_lcd_color = LCD_COLOR(0, 0xB0, 0xFF);
+        state->layer_text = "KBD functions";
+    }
+    else if (state->status.layer & 0x2) {
+        state->target_lcd_color = LCD_COLOR(0x80, 0xB0, 0xFF);
+        state->layer_text = "Function keys";
+    }
+    else {
+        state->target_lcd_color = LCD_COLOR(0x40, 0xB0, 0xFF);
+        state->layer_text = "Default";
+    }
+    // You can also stop existing animations, and start your custom ones here
+    // remember that you should normally have only one animation for the LCD
+    // and one for the background. But you can also combine them if you want.
+    start_keyframe_animation(&lcd_animation);
+    start_keyframe_animation(&color_animation);
+}
+
+void user_visualizer_suspend(visualizer_state_t* state) {
+    state->layer_text = "Suspending...";
+    uint8_t hue = LCD_HUE(state->current_lcd_color);
+    uint8_t sat = LCD_SAT(state->current_lcd_color);
+    state->target_lcd_color = LCD_COLOR(hue, sat, 0);
+    start_keyframe_animation(&suspend_animation);
+}
+
+void user_visualizer_resume(visualizer_state_t* state) {
+    state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0x00);
+    state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF);
+    start_keyframe_animation(&resume_animation);
+    start_keyframe_animation(&led_test_animation);
+}

+ 1 - 1
keyboards/kc60/Makefile

@@ -53,7 +53,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE ?= no       # 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)

+ 1 - 66
keyboards/kc60/keymaps/stanleylai/keymap.c

@@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   RESET,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,    KC_NO,    KC_NO, \
   KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,    KC_NO,    KC_NO, \
   KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,    KC_NO,    KC_NO,  \
-  KC_TRNS,KC_NO,  F(1),   F(2),   F(3),   F(4),   F(5),   F(6),   F(7),   F(8),   BL_STEP,BL_TOGG,  KC_TRNS,  KC_TRNS,\
+  KC_TRNS,KC_NO,  RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,BL_STEP,BL_TOGG,  KC_TRNS,  KC_TRNS,\
   KC_TRNS,KC_TRNS,KC_TRNS,                KC_TRNS,                                KC_TRNS,KC_TRNS,  KC_TRNS,  KC_TRNS),
   #else
   RESET,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,    KC_NO,    KC_NO, \
@@ -52,30 +52,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 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
 };
 
 #define MODS_CTRL_MASK  (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
@@ -102,50 +82,5 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
         }
       }
       break;
-
-    #ifdef RGBLIGHT_ENABLE
-
-    case RGBLED_TOGGLE:
-      //led operations
-      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
   }
 }

+ 2 - 3
keyboards/kc60/keymaps/ws2812/config.h

@@ -1,9 +1,8 @@
 #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 RGB_DI_PIN F5   // Based on wiring depicted in ws2812_wiring.jpg
+#define RGBLIGHT_TIMER       
 #define RGBLED_NUM 16         // Number of LEDs. Change this to match your use case.
 #define RGBLIGHT_HUE_STEP 8
 #define RGBLIGHT_SAT_STEP 8

+ 1 - 64
keyboards/kc60/keymaps/ws2812/keymap.c

@@ -52,7 +52,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   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, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, 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,  \
@@ -65,30 +65,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 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) {
@@ -114,48 +94,5 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
         }
       }
       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
   }
 }

+ 2 - 3
keyboards/lets_split/config.h

@@ -69,9 +69,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 )
 
 /* ws2812 RGB LED */
-#define ws2812_PORTREG  PORTD
-#define ws2812_DDRREG   DDRD
-#define ws2812_pin PD1
+#define RGB_DI_PIN D2
+#define RGBLIGHT_TIMER
 #define RGBLED_NUM 28     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17

+ 6 - 7
keyboards/phantom/config.h

@@ -62,13 +62,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* Underlight configuration
  */
- #define ws2812_PORTREG PORTE
- #define ws2812_DDRREG DDRE
- #define ws2812_pin 2
- #define RGBLED_NUM 20     // Number of LEDs
- #define RGBLIGHT_HUE_STEP 10
- #define RGBLIGHT_SAT_STEP 17
- #define RGBLIGHT_VAL_STEP 17
+#define RGB_DI_PIN E2
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 20     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
 
 /*
  * Feature disable options

+ 1 - 68
keyboards/phantom/keymaps/default/keymap.c

@@ -1,9 +1,5 @@
 #include "phantom.h"
 
-#ifdef RGBLIGHT_ENABLE
-#include "rgblight.h"
-#endif
-
 // Used for SHIFT_ESC
 #define MODS_CTRL_MASK  (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
 
@@ -59,7 +55,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   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, 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, KC_UP, 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,  RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, 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),
   #else
   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, \
@@ -73,30 +69,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 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) {
@@ -122,48 +98,5 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
         }
       }
       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
   }
 }

+ 1 - 1
keyboards/phantom/led.c

@@ -19,7 +19,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "stdint.h"
 #include "led.h"
 
-void led_init(void) {
+void led_init_ports(void) {
     // * Set our LED pins as output
     DDRB |= (1<<6);
 	DDRB |= (1<<7);

+ 3 - 3
keyboards/planck/keymaps/experimental/Makefile

@@ -10,12 +10,12 @@ EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no         # Console for debug(+400)
 COMMAND_ENABLE = yes        # Commands for debug and configuration
 NKRO_ENABLE = yes            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality
+BACKLIGHT_ENABLE = no      # Enable keyboard backlight functionality
 MIDI_ENABLE = no            # MIDI controls
-AUDIO_ENABLE = yes           # Audio output on port C6
+AUDIO_ENABLE = no           # Audio output on port C6
 UNICODE_ENABLE = no         # Unicode
 BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+RGBLIGHT_ENABLE = yes        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
 
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend

+ 8 - 0
keyboards/planck/keymaps/experimental/config.h

@@ -6,4 +6,12 @@
 #define LEADER_TIMEOUT 300
 #define BACKLIGHT_BREATHING
 
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN B1
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 8     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+
 #endif

+ 69 - 4
keyboards/planck/keymaps/experimental/keymap.c

@@ -15,7 +15,7 @@ extern keymap_config_t keymap_config;
 // 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 _QWERTY 0
+#define _QWERTY 10
 #define _COLEMAK 1
 #define _DVORAK 2
 #define _LOWER 3
@@ -31,7 +31,15 @@ enum planck_keycodes {
   LOWER,
   RAISE,
   BACKLIT,
-  EXT_PLV
+  EXT_PLV,
+  RGBLED_TOGGLE,
+  RGBLED_STEP_MODE,
+  RGBLED_INCREASE_HUE,
+  RGBLED_DECREASE_HUE,
+  RGBLED_INCREASE_SAT,
+  RGBLED_DECREASE_SAT,
+  RGBLED_INCREASE_VAL,
+  RGBLED_DECREASE_VAL,
 };
 
 // Fillers to make layering more clear
@@ -39,14 +47,20 @@ enum planck_keycodes {
 #define XXXXXXX KC_NO
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = {
+  {KC_NO, KC_NO, KC_NO, KC_NO, RGBLED_TOGGLE, RGBLED_STEP_MODE, RGBLED_INCREASE_HUE, RGBLED_DECREASE_HUE, RGBLED_INCREASE_SAT, RGBLED_DECREASE_SAT, RGBLED_INCREASE_VAL, RGBLED_DECREASE_VAL},
+  {KC_NO, KC_NO, KC_NO, KC_NO, RGBLED_TOGGLE, RGBLED_STEP_MODE, RGBLED_INCREASE_HUE, RGBLED_DECREASE_HUE, RGBLED_INCREASE_SAT, RGBLED_DECREASE_SAT, RGBLED_INCREASE_VAL, RGBLED_DECREASE_VAL},
+  {KC_NO, KC_NO, KC_NO, KC_NO, RGBLED_TOGGLE, RGBLED_STEP_MODE, RGBLED_INCREASE_HUE, RGBLED_DECREASE_HUE, RGBLED_INCREASE_SAT, RGBLED_DECREASE_SAT, RGBLED_INCREASE_VAL, RGBLED_DECREASE_VAL},
+  {KC_NO, KC_NO, KC_NO, KC_NO, RGBLED_TOGGLE, RGBLED_STEP_MODE, RGBLED_INCREASE_HUE, RGBLED_DECREASE_HUE, RGBLED_INCREASE_SAT, RGBLED_DECREASE_SAT, RGBLED_INCREASE_VAL, RGBLED_DECREASE_VAL}
+},
 
 /* Qwerty
- * ,-----------------------------------------------------------------------------------.
+ ,-----------------------------------------------------------------------------------.
  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
  * |------+------+------+------+------+-------------+------+------+------+------+------|
  * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
  * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |,  |   .  |   /  |Enter |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
  * `-----------------------------------------------------------------------------------'
@@ -292,6 +306,57 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
         break;
       return false;
 
+    case RGBLED_TOGGLE:
+      //led operations
+      if (record->event.pressed) {
+        rgblight_toggle();
+      }
+      return false;
+      break;
+    case RGBLED_INCREASE_HUE:
+      if (record->event.pressed) {
+        rgblight_increase_hue();
+      }
+      return false;
+      break;
+    case RGBLED_DECREASE_HUE:
+      if (record->event.pressed) {
+        rgblight_decrease_hue();
+      }
+      return false;
+      break;
+    case RGBLED_INCREASE_SAT:
+      if (record->event.pressed) {
+        rgblight_increase_sat();
+      }
+      return false;
+      break;
+    case RGBLED_DECREASE_SAT:
+      if (record->event.pressed) {
+        rgblight_decrease_sat();
+      }
+      return false;
+      break;
+    case RGBLED_INCREASE_VAL:
+      if (record->event.pressed) {
+        rgblight_increase_val();
+      }
+      return false;
+      break;
+    case RGBLED_DECREASE_VAL:
+      if (record->event.pressed) {
+        rgblight_decrease_val();
+      }
+      return false;
+      break;
+    case RGBLED_STEP_MODE:
+      if (record->event.pressed) {
+        rgblight_step();
+      }
+      return false;
+      break;
+
+
       }
   return true;
 };

+ 2 - 3
keyboards/planck/keymaps/pvc/config.h

@@ -60,9 +60,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 )
 
 /* ws2812 RGB LED */
-#define ws2812_PORTREG  PORTD
-#define ws2812_DDRREG   DDRD
-#define ws2812_pin PD1
+#define RGB_DI_PIN D1
+#define RGBLIGHT_TIMER
 #define RGBLED_NUM 28     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17

+ 2 - 3
keyboards/planck/keymaps/yang/config.h

@@ -4,9 +4,8 @@
 #include "../../config.h"
 
 /* ws2812 RGB LED */
-#define ws2812_PORTREG  PORTD
-#define ws2812_DDRREG   DDRD
-#define ws2812_pin PD1
+#define RGB_DI_PIN D1
+#define RGBLIGHT_TIMER
 #define RGBLED_NUM 28     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17

+ 5 - 61
keyboards/planck/keymaps/yang/keymap.c

@@ -51,33 +51,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 [_RGB] = { /* RGBLIGHT */
   {KC_TRNS,  KC_PGUP,  KC_UP,    KC_PGDN,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_DEL},
   {KC_TRNS,  KC_LEFT,  KC_DOWN,  KC_RGHT,  KC_TRNS,  KC_HOME,  KC_LEFT,  KC_DOWN,  KC_UP,    KC_RGHT,  KC_END,   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,  RGB_TOG,  RGB_MOD,  RGB_HUI,  RGB_HUD,  RGB_SAI,  RGB_SAD,  RGB_VAI,  RGB_VAD,  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}
 
 }
 };
 
-enum function_id {
-    RGBLED_TOGGLE,
-    RGBLED_STEP_MODE,
-    RGBLED_INCREASE_HUE,
-    RGBLED_DECREASE_HUE,
-    RGBLED_INCREASE_SAT,
-    RGBLED_DECREASE_SAT,
-    RGBLED_INCREASE_VAL,
-    RGBLED_DECREASE_VAL,
-};
+/*enum function_id {
+  
+};*/
 
 const uint16_t PROGMEM fn_actions[] = {
   [0]  = ACTION_LAYER_TAP_KEY(_RGB, KC_SPC),
-  [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),
 };
 
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
@@ -100,47 +85,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 
 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
   switch (id) {
-    case RGBLED_TOGGLE:
-      //led operations
-      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;
+  
   }
 }

+ 2 - 3
keyboards/preonic/config.h

@@ -62,9 +62,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 )
 
 /* ws2812 RGB LED */
-#define ws2812_PORTREG  PORTD
-#define ws2812_DDRREG   DDRD
-#define ws2812_pin PD1
+#define RGB_DI_PIN D1
+#define RGBLIGHT_TIMER
 #define RGBLED_NUM 28     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17

+ 7 - 7
keyboards/satan/config.h

@@ -65,13 +65,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* Underlight configuration
  */
- #define ws2812_PORTREG PORTE
- #define ws2812_DDRREG DDRE
- #define ws2812_pin 2
- #define RGBLED_NUM 8     // Number of LEDs
- #define RGBLIGHT_HUE_STEP 10
- #define RGBLIGHT_SAT_STEP 17
- #define RGBLIGHT_VAL_STEP 17
+
+#define RGB_DI_PIN E2
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 8     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
 
 /*
  * Feature disable options

+ 1 - 67
keyboards/satan/keymaps/default/keymap.c

@@ -1,8 +1,5 @@
 #include "satan.h"
 
-#ifdef RGBLIGHT_ENABLE
-#include "rgblight.h"
-#endif
 
 // Used for SHIFT_ESC
 #define MODS_CTRL_MASK  (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
@@ -53,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   KC_GRV, 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,  \
   KC_TRNS,KC_TRNS,KC_TRNS,  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_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, F(1), F(2), F(3), F(4), F(5), F(6), F(7), F(8), KC_TRNS, KC_TRNS, KC_TRNS, \
+  KC_TRNS,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, \
   KC_TRNS,KC_TRNS,KC_TRNS,          KC_TRNS,                               KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
   #else
   KC_GRV, 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,  \
@@ -66,30 +63,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 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) {
@@ -115,48 +92,5 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
         }
       }
       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
   }
 }

+ 116 - 0
keyboards/satan/keymaps/poker/keymap.c

@@ -0,0 +1,116 @@
+#include "satan.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
+#define _RL 2
+
+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_ENT,  \
+  KC_LSFT,         KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,            KC_RSFT, \
+  KC_LCTL, KC_LGUI,KC_LALT,          KC_SPC,                                        KC_RALT,  MO(_RL), MO(_FL),  KC_RCTL),
+
+/* Keymap _FL: Function Layer
+   * ,-----------------------------------------------------------.
+   * | ~ | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|  DEL  |
+   * |-----------------------------------------------------------|
+   * |     | Up|  |  |  |  |Cal|   |Ins|   |PrSc|Sclk|Paus|      |
+   * |-----------------------------------------------------------|
+   * |      |Left|Down|Rig|  |  |  |  |   |   |Home|PgUp|        |
+   * |-----------------------------------------------------------|
+   * |        |   |App|  |  |   |Vdn|Vup|Mute|End|PgDn|          |
+   * |-----------------------------------------------------------|
+   * |    |    |    |                        |    |    |    |    |
+   * `-----------------------------------------------------------'
+   */
+[_FL] = KEYMAP(
+  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_CALC,KC_TRNS,KC_INS, KC_TRNS, KC_PSCR,  KC_SLCK,   KC_PAUS,   KC_TRNS, \
+  KC_TRNS,KC_LEFT,KC_DOWN,KC_RGHT,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_HOME,    KC_PGUP,              KC_TRNS, \
+  KC_TRNS, KC_TRNS,  KC_APP,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_VOLD,  KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, \
+  KC_TRNS,KC_TRNS,KC_TRNS,          KC_TRNS,                               KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+  
+  /* Keymap _RL: Function Layer
+   * ,-----------------------------------------------------------.
+   * |   |   |   |   |   |   |   |   |   |   |   |   |   |  RESET|
+   * |-----------------------------------------------------------|
+   * |     |   |   |   |   |   |   |   |   |   |   |BL-|BL+|BL   |
+   * |-----------------------------------------------------------|
+   * |      |   |   |   |   |   |   |       |   |   |   |        |
+   * |-----------------------------------------------------------|
+   * |        | F1|F2 | F3|F4 | F5| F6| F7| F8|   |   |          |
+   * |-----------------------------------------------------------|
+   * |    |    |    |                        |    |    |    |    |
+   * `-----------------------------------------------------------'   
+   */
+[_RL] = KEYMAP(
+  #ifdef RGBLIGHT_ENABLE
+  KC_GRV, 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,  \
+  KC_TRNS,KC_TRNS,KC_TRNS,  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_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, RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, \
+  KC_TRNS,KC_TRNS,KC_TRNS,          KC_TRNS,                               KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+  #else
+  KC_GRV, 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,  \
+  KC_TRNS,KC_TRNS,KC_TRNS,  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_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, KC_TRNS),
+  #endif
+};
+
+enum function_id {
+    SHIFT_ESC,
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+  [0]  = ACTION_FUNCTION(SHIFT_ESC),
+};
+
+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;
+  }
+}

+ 3 - 70
keyboards/satan/keymaps/sethbc/keymap.c

@@ -1,9 +1,5 @@
 #include "satan.h"
 
-#ifdef RGBLIGHT_ENABLE
-#include "rgblight.h"
-#endif
-
 // Used for SHIFT_ESC
 #define MODS_CTRL_MASK  (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
 
@@ -44,39 +40,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,                                     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
   #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_TRNS, RESET, \
-  KC_CAPS, KC_TRNS, F(1),    F(2),    F(3),    KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP,   KC_TRNS, KC_BSPC, \
-  KC_TRNS, KC_VOLD, F(4),    F(5),    F(6),    KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT,          KC_PENT, \
-  KC_TRNS,          F(7),    F(8),    KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END,  KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \
+  KC_CAPS, KC_TRNS, RGB_TOG,RGB_MOD,RGB_HUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP,   KC_TRNS, KC_BSPC, \
+  KC_TRNS, KC_VOLD, RGB_HUD,RGB_SAI,RGB_SAD, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT,          KC_PENT, \
+  KC_TRNS,          RGB_VAI,RGB_VAD,KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END,  KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \
   KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,                                     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
   #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) {
@@ -102,48 +78,5 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
         }
       }
       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
   }
 }

+ 20 - 0
keyboards/satan/keymaps/stanleylai/config.h

@@ -0,0 +1,20 @@
+#include "../../config.h"
+
+// USB Device descriptor parameter
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x6060
+#define DEVICE_VER      0x0003
+#define MANUFACTURER    Custom
+#define PRODUCT         GH60 rev.CHN
+#define DESCRIPTION     QMK keyboard firmware for GH60 with WS2812 support
+
+// Backlight configuration
+#define BACKLIGHT_LEVELS 3
+
+// Underlight configuration
+#define RGB_DI_PIN E2
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 6        // Number of LEDs
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8

+ 84 - 0
keyboards/satan/keymaps/stanleylai/keymap.c

@@ -0,0 +1,84 @@
+#include "satan.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
+#define _RGBL 2
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+// See base_layer.png and rgb_layer.png for layout reference
+
+// Base Default Layer
+// Mac Modifier Layout. Use BootMagic to toggle GUI and ALT positions.
+[_BL] = KEYMAP_HHKB(
+  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_NO, \
+  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,       \
+  LT(_FL, 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_ENT,        \
+  KC_LSFT,          KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM, KC_DOT, KC_SLSH,           KC_UP,    MO(_FL),       \
+  KC_LCTL, KC_LALT, KC_LGUI,                        KC_SPC,                                  KC_RGUI, KC_LEFT,  KC_DOWN,  KC_RGHT),
+
+// Function layer
+[_FL] = KEYMAP_HHKB(
+  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_NO, \
+  KC_NO,   KC_MPRV, KC_UP,   KC_MNXT, KC_NO,   KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, \
+  KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,   KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,            KC_NO,  \
+  KC_TRNS,          KC_MUTE, KC_VOLD, KC_VOLU, KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,   LT(_RGBL, KC_PGUP), KC_TRNS,  \
+  KC_TRNS, KC_TRNS, KC_TRNS,                           KC_MPLY,                                 KC_TRNS, KC_HOME, KC_PGDN, KC_END),
+
+// RGB Layer
+[_RGBL] = KEYMAP_HHKB(
+  #ifdef RGBLIGHT_ENABLE
+  RESET,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,    KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO, \
+  KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,    KC_NO,   KC_NO,   KC_NO,   KC_NO, \
+  KC_NO,   BL_TOGG, BL_STEP, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,    KC_NO,   KC_NO,            KC_NO,  \
+  KC_TRNS,          RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD,  KC_NO,   KC_NO,   KC_TRNS, KC_TRNS,\
+  KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                             KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+  #else
+  RESET,   KC_NO,   KC_NO,   KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO, \
+  KC_NO,   KC_NO,   KC_NO,   KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,   KC_NO,   KC_NO, \
+  KC_NO,   BL_TOGG, BL_STEP, KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,            KC_NO,  \
+  KC_TRNS,          KC_NO,   KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,   KC_TRNS, KC_TRNS,\
+  KC_TRNS, KC_TRNS, KC_TRNS,                         KC_TRNS,                        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+  #endif
+};
+
+enum function_id {
+    SHIFT_ESC,
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+  [0]  = ACTION_FUNCTION(SHIFT_ESC),
+};
+
+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;
+  }
+}

+ 1 - 0
lib/ugfx

@@ -0,0 +1 @@
+Subproject commit 13e084ae6231857cd0d472c529f34be07d93c08b

+ 10 - 0
quantum/keymap.h

@@ -156,6 +156,16 @@ enum quantum_keycodes {
     BL_INC,
     BL_TOGG,
     BL_STEP,
+	
+	// RGB functionality
+	RGB_TOG,
+	RGB_MOD,
+	RGB_HUI,
+	RGB_HUD,
+	RGB_SAI,
+	RGB_SAD,
+	RGB_VAI,
+	RGB_VAD,
 
     // Left shift, open paren
     KC_LSPO,

+ 1 - 1
quantum/keymap_common.c

@@ -62,7 +62,7 @@ action_t action_for_key(uint8_t layer, keypos_t key)
         case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE:
             action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode));
             break;
-        case KC_AUDIO_MUTE ... KC_WWW_FAVORITES:
+        case KC_AUDIO_MUTE ... KC_MEDIA_REWIND:
             action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode));
             break;
         case KC_MS_UP ... KC_MS_ACCEL2:

+ 17 - 8
quantum/light_ws2812.c

@@ -19,12 +19,16 @@
 // Setleds for standard RGB
 void inline ws2812_setleds(struct cRGB *ledarray, uint16_t leds)
 {
-   ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin));
+   // ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin));
+   ws2812_setleds_pin(ledarray,leds, _BV(RGB_DI_PIN & 0xF));
 }
 
 void inline ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pinmask)
 {
-  ws2812_DDRREG |= pinmask; // Enable DDR
+  // ws2812_DDRREG |= pinmask; // Enable DDR
+  // new universal format (DDR)
+  _SFR_IO8((RGB_DI_PIN >> 4) + 1) |= pinmask;
+
   ws2812_sendarray_mask((uint8_t*)ledarray,leds+leds+leds,pinmask);
   _delay_us(50);
 }
@@ -32,14 +36,17 @@ void inline ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pin
 // Setleds for SK6812RGBW
 void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds)
 {
-  ws2812_DDRREG |= _BV(ws2812_pin); // Enable DDR
-  ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(ws2812_pin));
+  // ws2812_DDRREG |= _BV(ws2812_pin); // Enable DDR
+  // new universal format (DDR)
+  _SFR_IO8((RGB_DI_PIN >> 4) + 1) |= _BV(RGB_DI_PIN & 0xF);
+
+  ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(RGB_DI_PIN & 0xF));
   _delay_us(80);
 }
 
 void ws2812_sendarray(uint8_t *data,uint16_t datlen)
 {
-  ws2812_sendarray_mask(data,datlen,_BV(ws2812_pin));
+  ws2812_sendarray_mask(data,datlen,_BV(RGB_DI_PIN & 0xF));
 }
 
 /*
@@ -108,8 +115,10 @@ void inline ws2812_sendarray_mask(uint8_t *data,uint16_t datlen,uint8_t maskhi)
   uint8_t curbyte,ctr,masklo;
   uint8_t sreg_prev;
 
-  masklo	=~maskhi&ws2812_PORTREG;
-  maskhi |=        ws2812_PORTREG;
+  // masklo  =~maskhi&ws2812_PORTREG;
+  // maskhi |=        ws2812_PORTREG;
+  masklo  =~maskhi&_SFR_IO8((RGB_DI_PIN >> 4) + 2);
+  maskhi |=        _SFR_IO8((RGB_DI_PIN >> 4) + 2);
   sreg_prev=SREG;
   cli();
 
@@ -173,7 +182,7 @@ w_nop16
     "       dec   %0    \n\t"    //  '1' [+2] '0' [+2]
     "       brne  loop%=\n\t"    //  '1' [+3] '0' [+4]
     :	"=&d" (ctr)
-    :	"r" (curbyte), "I" (_SFR_IO_ADDR(ws2812_PORTREG)), "r" (maskhi), "r" (masklo)
+    :	"r" (curbyte), "I" (_SFR_IO_ADDR(_SFR_IO8((RGB_DI_PIN >> 4) + 2))), "r" (maskhi), "r" (masklo)
     );
   }
 

+ 64 - 2
quantum/quantum.c

@@ -93,16 +93,66 @@ bool process_record_quantum(keyrecord_t *record) {
             *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
         #endif
         bootloader_jump();
-        return false;
       }
+	  return false;
       break;
     case DEBUG:
       if (record->event.pressed) {
           print("\nDEBUG: enabled.\n");
           debug_enable = true;
-          return false;
       }
+	  return false;
+      break;
+	#ifdef RGBLIGHT_ENABLE
+	case RGB_TOG:
+		if (record->event.pressed) {
+			rgblight_toggle();
+      }
+	  return false;
+      break;
+	case RGB_MOD:
+		if (record->event.pressed) {
+			rgblight_step();
+      }
+	  return false;
       break;
+	case RGB_HUI:
+		if (record->event.pressed) {
+			rgblight_increase_hue();
+      }
+	  return false;
+      break;
+	case RGB_HUD:
+		if (record->event.pressed) {
+			rgblight_decrease_hue();
+      }
+	  return false;
+      break;
+	case RGB_SAI:
+		if (record->event.pressed) {
+			rgblight_increase_sat();
+      }
+	  return false;
+      break;
+	case RGB_SAD:
+		if (record->event.pressed) {
+			rgblight_decrease_sat();
+      }
+	  return false;
+      break;
+	case RGB_VAI:
+		if (record->event.pressed) {
+			rgblight_increase_val();
+      }
+	  return false;
+      break;
+	case RGB_VAD:
+		if (record->event.pressed) {
+			rgblight_decrease_val();
+      }
+	  return false;
+      break;
+	#endif
     case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_UNSWAP_ALT_GUI:
       if (record->event.pressed) {
         // MAGIC actions (BOOTMAGIC without the boot)
@@ -162,6 +212,12 @@ bool process_record_quantum(keyrecord_t *record) {
         register_mods(MOD_BIT(KC_LSFT));
       }
       else {
+        #ifdef DISABLE_SPACE_CADET_ROLLOVER
+          if (get_mods() & MOD_BIT(KC_RSFT)) {
+            shift_interrupted[0] = true;
+            shift_interrupted[1] = true;
+          }
+        #endif
         if (!shift_interrupted[0]) {
           register_code(LSPO_KEY);
           unregister_code(LSPO_KEY);
@@ -178,6 +234,12 @@ bool process_record_quantum(keyrecord_t *record) {
         register_mods(MOD_BIT(KC_RSFT));
       }
       else {
+        #ifdef DISABLE_SPACE_CADET_ROLLOVER
+          if (get_mods() & MOD_BIT(KC_LSFT)) {
+            shift_interrupted[0] = true;
+            shift_interrupted[1] = true;
+          }
+        #endif
         if (!shift_interrupted[1]) {
           register_code(RSPC_KEY);
           unregister_code(RSPC_KEY);

+ 19 - 4
quantum/rgblight.c

@@ -146,7 +146,9 @@ void rgblight_init(void) {
 	}
 	eeconfig_debug_rgblight(); // display current eeprom values
 
-	rgblight_timer_init(); // setup the timer
+	#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
+		rgblight_timer_init(); // setup the timer
+	#endif
 
   if (rgblight_config.enable) {
     rgblight_mode(rgblight_config.mode);
@@ -192,14 +194,19 @@ void rgblight_mode(uint8_t mode) {
   eeconfig_update_rgblight(rgblight_config.raw);
   xprintf("rgblight mode: %u\n", rgblight_config.mode);
 	if (rgblight_config.mode == 1) {
-		rgblight_timer_disable();
+		#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
+			rgblight_timer_disable();
+		#endif
 	} else if (rgblight_config.mode >=2 && rgblight_config.mode <=23) {
 		// MODE 2-5, breathing
 		// MODE 6-8, rainbow mood
 		// MODE 9-14, rainbow swirl
 		// MODE 15-20, snake
 		// MODE 21-23, knight
-		rgblight_timer_enable();
+
+		#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
+			rgblight_timer_enable();
+		#endif
 	}
   rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
 }
@@ -211,7 +218,10 @@ void rgblight_toggle(void) {
 	if (rgblight_config.enable) {
 		rgblight_mode(rgblight_config.mode);
 	} else {
-		rgblight_timer_disable();
+
+		#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
+			rgblight_timer_disable();
+		#endif
 		_delay_ms(50);
 		rgblight_set();
 	}
@@ -328,6 +338,9 @@ void rgblight_set(void) {
 	}
 }
 
+
+#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
+
 // Animation timer -- AVR Timer3
 void rgblight_timer_init(void) {
 	static uint8_t rgblight_timer_is_init = 0;
@@ -503,3 +516,5 @@ void rgblight_effect_knight(uint8_t interval) {
 	}
 
 }
+
+#endif

+ 5 - 2
quantum/rgblight.h

@@ -1,8 +1,11 @@
 #ifndef RGBLIGHT_H
 #define RGBLIGHT_H
 
-#ifndef RGBLIGHT_MODES
-#define RGBLIGHT_MODES 23
+
+#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
+	#define RGBLIGHT_MODES 23
+#else
+	#define RGBLIGHT_MODES 1
 #endif
 
 #ifndef RGBLIGHT_EFFECT_SNAKE_LENGTH

+ 1 - 1
quantum/template/template.c

@@ -18,7 +18,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
 	// put your per-action keyboard code here
 	// runs for every action, just before processing by the firmware
 
-	return process_action_user(record);
+	return process_record_user(keycode, record);
 }
 
 void led_set_kb(uint8_t usb_led) {

+ 2 - 2
quantum/visualizer/led_test.c

@@ -89,8 +89,8 @@ static uint8_t crossfade_start_frame[NUM_ROWS][NUM_COLS];
 static uint8_t crossfade_end_frame[NUM_ROWS][NUM_COLS];
 
 static uint8_t compute_gradient_color(float t, float index, float num) {
-    const float two_pi = 2.0f * PI;
-    float normalized_index = (1.0f - index / (num - 1)) * two_pi;
+    const float two_pi = M_2_PI;
+    float normalized_index = (1.0f - index / (num - 1.0f)) * two_pi;
     float x = t * two_pi + normalized_index;
     float v = 0.5 * (cosf(x) + 1.0f);
     return (uint8_t)(255.0f * v);

+ 5 - 9
quantum/visualizer/visualizer.c

@@ -29,9 +29,7 @@ SOFTWARE.
 #include "ch.h"
 #endif
 
-#ifdef LCD_ENABLE
 #include "gfx.h"
-#endif
 
 #ifdef LCD_BACKLIGHT_ENABLE
 #include "lcd_backlight.h"
@@ -45,7 +43,7 @@ SOFTWARE.
 #include "nodebug.h"
 #endif
 
-#ifdef USE_SERIAL_LINK
+#ifdef SERIAL_LINK_ENABLE
 #include "serial_link/protocol/transport.h"
 #include "serial_link/system/serial_link.h"
 #endif
@@ -75,7 +73,7 @@ static bool visualizer_enabled = false;
 #define MAX_SIMULTANEOUS_ANIMATIONS 4
 static keyframe_animation_t* animations[MAX_SIMULTANEOUS_ANIMATIONS] = {};
 
-#ifdef USE_SERIAL_LINK
+#ifdef SERIAL_LINK_ENABLE
 MASTER_TO_ALL_SLAVES_OBJECT(current_status, visualizer_keyboard_status_t);
 
 static remote_object_t* remote_objects[] = {
@@ -458,15 +456,13 @@ static DECLARE_THREAD_FUNCTION(visualizerThread, arg) {
 }
 
 void visualizer_init(void) {
-#ifdef LCD_ENABLE
     gfxInit();
-#endif
 
 #ifdef LCD_BACKLIGHT_ENABLE
     lcd_backlight_init();
 #endif
 
-#ifdef USE_SERIAL_LINK
+#ifdef SERIAL_LINK_ENABLE
     add_remote_objects(remote_objects, sizeof(remote_objects) / sizeof(remote_object_t*) );
 #endif
 
@@ -490,7 +486,7 @@ void update_status(bool changed) {
             geventSendEvent(listener);
         }
     }
-#ifdef USE_SERIAL_LINK
+#ifdef SERIAL_LINK_ENABLE
     static systime_t last_update = 0;
     systime_t current_update = chVTGetSystemTimeX();
     systime_t delta = current_update - last_update;
@@ -510,7 +506,7 @@ void visualizer_update(uint32_t default_state, uint32_t state, uint32_t leds) {
     // Alternatively a mutex could be used instead of the volatile variables
 
     bool changed = false;
-#ifdef USE_SERIAL_LINK
+#ifdef SERIAL_LINK_ENABLE
     if (is_serial_link_connected ()) {
         visualizer_keyboard_status_t* new_status = read_current_status();
         if (new_status) {

+ 0 - 2
quantum/visualizer/visualizer.h

@@ -28,9 +28,7 @@ SOFTWARE.
 #include <stdint.h>
 #include <stdbool.h>
 
-#ifdef LCD_ENABLE
 #include "gfx.h"
-#endif
 
 #ifdef LCD_BACKLIGHT_ENABLE
 #include "lcd_backlight.h"

+ 18 - 18
quantum/visualizer/visualizer.mk

@@ -20,41 +20,41 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-GFXLIB = $(VISUALIZER_DIR)/ugfx
 SRC += $(VISUALIZER_DIR)/visualizer.c
-UINCDIR += $(GFXINC) $(VISUALIZER_DIR)
+EXTRAINCDIRS += $(GFXINC) $(VISUALIZER_DIR)
+GFXLIB = $(LIB_PATH)/ugfx
+VPATH += $(VISUALIZER_PATH)
+
+OPT_DEFS += -DVISUALIZER_ENABLE
 
 ifdef LCD_ENABLE
-UDEFS += -DLCD_ENABLE
+OPT_DEFS += -DLCD_ENABLE
 ULIBS += -lm
-USE_UGFX = yes
 endif
 
 ifdef LCD_BACKLIGHT_ENABLE
 SRC += $(VISUALIZER_DIR)/lcd_backlight.c
-ifndef EMULATOR
-SRC += lcd_backlight_hal.c
-endif
-UDEFS += -DLCD_BACKLIGHT_ENABLE
+OPT_DEFS += -DLCD_BACKLIGHT_ENABLE
 endif
 
 ifdef LED_ENABLE
 SRC += $(VISUALIZER_DIR)/led_test.c
-UDEFS += -DLED_ENABLE
-USE_UGFX = yes
+OPT_DEFS += -DLED_ENABLE
 endif
 
-ifdef USE_UGFX
 include $(GFXLIB)/gfx.mk
-SRC += $(GFXSRC)
-UDEFS += $(patsubst %,-D%,$(patsubst -D%,%,$(GFXDEFS)))
-ULIBS += $(patsubst %,-l%,$(patsubst -l%,%,$(GFXLIBS)))
-endif
+SRC += $(patsubst $(TOP_DIR)/%,%,$(GFXSRC))
+OPT_DEFS += $(patsubst %,-D%,$(patsubst -D%,%,$(GFXDEFS)))
 
-ifndef VISUALIZER_USER
-VISUALIZER_USER = visualizer_user.c
+ifneq ("$(wildcard $(KEYMAP_PATH)/visualizer.c)","")
+	SRC += keyboards/$(KEYBOARD)/keymaps/$(KEYMAP)/visualizer.c
+else 
+	ifeq ("$(wildcard $(SUBPROJECT_PATH)/keymaps/$(KEYMAP)/visualizer.c)","")
+$(error "$(KEYMAP_PATH)/visualizer.c" does not exist)
+	else
+		SRC += keyboards/$(KEYBOARD)/$(SUBPROJECT)/keymaps/$(KEYMAP)/visualizer.c
+	endif
 endif
-SRC += $(VISUALIZER_USER)
 
 ifdef EMULATOR
 UINCDIR += $(TMK_DIR)/common

Разница между файлами не показана из-за своего большого размера
+ 87 - 14
readme.md


+ 1 - 1
tmk_core/common.mk

@@ -107,7 +107,7 @@ endif
 
 
 # Version string
-OPT_DEFS += -DVERSION=$(shell (git describe --always --dirty || echo 'unknown') 2> /dev/null)
+OPT_DEFS += -DVERSION=$(GIT_VERSION)
 
 # Bootloader address
 ifdef STM32_BOOTLOADER_ADDRESS

+ 8 - 0
tmk_core/common/keyboard.c

@@ -29,6 +29,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "sendchar.h"
 #include "eeconfig.h"
 #include "backlight.h"
+#include "action_layer.h"
 #ifdef BOOTMAGIC_ENABLE
 #   include "bootmagic.h"
 #else
@@ -52,6 +53,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #ifdef SERIAL_LINK_ENABLE
 #   include "serial_link/system/serial_link.h"
 #endif
+#ifdef VISUALIZER_ENABLE
+#   include "visualizer/visualizer.h"
+#endif
 
 #ifdef MATRIX_HAS_GHOST
 static bool has_ghost_in_row(uint8_t row)
@@ -181,6 +185,10 @@ MATRIX_LOOP_END:
 	serial_link_update();
 #endif
 
+#ifdef VISUALIZER_ENABLE
+    visualizer_update(default_layer_state, layer_state, host_keyboard_leds());
+#endif
+
     // update LED
     if (led_status != host_keyboard_leds()) {
         led_status = host_keyboard_leds();

+ 1 - 6
tmk_core/common/keycode.h

@@ -31,7 +31,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #define IS_SPECIAL(code)         ((0xA5 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF))
 #define IS_SYSTEM(code)          (KC_PWR       <= (code) && (code) <= KC_WAKE)
-#define IS_CONSUMER(code)        (KC_MUTE      <= (code) && (code) <= KC_WFAV)
+#define IS_CONSUMER(code)        (KC_MUTE      <= (code) && (code) <= KC_MRWD)
 #define IS_FN(code)              (KC_FN0       <= (code) && (code) <= KC_FN31)
 #define IS_MOUSEKEY(code)        (KC_MS_UP     <= (code) && (code) <= KC_MS_ACCEL2)
 #define IS_MOUSEKEY_MOVE(code)   (KC_MS_UP     <= (code) && (code) <= KC_MS_RIGHT)
@@ -156,8 +156,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define KC_WSTP KC_WWW_STOP
 #define KC_WREF KC_WWW_REFRESH
 #define KC_WFAV KC_WWW_FAVORITES
-/* Jump to bootloader */
-#define KC_BTLD KC_BOOTLOADER
 /* Transparent */
 #define KC_TRANSPARENT  1
 #define KC_TRNS KC_TRANSPARENT
@@ -428,9 +426,6 @@ enum internal_special_keycodes {
     KC_MEDIA_FAST_FORWARD,
     KC_MEDIA_REWIND,    /* 0xBC */
 
-    /* Jump to bootloader */
-    KC_BOOTLOADER       = 0xBF,
-
     /* Fn key */
     KC_FN0              = 0xC0,
     KC_FN1,

+ 15 - 0
tmk_core/protocol/chibios/main.c

@@ -38,6 +38,9 @@
 #ifdef SERIAL_LINK_ENABLE
 #include "serial_link/system/serial_link.h"
 #endif
+#ifdef VISUALIZER_ENABLE
+#include "visualizer/visualizer.h"
+#endif
 #include "suspend.h"
 
 
@@ -105,6 +108,11 @@ int main(void) {
   init_serial_link();
 #endif
 
+#ifdef VISUALIZER_ENABLE
+  visualizer_init();
+#endif
+
+
   host_driver_t* driver = NULL;
 
   /* Wait until the USB or serial link is active */
@@ -147,6 +155,9 @@ int main(void) {
 
     if(USB_DRIVER.state == USB_SUSPENDED) {
       print("[s]");
+#ifdef VISUALIZER_ENABLE
+      visualizer_suspend();
+#endif
       while(USB_DRIVER.state == USB_SUSPENDED) {
         /* Do this in the suspended state */
 #ifdef SERIAL_LINK_ENABLE
@@ -164,6 +175,10 @@ int main(void) {
 #ifdef MOUSEKEY_ENABLE
       mousekey_send();
 #endif /* MOUSEKEY_ENABLE */
+
+#ifdef VISUALIZER_ENABLE
+      visualizer_resume();
+#endif
     }
 
     keyboard_task();

+ 30 - 45
tmk_core/rules.mk

@@ -260,7 +260,7 @@ LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.lst,$(patsubst
 
 # Compiler flags to generate dependency files.
 #GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
-GENDEPFLAGS = -MMD -MP -MF $(BUILD_DIR)/.dep/$(subst /,_,$@).d
+GENDEPFLAGS = -MMD -MP -MF $(BUILD_DIR)/.dep/$(subst /,_,$(subst $(BUILD_DIR)/,,$@)).d
 
 
 # Combine all necessary flags and optional flags.
@@ -271,23 +271,10 @@ ALL_CPPFLAGS = $(MCUFLAGS) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS)
 ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS)
 
 # Default target.
-all:
-	@$(MAKE) begin
-	@$(MAKE) gccversion
-	@$(MAKE) sizebefore
-	@$(MAKE) clean_list # force clean each time
-	@$(MAKE) build
-	@$(MAKE) sizeafter
-	@$(MAKE) end
+all: build sizeafter
 
 # Quick make that doesn't clean
-quick:
-	@$(MAKE) begin
-	@$(MAKE) gccversion
-	@$(MAKE) sizebefore
-	@$(MAKE) build
-	@$(MAKE) sizeafter
-	@$(MAKE) end
+quick: build sizeafter
 
 # Change the build target to build a HEX file or a library.
 build: elf hex
@@ -303,13 +290,7 @@ sym: $(BUILD_DIR)/$(TARGET).sym
 LIBNAME=lib$(TARGET).a
 lib: $(LIBNAME)
 
-
-
-# Eye candy.
-# AVR Studio 3.x does not check make's exit code but relies on
-# the following magic strings to be generated by the compile job.
-begin:
-	@$(SECHO) $(MSG_BEGIN)
+check_submodule:
 	git submodule status --recursive | \
 	while IFS= read -r x; do \
 		case "$$x" in \
@@ -318,10 +299,6 @@ begin:
 		esac \
 	done
 
-end:
-	@$(SECHO) $(MSG_END)
-
-
 # Display size of file.
 HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
 #ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf
@@ -331,7 +308,7 @@ sizebefore:
 	@if test -f $(TARGET).hex; then $(SECHO) $(MSG_SIZE_BEFORE); $(SILENT) || $(HEXSIZE); \
 	2>/dev/null; $(SECHO); fi
 
-sizeafter:
+sizeafter: $(BUILD_DIR)/$(TARGET).hex
 	@if test -f $(TARGET).hex; then $(SECHO); $(SECHO) $(MSG_SIZE_AFTER); $(SILENT) || $(HEXSIZE); \
 	2>/dev/null; $(SECHO); fi
 	# test file sizes eventually
@@ -383,60 +360,55 @@ gccversion :
 	$(eval CMD=$(AR) $@ $(OBJ) )
 	@$(BUILD_CMD)
 
+BEGIN = gccversion check_submodule sizebefore
+
 # Link: create ELF output file from object files.
 .SECONDARY : $(BUILD_DIR)/$(TARGET).elf
 .PRECIOUS : $(OBJ)
-%.elf: $(OBJ)
+%.elf: $(OBJ) | $(BEGIN)
 	@$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD)
 	$(eval CMD=$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS))
 	@$(BUILD_CMD)
 
 # Compile: create object files from C source files.
-$(OBJDIR)/%.o : %.c
+$(OBJDIR)/%.o : %.c | $(BEGIN)
 	@mkdir -p $(@D)
 	@$(SILENT) || printf "$(MSG_COMPILING) $<" | $(AWK_CMD)
 	$(eval CMD=$(CC) -c $(ALL_CFLAGS) $< -o $@)
 	@$(BUILD_CMD)
 
 # Compile: create object files from C++ source files.
-$(OBJDIR)/%.o : %.cpp
+$(OBJDIR)/%.o : %.cpp | $(BEGIN)
 	@mkdir -p $(@D)
 	@$(SILENT) || printf "$(MSG_COMPILING_CPP) $<" | $(AWK_CMD)
 	$(eval CMD=$(CC) -c $(ALL_CPPFLAGS) $< -o $@)
 	@$(BUILD_CMD)
 
 # Compile: create assembler files from C source files.
-%.s : %.c
+%.s : %.c | $(BEGIN)
 	@$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD)
 	$(eval CMD=$(CC) -S $(ALL_CFLAGS) $< -o $@)
 	@$(BUILD_CMD)
 
 # Compile: create assembler files from C++ source files.
-%.s : %.cpp
+%.s : %.cpp | $(BEGIN)
 	@$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD)
 	$(eval CMD=$(CC) -S $(ALL_CPPFLAGS) $< -o $@)
 	@$(BUILD_CMD)
 
 # Assemble: create object files from assembler source files.
-$(OBJDIR)/%.o : %.S
+$(OBJDIR)/%.o : %.S | $(BEGIN)
 	@mkdir -p $(@D)
 	@$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD)
 	$(eval CMD=$(CC) -c $(ALL_ASFLAGS) $< -o $@)
 	@$(BUILD_CMD)
 
 # Create preprocessed source for use in sending a bug report.
-%.i : %.c
+%.i : %.c | $(BEGIN)
 	$(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@
 
 # Target: clean project.
-clean: begin clean_list end
-
-clean_list :
-	@$(REMOVE) -r $(BUILD_DIR)
-	@$(REMOVE) -r $(TOP_DIR)/$(BUILD_DIR)
-	@$(REMOVE) -r $(KEYBOARD_PATH)/$(BUILD_DIR)
-	@if $$SUBPROJECT; then $(REMOVE) -r $(SUBPROJECT_PATH)/$(BUILD_DIR); fi
-	@$(REMOVE) -r $(KEYMAP_PATH)/$(BUILD_DIR)
+clean: 
 
 show_path:
 	@echo VPATH=$(VPATH)
@@ -496,6 +468,19 @@ all-keymaps-%:
 
 all-keymaps: all-keymaps-all
 
+GOAL=$(MAKECMDGOALS)
+ifeq ($(MAKECMDGOALS),)
+GOAL = all
+endif
+CLEANING_GOALS=clean clean_list all
+ifneq ($(findstring $(GOAL),$(CLEANING_GOALS)),)
+$(shell $(REMOVE) -r $(BUILD_DIR) 2>/dev/null)
+$(shell $(REMOVE) -r $(TOP_DIR)/$(BUILD_DIR))
+$(shell $(REMOVE) -r $(KEYBOARD_PATH)/$(BUILD_DIR))
+$(shell if $$SUBPROJECT; then $(REMOVE) -r $(SUBPROJECT_PATH)/$(BUILD_DIR); fi)
+$(shell $(REMOVE) -r $(KEYMAP_PATH)/$(BUILD_DIR))
+endif
+
 # Create build directory
 $(shell mkdir $(BUILD_DIR) 2>/dev/null)
 
@@ -508,8 +493,8 @@ $(shell mkdir $(OBJDIR) 2>/dev/null)
 
 
 # Listing of phony targets.
-.PHONY : all quick begin finish end sizebefore sizeafter gccversion \
-build elf hex eep lss sym coff extcoff \
+.PHONY : all quick finish sizebefore sizeafter gccversion \
+build elf hex eep lss sym coff extcoff check_submodule \
 clean clean_list debug gdb-config show_path \
 program teensy dfu flip dfu-ee flip-ee dfu-start \
 all-keyboards-defaults all-keyboards all-keymaps \