summaryrefslogtreecommitdiffstats
path: root/keyboards/infinity60
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/infinity60')
-rw-r--r--keyboards/infinity60/MEMO.txt385
-rw-r--r--keyboards/infinity60/keymaps/jpetermans/Makefile2
-rw-r--r--keyboards/infinity60/keymaps/jpetermans/keymap.c280
-rw-r--r--keyboards/infinity60/keymaps/jpetermans/keymap_jpetermans.h78
-rw-r--r--keyboards/infinity60/keymaps/jpetermans/readme.md79
-rw-r--r--keyboards/infinity60/led.c4
-rw-r--r--keyboards/infinity60/led_controller.c329
-rw-r--r--keyboards/infinity60/led_controller.h14
8 files changed, 360 insertions, 811 deletions
diff --git a/keyboards/infinity60/MEMO.txt b/keyboards/infinity60/MEMO.txt
deleted file mode 100644
index e2886aa00..000000000
--- a/keyboards/infinity60/MEMO.txt
+++ /dev/null
@@ -1,385 +0,0 @@
-flabbergast's TMK/ChibiOS port
-==============================
-2015/10/16
-
-
-Build
------
-$ git clone -b chibios https://github.com/flabbergast/tmk_keyboard.git
-
-$ cd tmk_keyboard
-$ git submodule add -f -b kinetis https://github.com/flabbergast/ChibiOS.git tmk_core/tool/chibios/chibios
-or
-$ cd tmk_keyboard/tmk_core/tool/chibios
-$ git clone -b kinetis https://github.com/flabbergast/ChibiOS.git tmk_core/tool/chibios/chibios
-
-$ cd tmk_keyboard/keyboard/infinity_chibios
-$ make
-
-
-
-
-Chibios Configuration
----------------------
-halconf.h: for HAL configuration
- placed in project directory
- read in chibios/os/hal/hal.mk
- included in chibios/os/hal/include/hal.h
-mcuconf.h: for MCU configuration
- placed in project directory
- included in halconf.h
-
-
-Chibios Term
-------------
-PAL = Port Abstraction Layer
- palWritePad
- palReadPad
- palSetPad
- chibios/os/hal/include/pal.h
-
-LLD = Low Level Driver
-
-
-Makefile
---------
- # <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
- MCU_FAMILY = KINETIS
- MCU_SERIES = KL2x
-
- # - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
- # or <this_dir>/ld/
- MCU_LDSCRIPT = MKL26Z64
-
- # - it should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
- MCU_STARTUP = kl2x
-
- # Board: it should exist either in <chibios>/os/hal/boards/
- # or <this_dir>/boards
- BOARD = PJRC_TEENSY_LC
-
- MCU = cortex-m0
-
- # ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
- ARMV = 6
-
-
-halconf.h
----------
-
-
-mcuconf.h
----------
-
-
-chconf.h
---------
-
-
-ld script
----------
---- ../../tmk_core/tool/chibios/chibios/os/common/ports/ARMCMx/compilers/GCC/ld/MKL26Z64.ld 2015-10-15 09:08:58.732904304 +0900
-+++ ld/MKL26Z64.ld 2015-10-15 08:48:06.430215496 +0900
-@@ -27,7 +27,8 @@
- {
- flash0 : org = 0x00000000, len = 0xc0
- flashcfg : org = 0x00000400, len = 0x10
-- flash : org = 0x00000410, len = 64k - 0x410
-+ flash : org = 0x00000410, len = 62k - 0x410
-+ eeprom_emu : org = 0x0000F800, len = 2k
- ram : org = 0x1FFFF800, len = 8k
- }
-
-@@ -35,6 +36,10 @@
- __ram_size__ = LENGTH(ram);
- __ram_end__ = __ram_start__ + __ram_size__;
-
-+__eeprom_workarea_start__ = ORIGIN(eeprom_emu);
-+__eeprom_workarea_size__ = LENGTH(eeprom_emu);
-+__eeprom_workarea_end__ = __eeprom_workarea_start__ + __eeprom_workarea_size__;
-+
- SECTIONS
- {
- . = 0;
-
-
-
-Configuration/Startup for Infinity 60%
---------------------------------------
-Configuration:
-
-
-Clock:
-Inifinity
- FEI(FLL Engaged Internal) mode with core clock:48MHz, bus clock:48MHz, flash clock:24MHz
- Clock dividor:
- SIM_CLKDIV1[OUTDIV1] = 0 divide-by-1 for core clock
- SIM_CLKDIV1[OUTDIV2] = 0 divide-by-1 for bus clock
- SIM_CLKDIV1[OUTDIV4] = 1 divide-by-2 for flash clock
- Internal reference clock:
- MCG_C1[IREFS] = 1 Internal Reference Select for clock source for FLL
- MCG_C1[IRCLKEN] = 1 Internal Reference Clock Enable
- FLL multipilication:
- MCG_C4[DMX32] = 1
- MCG_C4[DRST_DRS] = 01 FLL factor 1464 * 32.768kHz = 48MHz
-
-chibios/os/hal/ports/KINETIS/K20x/hal_lld.c
- k20x_clock_init(): called in __early_init() defined in board.c
- disable watchdog and configure clock
-
- configurable macros:
- KINETIS_NO_INIT: whether init or not
- KINETIS_MCG_MODE: clock mode
- KINETIS_MCG_MODE_FEI
- KINETIS_MCG_MODE_PEE
- hal/ports/KINETIS/K20x/hal_lld.h
-
-
-chibios/os/hal/boards/FREESCALE_FREEDOM_K20D50M/board.h
- PALConfig pal_default_config
- boardInit()
- __early_init()
- macro definitions for board infos, freq and mcu type
-
-chibios/os/hal/boards/FREESCALE_FREEDOM_K20D50M/board.c
-
-USB
-
-
-Startup
--------
- common/ports/ARMCMx/GCC/crt0_v[67]m.s
- Reset_Handler: startup code
- common/ports/ARMCMx/GCC/crt1.c
- __core_init(): weak
- __early_init(): weak
- __late_init(): weak
- __default_exit(): weak
- called from Reset_Handler of crt0
- common/ports/ARMCMx/GCC/vector.c
- common/ports/ARMCMx/GCC/ld/*.ld
-
-chibios/os/common/ports/ARMCMx/compilers/GCC/
-├── crt0_v6m.s
-├── crt0_v7m.s
-├── crt1.c
-├── ld
-│   ├── MK20DX128BLDR3.ld
-│   ├── MK20DX128BLDR4.ld
-│   ├── MK20DX128.ld
-│   ├── MK20DX256.ld
-│   ├── MKL25Z128.ld
-│   ├── MKL26Z128.ld
-│   ├── MKL26Z64.ld
-│   └── STM32L476xG.ld
-├── mk
-│   ├── startup_k20x5.mk
-│   ├── startup_k20x7.mk
-│   ├── startup_k20x.mk
-│   ├── startup_kl2x.mk
-│   └── startup_stm32l4xx.mk
-├── rules.ld
-├── rules.mk
-└── vectors.c
-
-chibios/os/hal/
-├── boards
-│   ├── FREESCALE_FREEDOM_K20D50M
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── MCHCK_K20
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── PJRC_TEENSY_3
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── PJRC_TEENSY_3_1
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── PJRC_TEENSY_LC
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── readme.txt
-│   ├── simulator
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── ST_NUCLEO_F030R8
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   ├── board.mk
-│   │   └── cfg
-│   │   └── board.chcfg
-├── hal.mk
-├── include
-│   ├── adc.h
-│   ├── can.h
-│   ├── dac.h
-│   ├── ext.h
-│   ├── gpt.h
-│   ├── hal_channels.h
-│   ├── hal_files.h
-│   ├── hal.h
-│   ├── hal_ioblock.h
-│   ├── hal_mmcsd.h
-│   ├── hal_queues.h
-│   ├── hal_streams.h
-│   ├── i2c.h
-│   ├── i2s.h
-│   ├── icu.h
-│   ├── mac.h
-│   ├── mii.h
-│   ├── mmc_spi.h
-│   ├── pal.h
-│   ├── pwm.h
-│   ├── rtc.h
-│   ├── sdc.h
-│   ├── serial.h
-│   ├── serial_usb.h
-│   ├── spi.h
-│   ├── st.h
-│   ├── uart.h
-│   └── usb.h
-├── lib
-│   └── streams
-│   ├── chprintf.c
-│   ├── chprintf.h
-│   ├── memstreams.c
-│   ├── memstreams.h
-│   ├── nullstreams.c
-│   └── nullstreams.h
-├── osal
-│   ├── nil
-│   │   ├── osal.c
-│   │   ├── osal.h
-│   │   └── osal.mk
-│   ├── os-less
-│   │   └── ARMCMx
-│   │   ├── osal.c
-│   │   ├── osal.h
-│   │   └── osal.mk
-│   └── rt
-│   ├── osal.c
-│   ├── osal.h
-│   └── osal.mk
-├── ports
-│   ├── AVR
-│   ├── common
-│   │   └── ARMCMx
-│   │   ├── mpu.h
-│   │   ├── nvic.c
-│   │   └── nvic.h
-│   ├── KINETIS
-│   │   ├── K20x
-│   │   │   ├── hal_lld.c
-│   │   │   ├── hal_lld.h
-│   │   │   ├── kinetis_registry.h
-│   │   │   ├── platform.dox
-│   │   │   ├── platform.mk
-│   │   │   ├── pwm_lld.c
-│   │   │   ├── pwm_lld.h
-│   │   │   ├── spi_lld.c
-│   │   │   └── spi_lld.h
-│   │   ├── KL2x
-│   │   │   ├── hal_lld.c
-│   │   │   ├── hal_lld.h
-│   │   │   ├── kinetis_registry.h
-│   │   │   ├── platform.mk
-│   │   │   ├── pwm_lld.c
-│   │   │   └── pwm_lld.h
-│   │   ├── LLD
-│   │   │   ├── adc_lld.c
-│   │   │   ├── adc_lld.h
-│   │   │   ├── ext_lld.c
-│   │   │   ├── ext_lld.h
-│   │   │   ├── gpt_lld.c
-│   │   │   ├── gpt_lld.h
-│   │   │   ├── i2c_lld.c
-│   │   │   ├── i2c_lld.h
-│   │   │   ├── pal_lld.c
-│   │   │   ├── pal_lld.h
-│   │   │   ├── serial_lld.c
-│   │   │   ├── serial_lld.h
-│   │   │   ├── st_lld.c
-│   │   │   ├── st_lld.h
-│   │   │   ├── usb_lld.c
-│   │   │   └── usb_lld.h
-│   │   └── README.md
-│   ├── LPC
-│   ├── simulator
-│   └── STM32
-├── src
-│   ├── adc.c
-│   ├── can.c
-│   ├── dac.c
-│   ├── ext.c
-│   ├── gpt.c
-│   ├── hal.c
-│   ├── hal_mmcsd.c
-│   ├── hal_queues.c
-│   ├── i2c.c
-│   ├── i2s.c
-│   ├── icu.c
-│   ├── mac.c
-│   ├── mmc_spi.c
-│   ├── pal.c
-│   ├── pwm.c
-│   ├── rtc.c
-│   ├── sdc.c
-│   ├── serial.c
-│   ├── serial_usb.c
-│   ├── spi.c
-│   ├── st.c
-│   ├── uart.c
-│   └── usb.c
-└── templates
- ├── adc_lld.c
- ├── adc_lld.h
- ├── can_lld.c
- ├── can_lld.h
- ├── dac_lld.c
- ├── dac_lld.h
- ├── ext_lld.c
- ├── ext_lld.h
- ├── gpt_lld.c
- ├── gpt_lld.h
- ├── halconf.h
- ├── hal_lld.c
- ├── hal_lld.h
- ├── i2c_lld.c
- ├── i2c_lld.h
- ├── i2s_lld.c
- ├── i2s_lld.h
- ├── icu_lld.c
- ├── icu_lld.h
- ├── mac_lld.c
- ├── mac_lld.h
- ├── mcuconf.h
- ├── osal
- │   ├── osal.c
- │   ├── osal.h
- │   └── osal.mk
- ├── pal_lld.c
- ├── pal_lld.h
- ├── platform.mk
- ├── pwm_lld.c
- ├── pwm_lld.h
- ├── rtc_lld.c
- ├── rtc_lld.h
- ├── sdc_lld.c
- ├── sdc_lld.h
- ├── serial_lld.c
- ├── serial_lld.h
- ├── spi_lld.c
- ├── spi_lld.h
- ├── st_lld.c
- ├── st_lld.h
- ├── uart_lld.c
- ├── uart_lld.h
- ├── usb_lld.c
- └── usb_lld.h
diff --git a/keyboards/infinity60/keymaps/jpetermans/Makefile b/keyboards/infinity60/keymaps/jpetermans/Makefile
index 225e4cad4..df3d1e952 100644
--- a/keyboards/infinity60/keymaps/jpetermans/Makefile
+++ b/keyboards/infinity60/keymaps/jpetermans/Makefile
@@ -1,5 +1,3 @@
-#BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-#BOOTMAGIC_ENABLE = yes
ifndef QUANTUM_DIR
include ../../../../Makefile
diff --git a/keyboards/infinity60/keymaps/jpetermans/keymap.c b/keyboards/infinity60/keymaps/jpetermans/keymap.c
index 6f14b66cb..1afb7c067 100644
--- a/keyboards/infinity60/keymaps/jpetermans/keymap.c
+++ b/keyboards/infinity60/keymaps/jpetermans/keymap.c
@@ -1,6 +1,5 @@
#include "infinity60.h"
#include "led_controller.h"
-#include "keymap_jpetermans.h"
//Helpful Defines
#define _______ KC_TRNS
@@ -12,8 +11,33 @@
#define _MEDIA 3
#define _TILDE 4
+//IS31 chip has 8 available led pages, using 0 for all leds and 7 for single toggles
+#define max_pages 6
+
+enum ic60_keycodes {
+ NUMPAD,
+ FNAV,
+ MEDIA,
+ TILDE,
+ CTLALTDEL,
+ BACKLIGHT,
+ BRIGHT,
+ DIM,
+ BREATH,
+ ALL,
+ GAME,
+ MODE_SINGLE,
+ MODE_PAGE,
+ MODE_FLASH
+};
+
+uint8_t current_layer_global = 0;
+uint8_t led_mode_global = MODE_SINGLE;
+uint8_t backlight_status_global = 1; //init on/off state of backlight
+uint32_t led_layer_state = 0;
+
/* ==================================
- * KEYMAPS
+ * KEYMAPS
* ==================================*/
const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@@ -35,19 +59,10 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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_BSLS,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_BSPC, \
TT(_FNAV), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENT, \
- F(1), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,KC_NO, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,F(TILDE),KC_NO, \
KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,TG(_NUMPAD),MO(_MEDIA), KC_RCTL \
),
- /* F-, arrow, and media keys */
- [_FNAV] = 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_NO,\
- KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
- _______,M(0),KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
- _______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
- _______,_______,_______, _______, F(0),KC_NLCK,_______,_______ \
- ),
-
/* numpad */
[_NUMPAD] = KEYMAP( \
_______,_______,_______,_______,_______,_______,_______, KC_P7, KC_P8, KC_P9, KC_PSLS, _______,_______,_______,KC_NO,\
@@ -57,12 +72,21 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______,_______,_______, MO(_BASE), _______,_______,_______,_______ \
),
+ /* F-, arrow, and media keys */
+ [_FNAV] = 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_NO,\
+ KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
+ _______,M(0),KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
+ _______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
+ _______,_______,_______, _______, F(CTLALTDEL),KC_NLCK,_______,_______ \
+ ),
+
/* media */
[_MEDIA] = KEYMAP( \
- _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\
+ _______,F(MODE_SINGLE),F(MODE_PAGE),F(MODE_FLASH),_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
- _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
- _______,_______,F(2),F(3),F(4),F(5),F(6),F(7), KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO, \
+ _______,_______,_______,_______,_______,F(GAME),_______, _______, _______, _______,_______, _______,_______, \
+ _______,_______,F(ALL) ,F(BRIGHT),F(DIM),F(BACKLIGHT),_______, _______, KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO, \
_______,_______,_______, KC_MPLY, _______,_______, _______,_______ \
),
/* ~ */
@@ -91,21 +115,20 @@ enum function_id {
enum macro_id {
ACTION_LEDS_ALL,
ACTION_LEDS_GAME,
- ACTION_LEDS_NAV,
- ACTION_LEDS_MEDIA,
- ACTION_LEDS_NUMPAD,
- ACTION_LEDS_TEST
+ ACTION_LEDS_BACKLIGHT,
+ ACTION_LEDS_BRIGHT,
+ ACTION_LEDS_DIM,
+ ACTION_LEDS_BREATH,
+ ACTION_LEDS_SINGLE,
+ ACTION_LEDS_PAGE,
+ ACTION_LEDS_FLASH,
};
-
+
/* ==================================
- * LED MAPPING
+ * LED MAPPING
* ==================================*/
/*
- Configuring led control can be done as
- 1. full keyboard at a time - define led array, or
- 2. individual led - send specific led address (defined in keymap.h)
-
Infinity60 LED MAP
11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
28 31 32 33 34 35 36 37 38 41 42 43 44 45
@@ -113,163 +136,182 @@ enum macro_id {
63 64 65 66 67 68 71 72 73 74 75 76 77*
78 81 82 83 84 85 86 87
*Unused in Alphabet Layout
-
- The full keyboard arrays map to the mcu's LED pages
- (8 available) desribed in led_controller.c
-
- 0x24 (pcb row 1) is first byte of PWM portion of LED page
- 0x34 (pcb row 2) is 17th byte of PWM portion of LED page
- array translates to row and column positions
*/
-//LED Layer indicator (1 per layer 3-7)
-const uint8_t led_single_layer[5] = {
- 12,13,14,15,16
-};
-//LED Page 1 - All off
-//LED Page 2 - All on
-//LED Page 3 - _Nav
-const uint8_t led_nav[33] = {
- 11,12,13,14,15,16,17,18,21,22,23,24,25,
- 28, 37,38,41,42,45,
- 46,47,48, 54,55,56,57,58,
- 64,65,66, 71,
- 84,85
-};
-//LED Page 4 - _Numpad
-const uint8_t led_numpad[17] = {
+//======== full page arrays =========
+//LED Page 1 - _Numpad
+//any change in array size needs to be mirrored in matrix_init_user
+uint8_t led_numpad[16] = {
18,21,22,23,
37,38,41,42,
55,56,57,58,
- 72,73,74,75,
- 85
+ 72,73,74,75
};
-//LED Page 5 - _Media
-const uint8_t led_media[12] = {
- 23,24,25,
- 38,
- 55,56,57,
- 73,74,75,
- 83, 86
+//LED Page 2 - _Nav
+uint8_t led_nav[12] = {
+ 38,
+ 47,48, 55,56,57,
+ 64,65,66
};
-//LED Page 6 - _Game
-const uint8_t led_game[5] = {
- //row 1
+//LED Page 3 - _Media
+uint8_t led_media[15] = {
+ 12,13,14, 23,24,25,
+ 65,66,67,68, 73,74,75,
+ 83, 86
+};
+//LED Page 4 - _Game "WASD"
+uint8_t led_game[5] = {
11,
- //row 2
- //row 3
- 32,
- //row 4
- 47, 48,
- //row 5
- 51
- //row 6
- //row 7
- //row 8
+ 32,
+ 47,48,51
};
+//======== qmk functions =========
const uint16_t fn_actions[] = {
- [0] = ACTION_KEY(LALT(LCTL(KC_DEL))),
- [1] = ACTION_LAYER_MODS(_TILDE, MOD_LSFT),
- [2] = ACTION_FUNCTION(ACTION_LEDS_ALL),
- [3] = ACTION_FUNCTION(ACTION_LEDS_GAME),
- [4] = ACTION_FUNCTION(ACTION_LEDS_MEDIA),
- [5] = ACTION_FUNCTION(ACTION_LEDS_NAV),
- [6] = ACTION_FUNCTION(ACTION_LEDS_NUMPAD),
- [7] = ACTION_FUNCTION(ACTION_LEDS_TEST)
-
-
+ [CTLALTDEL] = ACTION_KEY(LALT(LCTL(KC_DEL))),
+ [TILDE] = ACTION_LAYER_MODS(_TILDE, MOD_LSFT),
+ [ALL] = ACTION_FUNCTION(ACTION_LEDS_ALL),
+ [GAME] = ACTION_FUNCTION(ACTION_LEDS_GAME),
+ [BACKLIGHT] = ACTION_FUNCTION(ACTION_LEDS_BACKLIGHT),
+ [BRIGHT] = ACTION_FUNCTION(ACTION_LEDS_BRIGHT),
+ [DIM] = ACTION_FUNCTION(ACTION_LEDS_DIM),
+ [BREATH] = ACTION_FUNCTION(ACTION_LEDS_BREATH),
+ [MODE_SINGLE] = ACTION_FUNCTION(ACTION_LEDS_SINGLE),
+ [MODE_PAGE] = ACTION_FUNCTION(ACTION_LEDS_PAGE),
+ [MODE_FLASH] = ACTION_FUNCTION(ACTION_LEDS_FLASH),
};
/* custom action function */
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
- (void)opt;
msg_t msg;
+
switch(id) {
case ACTION_LEDS_ALL:
if(record->event.pressed) {
- // signal the LED controller thread
+ led_mode_global = led_mode_global == ALL ? MODE_SINGLE : ALL;
msg=(TOGGLE_ALL << 8) | 0;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
- case ACTION_LEDS_GAME:
+
+ case ACTION_LEDS_BACKLIGHT:
if(record->event.pressed) {
- // signal the LED controller thread
- msg=(TOGGLE_LAYER_LEDS << 8) | 6;
+ backlight_status_global ^= 1;
+ msg=(TOGGLE_BACKLIGHT << 8) | (backlight_status_global);
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
- case ACTION_LEDS_MEDIA:
+
+ case ACTION_LEDS_GAME:
if(record->event.pressed) {
- // signal the LED controller thread
- msg=(TOGGLE_LAYER_LEDS << 8) | 5;
+ led_mode_global = led_mode_global == GAME ? MODE_SINGLE : GAME;
+
+ msg=(DISPLAY_PAGE << 8) | 4;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
- case ACTION_LEDS_NAV:
+
+ case ACTION_LEDS_BRIGHT:
if(record->event.pressed) {
- // signal the LED controller thread
- msg=(OFF_LED << 8) | 12;
+ msg=(STEP_BRIGHTNESS << 8) | 1;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
- case ACTION_LEDS_NUMPAD:
+
+ case ACTION_LEDS_DIM:
if(record->event.pressed) {
- // signal the LED controller thread
- msg=(ON_LED << 8) | 12;
+ msg=(STEP_BRIGHTNESS << 8) | 0;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
- case ACTION_LEDS_TEST:
+
+ case ACTION_LEDS_BREATH:
if(record->event.pressed) {
- // signal the LED controller thread
- msg=(TOGGLE_LED << 8) | 12;
+ msg=(TOGGLE_BREATH << 8) | 0;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
+
+ //set led_mode for matrix_scan to toggle leds
+ case ACTION_LEDS_SINGLE:
+ led_mode_global = MODE_SINGLE;
+ break;
+ case ACTION_LEDS_PAGE:
+ led_mode_global = MODE_PAGE;
+ break;
+ case ACTION_LEDS_FLASH:
+ led_mode_global = MODE_FLASH;
+ break;
+
}
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
- switch(id) {
- case 0:
- if (record->event.pressed) {
- }
- break;
- case 1:
- if (record->event.pressed) {
- }
- break;
- }
return MACRO_NONE;
};
+bool process_record_user (uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
xprintf("init start");
led_controller_init();
-//TODO: do pages need to be written at init or ok on demand?
-/* Write pages */
- write_led_page(3, led_nav, 33);
- chThdSleepMilliseconds(5);
+ // Write predefined led pages.
+ write_led_page(_NUMPAD, led_numpad, 16);
+ chThdSleepMilliseconds(10);
- write_led_page(4, led_numpad, 17);
- chThdSleepMilliseconds(5);
+ write_led_page(_FNAV, led_nav, 12);
+ chThdSleepMilliseconds(10);
- write_led_page(5, led_media, 12);
- chThdSleepMilliseconds(5);
+ write_led_page(_MEDIA, led_media, 15);
+ chThdSleepMilliseconds(10);
- write_led_page(6, led_game, 5);
- chThdSleepMilliseconds(5);
+ write_led_page(4, led_game, 5);
+ chThdSleepMilliseconds(1000);
};
-// Runs constantly in the background, in a loop.
+// Loops constantly in the background.
void matrix_scan_user(void) {
+ uint8_t page;
+ uint8_t led_pin_byte;
+ msg_t msg;
-};
+ if (backlight_status_global == 0) {//backlight is off, skip the rest
+ return;
+ }
+
+ if (led_layer_state != layer_state && led_mode_global != GAME && led_mode_global != ALL) {
+ //check mode
+ //Turn on layer indicator or page depending on mode
+ switch(led_mode_global) {
+ case MODE_FLASH: //flash preset page leds then single indicator
+ page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
+ msg=(DISPLAY_PAGE << 8) | (page);
+ chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
+ chThdSleepMilliseconds(500);
+ //flow to display single layer leds
+
+ case MODE_SINGLE: //light layer indicators for all active layers
+ led_pin_byte = layer_state & 0xFF;
+ msg=(DISPLAY_PAGE << 8) | 7;
+ chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
+ msg=(1<<16) | (SET_FULL_ROW << 8) | (led_pin_byte);
+ chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
+ break;
+
+ case MODE_PAGE: //display pre-defined led page
+ page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
+ msg=(DISPLAY_PAGE << 8) | (page);
+ chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
+ break;
+ }
+ led_layer_state = layer_state;
+ }
+}
diff --git a/keyboards/infinity60/keymaps/jpetermans/keymap_jpetermans.h b/keyboards/infinity60/keymaps/jpetermans/keymap_jpetermans.h
deleted file mode 100644
index 240374423..000000000
--- a/keyboards/infinity60/keymaps/jpetermans/keymap_jpetermans.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* LED layout mainly based on default Standard configuration
- * ,-----------------------------------------------------------.
- * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ | ` |
- * |-----------------------------------------------------------|
- * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bksp|
- * |-----------------------------------------------------------|
- * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter |
- * |-----------------------------------------------------------|
- * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn0|
- * |-----------------------------------------------------------'
- * | LCtl|LGui|LAlt | Space | RAlt|RGui|RMenu|RCtl|
- * `-----------------------------------------------------------'
-*/
-
-
-#define ADDR_LED_ESC 0x24
-#define ADDR_LED_1 0x25
-#define ADDR_LED_2 0x26
-#define ADDR_LED_3 0x27
-#define ADDR_LED_4 0x28
-#define ADDR_LED_5 0x29
-#define ADDR_LED_6 0x2A
-#define ADDR_LED_7 0x2B
-#define ADDR_LED_8 0x34
-#define ADDR_LED_9 0x35
-#define ADDR_LED_0 0x36
-#define ADDR_LED_MINS 0x37
-#define ADDR_LED_EQL 0x38
-#define ADDR_LED_BSLS 0x39
-//#define ADDR_LED_GRV 0x3A //not used by Alphabet layout
-#define ADDR_LED_TAB 0x3B
-#define ADDR_LED_Q 0x44
-#define ADDR_LED_W 0x45
-#define ADDR_LED_E 0x46
-#define ADDR_LED_R 0x47
-#define ADDR_LED_T 0x48
-#define ADDR_LED_Y 0x49
-#define ADDR_LED_U 0x4A
-#define ADDR_LED_I 0x4B
-#define ADDR_LED_O 0x54
-#define ADDR_LED_P 0x55
-#define ADDR_LED_LBRC 0x56
-#define ADDR_LED_RBRC 0x57
-#define ADDR_LED_BSPC 0x58
-#define ADDR_LED_CAPS 0x59
-#define ADDR_LED_A 0x5A
-#define ADDR_LED_S 0x5B
-#define ADDR_LED_D 0x64
-#define ADDR_LED_F 0x65
-#define ADDR_LED_G 0x66
-#define ADDR_LED_H 0x67
-#define ADDR_LED_J 0x68
-#define ADDR_LED_K 0x69
-#define ADDR_LED_L 0x6A
-#define ADDR_LED_SCLN 0x6B
-#define ADDR_LED_QUOT 0x74
-#define ADDR_LED_ENT 0x75
-#define ADDR_LED_LSFT 0x76
-#define ADDR_LED_Z 0x77
-#define ADDR_LED_X 0x78
-#define ADDR_LED_C 0x79
-#define ADDR_LED_V 0x7A
-#define ADDR_LED_B 0x7B
-#define ADDR_LED_N 0x84
-#define ADDR_LED_M 0x85
-#define ADDR_LED_COMM 0x86
-#define ADDR_LED_DOT 0x87
-#define ADDR_LED_SLSH 0x88
-#define ADDR_LED_RSFT 0x89
-//#define ADDR_LED_FN0 0x8A //not used by Alphabet layout
-#define ADDR_LED_LCTL 0x8B
-#define ADDR_LED_LGUI 0x94
-#define ADDR_LED_LALT 0x95
-#define ADDR_LED_SPC 0x96
-#define ADDR_LED_RALT 0x97
-#define ADDR_LED_RGUI 0x98
-#define ADDR_LED_MENU 0x99
-#define ADDR_LED_RCTL 0x9A
diff --git a/keyboards/infinity60/keymaps/jpetermans/readme.md b/keyboards/infinity60/keymaps/jpetermans/readme.md
new file mode 100644
index 000000000..9c5b89173
--- /dev/null
+++ b/keyboards/infinity60/keymaps/jpetermans/readme.md
@@ -0,0 +1,79 @@
+Backlight for Infinity60
+========================
+
+## Led Controller Specs
+
+The Infinity60 pcb uses the IS31FL3731C matrix LED driver from ISSI [datasheet](http://www.issi.com/WW/pdf/31FL3731C.pdf). The IS31 has the ability to control two led matrices (A & B), each matrix controlling 9 pins, each pin controlling 8 leds. The Infinity only utilizes matrix A.
+
+Infinity60 LED MAP:
+digits mean "row" and "col", i.e. 45 means C4-5 in the IS31 datasheet, matrix A
+```c
+ 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
+ 28 31 32 33 34 35 36 37 38 41 42 43 44 45
+ 46 47 48 51 52 53 54 55 56 57 58 61 62
+ 63 64 65 66 67 68 71 72 73 74 75 76 77*
+ 78 81 82 83 84 85 86 87
+```
+*Unused in Alphabet Layout
+
+The IS31 includes 8 pages (or frames) 0-7 and each page consists of 0xB4 (144) bytes
+- **0 - 17** LED control (on/off). 18 pins which alternate between A and B matrices (CA1, CB1, CA2, CB2, ..). Each byte controls the 8 leds on that pin with bits (8 to 1).
+- **18 - 35** Blink control. Same as LED control above, but sets blink on/off.
+- **36 - 143** PWM control. One byte per LED, sets PWM from 0 to 255. Same as above, the register alternates bytes between the A & B matrices.
+
+## Led Controller Code
+led_controller.c sets up ability to write led layers at startup or control leds on demand as part of fn_actions. By default led_controller.c assumes page 0 will be used for full on/off and page 7 for controlling individual leds. The remaining 6 pages (1-6) are free to preset led maps at init or on demand. Communication with the IS31 is primarily done through the led_mailbox using chMBPost described further below under "Sending messages in Keymap.c"
+
+One function is available to directly control leds:
+```
+write_led_page(page#, array of leds by address, # of leds in array)
+```
+This function saves a full page using a supplied array of led locations such as:
+```
+uint8_t led_numpad[16] = {
+ 18,21,22,23,
+ 37,38,41,42,
+ 55,56,57,58,
+ 72,73,74,75
+}
+write_led_page(5, led_numpad, 16);
+```
+
+Remaining led control is done through the led mailbox using these message types.
+- **SET_FULL_ROW** - 3 bytes: row#, message type, 8-bit mask. Sets all leds on one pin per the bit mask.
+- **OFF_LED** - 2 bytes: message type, led address. Turn off specific led.
+- **ON_LED** - 2 bytes: message type, led address. Turn on specific led.
+- **TOGGLE_LED** - 2 bytes: message type, led address. Toggle specific led on/off.
+- **BLINK_OFF_LED** - 2 bytes: message type, led address. Set blink off for specific led.
+- **BLINK_ON_LED** - 2 bytes: message type, led address. Set blink on for specific led.
+- **BLINK_TOGGLE_LED** - 2 bytes: message type, led address. Toggle blink for specific led.
+- **TOGGLE_ALL** - 2 bytes: message type, not used. Turn on/off full backlight.
+- **TOGGLE_BACKLIGHT** - 2 bytes: message type, on/off. Sets backlight completely off, no leds will display.
+- **DISPLAY_PAGE** - 2 bytes: message type, page to display. Switch to specific pre-set page.
+- **RESET_PAGE** - 2 bytes: message type, page to reset. Reset/erase specific page.
+- **TOGGLE_NUM_LOCK** - 2 bytes: message type, on/off (NUM_LOCK_LED_ADDRESS). Toggle numlock on/off. Usually run with the `set_leds` function to check state of numlock or capslock. If all leds are on (e.i. TOGGLE_ALL) then this sets numlock to blink instead (this is still a little buggy if toggling on/off quickly).
+- **TOGGLE_CAPS_LOCK** - 2 bytes: message type, on/off (CAPS_LOCK_LED_ADDRESS). Same as numlock.
+- **STEP_BRIGHTNESS** - 2 bytes: message type, and step up (1) or step down (0). Increase or decrease led brightness.
+
+## Sending messages in Keymap.c
+Sending an action to the led mailbox is done using chMBPost with the following form.
+```
+chMBPost(&led_mailbox, message, timeout);
+```
+- &led_mailbox - pointer to led mailbox
+- message - up to 4 bytes but most messages use only 2. First byte (LSB) is the message to process, the second byte is type. The third is only used to pass row information in SET_FULL_ROW. The fourth byte is currently unused.
+-timeout is usually TIME_IMMEDIATE
+
+An example:
+1. set the message to be sent. First byte (LSB) is the led address, and second is the message type
+`msg=(ON_LED << 8) | 42;`
+2. send msg to the led mailbox
+`chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);`
+
+Another:
+`msg=(BLINK_TOGGLE_LED << 8) | 46;`
+`chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);`
+
+Finally, SET_FULL_ROW requires an extra byte with row information in the message so sending this message looks like:
+`msg=(row<<16) | (SET_FULL_ROW << 8) | (led_pin_byte);`
+`chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);`
diff --git a/keyboards/infinity60/led.c b/keyboards/infinity60/led.c
index 92069dc59..d60c76fd8 100644
--- a/keyboards/infinity60/led.c
+++ b/keyboards/infinity60/led.c
@@ -29,26 +29,22 @@ void led_set(uint8_t usb_led) {
msg_t msg;
if (usb_led & (1<<USB_LED_NUM_LOCK)) {
- // signal the LED control thread
chSysUnconditionalLock();
msg=(TOGGLE_NUM_LOCK << 8) | 1;
chMBPostI(&led_mailbox, msg);
chSysUnconditionalUnlock();
} else {
- // signal the LED control thread
chSysUnconditionalLock();
msg=(TOGGLE_NUM_LOCK << 8) | 0;
chMBPostI(&led_mailbox, msg);
chSysUnconditionalUnlock();
}
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
- // signal the LED control thread
chSysUnconditionalLock();
msg=(TOGGLE_CAPS_LOCK << 8) | 1;
chMBPostI(&led_mailbox, msg);
chSysUnconditionalUnlock();
} else {
- // signal the LED control thread
chSysUnconditionalLock();
msg=(TOGGLE_CAPS_LOCK << 8) | 0;
chMBPostI(&led_mailbox, msg);
diff --git a/keyboards/infinity60/led_controller.c b/keyboards/infinity60/led_controller.c
index 75806d54b..d4ad0559b 100644
--- a/keyboards/infinity60/led_controller.c
+++ b/keyboards/infinity60/led_controller.c
@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/*
* LED controller code
- * WF uses IS31FL3731C matrix LED driver from ISSI
+ * IS31FL3731C matrix LED driver from ISSI
* datasheet: http://www.issi.com/WW/pdf/31FL3731C.pdf
*/
@@ -56,9 +56,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
order same as above (CA 1st row (8bytes), CB 1st row (8bytes), ...)
*/
-/* Which LED should be used for CAPS LOCK indicator
- * The usual Caps Lock position is C4-6, so the address is
- * 0x24 + (4-1)*0x10 + (8-1) = 0x59 */
+// Which LED should be used for CAPS LOCK indicator
#if !defined(CAPS_LOCK_LED_ADDRESS)
#define CAPS_LOCK_LED_ADDRESS 46
#endif
@@ -72,8 +70,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define BREATHE_LED_ADDRESS CAPS_LOCK_LED_ADDRESS
#endif
-#define DEBUG_ENABLED 0
-
/* =================
* ChibiOS I2C setup
* ================= */
@@ -92,7 +88,6 @@ uint8_t rx[1] __attribute__((aligned(2)));
uint8_t full_page[0xB4+1] = {0};
// LED mask (which LEDs are present, selected by bits)
-// See page comment above, control alternates CA matrix/CB matrix
// IC60 pcb uses only CA matrix.
// Each byte is a control pin for 8 leds ordered 8-1
const uint8_t all_on_leds_mask[0x12] = {
@@ -145,7 +140,6 @@ void is31_init(void) {
__builtin_memset(full_page,0,0xB4+1);
// zero function page, all registers (assuming full_page is all zeroes)
is31_write_data(IS31_FUNCTIONREG, full_page, 0xD + 1);
- // disable hardware shutdown
palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL);
palSetPad(GPIOB, 16);
chThdSleepMilliseconds(10);
@@ -182,14 +176,9 @@ static THD_FUNCTION(LEDthread, arg) {
uint8_t pwm_step_status, page_status;
//mailbox variables
- uint8_t temp, msg_type, msg_led;
+ uint8_t temp, msg_type, msg_pin, msg_col, msg_led;
msg_t msg;
-/* //control register variables
- uint8_t page, save_page, save_breath1, save_breath2;
- msg_t msg, retval;
-*/
-
// initialize persistent variables
pwm_step_status = 4; //full brightness
page_status = 0; //start frame 0 (all off/on)
@@ -199,82 +188,71 @@ page_status = 0; //start frame 0 (all off/on)
// (messages are queued (up to LED_MAILBOX_NUM_MSGS) if they can't
// be processed right away)
chMBFetch(&led_mailbox, &msg, TIME_INFINITE);
- msg_type = (msg >> 8) & 0xFF; //first byte is msg type
- msg_led = (msg) & 0xFF; //second byte is action information
-
- xprintf("--------------------\n");
- chThdSleepMilliseconds(10);
- xprintf("mailbox fetch\nmsg: %X\n", msg);
- chThdSleepMilliseconds(10);
- xprintf("type: %X - led: %X\n", msg_type, msg_led);
- chThdSleepMilliseconds(10);
+ msg_col = (msg >> 24) & 0xFF;//if needed
+ msg_pin = (msg >> 16) & 0XFF;//if needed (e.g. SET_FULL_ROW)
+ msg_type = (msg >> 8) & 0xFF; //second byte is msg type
+ msg_led = (msg) & 0xFF; //first byte is action information
switch (msg_type){
- case KEY_LIGHT:
- //TODO: lighting key led on keypress
+ case SET_FULL_ROW:
+ //write full byte to pin address, msg_pin = pin #, msg_led = byte to write
+ //writes only to current page
+ write_led_byte(page_status,msg_pin,msg_led);
break;
-
- //TODO: custom page that is written using keypresses
- //TODO: BLINK_ON/OFF_LED
case OFF_LED:
//on/off/toggle single led, msg_led = row/col of led
- xprintf("OFF_LED\n");
- chThdSleepMilliseconds(10);
set_led_bit(7, control_register_word, msg_led, 0);
is31_write_data (7, control_register_word, 0x02);
break;
-
case ON_LED:
- xprintf("ON_LED\n");
- chThdSleepMilliseconds(10);
set_led_bit(7, control_register_word, msg_led, 1);
is31_write_data (7, control_register_word, 0x02);
break;
-
case TOGGLE_LED:
- xprintf("TOGGLE_LED\n");
- chThdSleepMilliseconds(10);
set_led_bit(7, control_register_word, msg_led, 2);
is31_write_data (7, control_register_word, 0x02);
break;
+ case BLINK_OFF_LED:
+ //on/off/toggle single led, msg_led = row/col of led
+ set_led_bit(7, control_register_word, msg_led, 4);
+ is31_write_data (7, control_register_word, 0x02);
+ break;
+ case BLINK_ON_LED:
+ set_led_bit(7, control_register_word, msg_led, 5);
+ is31_write_data (7, control_register_word, 0x02);
+ break;
+ case BLINK_TOGGLE_LED:
+ set_led_bit(7, control_register_word, msg_led, 6);
+ is31_write_data (7, control_register_word, 0x02);
+ break;
+
case TOGGLE_ALL:
- xprintf("TOGGLE_ALL\n");
- chThdSleepMilliseconds(10);
//msg_led = unused
- is31_read_register(0, 0x00, &temp);//if first byte is on, then toggle frame 0 off
+ is31_read_register(0, 0x00, &temp);
led_control_reg[0] = 0;
+
+ //if first byte is on, then toggle frame 0 off
if (temp==0 || page_status > 0) {
- xprintf("all leds on");
- chThdSleepMilliseconds(10);
__builtin_memcpy(led_control_reg+1, all_on_leds_mask, 0x12);
} else {
- xprintf("all leds off");
- chThdSleepMilliseconds(10);
__builtin_memset(led_control_reg+1, 0, 0x12);
}
is31_write_data(0, led_control_reg, 0x13);
if (page_status > 0) {
is31_write_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, 0);
- }
- //maintain lock leds
- if (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) {
- set_lock_leds(NUM_LOCK_LED_ADDRESS, 1);
- }
- if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {
- set_lock_leds(CAPS_LOCK_LED_ADDRESS, 1);
- }
+ page_status=0;
- page_status=0;
+ //maintain lock leds
+ led_set(host_keyboard_leds());
+ }
break;
case TOGGLE_BACKLIGHT:
//msg_led = on/off
- xprintf("TOGGLE_BACKLIGHT\n");
- chThdSleepMilliseconds(10);
//populate the 9 byte rows to be written to each pin, first byte is register (pin) address
if (msg_led == 1) {
@@ -290,132 +268,63 @@ page_status = 0; //start frame 0 (all off/on)
}
break;
- case DISPLAY_PAGE://show single layer indicator or full map of layer
- //msg_led = page to toggle on
- xprintf("DISPLAY_PAGE\n");
- chThdSleepMilliseconds(10);
+ case DISPLAY_PAGE:
+ //msg_led = page to toggle on
if (page_status != msg_led) {
is31_write_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, msg_led);
+ page_status = msg_led;
+
+ //maintain lock leds
+ led_set(host_keyboard_leds());
}
- page_status = msg_led;
break;
case RESET_PAGE:
- //led_msg = page to reset
+ //led_msg = page to reset
led_control_reg[0] = 0;
__builtin_memset(led_control_reg+1, 0, 0x12);
is31_write_data(msg_led, led_control_reg, 0x13);
-
- //maintain lock leds
- if (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) {
- set_lock_leds(NUM_LOCK_LED_ADDRESS, 1);
- }
- if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {
- set_lock_leds(CAPS_LOCK_LED_ADDRESS, 1);
- }
break;
case TOGGLE_NUM_LOCK:
- //msg_led = 0 or 1, off/on
- set_lock_leds(NUM_LOCK_LED_ADDRESS, 1);
+ //msg_led = 0 or 1, off/on
+ set_lock_leds(NUM_LOCK_LED_ADDRESS, msg_led, page_status);
break;
-
case TOGGLE_CAPS_LOCK:
- //msg_led = 0 or 1, off/on
- set_lock_leds(CAPS_LOCK_LED_ADDRESS, 1);
+ //msg_led = 0 or 1, off/on
+ set_lock_leds(CAPS_LOCK_LED_ADDRESS, msg_led, page_status);
break;
- //TODO: MODE_BREATH
- case MODE_BREATH:
- break;
case STEP_BRIGHTNESS:
- xprintf("TOGGLE_BACKLIGHT\n");
- chThdSleepMilliseconds(10);
- //led_msg = step pwm up or down
- switch (msg_led) {
- case 0:
- if (pwm_step_status == 0) {
- pwm_step_status = 4;
- } else {
- pwm_step_status--;
- }
- break;
-
- case 1:
- if (pwm_step_status == 4) {
- pwm_step_status = 0;
- } else {
- pwm_step_status++;
- }
- break;
- }
-
- //populate 8 byte rows to write on each pin
- //first byte is register address, every 0x10 9 bytes are A-register pwm pins
- __builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8);
-
- for(i=0; i<8; i++) {
- pwm_register_array[0] = 0x24 + (i * 0x10);
- is31_write_data(0,pwm_register_array,9);
- }
- break;
+ //led_msg = step pwm up or down
+ switch (msg_led) {
+ case 0:
+ if (pwm_step_status == 0) {
+ pwm_step_status = 4;
+ } else {
+ pwm_step_status--;
+ }
+ break;
+
+ case 1:
+ if (pwm_step_status == 4) {
+ pwm_step_status = 0;
+ } else {
+ pwm_step_status++;
+ }
+ break;
+ }
-/* case LED_MSG_SLEEP_LED_ON:
- // save current settings
- is31_read_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, &save_page);
- is31_read_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL1, &save_breath1);
- is31_read_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL2, &save_breath2);
- // use pages 7 and 8 for (hardware) breathing (assuming they're empty)
- is31_write_register(6, BREATHE_LED_ADDRESS, 0xFF);
- is31_write_register(7, BREATHE_LED_ADDRESS, 0x00);
- is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL1, (6<<4)|6);
- is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL2, IS31_REG_BREATHCTRL2_ENABLE|3);
- retval = MSG_TIMEOUT;
- temp = 6;
- while(retval == MSG_TIMEOUT) {
- // switch to the other page
- is31_write_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, temp);
- temp = (temp == 6 ? 7 : 6);
- // the times should be sufficiently long for IS31 to finish switching pages
- retval = chMBFetch(&led_mailbox, &msg, MS2ST(temp == 6 ? 4000 : 6000));
+ //populate 8 byte rows to write on each pin
+ //first byte is register address, every 0x10 9 bytes are A-register pwm pins
+ __builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8);
+
+ for(i=0; i<8; i++) {
+ pwm_register_array[0] = 0x24 + (i * 0x10);
+ is31_write_data(0,pwm_register_array,9);
}
- // received a message (should be a wakeup), so restore previous state
- chThdSleepMilliseconds(3000); // need to wait until the page change finishes
- // note: any other messages are queued
- is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL1, save_breath1);
- is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL2, save_breath2);
- is31_write_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, save_page);
- break;
- case LED_MSG_SLEEP_LED_OFF:
- // should not get here; wakeup should be received in the branch above break;
break;
-*/
- xprintf("--------------------\n");
- chThdSleepMilliseconds(10);
}
-#if DEBUG_ENABLED
- uint8_t j, page;
- //debugging code - print full led/blink/pwm registers on each frame
- xprintf("----layer state----: %X\n", layer_state);
- for(i=0;i<8;i++) {
- xprintf("page: %d", i);
- chThdSleepMilliseconds(2);
- for(j=0;j<0xB4;j++){
- is31_read_register(i,j,&temp);
- chThdSleepMilliseconds(2);
- xprintf("%02X, ", temp);
- if(j % 9 == 0){
- xprintf("\n");
- if(j % 18 ==0){
- xprintf("register");
- xprintf("\n");
- }
- }
- chThdSleepMilliseconds(1);
- }
- xprintf("\n");
- }
-#endif
}
}
@@ -424,22 +333,28 @@ page_status = 0; //start frame 0 (all off/on)
* ============================== */
void set_led_bit (uint8_t page, uint8_t *led_control_reg, uint8_t led_addr, uint8_t action) {
- //returns 2 bytes led control register address and byte to write
+ //returns 2 bytes: led control register address and byte to write
+ //0 - bit off, 1 - bit on, 2 - toggle bit
+
+ uint8_t control_reg_addr, column_bit, column_byte, bit_temp, blink_on;
- uint8_t control_reg_addr, column_bit, column_byte, temp;
//check for valid led address
- if (led_addr < 0 || led_addr > 90 || led_addr % 10 > 8) {
- xprintf("Invalid address: %d\n", led_addr);
+ if (led_addr < 0 || led_addr > 87 || led_addr % 10 > 8) {
return;
}
+ //check for blink bit
+ blink_on = action>>2;
+ action &= ~(1<<2); //strip blink bit
+
//first byte is led control register address 0x00
//msg_led tens column is pin#, ones column is bit position in 8-bit mask
control_reg_addr = ((led_addr / 10) % 10 - 1 ) * 0x02;// A-register is every other byte
- column_bit = 1<<(led_addr % 10 - 1);
+ control_reg_addr += blink_on == 1 ? 0x12 : 0x00;//shift 12 bytes to blink register
- is31_read_register(page, control_reg_addr, &temp);//maintain status of leds on this byte
- column_byte = temp;
+ is31_read_register(page, control_reg_addr, &bit_temp);//maintain status of leds on this byte
+ column_bit = 1<<(led_addr % 10 - 1);
+ column_byte = bit_temp;
switch(action) {
case 0:
@@ -458,39 +373,47 @@ void set_led_bit (uint8_t page, uint8_t *led_control_reg, uint8_t led_addr, uint
led_control_reg[1] = column_byte;
}
-void set_lock_leds(uint8_t led_addr, uint8_t led_action) {
- uint8_t page;
- uint8_t led_control_word[2] = {0};
-
- //ignore frame0 if all leds are on or if option set in led_controller.h
- //TODO: blink of all leds are on, clear blink register if not
- //is31_read_register(0, 0x00, &temp);
- //led_addr += temp == 0 ? 0 : 0x12;//send bit to blink register instead
- //start = BACKLIGHT_OFF_LOCK_LED_OFF ? 1 : 0;
+void write_led_byte (uint8_t page, uint8_t row, uint8_t led_byte) {
+ uint8_t led_control_word[2] = {0};//register address and on/off byte
- for(page=0; page<8; page++) {
- set_led_bit(page,led_control_word,led_addr,led_action);
- is31_write_data(page, led_control_word, 0x02);
- }
+ led_control_word[0] = (row - 1 ) * 0x02;// A-register is every other byte
+ led_control_word[1] = led_byte;
+ is31_write_data(page, led_control_word, 0x02);
}
void write_led_page (uint8_t page, uint8_t *user_led_array, uint8_t led_count) {
uint8_t i;
- uint8_t row, col;
- uint8_t led_control_register[0x13] = {0};//led control register start address + 0x12 bytes
+ uint8_t pin, col;
+ uint8_t led_control_register[0x13] = {0};
__builtin_memset(led_control_register,0,13);
for(i=0;i<led_count;i++){
- row = ((user_led_array[i] / 10) % 10 - 1 ) * 2 + 1;// 1 byte shift for led register 0x00 address
+ // 1 byte shift for led register 0x00 address
+ pin = ((user_led_array[i] / 10) % 10 - 1 ) * 2 + 1;
col = user_led_array[i] % 10 - 1;
-
- led_control_register[row] |= 1<<(col);
+ led_control_register[pin] |= 1<<(col);
}
is31_write_data(page, led_control_register, 0x13);
}
+void set_lock_leds(uint8_t led_addr, uint8_t led_action, uint8_t page) {
+ uint8_t lock_temp;
+ uint8_t led_control_word[2] = {0};
+
+ //blink if all leds are on
+ if (page == 0) {
+ is31_read_register(0, 0x00, &lock_temp);
+ if (lock_temp == 0xFF) {
+ led_action |= (1<<2); //set blink bit
+ }
+ }
+
+ set_led_bit(page,led_control_word,led_addr,led_action);
+ is31_write_data(page, led_control_word, 0x02);
+}
+
/* =====================
* hook into user keymap
* ===================== */
@@ -513,10 +436,11 @@ void led_controller_init(void) {
/* initialise IS31 chip */
is31_init();
- //set Display Option Register so all pwm intensity is controlled from Frame 0
- is31_write_register(IS31_FUNCTIONREG, IS31_REG_DISPLAYOPT, IS31_REG_DISPLAYOPT_INTENSITY_SAME);
+ //set Display Option Register so all pwm intensity is controlled from page 0
+ //enable blink and set blink period to 0.27s x rate
+ is31_write_register(IS31_FUNCTIONREG, IS31_REG_DISPLAYOPT, IS31_REG_DISPLAYOPT_INTENSITY_SAME + IS31_REG_DISPLAYOPT_BLINK_ENABLE + 4);
- /* set full pwm on Frame 1 */
+ /* set full pwm on page 1 */
pwm_register_array[0] = 0;
__builtin_memset(pwm_register_array+1, 0xFF, 8);
for(i=0; i<8; i++) {
@@ -530,39 +454,8 @@ void led_controller_init(void) {
is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL1, (3<<4)|3);
is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL2, IS31_REG_BREATHCTRL2_ENABLE|3);
- // clean up the lock LEDs
- set_lock_leds(NUM_LOCK_LED_ADDRESS, 0);
- set_lock_leds(CAPS_LOCK_LED_ADDRESS, 0);
-
/* more time consuming LED processing should be offloaded into
* a thread, with asynchronous messaging. */
chMBObjectInit(&led_mailbox, led_mailbox_queue, LED_MAILBOX_NUM_MSGS);
chThdCreateStatic(waLEDthread, sizeof(waLEDthread), LOWPRIO, LEDthread, NULL);
}
-
-//TODO: Don't know equivalent QMK hooks for these
-//
-//void hook_usb_suspend_entry(void) {
-//#ifdef SLEEP_LED_ENABLE
-// chSysLockFromISR();
-// chMBPostI(&led_mailbox, LED_MSG_SLEEP_LED_ON);
-// chSysUnlockFromISR();
-//#endif /* SLEEP_LED_ENABLE */
-//}
-//
-//void hook_usb_suspend_loop(void) {
-// chThdSleepMilliseconds(100);
-// /* Remote wakeup */
-// if((USB_DRIVER.status & 2) && suspend_wakeup_condition()) {
-// send_remote_wakeup(&USB_DRIVER);
-// }
-//}
-//
-//void hook_usb_wakeup(void) {
-//#ifdef SLEEP_LED_ENABLE
-// chSysLockFromISR();
-// chMBPostI(&led_mailbox, LED_MSG_SLEEP_LED_OFF);
-// chSysUnlockFromISR();
-//#endif /* SLEEP_LED_ENABLE */
-//}
-//*/
diff --git a/keyboards/infinity60/led_controller.h b/keyboards/infinity60/led_controller.h
index 7a8a1a109..457b21a92 100644
--- a/keyboards/infinity60/led_controller.h
+++ b/keyboards/infinity60/led_controller.h
@@ -34,7 +34,6 @@ void led_controller_init(void);
#define CAPS_LOCK_LED_ADDRESS 46 //pin matrix location
#define NUM_LOCK_LED_ADDRESS 85
-#define BACKLIGHT_OFF_LOCK_LED_OFF 0 //set to 0 to show lock leds even if backlight off
/* =============================
* IS31 chip related definitions
@@ -59,7 +58,7 @@ void led_controller_init(void);
#define IS31_REG_DISPLAYOPT 0x05
#define IS31_REG_DISPLAYOPT_INTENSITY_SAME 0x20 // same intensity for all frames
-#define IS31_REG_DISPLAYOPT_BLINK_ENABLE 0x8
+#define IS31_REG_DISPLAYOPT_BLINK_ENABLE 0x08
// D2:D0 bits blink period time (*0.27s)
#define IS31_REG_AUDIOSYNC 0x06
@@ -87,28 +86,33 @@ void led_controller_init(void);
#define IS31_TIMEOUT 10000 // needs to be long enough to write a whole page
/* ========================================
- * LED Thread related functions/definitions
+ * LED Thread related items
* ========================================*/
extern mailbox_t led_mailbox;
void set_led_bit (uint8_t page, uint8_t *led_control_reg, uint8_t led_addr, uint8_t action);
-void set_lock_leds (uint8_t lock_addr, uint8_t led_action);
+void set_lock_leds (uint8_t led_addr, uint8_t led_action, uint8_t page);
+void write_led_byte (uint8_t page, uint8_t row, uint8_t led_byte);
void write_led_page (uint8_t page, uint8_t *led_array, uint8_t led_count);
// constants for signaling the LED controller thread
enum led_msg_t {
KEY_LIGHT,
+ SET_FULL_ROW,
OFF_LED,
ON_LED,
TOGGLE_LED,
+ BLINK_OFF_LED,
+ BLINK_ON_LED,
+ BLINK_TOGGLE_LED,
TOGGLE_ALL,
TOGGLE_BACKLIGHT,
DISPLAY_PAGE,
RESET_PAGE,
TOGGLE_NUM_LOCK,
TOGGLE_CAPS_LOCK,
- MODE_BREATH,
+ TOGGLE_BREATH,
STEP_BRIGHTNESS
};