diff options
Diffstat (limited to 'keyboards/input_club/infinity60')
24 files changed, 1677 insertions, 0 deletions
diff --git a/keyboards/input_club/infinity60/chconf.h b/keyboards/input_club/infinity60/chconf.h new file mode 100644 index 0000000000..3f1f9a8d76 --- /dev/null +++ b/keyboards/input_club/infinity60/chconf.h @@ -0,0 +1,31 @@ +/* Copyright 2020 QMK + * + * 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/>. + */ + +/* + * This file was auto-generated by: + * `qmk chibios-confmigrate -i keyboards/infinity60/chconf.h -r platforms/chibios/common/configs/chconf.h` + */ + +#pragma once + +#define CH_CFG_ST_TIMEDELTA 0 + +#define CH_CFG_TIME_QUANTUM 20 + +#define CH_CFG_USE_MAILBOXES TRUE + +#include_next <chconf.h> + diff --git a/keyboards/input_club/infinity60/config.h b/keyboards/input_club/infinity60/config.h new file mode 100644 index 0000000000..e73a663b39 --- /dev/null +++ b/keyboards/input_club/infinity60/config.h @@ -0,0 +1,61 @@ +/* +Copyright 2015 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/>. +*/ + +#pragma once + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x1C11 +#define PRODUCT_ID 0xB04D +#define DEVICE_VER 0x0001 +#define MANUFACTURER Input Club +#define PRODUCT Infinity 60% (QMK) + +/* key matrix size */ +#define MATRIX_ROWS 7 +#define MATRIX_COLS 9 + +/* COL2ROW, ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* 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 + +/* + * 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 diff --git a/keyboards/input_club/infinity60/halconf.h b/keyboards/input_club/infinity60/halconf.h new file mode 100644 index 0000000000..f2a330b416 --- /dev/null +++ b/keyboards/input_club/infinity60/halconf.h @@ -0,0 +1,27 @@ +/* Copyright 2020 QMK + * + * 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/>. + */ + +/* + * This file was auto-generated by: + * `qmk chibios-confmigrate -i keyboards/infinity60/halconf.h -r platforms/chibios/common/configs/halconf.h` + */ + +#pragma once + +#define HAL_USE_I2C TRUE + +#include_next <halconf.h> + diff --git a/keyboards/input_club/infinity60/infinity60.c b/keyboards/input_club/infinity60/infinity60.c new file mode 100644 index 0000000000..73751140ea --- /dev/null +++ b/keyboards/input_club/infinity60/infinity60.c @@ -0,0 +1,18 @@ +/* +Copyright 2012,2013 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/>. +*/ + +#include "infinity60.h" diff --git a/keyboards/input_club/infinity60/infinity60.h b/keyboards/input_club/infinity60/infinity60.h new file mode 100644 index 0000000000..ac1470d5f6 --- /dev/null +++ b/keyboards/input_club/infinity60/infinity60.h @@ -0,0 +1,36 @@ +/* +Copyright 2014 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/>. +*/ + +#pragma once + +#include "quantum.h" + +#define LAYOUT_60_ansi_split_bs_rshift( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k10, k11, k12, k13, k14, k15, \ + k16, k17, k18, k20, k21, k22, k23, k24, k25, k26, k27, k28, k30, k31, \ + k32, k33, k34, k35, k36, k37, k38, k40, k41, k42, k43, k44, k45, \ + k46, k47, k48, k50, k51, k52, k53, k54, k55, k56, k57, k58, k60, \ + k61, k62, k63, k64, k65, k66, k67, k68 \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08 }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18 }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28 }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38 }, \ + { k40, k41, k42, k43, k44, k45, k46, k47, k48 }, \ + { k50, k51, k52, k53, k54, k55, k56, k57, k58 }, \ + { k60, k61, k62, k63, k64, k65, k66, k67, k68 } \ +} diff --git a/keyboards/input_club/infinity60/info.json b/keyboards/input_club/infinity60/info.json new file mode 100644 index 0000000000..3fbd8b1b25 --- /dev/null +++ b/keyboards/input_club/infinity60/info.json @@ -0,0 +1,78 @@ +{ + "keyboard_name": "Infinity 60%", + "url": "https://input.club/devices/infinity-keyboard/", + "maintainer": "qmk", + "layouts": { + "LAYOUT_60_ansi_split_bs_rshift": { + "layout": [ + {"x": 0, "y": 0}, + {"x": 1, "y": 0}, + {"x": 2, "y": 0}, + {"x": 3, "y": 0}, + {"x": 4, "y": 0}, + {"x": 5, "y": 0}, + {"x": 6, "y": 0}, + {"x": 7, "y": 0}, + {"x": 8, "y": 0}, + {"x": 9, "y": 0}, + {"x": 10, "y": 0}, + {"x": 11, "y": 0}, + {"x": 12, "y": 0}, + {"x": 13, "y": 0}, + {"x": 14, "y": 0}, + + {"x": 0, "y": 1, "w": 1.5}, + {"x": 1.5, "y": 1}, + {"x": 2.5, "y": 1}, + {"x": 3.5, "y": 1}, + {"x": 4.5, "y": 1}, + {"x": 5.5, "y": 1}, + {"x": 6.5, "y": 1}, + {"x": 7.5, "y": 1}, + {"x": 8.5, "y": 1}, + {"x": 9.5, "y": 1}, + {"x": 10.5, "y": 1}, + {"x": 11.5, "y": 1}, + {"x": 12.5, "y": 1}, + {"x": 13.5, "y": 1, "w": 1.5}, + + {"x": 0, "y": 2, "w": 1.75}, + {"x": 1.75, "y": 2}, + {"x": 2.75, "y": 2}, + {"x": 3.75, "y": 2}, + {"x": 4.75, "y": 2}, + {"x": 5.75, "y": 2}, + {"x": 6.75, "y": 2}, + {"x": 7.75, "y": 2}, + {"x": 8.75, "y": 2}, + {"x": 9.75, "y": 2}, + {"x": 10.75, "y": 2}, + {"x": 11.75, "y": 2}, + {"x": 12.75, "y": 2, "w": 2.25}, + + {"x": 0, "y": 3, "w": 2.25}, + {"x": 2.25, "y": 3}, + {"x": 3.25, "y": 3}, + {"x": 4.25, "y": 3}, + {"x": 5.25, "y": 3}, + {"x": 6.25, "y": 3}, + {"x": 7.25, "y": 3}, + {"x": 8.25, "y": 3}, + {"x": 9.25, "y": 3}, + {"x": 10.25, "y": 3}, + {"x": 11.25, "y": 3}, + {"x": 12.25, "y": 3, "w": 1.75}, + {"x": 14, "y": 3}, + + {"x": 0, "y": 4, "w": 1.5}, + {"x": 1.5, "y": 4}, + {"x": 2.5, "y": 4, "w": 1.5}, + {"x": 4, "y": 4, "w": 6}, + {"x": 10, "y": 4, "w": 1.5}, + {"x": 11.5, "y": 4}, + {"x": 12.5, "y": 4}, + {"x": 13.5, "y": 4, "w": 1.5} + ] + } + } +} diff --git a/keyboards/input_club/infinity60/keymaps/default/keymap.c b/keyboards/input_club/infinity60/keymaps/default/keymap.c new file mode 100644 index 0000000000..334c24e29e --- /dev/null +++ b/keyboards/input_club/infinity60/keymaps/default/keymap.c @@ -0,0 +1,45 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ \ │ ` │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ Bspc│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │ Ctrl │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│ Fn│ + * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──┬┴───┴┬──┴┬───┬─┴───┤ + * │ │GUI│ Alt │ │ Alt │GUI│ │ │ + * └─────┴───┴─────┴───────────────────────┴─────┴───┴───┴─────┘ + */ + [0] = LAYOUT_60_ansi_split_bs_rshift( + 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_GRV, + 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, + 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_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, MO(1), + XXXXXXX, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, XXXXXXX, XXXXXXX + ), + + /* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Pwr│F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│Ins│Del│ + * ├───┴─┬─┴───┴───┴───┴───┴───┴───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴───┘ + * │Caps │ │ │ │ │ │ │ │PSc│Slk│Pse│ ↑ │ │ │ + * └─────┘┌───┬───┬───┐──┴┬──┴┌───┬──┴┬──┴┬──┴┬──┴┬──┴┬────────┐ + * │ │Vl-│Vl+│Mut│ │ │ * │ / │Hom│PgU│ ← │ → │ Enter │ + * ├──────└─┬─┴───┴───┘─┬─┴─┬─└─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┘ + * │ │ │ │ │ │ │ + │ - │End│PgD│ ↓ │ │ │ + * ├─────┬──┴┬──┴──┬┴───┴───┴───└───┴───┴───┴───┴───┘┬───┬─┴───┤ + * │ │ │ │ │ │ │ │ │ + * └─────┴───┴─────┴───────────────────────┴─────┴───┴───┴─────┘ + */ + [1] = LAYOUT_60_ansi_split_bs_rshift( + 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_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, + _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/input_club/infinity60/keymaps/depariel/keymap.c b/keyboards/input_club/infinity60/keymaps/depariel/keymap.c new file mode 100755 index 0000000000..22d74b866b --- /dev/null +++ b/keyboards/input_club/infinity60/keymaps/depariel/keymap.c @@ -0,0 +1,87 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Layer 0: Default Layer + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bksp| + * |-----------------------------------------------------------| + * |Contro| A| S| D| F| G| H| J| K| L| ;| '|Enter | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn2| + * |-----------------------------------------------------------' + * |Fn2 |Gui |Alt | Space |RAlt|Prv|PlPs|Next| + * `-----------------------------------------------------------' + */ + [0] = LAYOUT_60_ansi_split_bs_rshift( + 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_GRV, \ + 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, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, LT(5, KC_ENT), \ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, MO(4), \ + MO(4), KC_LGUI, KC_LALT, LT(3, KC_SPC), KC_RALT, KC_MPRV, KC_MPLY, KC_MNXT), + + /* Layer 1: "Toggle" off SpaceFn for League of Legends + */ + [1] = LAYOUT_60_ansi_split_bs_rshift( + 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_GRV, \ + 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, \ + 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_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, MO(4), \ + MO(4), KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_MPRV, KC_MPLY, KC_MNXT), + + /* Layer 2: "Toggle" off SpaceFn for MapleRoyals + */ + [2] = LAYOUT_60_ansi_split_bs_rshift( + 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_GRV, \ + 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, \ + 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_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, KC_LSFT, \ + MO(4), KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT), + + /* Layer 3: FN layer 1 + */ + [3] = LAYOUT_60_ansi_split_bs_rshift( + KC_NO, 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_NO, \ + KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, LALT(KC_F4), KC_HOME, KC_PGUP, KC_PSCR, KC_SLCK, KC_UP, KC_NO, KC_LPRN, KC_RPRN, KC_DEL, \ + MO(6), KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_END, KC_PGDN, KC_TILD, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, \ + LGUI(KC_SPC), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_CALC, KC_MENU, KC_TRNS, TG(4), \ + KC_TRNS, KC_TRNS, KC_TRNS, LT(3, KC_SPC), KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU), + + /* Layer 4: FN layer 2 + */ + [4] = LAYOUT_60_ansi_split_bs_rshift( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PMNS, KC_PPLS, KC_PSLS, TG(2), \ + KC_CAPS, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_PSCR, KC_NO, KC_P7, KC_P8, KC_P9, KC_PAST, KC_BSPC, \ + KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PENT, \ + KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P1, KC_P2, KC_P3, KC_RSFT, MO(4), \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P0, KC_PDOT, KC_NO, TG(1)), + + /* Layer 5: FN layer 3 + */ + [5] = LAYOUT_60_ansi_split_bs_rshift( + 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_TAB , KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F13, KC_F14, KC_F15, KC_F16, KC_NO, KC_TRNS, \ + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F17, KC_F18, KC_F19, KC_F20, LT(5, KC_ENT), \ + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F21, KC_F22, KC_F23, KC_F24, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RALT, KC_NO, KC_NO, KC_NO), + + /* Layer 6: FN layer 4 + */ + [6] = LAYOUT_60_ansi_split_bs_rshift( + 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, \ + LCTL(LSFT(KC_TAB)), KC_NO, LGUI(KC_UP), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + MO(6), LGUI(KC_LEFT), LGUI(KC_DOWN), LGUI(KC_RGHT), 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_NO, KC_NO, KC_NO), +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + +}; diff --git a/keyboards/input_club/infinity60/keymaps/hasu/keymap.c b/keyboards/input_club/infinity60/keymaps/hasu/keymap.c new file mode 100644 index 0000000000..be14c1b977 --- /dev/null +++ b/keyboards/input_club/infinity60/keymaps/hasu/keymap.c @@ -0,0 +1,110 @@ +#include QMK_KEYBOARD_H + +const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Layer 0: Default Layer + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| `|BSp| + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| + * |-----------------------------------------------------------| + * |Contro| A| S| D| F| G| H| J| K| L| ;| '|Enter | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn0| + * |-----------------------------------------------------------' + * | |Gui|Alt | Space |Alt |Gui| | | + * `-----------------------------------------------------------' + */ + [0] = LAYOUT_60_ansi_split_bs_rshift( + 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_GRV, + 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, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3, KC_SCLN), KC_QUOT, MT(KC_RCTL, KC_ENT), + OSM(MOD_LSFT), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, LT(2, KC_SLSH), KC_RSFT, TG(1), + KC_NO, KC_LGUI, KC_LALT, LT(4, KC_SPC), MO(4), KC_RGUI, KC_NO, KC_NO + ), + + /* 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 | |Backs| + * |-----------------------------------------------------------| + * | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | + * |-----------------------------------------------------------| + * | | | | | | | +| -|End|PgD|Dow| | | + * `-----------------------------------------------------------' + * | |Gui|Alt | Space |Alt |Gui| | | + * `-----------------------------------------------------------' + */ + [1] = LAYOUT_60_ansi_split_bs_rshift( + 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_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP, KC_TRNS,KC_BSPC, + KC_LCTL,KC_VOLD,KC_VOLU,KC_MUTE,KC_TRNS,KC_TRNS,KC_PAST,KC_PSLS,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT,KC_ENT, + KC_LSFT,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PPLS,KC_PMNS,KC_END, KC_PGDN,KC_DOWN,KC_RSFT,KC_TRNS, + KC_TRNS,KC_LGUI,KC_LALT, KC_TRNS, KC_RALT,KC_RGUI,KC_TRNS,KC_TRNS + ), + + /* Layer 2: Vi mode[Slash] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs| + * |-----------------------------------------------------------| + * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | + * |-----------------------------------------------------------| + * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | | + * `-----------------------------------------------------------' + * |Gui|Alt | Space |Alt |Gui| + * `-------------------------------------------' + */ + [2] = LAYOUT_60_ansi_split_bs_rshift( + 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_INS, KC_DEL, + KC_TAB, KC_HOME,KC_PGDN,KC_UP, KC_PGUP,KC_END, KC_HOME,KC_PGDN,KC_PGUP,KC_END, KC_NO, KC_NO, KC_NO, KC_BSPC, + KC_LCTL,KC_NO, KC_LEFT,KC_DOWN,KC_RGHT,KC_NO, KC_LEFT,KC_DOWN,KC_UP, KC_RGHT,KC_NO, KC_NO, KC_ENT, + KC_LSFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME,KC_PGDN,KC_PGUP,KC_END, LT(2, KC_SLSH), KC_RSFT,KC_TRNS, + KC_TRNS,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_TRNS, KC_TRNS + ), + + /* Layer 3: Mouse mode(IJKL)[Semicolon] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| + * |-----------------------------------------------------------| + * |Contro| | | | | |Mb2|McL|McD|McR|Fn | |Return | + * |-----------------------------------------------------------| + * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | + * `-----------------------------------------------------------' + * |Gui |Alt | Mb1 |Fn |Fn | + * `--------------------------------------------' + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel + */ + [3] = LAYOUT_60_ansi_split_bs_rshift( + 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_INS, KC_DEL, + LALT(KC_TAB), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_L,KC_WH_D,KC_MS_U, KC_WH_U, KC_WH_R, ALT_T(KC_LEFT), ALT_T(KC_RGHT),LALT(KC_TAB), + KC_LCTL, KC_ACL0,KC_ACL1,KC_ACL2,KC_ACL2,KC_NO, KC_NO, KC_MS_L,KC_MS_D, KC_MS_R, LT(3, KC_SCLN), KC_NO, KC_ENT, + KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN3,KC_BTN2,KC_BTN1,ALT_T(KC_LEFT), ALT_T(KC_RGHT), KC_NO, KC_RSFT, KC_TRNS, + KC_TRNS, KC_LGUI,KC_LALT, KC_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + /* Layer 4: Mouse mode(IJKL)[Space] + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| + * |-----------------------------------------------------------| + * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| + * |-----------------------------------------------------------| + * |Contro|VlD|VlU|VlM| | | |McL|McD|McR|Mb1| |Return | + * |-----------------------------------------------------------| + * |Shift | | | | |Mb3|Mb2|Mb1|A/L|A/R| |Shift | | + * `-----------------------------------------------------------' + * |Gui |Alt | Mb1 |Fn |Fn | + * `--------------------------------------------' + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel + */ + [4] = LAYOUT_60_ansi_split_bs_rshift( + 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_INS, KC_DEL, + LALT(KC_TAB), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_L, KC_WH_D, KC_MS_U, KC_WH_U, KC_WH_R, KC_BTN4, KC_BTN5, LALT(KC_TAB), + KC_LCTL, KC_VOLD, KC_VOLU, KC_MUTE, KC_NO, KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, KC_NO, KC_ENT, + KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN3, KC_BTN2, KC_BTN1, ALT_T(KC_LEFT), ALT_T(KC_RGHT), KC_NO, KC_RSFT, KC_NO, + KC_NO, KC_LGUI, KC_LALT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; diff --git a/keyboards/input_club/infinity60/keymaps/jpetermans/config.h b/keyboards/input_club/infinity60/keymaps/jpetermans/config.h new file mode 100644 index 0000000000..1949a9ad9d --- /dev/null +++ b/keyboards/input_club/infinity60/keymaps/jpetermans/config.h @@ -0,0 +1,6 @@ +#pragma once + +//overrides +#undef TAPPING_TOGGLE +#define TAPPING_TOGGLE 2 + diff --git a/keyboards/input_club/infinity60/keymaps/jpetermans/keymap.c b/keyboards/input_club/infinity60/keymaps/jpetermans/keymap.c new file mode 100644 index 0000000000..3c2e0d4da8 --- /dev/null +++ b/keyboards/input_club/infinity60/keymaps/jpetermans/keymap.c @@ -0,0 +1,264 @@ +#include QMK_KEYBOARD_H +#include "led_controller.h" + +//Define Layer Names +#define _BASE 0 +#define _NUMPAD 1 +#define _FNAV 2 +#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 led_modes { + MODE_ALL, + MODE_GAME, + MODE_SINGLE, + MODE_PAGE, + MODE_FLASH +}; + +enum macro_id { + LED_ALL = SAFE_RANGE, + LED_GAME, + LED_BACKLIGHT, + LED_BRIGHT, + LED_DIM, + LED_SINGLE, + LED_PAGE, + LED_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 + * ==================================*/ + +const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Layer 0: Default Layer + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Backs| + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| + * |-----------------------------------------------------------| + * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Enter | + * |-----------------------------------------------------------| + * |Shif| | Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui | FN | Ctrl | + * `-----------------------------------------------------------' + */ + /* default */ + [_BASE] = LAYOUT_60_ansi_split_bs_rshift( \ + 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, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,LM(_TILDE, MOD_LSFT),KC_NO, \ + KC_LCTL, KC_LGUI,KC_LALT, LT(_FNAV, KC_SPC), KC_RALT,TG(_NUMPAD),MO(_MEDIA), KC_RCTL \ + ), + + /* numpad */ + [_NUMPAD] = LAYOUT_60_ansi_split_bs_rshift( \ + _______,_______,_______,_______,_______,_______,_______, KC_P7, KC_P8, KC_P9, KC_PSLS, _______,_______,_______,KC_NO,\ + _______,_______,_______,_______,_______,_______,_______, KC_P4, KC_P5, KC_P6, KC_PAST, _______,_______,_______, \ + MO(_FNAV),_______,_______,_______,_______,_______,_______, KC_P1, KC_P2, KC_P3, KC_PMNS, _______,_______, \ + _______,_______,_______,_______,_______,_______,_______, KC_P0,KC_COMM,KC_PDOT,KC_PPLS, _______,KC_NO, \ + _______,_______,_______, TO(_BASE), _______,_______,_______,_______ \ + ), + + /* F-, arrow, and media keys */ + [_FNAV] = LAYOUT_60_ansi_split_bs_rshift( \ + 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, \ + _______,_______,KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \ + _______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \ + _______,_______,_______, _______, C(A(KC_DEL)),KC_NLCK,_______,_______ \ + ), + + /* media */ + [_MEDIA] = LAYOUT_60_ansi_split_bs_rshift( \ + _______,LED_SINGLE,LED_PAGE,LED_FLASH,_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\ + _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\ + _______,_______,_______,_______,_______,LED_GAME,_______, _______, _______, _______,_______, _______,_______, \ + _______,_______,LED_ALL ,LED_BRIGHT,LED_DIM,LED_BACKLIGHT,_______, _______, KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO, \ + _______,_______,_______, KC_MPLY, _______,_______, _______,_______ \ + ), + /* ~ */ + [_TILDE] = LAYOUT_60_ansi_split_bs_rshift( \ + KC_GRV,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\ + _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\ + _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \ + _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \ + _______,_______,_______, _______, _______,_______, _______,_______ \ + ), + /* template */ + [5] = LAYOUT_60_ansi_split_bs_rshift( \ + _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\ + _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\ + _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \ + _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \ + _______,_______,_______, _______, _______,_______, _______,_______ \ + ), +}; + +/* ================================== + * LED MAPPING + * ==================================*/ + +/* + 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 + 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 +*/ + +//======== full page arrays ========= +//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 +}; +//LED Page 2 - _Nav +uint8_t led_nav[12] = { + 38, + 47,48, 55,56,57, + 64,65,66 +}; +//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, + 32, + 47,48,51 +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + msg_t msg; + + switch(keycode) { + case LED_ALL: + if(record->event.pressed) { + led_mode_global = led_mode_global == MODE_ALL ? MODE_SINGLE : MODE_ALL; + msg=TOGGLE_ALL; + chMBPost(&led_mailbox, msg, TIME_IMMEDIATE); + } + return false; + + case LED_BACKLIGHT: + if(record->event.pressed) { + backlight_status_global ^= 1; + msg=(backlight_status_global << 8) | TOGGLE_BACKLIGHT; + chMBPost(&led_mailbox, msg, TIME_IMMEDIATE); + } + return false; + + case LED_GAME: + if(record->event.pressed) { + led_mode_global = led_mode_global == MODE_GAME ? MODE_SINGLE : MODE_GAME; + + msg=(4 << 8) | DISPLAY_PAGE; + chMBPost(&led_mailbox, msg, TIME_IMMEDIATE); + } + return false; + + case LED_BRIGHT: + if(record->event.pressed) { + msg=(1 << 8) | STEP_BRIGHTNESS; + chMBPost(&led_mailbox, msg, TIME_IMMEDIATE); + } + return false; + + case LED_DIM: + if(record->event.pressed) { + msg=(0 << 8) | STEP_BRIGHTNESS; + chMBPost(&led_mailbox, msg, TIME_IMMEDIATE); + } + return false; + + //set led_mode for matrix_scan to toggle leds + case LED_SINGLE: + led_mode_global = MODE_SINGLE; + return false; + case LED_PAGE: + led_mode_global = MODE_PAGE; + return false; + case LED_FLASH: + led_mode_global = MODE_FLASH; + return false; + + } + return true; +} + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + + led_controller_init(); + + // Write predefined led pages. + write_led_page(_NUMPAD, led_numpad, 16); + chThdSleepMilliseconds(10); + + write_led_page(_FNAV, led_nav, 12); + chThdSleepMilliseconds(10); + + write_led_page(_MEDIA, led_media, 15); + chThdSleepMilliseconds(10); + + write_led_page(4, led_game, 5); + chThdSleepMilliseconds(1000); +}; + +// 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 != MODE_GAME && led_mode_global != MODE_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=(page << 8) | DISPLAY_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=(7 << 8) | DISPLAY_PAGE; + chMBPost(&led_mailbox, msg, TIME_IMMEDIATE); + msg=(1 << 16) | (led_pin_byte << 8) | SET_FULL_ROW; + 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=(page << 8) | DISPLAY_PAGE; + chMBPost(&led_mailbox, msg, TIME_IMMEDIATE); + break; + } + led_layer_state = layer_state; + } +} diff --git a/keyboards/input_club/infinity60/keymaps/jpetermans/readme.md b/keyboards/input_club/infinity60/keymaps/jpetermans/readme.md new file mode 100644 index 0000000000..00421015bd --- /dev/null +++ b/keyboards/input_club/infinity60/keymaps/jpetermans/readme.md @@ -0,0 +1,87 @@ +Backlight for Infinity60 +======================== + +## Led Controller Specs + +The Infinity60 (revision 1.1a) 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 pin 4, column 5 in the IS31 datasheet +```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 led pages (or frames) 0-7 than can be displayed, and each page consists of 144 bytes. +- **bytes 0 - 17** - LED control (on/off). + * 18 bytes which alternate between A and B matrices (A1, B1, A2, B2, ..). + * Each byte controls the 8 leds on that pin with bits (8 to 1). +- **bytes 8 - 35** - Blink control. + * Same as LED control above, but sets blink on/off. +- **bytes 36 - 143** - PWM control. + * One byte per LED, sets PWM from 0 to 255. + * Same as above, the register alternates, every 8 *bytes* (not bits) between the A & B matrices. + +## Led Controller Code +In the Infinity60 project folder, 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. The remaining 7 pages (1-7) are free for preset led maps or single led actions 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". This code is based on work matt3o and flabbergast did for tmk firmware on the [whitefox](https://github.com/tmk/whitefox). + +One function is available to directly set leds without the mailbox: +``` +write_led_page(page#, array of leds by address, # of addresses in array) +``` +This function saves a full page to the controller using a supplied array of led locations such as: +```c +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) - message type, 8-bit mask, and row#. Sets all leds on one pin per the bit mask. +- **OFF_LED, ON_LED, TOGGLE_LED** (3 bytes) - message type, led address, and page#. Off/on/toggle specific led. +- **BLINK_OFF_LED, BLINK_ON_LED, BLINK_TOGGLE_LED** (3 bytes) - message type, led address, and page#. Set blink Off/on/toggle for specific led. +- **TOGGLE_ALL** (1 byte) - 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: +``` +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 type, the remaining three bytes are the message to process. +- timeout is TIME_IMMEDIATE + +An example: +```c +//set the message to be sent. First byte (LSB) is the message type, and second is the led address +msg=(42 << 8) | ON_LED; + +//send msg to the led mailbox +chMBPost(&led_mailbox, msg, TIME_IMMEDIATE); +``` + +Another: +```c +msg=(46 << 8) | BLINK_TOGGLE_LED; +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: +```c +msg=(row<<16) | (led_pin_byte << 8) | SET_FULL_ROW; +chMBPost(&led_mailbox, msg, TIME_IMMEDIATE); +``` diff --git a/keyboards/input_club/infinity60/led.c b/keyboards/input_club/infinity60/led.c new file mode 100644 index 0000000000..8effcea81a --- /dev/null +++ b/keyboards/input_club/infinity60/led.c @@ -0,0 +1,54 @@ +/* +Copyright 2015 Jun Wako <wakojun@gmail.com> +Copyright 2017 jpetermans <tibcmhhm@gmail.com> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <hal.h> + +#include "led.h" + +#include "led_controller.h" + +/* WARNING! This function needs to be callable from + * both regular threads and ISRs, unlocked (during resume-from-sleep). + * In particular, I2C functions (interrupt-driven) should NOT be called from here. + */ +void led_set(uint8_t usb_led) { + msg_t msg; + + if (usb_led & (1<<USB_LED_NUM_LOCK)) { + chSysUnconditionalLock(); + msg=(1 << 8) | TOGGLE_NUM_LOCK; + chMBPostI(&led_mailbox, msg); + chSysUnconditionalUnlock(); + } else { + chSysUnconditionalLock(); + msg=(0 << 8) | TOGGLE_NUM_LOCK; + chMBPostI(&led_mailbox, msg); + chSysUnconditionalUnlock(); + } + if (usb_led & (1<<USB_LED_CAPS_LOCK)) { + chSysUnconditionalLock(); + msg=(1 << 8) | TOGGLE_CAPS_LOCK; + chMBPostI(&led_mailbox, msg); + chSysUnconditionalUnlock(); + } else { + chSysUnconditionalLock(); + msg=(0 << 8) | TOGGLE_CAPS_LOCK; + chMBPostI(&led_mailbox, msg); + chSysUnconditionalUnlock(); + } +} diff --git a/keyboards/input_club/infinity60/led/config.h b/keyboards/input_club/infinity60/led/config.h new file mode 100644 index 0000000000..5bd3b590b9 --- /dev/null +++ b/keyboards/input_club/infinity60/led/config.h @@ -0,0 +1,23 @@ +/* +Copyright 2015 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/>. +*/ + +#pragma once + +// Keyboard Matrix Assignments +#define MATRIX_ROW_PINS { D1, D2, D3, D4, D5, D6, D7 } +#define MATRIX_COL_PINS { C0, C1, C2, C3, C4, C5, C6, C7, D0 } +#define UNUSED_PINS diff --git a/keyboards/input_club/infinity60/led/readme.md b/keyboards/input_club/infinity60/led/readme.md new file mode 100644 index 0000000000..d31335031f --- /dev/null +++ b/keyboards/input_club/infinity60/led/readme.md @@ -0,0 +1,3 @@ +## Infinity 60% LED + +This revision is for the version of the infinity 60 with LEDs (rev 1.1a) diff --git a/keyboards/input_club/infinity60/led/rules.mk b/keyboards/input_club/infinity60/led/rules.mk new file mode 100644 index 0000000000..d48f3b73a5 --- /dev/null +++ b/keyboards/input_club/infinity60/led/rules.mk @@ -0,0 +1,3 @@ +# project specific files +SRC += led.c \ + led_controller.c
\ No newline at end of file diff --git a/keyboards/input_club/infinity60/led_controller.c b/keyboards/input_club/infinity60/led_controller.c new file mode 100644 index 0000000000..cf3edf20dd --- /dev/null +++ b/keyboards/input_club/infinity60/led_controller.c @@ -0,0 +1,487 @@ +/* +Copyright 2016 flabbergast <s3+flabbergast@sdfeu.org> +Copyright 2017 jpetermans <tibcmhhm@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/>. +*/ + +/* + * LED controller code + * IS31FL3731C matrix LED driver from ISSI + * datasheet: http://www.issi.com/WW/pdf/31FL3731C.pdf + */ + +#include <ch.h> +#include <hal.h> +#include "print.h" +#include "led.h" +#include "host.h" + +#include "led_controller.h" + +#include "suspend.h" + +#include "usb_main.h" + +/* Infinity60 LED MAP + - digits mean "row" and "col", i.e. 45 means C4-5 in the IS31 datasheet, matrix A + + 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 +*/ + +/* + each page has 0xB4 bytes + 0 - 0x11: LED control (on/off): + order: CA1, CB1, CA2, CB2, .... (CA - matrix A, CB - matrix B) + CAn controls Cn-8 .. Cn-1 (LSbit) + 0x12 - 0x23: blink control (like "LED control") + 0x24 - 0xB3: PWM control: byte per LED, 0xFF max on + order same as above (CA 1st row (8bytes), CB 1st row (8bytes), ...) +*/ + +// Which LED should be used for CAPS LOCK indicator +#if !defined(CAPS_LOCK_LED_ADDRESS) +#define CAPS_LOCK_LED_ADDRESS 46 +#endif + +#if !defined(NUM_LOCK_LED_ADDRESS) +#define NUM_LOCK_LED_ADDRESS 85 +#endif + +/* Which LED should breathe during sleep */ +#if !defined(BREATHE_LED_ADDRESS) +#define BREATHE_LED_ADDRESS CAPS_LOCK_LED_ADDRESS +#endif + +/* ================= + * ChibiOS I2C setup + * ================= */ +static const I2CConfig i2ccfg = { + 400000 // clock speed (Hz); 400kHz max for IS31 +}; + +/* ============== + * variables + * ============== */ +// internal communication buffers +uint8_t tx[2] __attribute__((aligned(2))); +uint8_t rx[1] __attribute__((aligned(2))); + +// buffer for sending the whole page at once (used also as a temp buffer) +uint8_t full_page[0xB4+1] = {0}; + +// LED mask (which LEDs are present, selected by bits) +// 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] = { + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0x00 +}; + +// array to hold brightness pwm steps +const uint8_t pwm_levels[5] = { + 0x00, 0x16, 0x4E, 0xA1, 0xFF +}; + +// array to write to pwm register +uint8_t pwm_register_array[9] = {0}; + + +/* ============================ + * communication functions + * ============================ */ +msg_t is31_select_page(uint8_t page) { + tx[0] = IS31_COMMANDREGISTER; + tx[1] = page; + return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, tx, 2, NULL, 0, TIME_US2I(IS31_TIMEOUT)); +} + +msg_t is31_write_data(uint8_t page, uint8_t *buffer, uint8_t size) { + is31_select_page(page); + return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, buffer, size, NULL, 0, TIME_US2I(IS31_TIMEOUT)); +} + +msg_t is31_write_register(uint8_t page, uint8_t reg, uint8_t data) { + is31_select_page(page); + tx[0] = reg; + tx[1] = data; + return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, tx, 2, NULL, 0, TIME_US2I(IS31_TIMEOUT)); +} + +msg_t is31_read_register(uint8_t page, uint8_t reg, uint8_t *result) { + is31_select_page(page); + + tx[0] = reg; + return i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, tx, 1, result, 1, TIME_US2I(IS31_TIMEOUT)); +} + +/* ======================== + * initialise the IS31 chip + * ======================== */ +void is31_init(void) { + // just to be sure that it's all zeroes + __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); + // software shutdown + is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON); + chThdSleepMilliseconds(10); + // zero function page, all registers + is31_write_data(IS31_FUNCTIONREG, full_page, 0xD + 1); + chThdSleepMilliseconds(10); + // software shutdown disable (i.e. turn stuff on) + is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF); + chThdSleepMilliseconds(10); + // zero all LED registers on all 8 pages + uint8_t i; + for(i=0; i<8; i++) { + is31_write_data(i, full_page, 0xB4 + 1); + chThdSleepMilliseconds(5); + } +} + +/* ================== + * LED control thread + * ================== */ +#define LED_MAILBOX_NUM_MSGS 5 +static msg_t led_mailbox_queue[LED_MAILBOX_NUM_MSGS]; +mailbox_t led_mailbox; +static THD_WORKING_AREA(waLEDthread, 256); +static THD_FUNCTION(LEDthread, arg) { + (void)arg; + chRegSetThreadName("LEDthread"); + + uint8_t i; + uint8_t control_register_word[2] = {0};//2 bytes: register address, byte to write + uint8_t led_control_reg[0x13] = {0};//led control register start address + 0x12 bytes + + //persistent status variables + uint8_t pwm_step_status, page_status, capslock_status, numlock_status; + + //mailbox variables + uint8_t temp, msg_type; + uint8_t msg_args[3]; + msg_t msg; + + // initialize persistent variables + pwm_step_status = 4; //full brightness + page_status = 0; //start frame 0 (all off/on) + numlock_status = (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) ? 1 : 0; + capslock_status = (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? 1 : 0; + + while(true) { + // wait for a message (asynchronous) + // (messages are queued (up to LED_MAILBOX_NUM_MSGS) if they can't + // be processed right away + chMBFetchTimeout(&led_mailbox, &msg, TIME_INFINITE); + msg_type = msg & 0xFF; //first byte is action information + msg_args[0] = (msg >> 8) & 0xFF; + msg_args[1] = (msg >> 16) & 0XFF; + msg_args[2] = (msg >> 24) & 0xFF; + + + switch (msg_type){ + case SET_FULL_ROW: + //write full byte to pin address, msg_args[1] = pin #, msg_args[0] = 8 bits to write + //writes only to currently displayed page + write_led_byte(page_status, msg_args[1], msg_args[0]); + break; + + case OFF_LED: + //on/off/toggle single led, msg_args[0] = row/col of led, msg_args[1] = page + set_led_bit(msg_args[1], control_register_word, msg_args[0], 0); + break; + case ON_LED: + set_led_bit(msg_args[1], control_register_word, msg_args[0], 1); + break; + case TOGGLE_LED: + set_led_bit(msg_args[1], control_register_word, msg_args[0], 2); + break; + + case BLINK_OFF_LED: + //on/off/toggle single led, msg_args[0] = row/col of led + set_led_bit(msg_args[1], control_register_word, msg_args[0], 4); + break; + case BLINK_ON_LED: + set_led_bit(msg_args[1], control_register_word, msg_args[0], 5); + break; + case BLINK_TOGGLE_LED: + set_led_bit(msg_args[1], control_register_word, msg_args[0], 6); + break; + + case TOGGLE_ALL: + //turn on/off all leds, msg_args = unused + is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON); + chThdSleepMilliseconds(5); + is31_read_register(0, 0x00, &temp); + is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF); + + led_control_reg[0] = 0; + + //toggle led mask based on current state (temp) + if (temp==0 || page_status > 0) { + __builtin_memcpy(led_control_reg+1, all_on_leds_mask, 0x12); + } else { + __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); + + page_status=0; + + //maintain lock leds, reset to off and force recheck to blink of all leds toggled on + numlock_status = 0; + capslock_status = 0; + led_set(host_keyboard_leds()); + } + break; + + case TOGGLE_BACKLIGHT: + //msg_args[0] = on/off + + //populate 9 byte rows to be written to each pin, first byte is register (pin) address + if (msg_args[0] == 1) { + __builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8); + } else { + __builtin_memset(pwm_register_array+1, 0, 8); + } + + for(i=0; i<8; i++) { + //first byte is register address, every 0x10 9 bytes is A-matrix pwm pins + pwm_register_array[0] = 0x24 + (i * 0x10); + is31_write_data(0,pwm_register_array,9); + } + break; + + case DISPLAY_PAGE: + //msg_args[0] = page to toggle on + if (page_status != msg_args[0]) { + is31_write_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, msg_args[0]); + page_status = msg_args[0]; + + //maintain lock leds, reset to off and force recheck for new page + numlock_status = 0; + capslock_status = 0; + led_set(host_keyboard_leds()); + } + break; + + case RESET_PAGE: + //led_args[0] = page to reset + led_control_reg[0] = 0; + __builtin_memset(led_control_reg+1, 0, 0x12); + is31_write_data(msg_args[0], led_control_reg, 0x13); + + //repeat for blink register + led_control_reg[0] = 0x12; + is31_write_data(msg_args[0], led_control_reg, 0x13); + break; + + case TOGGLE_NUM_LOCK: + //msg_args[0] = 0 or 1, off/on + if (numlock_status != msg_args[0]) { + set_lock_leds(NUM_LOCK_LED_ADDRESS, msg_args[0], page_status); + numlock_status = msg_args[0]; + } + break; + case TOGGLE_CAPS_LOCK: + //msg_args[0] = 0 or 1, off/on + if (capslock_status != msg_args[0]) { + set_lock_leds(CAPS_LOCK_LED_ADDRESS, msg_args[0], page_status); + capslock_status = msg_args[0]; + } + break; + + case STEP_BRIGHTNESS: + //led_args[0] = step up (1) or down (0) + switch (msg_args[0]) { + 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 arrays to write on each pin + //first byte is register address, every 0x10 9 bytes are A-matrix 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 processing functions + * ============================== */ + +void set_led_bit (uint8_t page, uint8_t *led_control_word, uint8_t led_addr, uint8_t action) { + //returns 2 bytes: led control register address and byte to write + //action: 0 - off, 1 - on, 2 - toggle, 4 - blink on, 5 - blink off, 6 - toggle blink + + uint8_t control_reg_addr, column_bit, column_byte, temp, blink_bit; + + //check for valid led address + if (led_addr < 0 || led_addr > 87 || led_addr % 10 > 8) { + return; + } + + blink_bit = action>>2;//check for blink bit + action &= ~(1<<2); //strip blink bit + + //led_addr tens column is pin#, ones column is bit position in 8-bit mask + control_reg_addr = ((led_addr / 10) % 10 - 1 ) * 0x02;// A-matrix is every other byte + control_reg_addr += blink_bit == 1 ? 0x12 : 0x00;//if blink_bit, shift 12 bytes to blink register + + is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON); + chThdSleepMilliseconds(5); + is31_read_register(page, control_reg_addr, &temp);//maintain status of leds on this byte + is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF); + + column_bit = 1<<(led_addr % 10 - 1); + column_byte = temp; + + switch(action) { + case 0: + column_byte &= ~column_bit; + break; + case 1: + column_byte |= column_bit; + break; + case 2: + column_byte ^= column_bit; + break; + } + + //return word to be written in register + led_control_word[0] = control_reg_addr; + led_control_word[1] = column_byte; + is31_write_data (page, led_control_word, 0x02); +} + +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 + + led_control_word[0] = (row - 1 ) * 0x02;// A-matrix 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 pin, col; + uint8_t led_control_register[0x13] = {0}; + + __builtin_memset(led_control_register,0,13); + + for(i=0;i<led_count;i++){ + //shift pin by 1 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[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 temp; + uint8_t led_control_word[2] = {0}; + + //blink if all leds are on + if (page == 0) { + is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON); + chThdSleepMilliseconds(5); + is31_read_register(0, 0x00, &temp); + is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_OFF); + + if (temp == 0xFF) { + led_action |= (1<<2); //set blink bit + } + } + + set_led_bit(page,led_control_word,led_addr,led_action); +} + +/* ===================== + * hook into user keymap + * ===================== */ +void led_controller_init(void) { + uint8_t i; + + /* initialise I2C */ + /* I2C pins */ + palSetPadMode(GPIOB, 0, PAL_MODE_ALTERNATIVE_2); // PTB0/I2C0/SCL + palSetPadMode(GPIOB, 1, PAL_MODE_ALTERNATIVE_2); // PTB1/I2C0/SDA + /* 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; + + chThdSleepMilliseconds(10); + + /* initialise IS31 chip */ + is31_init(); + + //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 page 1 */ + pwm_register_array[0] = 0; + __builtin_memset(pwm_register_array+1, 0xFF, 8); + for(i=0; i<8; i++) { + pwm_register_array[0] = 0x24 + (i * 0x10);//first byte of 9 bytes must be register address + is31_write_data(0, pwm_register_array, 9); + chThdSleepMilliseconds(5); + } + + /* enable breathing when the displayed page changes */ + // Fade-in Fade-out, time = 26ms * 2^N, N=3 + is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL1, (3<<4)|3); + is31_write_register(IS31_FUNCTIONREG, IS31_REG_BREATHCTRL2, IS31_REG_BREATHCTRL2_ENABLE|3); + + /* 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); +} diff --git a/keyboards/input_club/infinity60/led_controller.h b/keyboards/input_club/infinity60/led_controller.h new file mode 100644 index 0000000000..e4b4717646 --- /dev/null +++ b/keyboards/input_club/infinity60/led_controller.h @@ -0,0 +1,121 @@ +/* +Copyright 2016 flabbergast <s3+flabbergast@sdfeu.org> +Copyright 2017 jpetermans <tibcmhhm@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 _LED_CONTROLLER_H_ +#define _LED_CONTROLLER_H_ + +/* ========================= + * communication functions + * ========================= */ + +msg_t is31_write_data(uint8_t page, uint8_t *buffer, uint8_t size); +msg_t is31_write_register(uint8_t page, uint8_t reg, uint8_t data); +msg_t is31_read_register(uint8_t page, uint8_t reg, uint8_t *result); + +/* ============================ + * init functions/definitions + * ============================*/ + +void led_controller_init(void); + +#define CAPS_LOCK_LED_ADDRESS 46 //pin matrix location +#define NUM_LOCK_LED_ADDRESS 85 + +/* ============================= + * IS31 chip related definitions + * ============================= */ + +#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 0x08 +// 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 0x1 +#define IS31_REG_SHUTDOWN_ON 0x0 + +#define IS31_REG_AGCCTRL 0x0B +#define IS31_REG_ADCRATE 0x0C + +#define IS31_COMMANDREGISTER 0xFD +#define IS31_FUNCTIONREG 0x0B // helpfully called 'page nine' + +#define IS31_TIMEOUT 10000 // needs to be long enough to write a whole page + +/* ======================================== + * 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 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, + TOGGLE_BREATH, + STEP_BRIGHTNESS +}; + +#endif /* _LED_CONTROLLER_H_ */ diff --git a/keyboards/input_club/infinity60/mcuconf.h b/keyboards/input_club/infinity60/mcuconf.h new file mode 100644 index 0000000000..6af85d0796 --- /dev/null +++ b/keyboards/input_club/infinity60/mcuconf.h @@ -0,0 +1,58 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _MCUCONF_H_ +#define _MCUCONF_H_ + +#define K20x_MCUCONF + +/* + * HAL driver system settings. + */ + +/* Select the MCU clocking mode below by enabling the appropriate block. */ + +#define KINETIS_NO_INIT FALSE + +/* FEI mode - 48 MHz with internal 32.768 kHz crystal */ +#define KINETIS_MCG_MODE KINETIS_MCG_MODE_FEI +#define KINETIS_MCG_FLL_DMX32 1 /* Fine-tune for 32.768 kHz */ +#define KINETIS_MCG_FLL_DRS 1 /* 1464x FLL factor */ +#define KINETIS_SYSCLK_FREQUENCY 47972352UL /* 32.768 kHz * 1464 (~48 MHz) */ +#define KINETIS_CLKDIV1_OUTDIV1 1 +#define KINETIS_CLKDIV1_OUTDIV2 1 +#define KINETIS_CLKDIV1_OUTDIV4 2 +#define KINETIS_BUSCLK_FREQUENCY KINETIS_SYSCLK_FREQUENCY +#define KINETIS_FLASHCLK_FREQUENCY KINETIS_SYSCLK_FREQUENCY/2 + +/* + * SERIAL driver system settings. + */ +#define KINETIS_SERIAL_USE_UART0 TRUE + +/* + * USB driver settings + */ +#define KINETIS_USB_USE_USB0 TRUE +#define KINETIS_USB_USB0_IRQ_PRIORITY 5 + +/* + * I2C driver settings + */ +#define KINETIS_I2C_USE_I2C0 TRUE +#define KINETIS_I2C_I2C0_PRIORITY 4 + +#endif /* _MCUCONF_H_ */ diff --git a/keyboards/input_club/infinity60/readme.md b/keyboards/input_club/infinity60/readme.md new file mode 100644 index 0000000000..e8ee6a9dad --- /dev/null +++ b/keyboards/input_club/infinity60/readme.md @@ -0,0 +1,17 @@ +# Infinity 60% + +A compact community driven keyboard. + +* Keyboard Maintainer: QMK Community +* Hardware Supported: Infinity 60% PCB +* Hardware Availability: https://input.club/devices/infinity-keyboard/ + +Make example for this keyboard (after setting up your build environment): + + make input_club/infinity60/rev1:default + +Flashing example for this keyboard: + + make input_club/infinity60/rev1:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/input_club/infinity60/rev1/config.h b/keyboards/input_club/infinity60/rev1/config.h new file mode 100644 index 0000000000..d4ab34bccc --- /dev/null +++ b/keyboards/input_club/infinity60/rev1/config.h @@ -0,0 +1,25 @@ +/* +Copyright 2015 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/>. +*/ + +#pragma once + +// Keyboard Matrix Assignments +#define MATRIX_ROW_PINS { D1, D2, D3, D4, D5, D6, D7 } +#define MATRIX_COL_PINS { B0, B1, B2, B3, B16, B17, C4, C5, D0 } +#define UNUSED_PINS + + diff --git a/keyboards/input_club/infinity60/rev1/readme.md b/keyboards/input_club/infinity60/rev1/readme.md new file mode 100644 index 0000000000..5df5cf5336 --- /dev/null +++ b/keyboards/input_club/infinity60/rev1/readme.md @@ -0,0 +1,2 @@ +## Infinity 60, initial massdrop release +This is for the initial massdrop PCBs that don't support LEDs (rev 1.03a) diff --git a/keyboards/input_club/infinity60/rev1/rules.mk b/keyboards/input_club/infinity60/rev1/rules.mk new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/keyboards/input_club/infinity60/rev1/rules.mk diff --git a/keyboards/input_club/infinity60/rules.mk b/keyboards/input_club/infinity60/rules.mk new file mode 100644 index 0000000000..7e21a06a9b --- /dev/null +++ b/keyboards/input_club/infinity60/rules.mk @@ -0,0 +1,34 @@ +# MCU name +MCU = MK20DX128 + +# Bootloader selection +BOOTLOADER = kiibohd + +# Board: it should exist either in <chibios>/os/hal/boards/ +# or <this_dir>/boards +# - BOARD = +# - PJRC_TEENSY_LC for Teensy LC +# - PJRC_TEENSY_3 for Teensy 3.0 +# - PJRC_TEENSY_3_1 for Teensy 3.1 or 3.2 +# - MCHCK_K20 for Infinity KB +BOARD = MCHCK_K20 + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Enable N-Key Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +AUDIO_ENABLE = no # Audio output + +DEFAULT_FOLDER = input_club/infinity60/led + +LAYOUTS = 60_ansi_split_bs_rshift + +# Enter lower-power sleep mode when on the ChibiOS idle thread +OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE |