From 1a9cec9a0315c2b7dbe320a6c34646e264a99681 Mon Sep 17 00:00:00 2001 From: Oleg Kostyuk <cub.uanic@gmail.com> Date: Thu, 20 Nov 2014 23:55:47 +0200 Subject: [PATCH 01/78] Documentation: small mistake Originally reported as https://github.com/cub-uanic/tmk_keyboard/issues/10, all credits to @olivierpons --- doc/keycode.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/keycode.txt b/doc/keycode.txt index 413756692..760c726e3 100644 --- a/doc/keycode.txt +++ b/doc/keycode.txt @@ -81,7 +81,7 @@ KC_F12 45 Keyboard F12 KC_PSCREEN KC_PSCR 46 Keyboard PrintScreen1 KC_SCKLOCK KC_SLCK 47 Keyboard Scroll Lock11 KC_PAUSE KC_PAUS 48 Keyboard Pause1 -KC_INSERT KC_INT 49 Keyboard Insert1 +KC_INSERT KC_INS 49 Keyboard Insert1 KC_HOME 4A Keyboard Home1 KC_PGUP 4B Keyboard PageUp1 KC_DELETE KC_DELETE 4C Keyboard Delete Forward From 60acd8996d559f5ab0458c2e1ea46ac9790d14b3 Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton <bswinnerton@gmail.com> Date: Sun, 30 Nov 2014 13:27:59 -0500 Subject: [PATCH 02/78] Fixing typo in console mode --- common/command.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/common/command.c b/common/command.c index 971ef7f0a..380f2d8c0 100644 --- a/common/command.c +++ b/common/command.c @@ -302,7 +302,7 @@ static bool command_common(uint8_t code) #endif " " STR(BOOTLOADER_SIZE) "\n"); - print("GCC: " STR(__GNUC__) "." STR(__GNUC_MINOR__) "." STR(__GNUC_PATCHLEVEL__) + print("GCC: " STR(__GNUC__) "." STR(__GNUC_MINOR__) "." STR(__GNUC_PATCHLEVEL__) " AVR-LIBC: " __AVR_LIBC_VERSION_STRING__ " AVR_ARCH: avr" STR(__AVR_ARCH__) "\n"); break; @@ -541,12 +541,12 @@ static void mousekey_console_help(void) print("4: select mk_time_to_max\n"); print("5: select mk_wheel_max_speed\n"); print("6: select mk_wheel_time_to_max\n"); - print("p: print prameters\n"); + print("p: print parameters\n"); print("d: set default values\n"); - print("up: increase prameters(+1)\n"); - print("down: decrease prameters(-1)\n"); - print("pgup: increase prameters(+10)\n"); - print("pgdown: decrease prameters(-10)\n"); + print("up: increase parameters(+1)\n"); + print("down: decrease parameters(-1)\n"); + print("pgup: increase parameters(+10)\n"); + print("pgdown: decrease parameters(-10)\n"); print("\nspeed = delta * max_speed * (repeat / time_to_max)\n"); print("where delta: cursor="); pdec(MOUSEKEY_MOVE_DELTA); print(", wheel="); pdec(MOUSEKEY_WHEEL_DELTA); print("\n"); From a6d33e2c98b16fdd3c7eaccb9e8c941d4315d528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlastimil=20Ov=C4=8D=C3=A1=C4=8D=C3=ADk?= <vovcacik@github.ovcacik.org> Date: Sun, 28 Dec 2014 09:49:57 +0100 Subject: [PATCH 03/78] Added support for The Ghost Squid controller used for CM XT keyboard. - initial commit - created as clone of the kitten_paw subproject with pins adjusted for CM XT --- README.md | 3 + keyboard/ghost_squid/Makefile.lufa | 117 ++++++++++++++ keyboard/ghost_squid/README.md | 20 +++ keyboard/ghost_squid/config.h | 43 ++++++ keyboard/ghost_squid/keymap.c | 102 +++++++++++++ keyboard/ghost_squid/keymap_ansi.h | 23 +++ keyboard/ghost_squid/led.c | 60 ++++++++ keyboard/ghost_squid/matrix.c | 237 +++++++++++++++++++++++++++++ 8 files changed, 605 insertions(+) create mode 100644 keyboard/ghost_squid/Makefile.lufa create mode 100644 keyboard/ghost_squid/README.md create mode 100644 keyboard/ghost_squid/config.h create mode 100644 keyboard/ghost_squid/keymap.c create mode 100644 keyboard/ghost_squid/keymap_ansi.h create mode 100644 keyboard/ghost_squid/led.c create mode 100644 keyboard/ghost_squid/matrix.c diff --git a/README.md b/README.md index a01de8c6f..550f1267d 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ You can find some keyboard specific projects under `converter` and `keyboard` di * [macway](keyboard/macway/) - [Compact keyboard mod][GH_macway] [retired] * [KMAC](keyboard/kmac/) - Korean custom keyboard * [Lightsaber](keyboard/lightsaber/) - Korean custom keyboard +* [ghost_squid](keyboard/ghost_squid/) - [The Ghost Squid][ghost_squid] controller for [Cooler Master QuickFire XT][cmxt] [GH_macway]: http://geekhack.org/showwiki.php?title=Island:11930 [GH_hhkb]: http://geekhack.org/showwiki.php?title=Island:12047 @@ -72,6 +73,8 @@ You can find some keyboard specific projects under `converter` and `keyboard` di [PC98]: http://en.wikipedia.org/wiki/NEC_PC-9801 [Sun]: http://en.wikipedia.org/wiki/Sun-3 [IIGS]: http://en.wikipedia.org/wiki/Apple_IIGS +[ghost_squid]: http://deskthority.net/wiki/Costar_replacement_controllers#The_Ghost_Squid +[cmxt]: http://gaming.coolermaster.com/en/products/keyboards/quickfirext/ diff --git a/keyboard/ghost_squid/Makefile.lufa b/keyboard/ghost_squid/Makefile.lufa new file mode 100644 index 000000000..61893893a --- /dev/null +++ b/keyboard/ghost_squid/Makefile.lufa @@ -0,0 +1,117 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# Target file name (without extension). +TARGET = ghostsquid_lufa + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# List C source files here. (C dependencies are automatically generated.) +SRC = keymap.c \ + matrix.c \ + led.c + +CONFIG_H = config.h + +# MCU name +MCU = atmega32u2 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + + +# Build Options +# comment out to disable the options. +# +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +#CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA + + +# Boot Section Size in bytes +# Teensy halfKay 512 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk diff --git a/keyboard/ghost_squid/README.md b/keyboard/ghost_squid/README.md new file mode 100644 index 000000000..dda67e6ba --- /dev/null +++ b/keyboard/ghost_squid/README.md @@ -0,0 +1,20 @@ +The Ghost Squid controller +========================== +Custom controller for the Cooler Master QuickFire XT keyboard designed by bpiphany. + +*Note that this is not the official firmware* + +Build +----- +Move to this directory then just run `make` like: + + $ make -f Makefile.lufa + +At the moment only the LUFA stack is supported. + + +Bootloader +--------- +To enter bootloader by hardware use a magnet above the controller before connecting the usb cable. + +It is still possible to use Boot Magic and Command (LSFT+RSFT+PAUS) to access the bootloader though. diff --git a/keyboard/ghost_squid/config.h b/keyboard/ghost_squid/config.h new file mode 100644 index 000000000..54f03143c --- /dev/null +++ b/keyboard/ghost_squid/config.h @@ -0,0 +1,43 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED // 0x2516 (original CM XT value) +#define PRODUCT_ID 0x001A +#define DEVICE_VER 0x0000 +#define MANUFACTURER Cooler Master +#define PRODUCT Cooler Master QuickFire XT + +/* message strings */ +#define DESCRIPTION t.m.k. keyboard firmware for Cooler Master QuickFire XT + +/* matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 18 + +/* Set 0 if need no debouncing */ +#define DEBOUNCE 5 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +#endif diff --git a/keyboard/ghost_squid/keymap.c b/keyboard/ghost_squid/keymap.c new file mode 100644 index 000000000..e9ad9efe1 --- /dev/null +++ b/keyboard/ghost_squid/keymap.c @@ -0,0 +1,102 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 <stdint.h> +#include <stdbool.h> +#include <avr/pgmspace.h> +#include "keycode.h" +#include "action.h" +#include "action_macro.h" +#include "report.h" +#include "host.h" +#include "debug.h" +#include "keymap.h" + +/* + Matrix col/row mapping + + ,----. ,-------------------. ,-------------------. ,-------------------. ,--------------. + |06/6| |07/4|08/4|08/2|08/6| |15/5|11/6|12/2|12/4| |14/4|14/5|14/6|14/0| |13/5|13/7|15/7| + `----' `-------------------' `-------------------' `-------------------' `--------------' + ,-------------------------------------------------------------------------. ,--------------. ,-------------------. + |06/4|06/5|07/5|08/5|09/5|09/4|10/4|10/5|11/5|12/5|05/5|05/4|11/4| 14/2| |17/4|02/4|04/4| |16/1|17/1|04/1|04/0| + |-------------------------------------------------------------------------| |--------------| |-------------------| + |06/2 |06/7|07/7|08/7|09/7|09/2|10/2|10/7|11/7|12/7|05/7|05/2|11/2| 14/3| |16/4|02/5|04/5| |16/7|17/7|04/7| | + |-------------------------------------------------------------------------| '--------------' |-------------- 02/7| + |02/7 |06/3|07/3|08/3|09/3|09/6|10/6|10/3|11/3|12/3|05/3|05/6| 14/1| |16/2|17/2|04/2| | + |-------------------------------------------------------------------------| ,----. |-------------------| + |01/2 |06/1|07/1|08/1|09/1|09/0|10/0|10/1|11/1|12/1|05/0| 01/3| |02/6| |16/3|17/3|04/3| | + |-------------------------------------------------------------------------| ,--------------. |-------------- 02/3| + |15/4|03/2|13/6| 16/6 |13/0|0/3|12/0|15/1| |02/0|16/0|17/0| | 17/6 |04/6| | + `-------------------------------------------------------------------------' `--------------' `-------------------' +*/ + +#define KEYMAP( \ + KG6, KH4, KI4, KI2, KI6, KP5, KL6, KM2, KM4, KO4, KO5, KO6, KO0, KN5, KN7, KP7, \ + KG4, KG5, KH5, KI5, KJ5, KJ4, KK4, KK5, KL5, KM5, KF5, KF4, KL4, KO2, KR4, KC4, KE4, KQ1, KR1, KE1, KE0, \ + KG2, KG7, KH7, KI7, KJ7, KJ2, KK2, KK7, KL7, KM7, KF7, KF2, KL2, KO3, KQ4, KC5, KE5, KQ7, KR7, KE7, KC7, \ + KH2, KG3, KH3, KI3, KJ3, KJ6, KK6, KK3, KL3, KM3, KF3, KF6, KO1, KQ2, KR2, KE2, \ + KB2, KH6, KG1, KH1, KI1, KJ1, KJ0, KK0, KK1, KL1, KM1, KF0, KB3, KC6, KQ3, KR3, KE3, KC3, \ + KP4, KD2, KN6, KQ6, KN0, KA3, KM0, KP1, KC0, KQ0, KR0, KR6, KE6 \ +) { \ +/* 0 1 2 3 4 5 6 7 */ \ +/* A 0 */ {KC_NO, KC_NO, KC_NO, KC_##KA3, KC_NO, KC_NO, KC_NO, KC_NO },\ +/* B 1 */ {KC_NO, KC_NO, KC_##KB2, KC_##KB3, KC_NO, KC_NO, KC_NO, KC_NO },\ +/* C 2 */ {KC_##KC0, KC_NO, KC_NO, KC_##KC3, KC_##KC4, KC_##KC5, KC_##KC6, KC_##KC7},\ +/* D 3 */ {KC_NO, KC_NO, KC_##KD2, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO },\ +/* E 4 */ {KC_##KE0, KC_##KE1, KC_##KE2, KC_##KE3, KC_##KE4, KC_##KE5, KC_##KE6, KC_##KE7},\ +/* F 5 */ {KC_##KF0, KC_NO, KC_##KF2, KC_##KF3, KC_##KF4, KC_##KF5, KC_##KF6, KC_##KF7},\ +/* G 6 */ {KC_NO, KC_##KG1, KC_##KG2, KC_##KG3, KC_##KG4, KC_##KG5, KC_##KG6, KC_##KG7},\ +/* H 7 */ {KC_NO, KC_##KH1, KC_##KH2, KC_##KH3, KC_##KH4, KC_##KH5, KC_##KH6, KC_##KH7},\ +/* I 8 */ {KC_NO, KC_##KI1, KC_##KI2, KC_##KI3, KC_##KI4, KC_##KI5, KC_##KI6, KC_##KI7},\ +/* J 9 */ {KC_##KJ0, KC_##KJ1, KC_##KJ2, KC_##KJ3, KC_##KJ4, KC_##KJ5, KC_##KJ6, KC_##KJ7},\ +/* K 10 */ {KC_##KK0, KC_##KK1, KC_##KK2, KC_##KK3, KC_##KK4, KC_##KK5, KC_##KK6, KC_##KK7},\ +/* L 11 */ {KC_NO, KC_##KL1, KC_##KL2, KC_##KL3, KC_##KL4, KC_##KL5, KC_##KL6, KC_##KL7},\ +/* M 12 */ {KC_##KM0, KC_##KM1, KC_##KM2, KC_##KM3, KC_##KM4, KC_##KM5, KC_NO, KC_##KM7},\ +/* N 13 */ {KC_##KN0, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KN5, KC_##KN6, KC_##KN7},\ +/* O 14 */ {KC_##KO0, KC_##KO1, KC_##KO2, KC_##KO3, KC_##KO4, KC_##KO5, KC_##KO6, KC_NO },\ +/* P 15 */ {KC_NO, KC_##KP1, KC_NO, KC_NO, KC_##KP4, KC_##KP5, KC_NO, KC_##KP7},\ +/* Q 16 */ {KC_##KQ0, KC_##KQ1, KC_##KQ2, KC_##KQ3, KC_##KQ4, KC_NO, KC_##KQ6, KC_##KQ7},\ +/* R 17 */ {KC_##KR0, KC_##KR1, KC_##KR2, KC_##KR3, KC_##KR4, KC_NO, KC_##KR6, KC_##KR7} \ +} + +#include "keymap_ansi.h" + +#define KEYMAPS_SIZE (sizeof(keymaps) / sizeof(keymaps[0])) +#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0])) + +/* translates key to keycode */ +uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) +{ + if (layer < KEYMAPS_SIZE) { + return pgm_read_byte(&keymaps[(layer)][(key.col)][(key.row)]); + } else { + return pgm_read_byte(&keymaps[0][(key.col)][(key.row)]); + } +} + +/* translates Fn keycode to action */ +action_t keymap_fn_to_action(uint8_t keycode) +{ + action_t action; + if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) { + action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); + } else { + action.code = ACTION_NO; + } + return action; +} diff --git a/keyboard/ghost_squid/keymap_ansi.h b/keyboard/ghost_squid/keymap_ansi.h new file mode 100644 index 000000000..ed1088baa --- /dev/null +++ b/keyboard/ghost_squid/keymap_ansi.h @@ -0,0 +1,23 @@ + +static const uint8_t PROGMEM keymaps[][MATRIX_COLS][MATRIX_ROWS] = { + /* Layer 0: Standard ANSI layer */ + KEYMAP(\ + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, \ + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, \ + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, \ + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, PENT, \ + LCTL,LGUI,LALT, SPC, RALT,RGUI, FN0,RCTL, LEFT,DOWN,RGHT, P0, PDOT), \ + /* Layer 1: Function layer */ + KEYMAP(\ + CALC,MYCM,WSCH,WHOM,MAIL,VOLD,VOLU,MSEL,MSTP,MPLY,MPRV,MNXT,TRNS, WAKE, PWR,SLEP, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS) +}; + +static const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(1) +}; diff --git a/keyboard/ghost_squid/led.c b/keyboard/ghost_squid/led.c new file mode 100644 index 000000000..da5dbd7ae --- /dev/null +++ b/keyboard/ghost_squid/led.c @@ -0,0 +1,60 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 <avr/io.h> +#include "stdint.h" +#include "led.h" + +/* LED pin configuration + * + * Scroll Lock PB7 + * CAPS PC6 + * NUMLOCK PC5 + * + */ +void led_set(uint8_t usb_led) +{ + DDRB |= (1<<7); + DDRC |= (1<<5) | (1<<6); + + if (usb_led & (1<<USB_LED_CAPS_LOCK)) + { + PORTC &= ~(1<<6); + } + else + { + PORTC |= (1<<6); + } + + if (usb_led & (1<<USB_LED_NUM_LOCK)) + { + PORTC &= ~(1<<5); + } + else + { + PORTC |= (1<<5); + } + + if (usb_led & (1<<USB_LED_SCROLL_LOCK)) + { + PORTB &= ~(1<<7); + } + else + { + PORTB |= (1<<7); + } +} diff --git a/keyboard/ghost_squid/matrix.c b/keyboard/ghost_squid/matrix.c new file mode 100644 index 000000000..d6a82ef75 --- /dev/null +++ b/keyboard/ghost_squid/matrix.c @@ -0,0 +1,237 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include <util/delay.h> +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" + +#ifndef DEBOUNCE +# define DEBOUNCE 0 +#endif +static uint8_t debouncing = DEBOUNCE; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static uint8_t read_rows(void); +static void init_rows(void); +static void unselect_cols(void); +static void select_col(uint8_t col); + +inline uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + unselect_cols(); + init_rows(); + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } +} + +uint8_t matrix_scan(void) +{ + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + select_col(col); + _delay_us(3); + uint8_t rows = read_rows(); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col); + bool curr_bit = rows & (1<<row); + if (prev_bit != curr_bit) { + matrix_debouncing[row] ^= ((matrix_row_t)1<<col); + debouncing = DEBOUNCE; + } + } + unselect_cols(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + return 1; +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<<col)); +} + +inline matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +void matrix_print(void) +{ + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + xprintf("%02X: %032lb\n", row, bitrev32(matrix_get_row(row))); + } +} + +uint8_t matrix_key_count(void) +{ + uint8_t count = 0; + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + count += bitpop32(matrix[i]); + } + return count; +} + +/* Row pin configuration + * + * row: 0 1 2 3 4 5 6 7 + * pin: PB1 PC2 PB6 PB4 PB3 PB5 PB0 PB2 + * + */ +static void init_rows(void) +{ + DDRC &= ~0b00000100; + DDRB &= ~0b01111111; + PORTC |= 0b00000100; + PORTB |= 0b01111111; +} + +static uint8_t read_rows(void) +{ + return (PINB&(1<<1) ? 0 : (1<<0)) | + (PINC&(1<<2) ? 0 : (1<<1)) | + (PINB&(1<<6) ? 0 : (1<<2)) | + (PINB&(1<<4) ? 0 : (1<<3)) | + (PINB&(1<<3) ? 0 : (1<<4)) | + (PINB&(1<<5) ? 0 : (1<<5)) | + (PINB&(1<<0) ? 0 : (1<<6)) | + (PINB&(1<<2) ? 0 : (1<<7)); +} + +/* These columns uses two 74HC42 4 to 10 bit demultiplexers (low active). + * + * COL PD6 PD5 PD4 PD3 PD2 PD1 + * 10 1 1 0 0 0 0 + * 15 1 1 0 0 0 1 + * 8 1 1 0 0 1 0 + * 14 1 1 0 1 0 0 + * 6 1 1 0 1 0 1 + * 13 1 1 0 1 1 0 + * 12 1 1 1 0 0 0 + * 9 1 1 1 0 1 0 + * 11 1 1 1 1 0 0 + * 7 1 1 1 1 1 0 + * + * COL PD1 PD2 PD3 PD4 PD5 PD6 + * 3 1 1 0 0 0 1 + * 4 1 1 0 0 1 0 + * 17 1 1 0 1 0 0 + * 16 1 1 0 1 1 0 + * 0 1 1 1 0 0 1 + * 5 1 1 1 0 1 0 + * 2 1 1 1 1 0 0 + * 1 1 1 1 1 1 0 + */ +static void unselect_cols(void) +{ + DDRD |= 0b01111111; + PORTD &= ~0b01111111; +} + +static void select_col(uint8_t col) +{ + switch (col) { + case 0: + PORTD |= (1<<6) | (1<<3) | (1<<2) | (1<<1); + break; + case 1: + PORTD |= (1<<5) | (1<<4) | (1<<3) | (1<<2) | (1<<1); + break; + case 2: + PORTD |= (1<<4) | (1<<3) | (1<<2) | (1<<1); + break; + case 3: + PORTD |= (1<<6) | (1<<2) | (1<<1); + break; + case 4: + PORTD |= (1<<5) | (1<<2) | (1<<1); + break; + case 5: + PORTD |= (1<<5) | (1<<3) | (1<<2) | (1<<1); + break; + case 6: + PORTD |= (1<<6) | (1<<5) | (1<<3) | (1<<1); + break; + case 7: + PORTD |= (1<<6) | (1<<5) | (1<<4) | (1<<3) | (1<<2); + break; + case 8: + PORTD |= (1<<6) | (1<<5) | (1<<2); + break; + case 9: + PORTD |= (1<<6) | (1<<5) | (1<<4) | (1<<2); + break; + case 10: + PORTD |= (1<<6) | (1<<5); + break; + case 11: + PORTD |= (1<<6) | (1<<5) | (1<<4) | (1<<3); + break; + case 12: + PORTD |= (1<<6) | (1<<5) | (1<<4); + break; + case 13: + PORTD |= (1<<6) | (1<<5) | (1<<3) | (1<<2); + break; + case 14: + PORTD |= (1<<6) | (1<<5) | (1<<3); + break; + case 15: + PORTD |= (1<<6) | (1<<5) | (1<<1); + break; + case 16: + PORTD |= (1<<5) | (1<<4) | (1<<2) | (1<<1); + break; + case 17: + PORTD |= (1<<4) | (1<<2) | (1<<1); + break; + } +} From 02a9f8a906f67d252d8608606065b44ad94316b0 Mon Sep 17 00:00:00 2001 From: Oleg Kostyuk <cub.uanic@gmail.com> Date: Sat, 3 Jan 2015 15:10:45 +0200 Subject: [PATCH 04/78] Update other_projects.md - added TMK/Ergodox --- doc/other_projects.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/other_projects.md b/doc/other_projects.md index ce24e0ab5..bf980b0a9 100644 --- a/doc/other_projects.md +++ b/doc/other_projects.md @@ -29,6 +29,7 @@ Other Keyboard Firmware Projects ## ErgoDox[Ergo][Split][USB][AVR] - <http://geekhack.org/index.php?topic=22780.0> - <https://github.com/benblazak/ergodox-firmware> +- <https://github.com/cub-uanic/tmk_keyboard> ## Suka's keyboard collection[Ergo][Split][3DPrinting][USB][AVR] - <http://deskthority.net/workshop-f7/my-diy-keyboard-collection-or-how-i-became-a-kb-geek-t2534.html> From 05795cb0034e885bec37f782cfc6bddcae262637 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Wed, 26 Nov 2014 11:25:45 +0900 Subject: [PATCH 05/78] Compensate timer during prower down --- common/avr/suspend.c | 27 ++++++++++++++++----------- common/suspend.h | 2 +- keyboard/hhkb_rn42/MEMO.txt | 7 +++++++ keyboard/hhkb_rn42/matrix.c | 2 +- keyboard/hhkb_rn42/rn42/main.c | 2 +- protocol/lufa/lufa.c | 2 +- 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/common/avr/suspend.c b/common/avr/suspend.c index 66a579fd7..80243f02b 100644 --- a/common/avr/suspend.c +++ b/common/avr/suspend.c @@ -7,6 +7,7 @@ #include "backlight.h" #include "suspend_avr.h" #include "suspend.h" +#include "timer.h" #ifdef PROTOCOL_LUFA #include "lufa.h" #endif @@ -52,11 +53,13 @@ void suspend_idle(uint8_t time) * WDTO_4S * WDTO_8S */ -void suspend_power_down(uint8_t wdto) +static uint8_t wdt_timeout = 0; +static void power_down(uint8_t wdto) { #ifdef PROTOCOL_LUFA if (USB_DeviceState == DEVICE_STATE_Configured) return; #endif + wdt_timeout = wdto; // Watchdog Interrupt Mode wdt_intr_enable(wdto); @@ -67,7 +70,6 @@ void suspend_power_down(uint8_t wdto) // - prescale clock // - BOD disable // - Power Reduction Register PRR - set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sei(); @@ -78,6 +80,11 @@ void suspend_power_down(uint8_t wdto) wdt_disable(); } +void suspend_power_down(void) +{ + power_down(WDTO_15MS); +} + bool suspend_wakeup_condition(void) { matrix_power_up(); @@ -103,15 +110,13 @@ void suspend_wakeup_init(void) /* watchdog timeout */ ISR(WDT_vect) { - /* wakeup from MCU sleep mode */ -/* - // blink LED - static uint8_t led_state = 0; - static uint8_t led_count = 0; - led_count++; - if ((led_count & 0x07) == 0) { - led_set((led_state ^= (1<<USB_LED_CAPS_LOCK))); + // compensate timer for sleep + switch (wdt_timeout) { + case WDTO_15MS: + timer_count += 15 + 2; // WDTO_15MS + 2(from observation) + break; + default: + ; } -*/ } #endif diff --git a/common/suspend.h b/common/suspend.h index f339c670a..80617a824 100644 --- a/common/suspend.h +++ b/common/suspend.h @@ -6,7 +6,7 @@ void suspend_idle(uint8_t timeout); -void suspend_power_down(uint8_t timeout); +void suspend_power_down(void); bool suspend_wakeup_condition(void); void suspend_wakeup_init(void); diff --git a/keyboard/hhkb_rn42/MEMO.txt b/keyboard/hhkb_rn42/MEMO.txt index 337dad603..062ee3399 100644 --- a/keyboard/hhkb_rn42/MEMO.txt +++ b/keyboard/hhkb_rn42/MEMO.txt @@ -9,10 +9,15 @@ Bug: - Do not power-down during USB connection is active - DONE 11/11 (USB_DeviceState == USB_DEVICE_Configured) is used to check USB connection matrix_power_down() matrix.c - 11/23 +- timer is slow while power down - DONE 11/26 + - time out interrupt is lost while power down? + - interrupt of watchdog timer compensates timer counter(avr/suspend.c) Todo: Design: +- suspend.h - DONE 11/26 + - remove argument from suspend_power_down() for backward compatitibility - remove MCU dependent power saving code from core/keyboard - it should be located in project matrix.c - DONE 11/23 - HHKB matrix.c needs matrix_prev? @@ -47,6 +52,8 @@ Power saving: - During USB suspend change clock source to internal RC from external Xtal(6.8) - FRZCLK: you can freeze clock for power saving. still WAKEUPI and VBUSTI interrupts are available while freezing.(21.7.3) - Suspend: Clear Suspend Bit, Freeze clock, disable PLL, MCU sleep(21.13) +- Voltage reference(8.1.1) + - to reduce power consumption while power down mode Improving: - BT LED; connecting, linked, sleeping, deep sleeping diff --git a/keyboard/hhkb_rn42/matrix.c b/keyboard/hhkb_rn42/matrix.c index c6c444ff5..513a271e4 100644 --- a/keyboard/hhkb_rn42/matrix.c +++ b/keyboard/hhkb_rn42/matrix.c @@ -186,6 +186,6 @@ void matrix_power_down(void) { if (USB_DeviceState == DEVICE_STATE_Configured) return; if (timer_elapsed32(matrix_last_modified) <= MATRIX_POWER_SAVE) return; KEY_POWER_OFF(); - suspend_power_down(WDTO_15MS); + suspend_power_down(); matrix_power = false; } diff --git a/keyboard/hhkb_rn42/rn42/main.c b/keyboard/hhkb_rn42/rn42/main.c index 43d887067..a3a37c074 100644 --- a/keyboard/hhkb_rn42/rn42/main.c +++ b/keyboard/hhkb_rn42/rn42/main.c @@ -85,7 +85,7 @@ int main(void) print("Keyboard start.\n"); while (1) { while (USB_DeviceState == DEVICE_STATE_Suspended) { - suspend_power_down(WDTO_120MS); + suspend_power_down(); if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { USB_Device_SendRemoteWakeup(); } diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index 6802f3b63..ee15b7f45 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -587,7 +587,7 @@ int main(void) print("Keyboard start.\n"); while (1) { while (USB_DeviceState == DEVICE_STATE_Suspended) { - suspend_power_down(WDTO_120MS); + suspend_power_down(); if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { USB_Device_SendRemoteWakeup(); } From 9179246a1d69024449829218aa7fb967d8ccc3f5 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Wed, 26 Nov 2014 11:42:53 +0900 Subject: [PATCH 06/78] Fix USB plug-in while BT mode falls to be enumerated --- keyboard/hhkb_rn42/matrix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboard/hhkb_rn42/matrix.c b/keyboard/hhkb_rn42/matrix.c index 513a271e4..22becd105 100644 --- a/keyboard/hhkb_rn42/matrix.c +++ b/keyboard/hhkb_rn42/matrix.c @@ -183,7 +183,7 @@ void matrix_power_up(void) { void matrix_power_down(void) { if (!matrix_power) return; // doesn't power save while USB connection is active - if (USB_DeviceState == DEVICE_STATE_Configured) return; + if (USB_DeviceState != DEVICE_STATE_Unattached) return; if (timer_elapsed32(matrix_last_modified) <= MATRIX_POWER_SAVE) return; KEY_POWER_OFF(); suspend_power_down(); From 20caf673d8ba7fb7675e2559bfebad6ddb9d6fd0 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Sat, 29 Nov 2014 20:47:15 +0900 Subject: [PATCH 07/78] Fix lufa sendchar() infinite wait loop - FrameNumber is not updated when adapter powered - can be blocked in sendchar() when pluged into AC adapter --- keyboard/hhkb_rn42/rn42/main.c | 3 ++- protocol/lufa/lufa.c | 36 +++++++++++++++++----------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/keyboard/hhkb_rn42/rn42/main.c b/keyboard/hhkb_rn42/rn42/main.c index a3a37c074..42b09d8c8 100644 --- a/keyboard/hhkb_rn42/rn42/main.c +++ b/keyboard/hhkb_rn42/rn42/main.c @@ -17,8 +17,8 @@ static int8_t sendchar_func(uint8_t c) { - sendchar(c); // LUFA xmit(c); // SUART + sendchar(c); // LUFA return 0; } @@ -85,6 +85,7 @@ int main(void) print("Keyboard start.\n"); while (1) { while (USB_DeviceState == DEVICE_STATE_Suspended) { + print("[s]"); suspend_power_down(); if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { USB_Device_SendRemoteWakeup(); diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index ee15b7f45..3d6b3ea00 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -148,6 +148,7 @@ static void Console_Task(void) */ void EVENT_USB_Device_Connect(void) { + print("[C]"); /* For battery powered device */ if (!USB_IsInitialized) { USB_Init(); @@ -157,6 +158,7 @@ void EVENT_USB_Device_Connect(void) void EVENT_USB_Device_Disconnect(void) { + print("[D]"); /* For battery powered device */ /* TODO: This doesn't work. After several plug in/outs can not be enumerated. if (USB_IsInitialized) { @@ -169,10 +171,12 @@ void EVENT_USB_Device_Disconnect(void) void EVENT_USB_Device_Reset(void) { + print("[R]"); } void EVENT_USB_Device_Suspend() { + print("[S]"); #ifdef SLEEP_LED_ENABLE sleep_led_enable(); #endif @@ -180,6 +184,7 @@ void EVENT_USB_Device_Suspend() void EVENT_USB_Device_WakeUp() { + print("[W]"); suspend_wakeup_init(); #ifdef SLEEP_LED_ENABLE @@ -489,37 +494,28 @@ int8_t sendchar(uint8_t c) uint8_t ep = Endpoint_GetCurrentEndpoint(); Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM); if (!Endpoint_IsEnabled() || !Endpoint_IsConfigured()) { - Endpoint_SelectEndpoint(ep); - return -1; + goto ERROR_EXIT; } if (timeouted && !Endpoint_IsReadWriteAllowed()) { - Endpoint_SelectEndpoint(ep); - return - 1; + goto ERROR_EXIT; } timeouted = false; uint8_t timeout = SEND_TIMEOUT; - uint16_t prevFN = USB_Device_GetFrameNumber(); while (!Endpoint_IsReadWriteAllowed()) { - switch (USB_DeviceState) { - case DEVICE_STATE_Unattached: - case DEVICE_STATE_Suspended: - return -1; + if (USB_DeviceState != DEVICE_STATE_Configured) { + goto ERROR_EXIT; } if (Endpoint_IsStalled()) { - Endpoint_SelectEndpoint(ep); - return -1; + goto ERROR_EXIT; } - if (prevFN != USB_Device_GetFrameNumber()) { - if (!(timeout--)) { - timeouted = true; - Endpoint_SelectEndpoint(ep); - return -1; - } - prevFN = USB_Device_GetFrameNumber(); + if (!(timeout--)) { + timeouted = true; + goto ERROR_EXIT; } + _delay_ms(1); } Endpoint_Write_8(c); @@ -530,6 +526,9 @@ int8_t sendchar(uint8_t c) Endpoint_SelectEndpoint(ep); return 0; +ERROR_EXIT: + Endpoint_SelectEndpoint(ep); + return -1; } #else int8_t sendchar(uint8_t c) @@ -587,6 +586,7 @@ int main(void) print("Keyboard start.\n"); while (1) { while (USB_DeviceState == DEVICE_STATE_Suspended) { + print("[s]"); suspend_power_down(); if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { USB_Device_SendRemoteWakeup(); From 570bcb2ed112b3435a09b974c20138f13de6aaaa Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Sat, 29 Nov 2014 21:12:47 +0900 Subject: [PATCH 08/78] Add LUFA device state to command info --- keyboard/hhkb_rn42/rn42/rn42_task.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboard/hhkb_rn42/rn42/rn42_task.c b/keyboard/hhkb_rn42/rn42/rn42_task.c index c3359ed50..668626862 100644 --- a/keyboard/hhkb_rn42/rn42/rn42_task.c +++ b/keyboard/hhkb_rn42/rn42/rn42_task.c @@ -197,6 +197,8 @@ bool command_extra(uint8_t code) xprintf("rn42_linked(): %X\n", rn42_linked()); xprintf("rn42_rts(): %X\n", rn42_rts()); xprintf("config_mode: %X\n", config_mode); + xprintf("USB_DeviceState: %X\n", USB_DeviceState); + xprintf("USB_Device_RemoteWakeupEnabled: %X\n", USB_Device_RemoteWakeupEnabled); xprintf("VBUS: %X\n", USBSTA&(1<<VBUS)); xprintf("battery_charging: %X\n", battery_charging()); xprintf("battery_status: %X\n", battery_status()); From de29f986a73860abfa930cd1b91cec60b02ee7a7 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Sat, 29 Nov 2014 21:14:00 +0900 Subject: [PATCH 09/78] Update MEMO --- keyboard/hhkb_rn42/MEMO.txt | 58 +++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/keyboard/hhkb_rn42/MEMO.txt b/keyboard/hhkb_rn42/MEMO.txt index 062ee3399..e623c0013 100644 --- a/keyboard/hhkb_rn42/MEMO.txt +++ b/keyboard/hhkb_rn42/MEMO.txt @@ -9,33 +9,84 @@ Bug: - Do not power-down during USB connection is active - DONE 11/11 (USB_DeviceState == USB_DEVICE_Configured) is used to check USB connection matrix_power_down() matrix.c - 11/23 + +- When given power only from wall wart adapter + - it sleeps. it should not sleep + - Configured state without USB connection? + - timer is slow while power down - DONE 11/26 - time out interrupt is lost while power down? - interrupt of watchdog timer compensates timer counter(avr/suspend.c) +- USB plug-in while BT failes + - it ends in suspend state + - maybe, not responsive to host enumeration process due to power-down. + - matrix_power_down() only when state is unattached - 11/26 + - need to observe a while +- repeated CHARGING/FULL_CHARGED + - In LTC sharp pulses are observed. + - MCP has no pulse but still has a problem. + - needs more wait before read pin state? +- wrongly suspended when powered from adapter without USB connection + - suspend event may occur when plug into adapter + - and never wake until conected to real USB line + - without debug print via USB no problem; CSW(wake just after suspend as real USB line) + - seems like USB print causes this problem after suspended + Todo: +- sendchar() in lufa.c block loop - 11/29 + - block loop when powered with AC adapter + - FrameNumber is not updated when adapter powered +- sendchar() in lufa.c no buffer + - no buffering. character lost can be caused. Design: - suspend.h - DONE 11/26 - remove argument from suspend_power_down() for backward compatitibility -- remove MCU dependent power saving code from core/keyboard - - it should be located in project matrix.c - DONE 11/23 +- remove MCU dependent power saving code from core/keyboard - DONE 11/23 + - it should be located in project matrix.c - HHKB matrix.c needs matrix_prev? - is_modified() is obsolete now. really needs? +- ADC: removing AREF capacitor C10 + - seems to be better while usb powered + - still bad while battery powered + http://electronics.stackexchange.com/questions/105849/avcc-and-capacitor-using-adc +- ADC: smaller resistors for voltage dividor + - 1K + 1K: not improved. - 11/27 LUFA: USB connection check: state of USB deivce - USB_DeviceState: USB_Deivce_State_t { Unattached, Powered, Default, Addressed, Configured*, Suspended* } + Unattached: unpluged + Powered: pluged with power adapter + Default: enumerate process bigin + Addressed: addressed + Configured: enumerated + Suspended: suspended + - USB_IsInitialized: state of LUFA core setup becomes true in USB_Init() USBController_AVR8.c becomes false in USB_Disable() USBController_AVR8.c - USB_VBUS_GetStatus(): state of VBUS(power/connection) - USB_Disable() detaches, disables all interrupts, controller, PLL, regulater. +- When connect to power adapter + - event happened: CW or CSW or C or DDC + - USB state: not configured + +- USB evnets + - USB connect: CSWRWRW + - USB connect but fail to enumeration: CWRWRWRWS + - USB disconnect: D + - Power adapter connect: CW, CSW, C + - Power adapter disconnect: D + Power saving: +- matrix power saving + - power saving while externally powered and not while unpluged - confirm suspend mode lufa.c: matrix_power_*, suspend_wakeup_condition - 8MHz clock - When not connected in a few minutes get into deep sleep to save battery life @@ -63,6 +114,9 @@ Improving: - ADC resolution AVR120 AVR32138 + - Enhancing ADC resolution by oversampling + AVR121 http://www.atmel.com/images/doc8003.pdf + Testing: - Factroy reset doesn't work; need to **test again** 10K pull-up is too high? From 825be9d121a9c698bf60bbdc384f2eeaf66f60d0 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Tue, 2 Dec 2014 22:47:59 +0900 Subject: [PATCH 10/78] Disable input buffer for ADC --- keyboard/hhkb_rn42/rn42/battery.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/keyboard/hhkb_rn42/rn42/battery.c b/keyboard/hhkb_rn42/rn42/battery.c index 0320e1baf..720d63beb 100644 --- a/keyboard/hhkb_rn42/rn42/battery.c +++ b/keyboard/hhkb_rn42/rn42/battery.c @@ -21,6 +21,10 @@ void battery_init(void) ADMUX = (1<<REFS1) | (1<<REFS0); ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); ADCSRA |= (1<<ADEN); + // digital input buffer disable(24.9.5) + DIDR0 = (1<<ADC0D) | (1<<ADC4D) | (1<<ADC5D) | (1<<ADC7D); + DIDR1 = (1<<AIN0D); + DIDR2 = (1<<ADC8D) | (1<<ADC9D) | (1<<ADC11D) | (1<<ADC12D) | (1<<ADC13D); // ADC disable voltate divider(PF4) DDRF |= (1<<4); From 25aee431bd83b46d694293c85a939d476943a5aa Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Wed, 3 Dec 2014 02:08:27 +0900 Subject: [PATCH 11/78] Clean ADC code of battery_voltage() --- keyboard/hhkb_rn42/rn42/battery.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/keyboard/hhkb_rn42/rn42/battery.c b/keyboard/hhkb_rn42/rn42/battery.c index 720d63beb..3ecde5223 100644 --- a/keyboard/hhkb_rn42/rn42/battery.c +++ b/keyboard/hhkb_rn42/rn42/battery.c @@ -20,7 +20,6 @@ void battery_init(void) // Ref:2.56V band-gap, Input:ADC0(PF0), Prescale:128(16MHz/128=125KHz) ADMUX = (1<<REFS1) | (1<<REFS0); ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); - ADCSRA |= (1<<ADEN); // digital input buffer disable(24.9.5) DIDR0 = (1<<ADC0D) | (1<<ADC4D) | (1<<ADC5D) | (1<<ADC7D); DIDR1 = (1<<AIN0D); @@ -92,23 +91,13 @@ uint16_t battery_voltage(void) PORTF |= (1<<4); volatile uint16_t bat; - //ADCSRA |= (1<<ADEN); - - // discard first result - ADCSRA |= (1<<ADSC); - while (ADCSRA & (1<<ADSC)) ; - bat = ADC; - - // discard second result - ADCSRA |= (1<<ADSC); - while (ADCSRA & (1<<ADSC)) ; - bat = ADC; + ADCSRA |= (1<<ADEN); ADCSRA |= (1<<ADSC); while (ADCSRA & (1<<ADSC)) ; bat = ADC; - //ADCSRA &= ~(1<<ADEN); + ADCSRA &= ~(1<<ADEN); // ADC disable voltate divider(PF4) DDRF |= (1<<4); From 2d7973fc3fa27b74379ba08392e2487e208b770a Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Wed, 3 Dec 2014 02:17:54 +0900 Subject: [PATCH 12/78] Fix: enable digital input for PF5 --- keyboard/hhkb_rn42/rn42/battery.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboard/hhkb_rn42/rn42/battery.c b/keyboard/hhkb_rn42/rn42/battery.c index 3ecde5223..34aa18446 100644 --- a/keyboard/hhkb_rn42/rn42/battery.c +++ b/keyboard/hhkb_rn42/rn42/battery.c @@ -21,7 +21,7 @@ void battery_init(void) ADMUX = (1<<REFS1) | (1<<REFS0); ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // digital input buffer disable(24.9.5) - DIDR0 = (1<<ADC0D) | (1<<ADC4D) | (1<<ADC5D) | (1<<ADC7D); + DIDR0 = (1<<ADC0D) | (1<<ADC4D) | (1<<ADC7D); DIDR1 = (1<<AIN0D); DIDR2 = (1<<ADC8D) | (1<<ADC9D) | (1<<ADC11D) | (1<<ADC12D) | (1<<ADC13D); From 86f82dd02db577cd658ca4284cae15e9664db0f2 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Wed, 3 Dec 2014 14:22:10 +0900 Subject: [PATCH 13/78] Add wait for charging capacitance of ADC S/H --- keyboard/hhkb_rn42/rn42/battery.c | 1 + 1 file changed, 1 insertion(+) diff --git a/keyboard/hhkb_rn42/rn42/battery.c b/keyboard/hhkb_rn42/rn42/battery.c index 34aa18446..7e868c964 100644 --- a/keyboard/hhkb_rn42/rn42/battery.c +++ b/keyboard/hhkb_rn42/rn42/battery.c @@ -92,6 +92,7 @@ uint16_t battery_voltage(void) volatile uint16_t bat; ADCSRA |= (1<<ADEN); + _delay_ms(1); // wait for charging S/H capacitance ADCSRA |= (1<<ADSC); while (ADCSRA & (1<<ADSC)) ; From ebe437325872045e0b99469f83cb9e877e98112c Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Wed, 3 Dec 2014 15:50:02 +0900 Subject: [PATCH 14/78] Fix power saving while USB suspended - doesn't pwoer save while Bluetooth turns on --- keyboard/hhkb_rn42/hhkb_avr.h | 4 +++- keyboard/hhkb_rn42/matrix.c | 21 ++++++++++----------- keyboard/hhkb_rn42/rn42/main.c | 14 +++++++++++--- protocol/lufa/lufa.c | 3 +++ 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/keyboard/hhkb_rn42/hhkb_avr.h b/keyboard/hhkb_rn42/hhkb_avr.h index f007d7667..0321977d1 100644 --- a/keyboard/hhkb_rn42/hhkb_avr.h +++ b/keyboard/hhkb_rn42/hhkb_avr.h @@ -53,9 +53,11 @@ static inline void KEY_POWER_OFF(void) { DDRB = 0x00; PORTB = 0xFF; // change pins input with pull-up DDRD |= (1<<4); PORTD &= ~(1<<4); // MOS FET switch off } +static inline bool KEY_POWER_STATE(void) { return PORTD & (1<<4); } #else static inline void KEY_POWER_ON(void) {} static inline void KEY_POWER_OFF(void) {} +static inline bool KEY_POWER_STATE(void) { return true; } #endif static inline void KEY_INIT(void) { @@ -73,7 +75,7 @@ static inline void KEY_INIT(void) KEY_UNABLE(); KEY_PREV_OFF(); - KEY_POWER_ON(); + KEY_POWER_OFF(); } static inline void KEY_SELECT(uint8_t ROW, uint8_t COL) { diff --git a/keyboard/hhkb_rn42/matrix.c b/keyboard/hhkb_rn42/matrix.c index 22becd105..fb9699794 100644 --- a/keyboard/hhkb_rn42/matrix.c +++ b/keyboard/hhkb_rn42/matrix.c @@ -35,7 +35,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. // matrix power saving #define MATRIX_POWER_SAVE 10000 static uint32_t matrix_last_modified = 0; -static bool matrix_power = true; // matrix state buffer(1:on, 0:off) static matrix_row_t *matrix; @@ -80,7 +79,8 @@ uint8_t matrix_scan(void) matrix_prev = matrix; matrix = tmp; - matrix_power_up(); + // power on + if (!KEY_POWER_STATE()) KEY_POWER_ON(); for (uint8_t row = 0; row < MATRIX_ROWS; row++) { for (uint8_t col = 0; col < MATRIX_COLS; col++) { KEY_SELECT(row, col); @@ -136,7 +136,14 @@ uint8_t matrix_scan(void) } if (matrix[row] ^ matrix_prev[row]) matrix_last_modified = timer_read32(); } - matrix_power_down(); + // power off + if (KEY_POWER_STATE() && + (USB_DeviceState == DEVICE_STATE_Suspended || + USB_DeviceState == DEVICE_STATE_Unattached ) && + timer_elapsed32(matrix_last_modified) > MATRIX_POWER_SAVE) { + KEY_POWER_OFF(); + suspend_power_down(); + } return 1; } @@ -176,16 +183,8 @@ void matrix_print(void) } void matrix_power_up(void) { - if (matrix_power) return; KEY_POWER_ON(); - matrix_power = true; } void matrix_power_down(void) { - if (!matrix_power) return; - // doesn't power save while USB connection is active - if (USB_DeviceState != DEVICE_STATE_Unattached) return; - if (timer_elapsed32(matrix_last_modified) <= MATRIX_POWER_SAVE) return; KEY_POWER_OFF(); - suspend_power_down(); - matrix_power = false; } diff --git a/keyboard/hhkb_rn42/rn42/main.c b/keyboard/hhkb_rn42/rn42/main.c index 42b09d8c8..83d995038 100644 --- a/keyboard/hhkb_rn42/rn42/main.c +++ b/keyboard/hhkb_rn42/rn42/main.c @@ -63,7 +63,7 @@ int main(void) USB_USBTask(); #endif } - print("USB configured.\n"); + print("\nUSB init\n"); rn42_init(); rn42_task_init(); @@ -82,10 +82,18 @@ int main(void) sleep_led_init(); #endif - print("Keyboard start.\n"); + print("Keyboard start\n"); while (1) { - while (USB_DeviceState == DEVICE_STATE_Suspended) { + while (rn42_rts() && // RN42 is off + USB_DeviceState == DEVICE_STATE_Suspended) { print("[s]"); + matrix_power_down(); + suspend_power_down(); + suspend_power_down(); + suspend_power_down(); + suspend_power_down(); + suspend_power_down(); + suspend_power_down(); suspend_power_down(); if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { USB_Device_SendRemoteWakeup(); diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index 3d6b3ea00..cdfc7bc6a 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -151,6 +151,7 @@ void EVENT_USB_Device_Connect(void) print("[C]"); /* For battery powered device */ if (!USB_IsInitialized) { + USB_Disable(); USB_Init(); USB_Device_EnableSOFEvents(); } @@ -160,6 +161,7 @@ void EVENT_USB_Device_Disconnect(void) { print("[D]"); /* For battery powered device */ + USB_IsInitialized = false; /* TODO: This doesn't work. After several plug in/outs can not be enumerated. if (USB_IsInitialized) { USB_Disable(); // Disable all interrupts @@ -177,6 +179,7 @@ void EVENT_USB_Device_Reset(void) void EVENT_USB_Device_Suspend() { print("[S]"); + matrix_power_down(); #ifdef SLEEP_LED_ENABLE sleep_led_enable(); #endif From 160e02d06a11682d994da905adb1345bc1dde249 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Mon, 8 Dec 2014 12:22:33 +0900 Subject: [PATCH 15/78] Change RN42 state display --- keyboard/hhkb_rn42/rn42/rn42_task.c | 42 ++++++++++++++++------------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/keyboard/hhkb_rn42/rn42/rn42_task.c b/keyboard/hhkb_rn42/rn42/rn42_task.c index 668626862..1ad38d372 100644 --- a/keyboard/hhkb_rn42/rn42/rn42_task.c +++ b/keyboard/hhkb_rn42/rn42/rn42_task.c @@ -96,18 +96,6 @@ void rn42_task(void) battery_led(LED_CHARGER); } - static uint8_t prev_status = UNKNOWN; - if (bs != prev_status) { - prev_status = bs; - switch (bs) { - case FULL_CHARGED: xprintf("FULL_CHARGED\n"); break; - case CHARGING: xprintf("CHARGING\n"); break; - case DISCHARGING: xprintf("DISCHARGING\n"); break; - case LOW_VOLTAGE: xprintf("LOW_VOLTAGE\n"); break; - default: xprintf("UNKNOWN STATUS\n"); break; - }; - } - /* every minute */ uint32_t t = timer_read32()/1000; if (t%60 == 0) { @@ -193,15 +181,33 @@ bool command_extra(uint8_t code) print("\n----- RN-42 info -----\n"); xprintf("protocol: %s\n", (host_get_driver() == &rn42_driver) ? "RN-42" : "LUFA"); xprintf("force_usb: %X\n", force_usb); + xprintf("rn42: %s\n", rn42_rts() ? "OFF" : (rn42_linked() ? "CONN" : "ON")); xprintf("rn42_autoconnecting(): %X\n", rn42_autoconnecting()); - xprintf("rn42_linked(): %X\n", rn42_linked()); - xprintf("rn42_rts(): %X\n", rn42_rts()); xprintf("config_mode: %X\n", config_mode); - xprintf("USB_DeviceState: %X\n", USB_DeviceState); - xprintf("USB_Device_RemoteWakeupEnabled: %X\n", USB_Device_RemoteWakeupEnabled); + xprintf("USB State: %s\n", + (USB_DeviceState == DEVICE_STATE_Unattached) ? "Unattached" : + (USB_DeviceState == DEVICE_STATE_Powered) ? "Powered" : + (USB_DeviceState == DEVICE_STATE_Default) ? "Default" : + (USB_DeviceState == DEVICE_STATE_Addressed) ? "Addressed" : + (USB_DeviceState == DEVICE_STATE_Configured) ? "Configured" : + (USB_DeviceState == DEVICE_STATE_Suspended) ? "Suspended" : "?"); + xprintf("battery: "); + switch (battery_status()) { + case FULL_CHARGED: xprintf("FULL"); break; + case CHARGING: xprintf("CHARG"); break; + case DISCHARGING: xprintf("DISCHG"); break; + case LOW_VOLTAGE: xprintf("LOW"); break; + default: xprintf("?"); break; + }; + xprintf("\n"); + xprintf("RemoteWakeupEnabled: %X\n", USB_Device_RemoteWakeupEnabled); xprintf("VBUS: %X\n", USBSTA&(1<<VBUS)); - xprintf("battery_charging: %X\n", battery_charging()); - xprintf("battery_status: %X\n", battery_status()); + t = timer_read32()/1000; + uint8_t d = t/3600/24; + uint8_t h = t/3600; + uint8_t m = t%3600/60; + uint8_t s = t%60; + xprintf("uptime: %02ud%02u:%02u:%02u\n", d, h, m, s); return true; case KC_B: // battery monitor From 884c2ab0f20e62ebd01ca0fd634f7f60558e3088 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Fri, 12 Dec 2014 08:25:16 +0900 Subject: [PATCH 16/78] Update doc --- keyboard/hhkb_rn42/MEMO.txt | 548 ++++++------------------------- keyboard/hhkb_rn42/PowerSave.txt | 13 + 2 files changed, 119 insertions(+), 442 deletions(-) diff --git a/keyboard/hhkb_rn42/MEMO.txt b/keyboard/hhkb_rn42/MEMO.txt index e623c0013..f2aaa7c04 100644 --- a/keyboard/hhkb_rn42/MEMO.txt +++ b/keyboard/hhkb_rn42/MEMO.txt @@ -4,7 +4,7 @@ Roving RN-42 Bug: - with Nexus5 keyboard and mouse are very laggy. -- lose USB connection during power-down mode +- lose USB connection during power-down mode - DONE - USB initialize code in main() causes this - WRONG - Do not power-down during USB connection is active - DONE 11/11 (USB_DeviceState == USB_DEVICE_Configured) is used to check USB connection @@ -18,7 +18,7 @@ Bug: - time out interrupt is lost while power down? - interrupt of watchdog timer compensates timer counter(avr/suspend.c) -- USB plug-in while BT failes +- USB plug-in fails while BT - it ends in suspend state - maybe, not responsive to host enumeration process due to power-down. - matrix_power_down() only when state is unattached - 11/26 @@ -26,19 +26,49 @@ Bug: - repeated CHARGING/FULL_CHARGED - In LTC sharp pulses are observed. - MCP has no pulse but still has a problem. - - needs more wait before read pin state? -- wrongly suspended when powered from adapter without USB connection + - needs more wait before read pin state? - NO +- wrongly suspended when powered from adapter without USB connection - DONE - suspend event may occur when plug into adapter - and never wake until conected to real USB line - without debug print via USB no problem; CSW(wake just after suspend as real USB line) - seems like USB print causes this problem after suspended +- Factory Reset PIO4 doesn't work + - the reason is unclear - 12/08 NOT LOOK INTO ANY MORE + - WORKAROUND: use serial pins(3.3V, GND, RX and TX) + - SF,1 and R,1 to set factory defalult + + Todo: -- sendchar() in lufa.c block loop - 11/29 - - block loop when powered with AC adapter - - FrameNumber is not updated when adapter powered +- LED cover and switch knob and new Slide Switch +- RN42 auto configuration + - configure the module as HID device every time powering up + - this'll reduce work load of assembly + +- move rn42 to protocol directory when it becomes reusable stack + - sendchar() in lufa.c no buffer - no buffering. character lost can be caused. +- LUFA sendchar should be buffered and serial_uart.c buffur size is too large(256). + +- switch BT host connections +- BT operations + - disconnect + - new connection + - switch next connection + - remove connection + +- sendchar() in lufa.c block loop - DONE 11/29 + - block loop when powered with AC adapter + - FrameNumber is not updated when adapter powered + +Improving: +- ADC resolution + AVR120 + AVR32138 + - Enhancing ADC resolution by oversampling + AVR121 http://www.atmel.com/images/doc8003.pdf + - disable digital input buffer DIDR(7.8.6) Design: - suspend.h - DONE 11/26 @@ -85,6 +115,24 @@ USB connection check: state of USB deivce Power saving: +- Pro2 current consumption + - active: 138.2mA(no device on Hub) + - suspended: 30.9mA(WakeUp enabled DIPSW6) + - suspended: 0mA->46.0mA(WakeUp disabled DIPSW6) +- Pro current consumption + - active: 54.0mA + - suspended: 40.5mA(WakeUp enabled DIPSW6) + - suspended: 0.3mA(WakeUp disabled DIPSW6) + +- RN42 3.3V + - disconnected(Idle): 5mA (config mode) + - connected(Active): + SW,0000: 23-26mA + SW,0010: 27-29mA worse than 0000 for unknown reason + SW,0020: 17-19mA mouse NG + SW,0030: 13-16mA laggy mouse NG + SW,0050: 10-13mA laggy mouse NG + - matrix power saving - power saving while externally powered and not while unpluged - confirm suspend mode lufa.c: matrix_power_*, suspend_wakeup_condition @@ -105,136 +153,12 @@ Power saving: - Suspend: Clear Suspend Bit, Freeze clock, disable PLL, MCU sleep(21.13) - Voltage reference(8.1.1) - to reduce power consumption while power down mode - -Improving: -- BT LED; connecting, linked, sleeping, deep sleeping -- Battry LED; blink(using timer?) -- move rn42 to protocol directory when it becomes reusable stack -- LUFA sendchar should be buffered and serial_uart.c buffur size is too large(256). -- ADC resolution - AVR120 - AVR32138 - - Enhancing ADC resolution by oversampling - AVR121 http://www.atmel.com/images/doc8003.pdf - - -Testing: -- Factroy reset doesn't work; need to **test again** 10K pull-up is too high? -- Lipo voltage ADC value is not stabilized -- DCDC converter: squeaky inducter; try other inductors - -- Keymap layer bug: during space is pressed(mousekey) press Fn(HHKB) then release space before Fn, in result HHKB layer is locked(toggled) unintentionally. - - -Done: -- low battery alert(solid light) 09/04 - - -Power routing -------------- -Current: -(USB) +---(Lipo) - | | | - | | +------+ DPDT - | | |Switch/-----------------------+ - | | +------+ | - | +-------+ | | - +-|Charger| | | - | +-------+ | +---+ | - | | |MCU| | - | | +---+ | - | | | | - | | | | -+--------------+ +-----+ +------+ +---/--+ +-----+ -|Power Selector|--|DC 5V|--|DC3.3V|---|Switch|----|RN-42| -+--------------+ +-----+ +------+ +------+ +-----+ -USB Power is boosted unnecessarily, not harmful? - -Idea 1: -(USB) +---(Lipo) - | | | - | | +------+ DPDT - | | |Switch/----------+ - | | +------+ | - | +-------+ | | - +-|Charger| | | - | +-------+ | +---+ | - | +-----+ |MCU| | - | |DC 5V| +---+ | - | +-----+ | | - | | | | -+--------------+ | +---/--+ +------+ +-----+ -|Power Selector|-----+---|Switch|----|DC3.3V|-----|RN-42| -+--------------+ +------+ +------+ +-----+ -To enable BT when USB powered it still needs to turn siwtch on, Lipo consumes quinscent current at 5V converter in vain.(Not good) - -Idea 2: -(USB) +---(Lipo) - | | | - | | +------+ - | | |Switch| - | | +------+ - | +-------+ | - +-|Charger| | - | +-------+ | +---+ - | +-----+ |MCU|----+ Controlled by firmware - | |DC 5V| +---+ | On: Lipo powered - | +-----+ | | Off: USB powered - | | | |enable -+--------------+ | +------+ +-----+ -|Power Selector|-----+---|DC3.3V|-----|RN-42| -+--------------+ +------+ +-----+ -MCU can controlled power of RN-42 without hardware switch. -When USB powered and switch is on Lipo consumes quinscent current at 5V converter in vain.(Not good) - -Idea 3: -(USB) +---(Lipo) - | | | - | | +------+ - | | |Switch|SPST(or without) - | | +------+ - | +-------+ | - +-|Charger| | - | +-------+ | +---+ - | | |MCU|----+ Controlled by firmware - | | +---+ | On: Lipo powered - | | | | Off: USB powered - | | | |enable -+--------------+ +-----+ +------+ +-----+ -|Power Selector|-|DC 5V|-|DC3.3V|-----|RN-42| -+--------------+ +-----+ +------+ +-----+ -Switch is needed to save Lipo when not used because decent power saving is not available now. If firmware can turn off BT module completely and make MCU deep sleep the switch will be not even needed. +- unset ADEN before sleep(24.7) -DONE: -- BT_INDICATOR LED turns on wrongly when touching line or pin. -- pull-up enabled on PF6/GPIO2 08/30 -- Lipo charger configuration: fast charge time: USB charger spec? -- used 2kohm -- use LED of charger to alarm low battery. LED should be powered directly from Lipo? - cancel; powered from VUSB -- Use RTS in serial_uart.c to resolve missing chars from help message of RN-42 - done -- CTS/RTS lines are needed? just connect in loop back if no flow control is needed. - done -- add IO pin to charger status CHRG; LED control(low) and detect charge status(input HiZ) 07.24 -- LINKED: add trace on PIO2 to PF6 07.24 -- Lipo voltage ADC sensing -- Lipo charger MCP73831: needs capacitor 4.7uF *2 -- USB connection check - 07.01 -- BT on/off check: whether RX line is pulled up? - checking RTS 07.01 -- USB/BT switching BT is on -> BT, BT is off -> USB - 07.01 -- Under voltage lock out UVLO for protection of Lipo - Lipo has discharge protection at 3.100V 07.01 -- Power saving: HHKB scan, BT radio control - 9h with 850mAh, this is enough 07.01 -- Power selector doesn't work; Q4 MOSFET leaks from Lipo to USB power line. -- use Schottky instead 07/04 - - - -TROUBLE SHOOT -------------- -07/16 After fix of voltage dividor on GPIO6, had a trouble that it could not send a char to BT module, though could receive. - Found R8 had wrong 1K resistor and changed to 10K, after that it can send to the module again. Not sure how it had sent with the wrong 1K before. - -07/18 On Linux, had an USB related trouble; keyobard or console didn't work for some reason. Changing PID cured this problem. Very annoying, took very long time before resolved it. - Lipo @@ -249,7 +173,7 @@ Protection spec: http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Prototyping/BatteryProtection.pdf min typical max over-charge 4.255 4.280 4.305 - over-charge discover? 4.030 4.080 4.130 + over-charge discover? 4.030 4.080 4.130 over-discharge 2.827 2.900 2.973 over-discharge discover 3.022 3.100 3.178 @@ -260,325 +184,65 @@ ADC voltage monitor: voltage divider 10K+10K(0.5) ------------------ 4.20 0x347(839) 3.10 0x26b(619) - -Configuration + +TROUBLE SHOOT ------------- -Ver 6.15 04/26/2013 -(c) Roving Networks -***Settings*** -BTA=0006664B3AE3 -BTName=tmkBT-3AE3 -Baudrt(SW4)=115K -Mode =DTR -Authen=2 -Bonded=0 -Rem=000000000000 -***ADVANCED Settings*** -SrvName= keyboard/mouse -SrvClass=0000 -DevClass=0000 -InqWindw=0100 -PagWindw=0100 -CfgTimer=255 -StatuStr=NULL -HidFlags=3c -DTRtimer=8 -KeySwapr=0 -***OTHER Settings*** -Profile= HID -CfgChar= $ -SniffEna=8010 -LowPower=0 -TX Power=0 -IOPorts= 0 -IOValues=0 -Sleeptmr=0 -DebugMod=0 -RoleSwch=0 +07/16 After fix of voltage dividor on GPIO6, had a trouble that it could not send a char to BT module, though could receive. + Found R8 had wrong 1K resistor and changed to 10K, after that it can send to the module again. Not sure how it had sent with the wrong 1K before. +07/18 On Linux, had an USB related trouble; keyobard or console didn't work for some reason. Changing PID cured this problem. Very annoying, took very long time before resolved it. - -Serial connection ------------------ -Serial line: 115200bps, 8bit, 1-stopbit, non-parity, no flow control -SSP: 115200bps, 8bit, 1-stopbit, non-parity, no flow control(via Bluetooth) - -To enter command mode disconnect the module from host and type '$$$'.(you will see 'CMD') -To exit type '---'(you will see 'END') and '+' to get local echo. - - - -Setting command mode --------------------- -S-,tmkBT // Device name -SS,keyboard/mouse // service name -SM,4 // Auto Connect DTR mode -SW,8010 // Sniff enable 0x10*0.625ms=10ms; 50ms is laggish and not much power save -S~,6 // HID profile -SH,003C // HID register -SY,0004 // Transmit power +12/07 rn42_rts() read 1 every time. R12 broke in open mode(no coductive), idk why, too much heat with soldering? and PF1 pin was not soldered. + It resolved with resoldering PF1 and new resistor on R12. -Other options: -SC,0000 // COD: 000005C0 (see HID spec/Bluegiga doc) -SD,05C0 // bit 12-8 7 6 5-0 - // 00101 1 1 0 - // peripheral pointing keybaord joystick, gamepad, ... -SM,6 // Pairing mode: auto connect -SM,4 // Master mode: Connection can be controled with GPIO6 +Done: +- low battery alert(solid light) 09/04 +- *** Rev.E BT test *** - DONE + - with MCP73832, new Schottky, tantalum caps - DONE 12/07 + * MCP73832 doesn't leak from Vcc pin when unpluged and battery powered + 34mV vs 2.07V(MCP73831) at Vcc pin + MCP73832 doesn't need revese protection diode D5 + * PMEG2010ER is very low VF while reverse current/voltage is high + VF=0.96 vs 1.98(RB160M-30TR)with Fluke 175 + Anode of D11 is 680mV vs 20mV(RB160M-30TR) + 780mV is still low < 1.4V VBUS plugin detection(21.11) + this doesn't cause false VBUS detect + and 780mV on MCP73832 Vcc pin is also no problem. + D5 can be removed. + - ADC divider switching - DONE 12/07 + * Drain and Source of Q4 Pch was reversed wrongly on Rev.E. + + - reverse current from Lipo charger - DONE 12/07 + * MCP73832 has no recverse current from Vcc pin unlike MCP73831 + + +- Rev.F design - DONE + - current measure point - DONE 12/08 + - change value of cap 68->47 - DONE 12/08 + - PPTC land pattern: no solder jumper, use 0Ohm resistor instead - CANCEL 12/08 + - Q4 Pch FET: wrong Drain and Source - DONE 12/08 + - D5 can be removed. - DONE 12/08 - -HID profile ------------ -S~,6 HID profile -S~,0 SPP profile -R,1 reboot - - -Apple iOS ---------- -Keyboard can be used with iPhone, but mouse cannot. -To operate iOS with keyboard is not so useful, though. -There may be iOS specific scancodes? - - -HID flag register ------------------ -SH,0200 -GH - -10 0000 0000(0200) default -00 0011 1000(0038) Combo -|| | | |\_\____ number of paired devices to which the module can reconnect -|| | | \_______ send out reports over UART (0xFF <len> <data>) -|| \__\_________ descriptor type -|\______________ toggle virtual keyboard on iOS when first connected -\_______________ Force HID mode if GPIO11 is high on power-up - - Descriptor type: - 0000: keybaord - 0001: Game Pad - 0010: Mouse - 0011: Combo - 0100: Joystick - 1xxx: reserved - - -Out report - Indicator ----------------------- -0xFE 0x02 0x01 <LED_state> - - -LED Status ----------- -Configuring 10 times per sec -Startup/configuration timer 2 times per sec -Discoverable/Inquiring/Idle once per sec -Connected solid on - - -Pairing -------- -First, host initiates pairing process and once it is done, auto connect will work thereafter. -SM,3 Master mode -SM,4 Auto Connect DTR Mode uses GPIO6 to make and break connection(Mode =DTR) - confirm: auto connect works and control connection with GPIO6 -SM,5 Auto Connect ANY Mode (Mode =ANY) - each time GPIO is set, make inquiry and connect to the first found device -SM,6 automatically reconnect(Mode =Pair) - confirm: auto connect works well but difficult to enter command mode. - -SR,Z removes all remote addresses for reconnecting. - can be used to connect another host -SR,I registers last inquiry address - - -Fast data mode --------------- -The module enters fast data mode after 'remote configuration timer' window is passed from power on. -In this mode the module does not accept '$$$' to enter command mode. - -Power Management ----------------- -Inquiry and Page window Idle or Active (3.1.1) - Downside: delay in discovery or connection time - SI, // set inquiry scan window(discovery) on/off duty? - SJ, // set page scan window(connection) - This reduces averaege power >20mA to 5mA(3mA in Sniff mode) - -Sniff mode Transmit - Sniff mode is disabled by default and radio is active continuously when connected.(25-30mA) - In Sniff mode the radio wakes up intermittently and sleeps in very low power mode.(2mA) - SW,<val> // set interval timer(*0.625ms) 0000-7FFF - -Deep sleep Idle (3.1.2) - In this mode the module shuts down completly and only draws about 300uA. To enable this set the most signifant bit(0x8000) of Sniff interaval timer. - SW,8320 // deep sleep enable(interval=0x320*0.625=500ms) - In normal sleep the firmware is still running in idle mode, and wakes up about 20 times per second to check ports, update LEDs, etc. During deep sleep, the firmware actually stops runnig some tasks and the LEDs only update about once per second. - To wake from deep sleep there are three ways: (in worst case wake up takes 5ms) - *send a charactor to the UART(first charactor will be lost) - *toggle CTS low to high and wait 5ms - *wake automatically every slot time(<val>*0.625ms) - Once the radio is awake it stay active for exactly 1 second of inactivity and then sleeps again. - Downside: latency and data loss - -Disable Output driver Idle or Active (3.1.3) - S%,1000 // set all GPIO pins(0-11) to inputs. - -Lower Transmit Power Idle or Active (3.1.4) - SY,<hex> // transmit power setting(takes effect after a power cycle and reboot) - Downside: reducing effective range - - -Optimizig for Latency ---------------------- -By default the firmware is optimized for throughput. -SQ,16 // set latency bit -SQ,0 // unset latency bit - - -Configuration timer settings ----------------------------- -Remote configuration is used for the module to be configured with various commands over Bluetooth(SPP profile only?). - -The module has remote configuration timer to allow remote configuration over Bluetooth after power up in Slave mode. In Master modes the remote configuration timer is set to 0(no remote configuration). (In Trigger Master mode the timer is used as an idle timer to break the connection after time expires with no charactors receive.) - ST,0 // no remote, no local when connected - ST,<1-252> // local and remote with timeout in seconds from power up - ST,253 // local only without timeout - ST,254 // remote only without timeout - ST,255 // local and remote without timeout - - -Android -------- -3.7.1.5 Note: To connect with Android phone the modules must wake up 11ms every 2.5seconds. - - -Commands --------- -SC, -SM,<val> -SD, -SP,<string> Pin code(alpahnumeric) -SQ,<mask> Special configuration(GPIO, discovery mode, low latency, reboot, UART) -SR,<hex> Store remote address -SR,Z Erase all address -SS,<string> Set service name(1-20)** -ST,<val> Remote configuration timer(Master:0, Slave:0-255, Triger:as idle timer) -SU,<val> UART baud rate -SW,<val> low-power sniff mode** deep sleep and wake up every 625us * <val> -SX,<0|1> bonding enable only acceps device that matches the stored address -SY,<hex> power setting** -SZ,<val> non-standard raw baud rate <val>=baud*0.004096 -S~,<val> Profile 0:SPP, 5:APL, 6:HID -S-,<string> Device name -15 alphanumeric charactors -S?,<0|1> role switch enable -S$,<char> command mode char -$|,<hex> low-power connect mode deep sleep/active(discoverable and connectable) cycle -D display basic setting -E display extended setting -GB display the device's Bluetooth address -GF display Bluetooth address of connected device -GK show connection status -GR show remote address for reconnecting -G& show GPIO pin -G<char> show stored setting -+ toggle local echo on/off -& show GPIO 3,4,6,7(DIP switch) -C connect to stored remote address -C,<address> connect last address -CFI connect and go into fast data mode -CFR connect and go into fast data mode -CT,<address>,<val> connect to the address and disconnect after val? -F,1 fast data mod: -H display help -I,<time>,<cod> inquiry scan with <cod> -IN -IQ scan -IS inquiry scan with 001F00 -J hide pin code -K, kill disconnects current connection -L link quality -M show modem signlal status -O display other settings -P,<car> pass through? -Q quiet mode make the module not discoverable -Q,0 discoverable and connectable -Q,1 not discoverable and not connectable -Q,2 not discoverable and connectable -Q,? display current quiet mode -R,1 reboot -T,<0|1> pass received data while in command mode -U,<baud>,<parity> change UART setting tentatively -V display firmware version -W wake from quiet mode enable discovery and connection -Z deep sleep mode(<2mA) - - - -help ----- -*** SET COMMANDS *** -SA,<3,0> - Authentication -SC,<hex> - Service Class -SD,<hex> - Device Class -SE,<1-16> - UUID -SF,1 - Factory Defaults -SH,<hex> - HID flags -SI,<hex> - Inquiry Scan Window -SJ,<hex> - Page Scan Window -SL,<E,O,N> - Parity -SM,<0-5> - Mode (0=slav,1=mstr,2=trig,3=auto,4=DTR,5=Any) -SN,<name> - Name -SO,<text> - conn/discon Status -SP,<text> - Pin Code -SR,<adr> - Remote Address -SS,<text> - Service Name -ST,<num> - Config Timer -SU,<rate> - Baudrate -SW,<hex> - Sniff Rate -SX,<1,0> - Bonding -SY,<hex> - TX power -SZ,<num> - Raw Baudrate -S~,<0-6> - Profile (0=SPP,1=DCE,2=DTE,3=MDM,4=D&S,6=HID -S?,<0-1> - role switch -S$,<char> - CMD mode char -S@,<hex> - io port dir -S&,<hex> - io port val -S%,<hex> - io boot dir -S^,<hex> - io boot val -S*,<hex> - pio(8-11) set -S|,<hex> - low power timers -S+,<num> - DTR timer -S=,<hex> - Key mapper -S:,<num> - sleep timer -*** DISPLAY *** -D - Basic Settings -E - Extended Settings -G<X> - Stored setting -GB - BT Address -GF - BT Address of Last Connection -GK - Connect Status -G& - I/O Ports -V - Firmare version -*** OTHER *** -C,<adr> - Connect -F,1 - Fast Mode -I,<time>,<cod> - Device Scan Inquiry -J - Hide Pin Code -K, - Kill (disconnect) -L, - toggle local echo -P,<text> - Pass Thru -Q - Quiet (no discovery) -R,1 - Reboot -T,<0,1> - send data in CMD mode -U,<rate>,<E,O,N> - Temp Uart Change -Z - low power sleep -& - Read switches +- BT_INDICATOR LED turns on wrongly when touching line or pin. -- pull-up enabled on PF6/GPIO2 08/30 +- Lipo charger configuration: fast charge time: USB charger spec? -- used 2kohm +- use LED of charger to alarm low battery. LED should be powered directly from Lipo? - cancel; powered from VUSB +- Use RTS in serial_uart.c to resolve missing chars from help message of RN-42 - done +- CTS/RTS lines are needed? just connect in loop back if no flow control is needed. - done +- add IO pin to charger status CHRG; LED control(low) and detect charge status(input HiZ) 07.24 +- LINKED: add trace on PIO2 to PF6 07.24 +- Lipo voltage ADC sensing +- Lipo charger MCP73831: needs capacitor 4.7uF *2 +- USB connection check - 07.01 +- BT on/off check: whether RX line is pulled up? - checking RTS 07.01 +- USB/BT switching BT is on -> BT, BT is off -> USB - 07.01 +- Under voltage lock out UVLO for protection of Lipo - Lipo has discharge protection at 3.100V 07.01 +- Power saving: HHKB scan, BT radio control - 9h with 850mAh, this is enough 07.01 +- Power selector doesn't work; Q4 MOSFET leaks from Lipo to USB power line. -- use Schottky instead 07/04 diff --git a/keyboard/hhkb_rn42/PowerSave.txt b/keyboard/hhkb_rn42/PowerSave.txt index 943923c33..9aa89f441 100644 --- a/keyboard/hhkb_rn42/PowerSave.txt +++ b/keyboard/hhkb_rn42/PowerSave.txt @@ -1,6 +1,19 @@ RN-42 ===== + +12/11 +Power Comsumption +MCU+HHKB +-------- +Battery drive: + idle 18.9mA + active 35.8mA + +USB powered: + 40.0mA + + HHKB key switch power control ----------------------------- MOS FET Nch: BSS138 or IRLML6344T, either works and no apparent difference. From a679928620c68e346fcfc864e8de632ce8c997c3 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Tue, 6 Jan 2015 03:22:41 +0900 Subject: [PATCH 17/78] Fxi layer stuck of keymap_hasu - In mouse key layer with holding semicolon, press Fn0, release semicolon and release Fn0 now layer 1 is stuck. --- keyboard/hhkb_rn42/keymap_hasu.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/keyboard/hhkb_rn42/keymap_hasu.c b/keyboard/hhkb_rn42/keymap_hasu.c index 7b9378908..433f9cb27 100644 --- a/keyboard/hhkb_rn42/keymap_hasu.c +++ b/keyboard/hhkb_rn42/keymap_hasu.c @@ -47,7 +47,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, BSPC, \ LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,TRNS, \ - LGUI,LALT, SPC, RALT,RGUI), + LGUI,LALT, TRNS, RALT,RGUI), /* Layer 2: Vi mode[Slash] * ,-----------------------------------------------------------. @@ -66,7 +66,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS,RSFT,NO, \ + LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,TRNS, \ LGUI,LALT, SPC, RALT,RGUI), /* Layer 3: Mouse mode(IJKL)[Semicolon] @@ -81,16 +81,16 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * `-----------------------------------------------------------' * |Gui |Alt | Mb1 |Fn |Fn | * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel8 + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ [3] = \ KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, LEFT,WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ - LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,TRNS,NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,NO, \ + FN8, NO, NO, NO, NO, NO, NO, WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ + LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,FN3, NO, ENT, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,TRNS, \ LGUI,LALT, BTN1, TRNS,TRNS), - /* Layer 5: Mouse mode(IJKL)[Space] + /* Layer 4: Mouse mode(IJKL)[Space] * ,-----------------------------------------------------------. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| * |-----------------------------------------------------------| @@ -102,13 +102,13 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * `-----------------------------------------------------------' * |Gui |Alt | Mb1 |Fn |Fn | * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel8 + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ [4] = \ KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, LEFT,WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ + FN8, NO, NO, NO, NO, NO, NO, WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ LCTL,VOLD,VOLU,MUTE,NO, NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,NO, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,TRNS, \ LGUI,LALT, TRNS, TRNS,TRNS), #if 0 @@ -127,7 +127,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - TAB, NO, NO, NO, NO, NO, LEFT,WH_D,WH_U,RGHT,NO, NO, NO, BSPC, \ + TAB, NO, NO, NO, NO, NO, NO, WH_D,WH_U,RGHT,NO, NO, NO, BSPC, \ LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,TRNS,QUOT,ENT, \ LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,SLSH,RSFT,NO, \ LGUI,LALT, BTN1, RALT,TRNS), @@ -147,7 +147,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, LEFT,WH_D,WH_U,RGHT,NO, FN9, FN10,FN8, \ + FN8, NO, NO, NO, NO, NO, NO, WH_D,WH_U,RGHT,NO, FN9, FN10,FN8, \ LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,BTN1,NO, ENT, \ LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,NO, \ LGUI,LALT, TRNS, RALT,RGUI), From 4f121de7ad7782cde7d9d5c04adb3ef2561c5eaf Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Sun, 11 Jan 2015 02:39:32 +0900 Subject: [PATCH 18/78] rn42: Add rn42_getc and rn42_gets --- keyboard/hhkb_rn42/rn42/rn42.c | 29 +++++++++++++++++++++++++++++ keyboard/hhkb_rn42/rn42/rn42.h | 3 +++ 2 files changed, 32 insertions(+) diff --git a/keyboard/hhkb_rn42/rn42/rn42.c b/keyboard/hhkb_rn42/rn42/rn42.c index 1565b4cf1..aa6015cbf 100644 --- a/keyboard/hhkb_rn42/rn42/rn42.c +++ b/keyboard/hhkb_rn42/rn42/rn42.c @@ -4,6 +4,7 @@ #include "serial.h" #include "rn42.h" #include "print.h" +#include "timer.h" #include "wait.h" @@ -47,11 +48,39 @@ void rn42_init(void) serial_init(); } +int16_t rn42_getc(void) +{ + return serial_recv2(); +} + +char *rn42_gets(uint16_t timeout) +{ + static char s[16]; + uint16_t t = timer_read(); + uint8_t i = 0; + int16_t c; + while (i < 15 && timer_elapsed(t) < timeout) { + if ((c = rn42_getc()) != -1) { + if ((char)c == '\r') continue; + if ((char)c == '\n') break; + s[i++] = c; + } + } + s[i] = '\0'; + return s; +} + void rn42_putc(uint8_t c) { serial_send(c); } +void rn42_puts(char *s) +{ + while (*s) + serial_send(*s++); +} + bool rn42_autoconnecting(void) { // GPIO6 for control connection(high: auto connect, low: disconnect) diff --git a/keyboard/hhkb_rn42/rn42/rn42.h b/keyboard/hhkb_rn42/rn42/rn42.h index 5283a3648..86090be7c 100644 --- a/keyboard/hhkb_rn42/rn42/rn42.h +++ b/keyboard/hhkb_rn42/rn42/rn42.h @@ -7,7 +7,10 @@ host_driver_t rn42_driver; host_driver_t rn42_config_driver; void rn42_init(void); +int16_t rn42_getc(void); +char *rn42_gets(uint16_t timeout); void rn42_putc(uint8_t c); +void rn42_puts(char *s); bool rn42_autoconnecting(void); void rn42_autoconnect(void); void rn42_disconnect(void); From 1b95b3c51a0eee5c8e47b189ece68ac55d7e4069 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Sun, 11 Jan 2015 07:00:41 +0900 Subject: [PATCH 19/78] rn42: Add commands for RN-42 --- keyboard/hhkb_rn42/rn42/rn42_task.c | 234 ++++++++++++++++++---------- 1 file changed, 153 insertions(+), 81 deletions(-) diff --git a/keyboard/hhkb_rn42/rn42/rn42_task.c b/keyboard/hhkb_rn42/rn42/rn42_task.c index 1ad38d372..e58bb427a 100644 --- a/keyboard/hhkb_rn42/rn42/rn42_task.c +++ b/keyboard/hhkb_rn42/rn42/rn42_task.c @@ -1,4 +1,5 @@ #include <stdint.h> +#include <string.h> #include "keycode.h" #include "serial.h" #include "host.h" @@ -9,6 +10,7 @@ #include "print.h" #include "debug.h" #include "timer.h" +#include "wait.h" #include "command.h" #include "battery.h" @@ -34,39 +36,34 @@ void rn42_task_init(void) void rn42_task(void) { int16_t c; - if (config_mode) { - // Config mode: print output from RN-42 - while ((c = serial_recv2()) != -1) { - // without flow control it'll fail to receive data when flooded - xprintf("%c", c); - } - } else { - // Raw mode: interpret output report of LED state - while ((c = serial_recv2()) != -1) { - // LED Out report: 0xFE, 0x02, 0x01, <leds> - // To get the report over UART set bit3 with SH, command. - static enum {LED_INIT, LED_FE, LED_02, LED_01} state = LED_INIT; - switch (state) { - case LED_INIT: - if (c == 0xFE) state = LED_FE; - else state = LED_INIT; - break; - case LED_FE: - if (c == 0x02) state = LED_02; - else state = LED_INIT; - break; - case LED_02: - if (c == 0x01) state = LED_01; - else state = LED_INIT; - break; - case LED_01: - dprintf("LED status: %02X\n", c); - rn42_set_leds(c); - state = LED_INIT; - break; - default: - state = LED_INIT; - } + // Raw mode: interpret output report of LED state + while ((c = rn42_getc()) != -1) { + // LED Out report: 0xFE, 0x02, 0x01, <leds> + // To get the report over UART set bit3 with SH, command. + static enum {LED_INIT, LED_FE, LED_02, LED_01} state = LED_INIT; + switch (state) { + case LED_INIT: + if (c == 0xFE) state = LED_FE; + else { + if (0x0 <= c && c <= 0x7f) xprintf("%c", c); + else xprintf(" %02X", c); + } + break; + case LED_FE: + if (c == 0x02) state = LED_02; + else state = LED_INIT; + break; + case LED_02: + if (c == 0x01) state = LED_01; + else state = LED_INIT; + break; + case LED_01: + dprintf("LED status: %02X\n", c); + rn42_set_leds(c); + state = LED_INIT; + break; + default: + state = LED_INIT; } } @@ -103,7 +100,7 @@ void rn42_task(void) uint8_t h = t/3600; uint8_t m = t%3600/60; uint8_t s = t%60; - xprintf("%02u:%02u:%02u\t%umV\n", h, m, s, v); + dprintf("%02u:%02u:%02u\t%umV\n", h, m, s, v); /* TODO: xprintf doesn't work for this. xprintf("%02u:%02u:%02u\t%umV\n", (t/3600), (t%3600/60), (t%60), v); */ @@ -124,59 +121,105 @@ void rn42_task(void) /****************************************************************************** * Command ******************************************************************************/ +static host_driver_t *prev_driver = &rn42_driver; + +static void print_rn42(void) +{ + int16_t c; + while ((c = rn42_getc()) != -1) { + xprintf("%c", c); + } +} + +static void clear_rn42(void) +{ + while (rn42_getc() != -1) ; +} + +static void enter_command_mode(void) +{ + // RN-42 disconnect + prev_driver = host_get_driver(); + clear_keyboard(); + host_set_driver(&rn42_config_driver); // null driver; not to send a key to host + rn42_disconnect(); + print("\nRN-42: disconnect\n"); + + print("Entering config mode ...\n"); + wait_ms(1000); + rn42_puts("$$$"); // Command mode + wait_ms(1000); + rn42_puts("+\r\n"); // Local echo on + print_rn42(); +} + +static void exit_command_mode(void) +{ + print("Exiting config mode ...\n"); + rn42_puts("+\r\n"); // Local echo off + wait_ms(500); + rn42_puts("---\r\n"); + wait_ms(500); + print_rn42(); + + rn42_autoconnect(); + print("RN-42: auto_connect\n"); + host_set_driver(prev_driver); +} + +static void init_rn42(void) +{ + // RN-42 configure + if (!config_mode) enter_command_mode(); + rn42_puts("SF,1\r\n"); // factory defaults + wait_ms(500); print_rn42(); + rn42_puts("S-,TmkBT\r\n"); + wait_ms(500); print_rn42(); + rn42_puts("SS,Keyboard/Mouse\r\n"); + wait_ms(500); print_rn42(); + rn42_puts("SM,4\r\n"); // auto connect(DTR) + wait_ms(500); print_rn42(); + rn42_puts("SW,8000\r\n"); // Sniff disable + wait_ms(500); print_rn42(); + rn42_puts("S~,6\r\n"); // HID profile + wait_ms(500); print_rn42(); + rn42_puts("SH,003C\r\n"); // combo device, out-report, 4-reconnect + wait_ms(500); print_rn42(); + rn42_puts("SY,FFF4\r\n"); // transmit power -12 + wait_ms(500); print_rn42(); + rn42_puts("R,1\r\n"); + wait_ms(500); print_rn42(); + if (!config_mode) exit_command_mode(); +} + +static void connect(uint8_t *addr) +{ + enter_command_mode(); +} + +static void pairng(void) +{ +} + bool command_extra(uint8_t code) { uint32_t t; uint16_t b; - static host_driver_t *prev_driver = &rn42_driver; switch (code) { case KC_H: case KC_SLASH: /* ? */ print("\n\n----- Bluetooth RN-42 Help -----\n"); - print("Del: enter/exit config mode(auto_connect/disconnect)\n"); - print("i: RN-42 info\n"); - print("b: battery voltage\n"); + print("i: RN-42 info\n"); + print("b: battery voltage\n"); + print("Del: enter/exit RN-42 config mode\n"); + print("Slck: RN-42 initialize\n"); if (config_mode) { return true; } else { - print("u: Force USB mode\n"); + print("u: toggle Force USB mode\n"); return false; // to display default command help } - case KC_DELETE: - if (rn42_autoconnecting()) { - prev_driver = host_get_driver(); - clear_keyboard(); - _delay_ms(500); - host_set_driver(&rn42_config_driver); // null driver; not to send a key to host - rn42_disconnect(); - print("\nRN-42: disconnect\n"); - print("Enter config mode\n"); - print("type $$$ to start and + for local echo\n"); - command_state = CONSOLE; - config_mode = true; - } else { - rn42_autoconnect(); - print("\nRN-42: auto_connect\n"); - print("Exit config mode\n"); - command_state = ONESHOT; - config_mode = false; - //clear_keyboard(); - host_set_driver(prev_driver); - } - return true; - case KC_U: - if (config_mode) return false; - if (force_usb) { - print("Auto mode\n"); - force_usb = false; - } else { - print("USB mode\n"); - force_usb = true; - clear_keyboard(); - host_set_driver(&lufa_driver); - } - return true; case KC_I: print("\n----- RN-42 info -----\n"); xprintf("protocol: %s\n", (host_get_driver() == &rn42_driver) ? "RN-42" : "LUFA"); @@ -207,7 +250,7 @@ bool command_extra(uint8_t code) uint8_t h = t/3600; uint8_t m = t%3600/60; uint8_t s = t%60; - xprintf("uptime: %02ud%02u:%02u:%02u\n", d, h, m, s); + xprintf("uptime: %02u %02u:%02u:%02u\n", d, h, m, s); return true; case KC_B: // battery monitor @@ -218,24 +261,53 @@ bool command_extra(uint8_t code) xprintf("%02u:", t%3600/60); xprintf("%02u\n", t%60); return true; + case KC_U: + if (config_mode) return false; + if (force_usb) { + print("Auto mode\n"); + force_usb = false; + } else { + print("USB mode\n"); + force_usb = true; + clear_keyboard(); + host_set_driver(&lufa_driver); + } + return true; + case KC_DELETE: + /* RN-42 Command mode */ + if (rn42_autoconnecting()) { + enter_command_mode(); + + command_state = CONSOLE; + config_mode = true; + } else { + exit_command_mode(); + + command_state = ONESHOT; + config_mode = false; + } + return true; + case KC_SCROLLLOCK: + init_rn42(); + return true; default: if (config_mode) return true; else - return false; // exec default command + return false; // yield to default command } return true; } +/* + * RN-42 Command mode + * sends charactors to the module + */ static uint8_t code2asc(uint8_t code); bool command_console_extra(uint8_t code) { - switch (code) { - default: - rn42_putc(code2asc(code)); - return true; - } - return false; + rn42_putc(code2asc(code)); + return true; } // convert keycode into ascii charactor From 3b3af3bae0deac7831c85847bae7729b0e281b8d Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Mon, 12 Jan 2015 04:32:53 +0900 Subject: [PATCH 20/78] Increase buffer of rn42_gets() and change rn42_linked() --- keyboard/hhkb_rn42/rn42/rn42.c | 10 +++++----- keyboard/hhkb_rn42/rn42/rn42.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboard/hhkb_rn42/rn42/rn42.c b/keyboard/hhkb_rn42/rn42/rn42.c index aa6015cbf..756285d7b 100644 --- a/keyboard/hhkb_rn42/rn42/rn42.c +++ b/keyboard/hhkb_rn42/rn42/rn42.c @@ -53,14 +53,14 @@ int16_t rn42_getc(void) return serial_recv2(); } -char *rn42_gets(uint16_t timeout) +const char *rn42_gets(uint16_t timeout) { - static char s[16]; + static char s[24]; uint16_t t = timer_read(); uint8_t i = 0; int16_t c; - while (i < 15 && timer_elapsed(t) < timeout) { - if ((c = rn42_getc()) != -1) { + while (i < 23 && timer_elapsed(t) < timeout) { + if ((c = rn42_getc()) != -1) { if ((char)c == '\r') continue; if ((char)c == '\n') break; s[i++] = c; @@ -126,7 +126,7 @@ bool rn42_linked(void) // Hi-Z: Not powered // High: Linked // Low: Connecting - return !rn42_rts() && PINF&(1<<6); + return PINF&(1<<6); } diff --git a/keyboard/hhkb_rn42/rn42/rn42.h b/keyboard/hhkb_rn42/rn42/rn42.h index 86090be7c..db6916fe8 100644 --- a/keyboard/hhkb_rn42/rn42/rn42.h +++ b/keyboard/hhkb_rn42/rn42/rn42.h @@ -8,7 +8,7 @@ host_driver_t rn42_config_driver; void rn42_init(void); int16_t rn42_getc(void); -char *rn42_gets(uint16_t timeout); +const char *rn42_gets(uint16_t timeout); void rn42_putc(uint8_t c); void rn42_puts(char *s); bool rn42_autoconnecting(void); From 2626a3226023a9d0bb7add6dadae46205990c6d2 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Mon, 12 Jan 2015 04:35:00 +0900 Subject: [PATCH 21/78] Use pgmspace for RN-42 commands --- keyboard/hhkb_rn42/rn42/rn42_task.c | 170 ++++++++++++++++++++++------ 1 file changed, 137 insertions(+), 33 deletions(-) diff --git a/keyboard/hhkb_rn42/rn42/rn42_task.c b/keyboard/hhkb_rn42/rn42/rn42_task.c index e58bb427a..5107fef48 100644 --- a/keyboard/hhkb_rn42/rn42/rn42_task.c +++ b/keyboard/hhkb_rn42/rn42/rn42_task.c @@ -1,5 +1,7 @@ #include <stdint.h> #include <string.h> +#include <avr/pgmspace.h> +#include <avr/eeprom.h> #include "keycode.h" #include "serial.h" #include "host.h" @@ -109,7 +111,7 @@ void rn42_task(void) /* Connection monitor */ - if (rn42_linked()) { + if (!rn42_rts() && rn42_linked()) { status_led(true); } else { status_led(false); @@ -136,34 +138,51 @@ static void clear_rn42(void) while (rn42_getc() != -1) ; } +#define SEND_STR(str) send_str(PSTR(str)) +#define SEND_COMMAND(cmd) send_command(PSTR(cmd)) + +static void send_str(const char *str) +{ + uint8_t c; + while ((c = pgm_read_byte(str++))) + rn42_putc(c); +} + +static const char *send_command(const char *cmd) +{ + static const char *s; + send_str(cmd); + wait_ms(500); + s = rn42_gets(100); + xprintf("%s\r\n", s); + print_rn42(); + return s; +} + static void enter_command_mode(void) { - // RN-42 disconnect prev_driver = host_get_driver(); clear_keyboard(); host_set_driver(&rn42_config_driver); // null driver; not to send a key to host rn42_disconnect(); - print("\nRN-42: disconnect\n"); + while (rn42_linked()) ; print("Entering config mode ...\n"); - wait_ms(1000); - rn42_puts("$$$"); // Command mode - wait_ms(1000); - rn42_puts("+\r\n"); // Local echo on + wait_ms(1100); // need 1 sec + SEND_COMMAND("$$$"); + wait_ms(600); // need 1 sec print_rn42(); + const char *s = SEND_COMMAND("v\r\n"); + if (strncmp("v", s, 1) != 0) SEND_COMMAND("+\r\n"); // local echo on } static void exit_command_mode(void) { print("Exiting config mode ...\n"); - rn42_puts("+\r\n"); // Local echo off - wait_ms(500); - rn42_puts("---\r\n"); - wait_ms(500); - print_rn42(); + SEND_COMMAND("---\r\n"); // exit rn42_autoconnect(); - print("RN-42: auto_connect\n"); + clear_keyboard(); host_set_driver(prev_driver); } @@ -171,34 +190,77 @@ static void init_rn42(void) { // RN-42 configure if (!config_mode) enter_command_mode(); - rn42_puts("SF,1\r\n"); // factory defaults - wait_ms(500); print_rn42(); - rn42_puts("S-,TmkBT\r\n"); - wait_ms(500); print_rn42(); - rn42_puts("SS,Keyboard/Mouse\r\n"); - wait_ms(500); print_rn42(); - rn42_puts("SM,4\r\n"); // auto connect(DTR) - wait_ms(500); print_rn42(); - rn42_puts("SW,8000\r\n"); // Sniff disable - wait_ms(500); print_rn42(); - rn42_puts("S~,6\r\n"); // HID profile - wait_ms(500); print_rn42(); - rn42_puts("SH,003C\r\n"); // combo device, out-report, 4-reconnect - wait_ms(500); print_rn42(); - rn42_puts("SY,FFF4\r\n"); // transmit power -12 - wait_ms(500); print_rn42(); - rn42_puts("R,1\r\n"); - wait_ms(500); print_rn42(); + SEND_COMMAND("SF,1\r\n"); // factory defaults + SEND_COMMAND("S-,TmkBT\r\n"); + SEND_COMMAND("SS,Keyboard/Mouse\r\n"); + SEND_COMMAND("SM,4\r\n"); // auto connect(DTR) + SEND_COMMAND("SW,8000\r\n"); // Sniff disable + SEND_COMMAND("S~,6\r\n"); // HID profile + SEND_COMMAND("SH,003C\r\n"); // combo device, out-report, 4-reconnect + SEND_COMMAND("SY,FFF4\r\n"); // transmit power -12 + SEND_COMMAND("R,1\r\n"); if (!config_mode) exit_command_mode(); } -static void connect(uint8_t *addr) +#if 0 +// Switching connections +// NOTE: Remote Address doesn't work in the way manual says. +// EEPROM address for link store +#define RN42_LINK0 (uint8_t *)128 +#define RN42_LINK1 (uint8_t *)140 +#define RN42_LINK2 (uint8_t *)152 +#define RN42_LINK3 (uint8_t *)164 +static void store_link(uint8_t *eeaddr) { enter_command_mode(); + SEND_STR("GR\r\n"); // remote address + const char *s = rn42_gets(500); + if (strcmp("GR", s) == 0) s = rn42_gets(500); // ignore local echo + xprintf("%s(%d)\r\n", s, strlen(s)); + if (strlen(s) == 12) { + for (int i = 0; i < 12; i++) { + eeprom_write_byte(eeaddr+i, *(s+i)); + dprintf("%c ", *(s+i)); + } + dprint("\r\n"); + } + exit_command_mode(); } -static void pairng(void) +static void restore_link(const uint8_t *eeaddr) { + enter_command_mode(); + SEND_COMMAND("SR,Z\r\n"); // remove remote address + SEND_STR("SR,"); // set remote address from EEPROM + for (int i = 0; i < 12; i++) { + uint8_t c = eeprom_read_byte(eeaddr+i); + rn42_putc(c); + dprintf("%c ", c); + } + dprintf("\r\n"); + SEND_COMMAND("\r\n"); + SEND_COMMAND("R,1\r\n"); // reboot + exit_command_mode(); +} + +static const char *get_link(uint8_t * eeaddr) +{ + static char s[13]; + for (int i = 0; i < 12; i++) { + uint8_t c = eeprom_read_byte(eeaddr+i); + s[i] = c; + } + s[12] = '\0'; + return s; +} +#endif + +static void pairing(void) +{ + enter_command_mode(); + SEND_COMMAND("SR,Z\r\n"); // remove remote address + SEND_COMMAND("R,1\r\n"); // reboot + exit_command_mode(); } bool command_extra(uint8_t code) @@ -213,6 +275,11 @@ bool command_extra(uint8_t code) print("b: battery voltage\n"); print("Del: enter/exit RN-42 config mode\n"); print("Slck: RN-42 initialize\n"); +#if 0 + print("1-4: restore link\n"); + print("F1-F4: store link\n"); +#endif + print("p: pairing\n"); if (config_mode) { return true; @@ -220,6 +287,37 @@ bool command_extra(uint8_t code) print("u: toggle Force USB mode\n"); return false; // to display default command help } + case KC_P: + pairing(); + return true; +#if 0 + /* Store link address to EEPROM */ + case KC_F1: + store_link(RN42_LINK0); + return true; + case KC_F2: + store_link(RN42_LINK1); + return true; + case KC_F3: + store_link(RN42_LINK2); + return true; + case KC_F4: + store_link(RN42_LINK3); + return true; + /* Restore link address to EEPROM */ + case KC_1: + restore_link(RN42_LINK0); + return true; + case KC_2: + restore_link(RN42_LINK1); + return true; + case KC_3: + restore_link(RN42_LINK2); + return true; + case KC_4: + restore_link(RN42_LINK3); + return true; +#endif case KC_I: print("\n----- RN-42 info -----\n"); xprintf("protocol: %s\n", (host_get_driver() == &rn42_driver) ? "RN-42" : "LUFA"); @@ -251,6 +349,12 @@ bool command_extra(uint8_t code) uint8_t m = t%3600/60; uint8_t s = t%60; xprintf("uptime: %02u %02u:%02u:%02u\n", d, h, m, s); +#if 0 + xprintf("LINK0: %s\r\n", get_link(RN42_LINK0)); + xprintf("LINK1: %s\r\n", get_link(RN42_LINK1)); + xprintf("LINK2: %s\r\n", get_link(RN42_LINK2)); + xprintf("LINK3: %s\r\n", get_link(RN42_LINK3)); +#endif return true; case KC_B: // battery monitor From 517817b9c7f00b180385c6bdf5310234185e5b98 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Thu, 15 Jan 2015 17:02:38 +0900 Subject: [PATCH 22/78] rn42: Update doc --- keyboard/hhkb_rn42/{ => rn42}/MEMO.txt | 77 +++--- keyboard/hhkb_rn42/rn42/RN42.txt | 362 +++++++++++++++++++++++++ 2 files changed, 404 insertions(+), 35 deletions(-) rename keyboard/hhkb_rn42/{ => rn42}/MEMO.txt (95%) create mode 100644 keyboard/hhkb_rn42/rn42/RN42.txt diff --git a/keyboard/hhkb_rn42/MEMO.txt b/keyboard/hhkb_rn42/rn42/MEMO.txt similarity index 95% rename from keyboard/hhkb_rn42/MEMO.txt rename to keyboard/hhkb_rn42/rn42/MEMO.txt index f2aaa7c04..f772c4cb5 100644 --- a/keyboard/hhkb_rn42/MEMO.txt +++ b/keyboard/hhkb_rn42/rn42/MEMO.txt @@ -1,38 +1,8 @@ -Roving RN-42 -============ +Memo of deveopment +================== +just memo, NOT WORTH READING Bug: -- with Nexus5 keyboard and mouse are very laggy. - -- lose USB connection during power-down mode - DONE - - USB initialize code in main() causes this - WRONG - - Do not power-down during USB connection is active - DONE 11/11 - (USB_DeviceState == USB_DEVICE_Configured) is used to check USB connection - matrix_power_down() matrix.c - 11/23 - -- When given power only from wall wart adapter - - it sleeps. it should not sleep - - Configured state without USB connection? - -- timer is slow while power down - DONE 11/26 - - time out interrupt is lost while power down? - - interrupt of watchdog timer compensates timer counter(avr/suspend.c) - -- USB plug-in fails while BT - - it ends in suspend state - - maybe, not responsive to host enumeration process due to power-down. - - matrix_power_down() only when state is unattached - 11/26 - - need to observe a while -- repeated CHARGING/FULL_CHARGED - - In LTC sharp pulses are observed. - - MCP has no pulse but still has a problem. - - needs more wait before read pin state? - NO -- wrongly suspended when powered from adapter without USB connection - DONE - - suspend event may occur when plug into adapter - - and never wake until conected to real USB line - - without debug print via USB no problem; CSW(wake just after suspend as real USB line) - - seems like USB print causes this problem after suspended - - Factory Reset PIO4 doesn't work - the reason is unclear - 12/08 NOT LOOK INTO ANY MORE - WORKAROUND: use serial pins(3.3V, GND, RX and TX) @@ -51,11 +21,9 @@ Todo: - no buffering. character lost can be caused. - LUFA sendchar should be buffered and serial_uart.c buffur size is too large(256). -- switch BT host connections - BT operations - disconnect - new connection - - switch next connection - remove connection - sendchar() in lufa.c block loop - DONE 11/29 @@ -246,3 +214,42 @@ Done: - Under voltage lock out UVLO for protection of Lipo - Lipo has discharge protection at 3.100V 07.01 - Power saving: HHKB scan, BT radio control - 9h with 850mAh, this is enough 07.01 - Power selector doesn't work; Q4 MOSFET leaks from Lipo to USB power line. -- use Schottky instead 07/04 + +- wrongly suspended when powered from adapter without USB connection - DONE + - suspend event may occur when plug into adapter + - and never wake until conected to real USB line + - without debug print via USB no problem; CSW(wake just after suspend as real USB line) + - seems like USB print causes this problem after suspended + +- lose USB connection during power-down mode - DONE + - USB initialize code in main() causes this - WRONG + - Do not power-down during USB connection is active - DONE 11/11 + (USB_DeviceState == USB_DEVICE_Configured) is used to check USB connection + matrix_power_down() matrix.c - 11/23 + +- with Nexus5 keyboard and mouse are very laggy. + Not confirmed. 01/15 + +- switch BT host connections - CANCEL 01/15 + - switch next connection + cannot switch connection with version 6.15 at least + +- When given power only from wall wart adapter - DONE? not confirmed 01/15 + - it sleeps. it should not sleep + - Configured state without USB connection? + +- timer is slow while power down - DONE 11/26 + - time out interrupt is lost while power down? + - interrupt of watchdog timer compensates timer counter(avr/suspend.c) + +- repeated CHARGING/FULL_CHARGED - No longer problem 01/15 + - In LTC sharp pulses are observed. + - MCP has no pulse but still has a problem. + - needs more wait before read pin state? - NO + +- USB plug-in fails while BT - No longer problem 01/15 + - it ends in suspend state + - maybe, not responsive to host enumeration process due to power-down. + - matrix_power_down() only when state is unattached - 11/26 + - need to observe a while + diff --git a/keyboard/hhkb_rn42/rn42/RN42.txt b/keyboard/hhkb_rn42/rn42/RN42.txt new file mode 100644 index 000000000..ace30da4e --- /dev/null +++ b/keyboard/hhkb_rn42/rn42/RN42.txt @@ -0,0 +1,362 @@ +RN-42 Bluetooth Module Support +============================== +Bluetooth controller board works with HHKB Pro2, JP, Type-S and Type-S JP and it supports both USB and Bluetooth as keyboard output protocol. Bluetooth module Roving Networks/Microchip RN-42 is installed on the board. + + +Limitations: +- short battery life +- connection switching + the module always connects to the last linked device. Remote address setting does not work as expected. +- HHKB JP requires case modification for power switch and LEDs. + without switch power controlled by MCU? Probably using 3.3V regulator enable pin power of RN-42 can be controlled. +- Wiress certification of RN-42 + Japan, Korea, Taiwan, Europe, FCC, Canada + http://www.microchip.com/wwwproducts/Devices.aspx?product=RN42 + +NOTE: +- Lipo battery is not included. Cannot ship it from Japan due to regulations. + +Bugs: + +Todos: + + + + + +LED Status +---------- +Configuring 10 times per sec +Startup/configuration timer 2 times per sec +Discoverable/Inquiring/Idle once per sec +Connected solid on + + +RN-42 Magic Command +-------------------- +Magic key combination is 'LShift+RShift' by default in case of HHKB. + +Here is help. + + ----- Bluetooth RN-42 Help ----- + i: RN-42 info + b: battery voltage + Del: enter/exit RN-42 config mode + Slck: RN-42 initialize + p: pairing + u: toggle Force USB mode + + RN-42 info: displays information of the module on console. + battery voltage: displays current voltage of battery and uptime. + RN-42 initialize: does factory reset and configures RN-42 + pairing: enters Pairing mode. + toggle Force USB mode: switch between USB and Bluetooth + + +RN-42 Config mode +----------------- +You can tune/operate RN-42 yourself with config(command) mode. + +1. hook up USB cable +2. run `hid_listen` command in console +3. turn on Bluetooth switch +4. press LShift+RShift+Delete(Fn+~) you will see output like followings: + + Entering config mode ... + CMD + v + Ver 6.15 04/26/2013 + (c) Roving Networks + +5. do config with RN-42 commands. See documentations of RN-42. +6. to exit also press LShift+RShift+Delete(Fn+~) + + Exiting config mode ... + --- + END + + +RN-42 Initial Configuration +--------------------------- +RN-42 is configured as SPP device at factory reset, you need to configure it as HID device. This is needed just once first time. + +1. hook up USB cable +2. run `hid_listen` command in console +3. turn on Bluetooth switch +4. press LShift+RShift+ScrLk(Fn+O) you will see output like followings: + + Entering config mode ... + CMD + Ver 6.15 04/26/2013 + (c) Roving Networks + ECHO ON + SF,1 + AOK + S-,TmkBT + AOK + SS,Keyboard/Mouse + AOK + SM,4 + AOK + SW,8000 + AOK + S~,6 + AOK + SH,003C + AOK + SY,FFF4 + AOK + R,1 + Reboot! + Exiting config mode ... + +5. output of command 'X' after cofiguration + + Ver 6.15 04/26/2013 + (c) Roving Networks + ***Settings*** + BTA=00066667BBE9 + BTName=TmkBT-BBE9 + Baudrt(SW4)=115K + Mode =DTR + Authen=1 + PinCod=1234 + Bonded=0 + Rem=NONE SET + ***ADVANCED Settings*** + SrvName= Keyboard/Mouse + SrvClass=0000 + DevClass=1F00 + InqWindw=0100 + PagWindw=0100 + CfgTimer=255 + StatuStr=NULL + HidFlags=3c + DTRtimer=8 + KeySwapr=0 + ***OTHER Settings*** + Profile= HID + CfgChar= $ + SniffEna=8000 + LowPower=0 + TX Power=fff4 + IOPorts= 0 + IOValues=0 + Sleeptmr=0 + DebugMod=0 + RoleSwch=0 + + +Switch to USB mode +------------------ +You can switch between USB and Bluetooth with pressing 'LShift+RShift+u'. + + +Pairing mode +------------ +This disconnects current connect and enter pairing mode. + + + + +For deveropment +=============== + +RN-42 Serial Connection +----------------------- +UART: 115200bps, 8bit, 1-stopbit, non-parity, no flow control +SSP: 115200bps, 8bit, 1-stopbit, non-parity, no flow control(via Bluetooth) + +To enter command mode disconnect the module from host and type '$$$'.(you will see 'CMD') and type '+' to get local echo. To exit type '---'(you will see 'END'). + + +RN-42 Commands +-------------- +S-,tmkBT // Device name +SS,keyboard/mouse // service name +SM,4 // Auto Connect DTR mode +SW,8010 // Sniff enable 0x10*0.625ms=10ms; 50ms is laggish and not much power save +S~,6 // HID profile +S~,0 // SPP profile +SH,003C // HID register +SY,0004 // Transmit power +SC,0000 // COD: 000005C0 (see HID spec/Bluegiga doc) +SD,05C0 // bit 12-8 7 6 5-0 + // 00101 1 1 0 + // peripheral pointing keybaord joystick, gamepad, ... +SM,6 // Pairing mode: auto connect +SM,4 // Master mode: Connection can be controled with GPIO6 +SF,1 // Factroy reset +R,1 // reboot +SR,Z // removes all remote addresses for reconnecting. + // can be used to connect another host +SR,I // registers last inquiry address + + +Operation Modes +--------------- +SM,3 Auto Connect Master mode +SM,4 Auto Connect DTR Mode uses GPIO6 to make and break connection(Mode =DTR) + confirm: auto connect works and control connection with GPIO6 +SM,5 Auto Connect ANY Mode (Mode =ANY) + each time GPIO is set, make inquiry and connect to the first found device +SM,6 automatically reconnect(Mode =Pair) + confirm: auto connect works well but difficult to enter command mode. + + +HID flag register +----------------- +SH,0200 +GH + +10 0000 0000(0200) default +00 0011 1000(0038) Combo +|| | | |\_\____ number of paired devices to which the module can reconnect +|| | | \_______ send out reports over UART (0xFF <len> <data>) +|| \__\_________ descriptor type +|\______________ toggle virtual keyboard on iOS when first connected +\_______________ Force HID mode if GPIO11 is high on power-up + + Descriptor type: + 0000: keybaord + 0001: Game Pad + 0010: Mouse + 0011: Combo + 0100: Joystick + 1xxx: reserved + + +Out report - Indicator +---------------------- +0xFE 0x02 0x01 <LED_state> + + +Apple iOS +--------- +Keyboard can be used with iPhone, but mouse cannot. + + +Android +------- +3.7.1.5 Note: To connect with Android phone the modules must wake up 11ms every 2.5seconds. + + +Power Management +---------------- +Inquiry and Page window Idle or Active (3.1.1) + Downside: delay in discovery or connection time + SI, // set inquiry scan window(discovery) on/off duty? + SJ, // set page scan window(connection) + This reduces averaege power >20mA to 5mA(3mA in Sniff mode) + +Sniff mode Transmit + Sniff mode is disabled by default and radio is active continuously when connected.(25-30mA) + In Sniff mode the radio wakes up intermittently and sleeps in very low power mode.(2mA) + SW,<val> // set interval timer(*0.625ms) 0000-7FFF + +Deep sleep Idle (3.1.2) + In this mode the module shuts down completly and only draws about 300uA. To enable this set the most signifant bit(0x8000) of Sniff interaval timer. + SW,8320 // deep sleep enable(interval=0x320*0.625=500ms) + In normal sleep the firmware is still running in idle mode, and wakes up about 20 times per second to check ports, update LEDs, etc. During deep sleep, the firmware actually stops runnig some tasks and the LEDs only update about once per second. + To wake from deep sleep there are three ways: (in worst case wake up takes 5ms) + *send a charactor to the UART(first charactor will be lost) + *toggle CTS low to high and wait 5ms + *wake automatically every slot time(<val>*0.625ms) + Once the radio is awake it stay active for exactly 1 second of inactivity and then sleeps again. + Downside: latency and data loss + +Disable Output driver Idle or Active (3.1.3) + S%,1000 // set all GPIO pins(0-11) to inputs. + +Lower Transmit Power Idle or Active (3.1.4) + SY,<hex> // transmit power setting(takes effect after a power cycle and reboot) + Downside: reducing effective range + + +Optimizig for Latency +--------------------- +By default the firmware is optimized for throughput. +SQ,16 // set latency bit +SQ,0 // unset latency bit + + +Configuration timer settings +---------------------------- +Remote configuration is used for the module to be configured with various commands over Bluetooth(SPP profile only?). + +The module has remote configuration timer to allow remote configuration over Bluetooth after power up in Slave mode. In Master modes the remote configuration timer is set to 0(no remote configuration). (In Trigger Master mode the timer is used as an idle timer to break the connection after time expires with no charactors receive.) + ST,0 // no remote, no local when connected + ST,<1-252> // local and remote with timeout in seconds from power up + ST,253 // local only without timeout + ST,254 // remote only without timeout + ST,255 // local and remote without timeout + + +Commands +-------- +S7, 7bit mode +SA, Authenticaiton +SB, Send break +SC, Service class +SD, Device class +SM,<val> Operation mode +SP,<string> Pin code(alpahnumeric) +SQ,<mask> Special configuration(GPIO, discovery mode, low latency, reboot, UART) +SR,<hex> Store remote address +SR,Z Erase all address +SS,<string> Set service name(1-20)** +ST,<val> Remote configuration timer(Master:0, Slave:0-255, Triger:as idle timer) +SU,<val> UART baud rate +SW,<val> low-power sniff mode** deep sleep and wake up every 625us * <val> +SX,<0|1> bonding enable only acceps device that matches the stored address +SY,<hex> power setting** +SZ,<val> non-standard raw baud rate <val>=baud*0.004096 +S~,<val> Profile 0:SPP, 5:APL, 6:HID +S-,<string> Device name -15 alphanumeric charactors +S?,<0|1> role switch enable +S$,<char> command mode char +$|,<hex> low-power connect mode deep sleep/active(discoverable and connectable) cycle +D display basic setting +E display extended setting +GB display the device's Bluetooth address +GF display Bluetooth address of connected device +GK show connection status +GR show remote address for reconnecting +G& show GPIO pin +G<char> show stored setting ++ toggle local echo on/off +& show GPIO 3,4,6,7(DIP switch) +C connect to stored remote address +C,<address> connect last address +CFI connect and go into fast data mode +CFR connect and go into fast data mode +CT,<address>,<val> connect to the address and disconnect after val? +F,1 fast data mod: +H display help +I,<time>,<cod> inquiry scan with <cod> +IN,<time>,<cod> inquiry scan with <cod>, return without BT name +IR inquiry scan with 0055AA +IS inquiry scan with 001F00 +J hide pin code +K, kill disconnects current connection +L link quality +M show modem signlal status +O display other settings +P,<char> pass through? +Q quiet mode make the module not discoverable +Q,0 discoverable and connectable +Q,1 not discoverable and not connectable +Q,2 not discoverable and connectable +Q,? display current quiet mode +R,1 reboot +T,<0|1> pass received data while in command mode +U,<baud>,<parity> change UART setting tentatively +V display firmware version +W wake from quiet mode enable discovery and connection +Z deep sleep mode(<2mA) + + +Reset to Factory Default +------------------------ +SF,1 +R,1 From 3e88e8b761f8f8d8c5155fed3f064cc1bf207dab Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Fri, 16 Jan 2015 05:22:29 +0900 Subject: [PATCH 23/78] hhkb: Fix layer stuck of keymap_hasu - In mouse key layer with holding semicolon, press Fn0, release semicolon and release Fn0 now layer 1 is stuck. --- keyboard/hhkb/keymap_hasu.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/keyboard/hhkb/keymap_hasu.c b/keyboard/hhkb/keymap_hasu.c index 8379c84f5..433f9cb27 100644 --- a/keyboard/hhkb/keymap_hasu.c +++ b/keyboard/hhkb/keymap_hasu.c @@ -27,7 +27,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,FN6, \ FN7, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN1, \ - LGUI,LALT, FN4, FN5, FN5), + LGUI,LALT, FN4, FN5, RGUI), /* Layer 1: HHKB mode[HHKB Fn] * ,-----------------------------------------------------------. @@ -47,7 +47,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, BSPC, \ LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,TRNS, \ - LGUI,LALT, SPC, RALT,RGUI), + LGUI,LALT, TRNS, RALT,RGUI), /* Layer 2: Vi mode[Slash] * ,-----------------------------------------------------------. @@ -66,7 +66,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS,RSFT,NO, \ + LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,TRNS, \ LGUI,LALT, SPC, RALT,RGUI), /* Layer 3: Mouse mode(IJKL)[Semicolon] @@ -81,16 +81,16 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * `-----------------------------------------------------------' * |Gui |Alt | Mb1 |Fn |Fn | * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel8 + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ [3] = \ KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD,FN8, \ - LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,TRNS,NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ + FN8, NO, NO, NO, NO, NO, NO, WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ + LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,FN3, NO, ENT, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,TRNS, \ LGUI,LALT, BTN1, TRNS,TRNS), - /* Layer 5: Mouse mode(IJKL)[Space] + /* Layer 4: Mouse mode(IJKL)[Space] * ,-----------------------------------------------------------. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| * |-----------------------------------------------------------| @@ -102,13 +102,13 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * `-----------------------------------------------------------' * |Gui |Alt | Mb1 |Fn |Fn | * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel8 + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ [4] = \ KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD,FN8, \ + FN8, NO, NO, NO, NO, NO, NO, WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ LCTL,VOLD,VOLU,MUTE,NO, NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,TRNS, \ LGUI,LALT, TRNS, TRNS,TRNS), #if 0 @@ -127,9 +127,9 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ + TAB, NO, NO, NO, NO, NO, NO, WH_D,WH_U,RGHT,NO, NO, NO, BSPC, \ LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,TRNS,QUOT,ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,NO, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,SLSH,RSFT,NO, \ LGUI,LALT, BTN1, RALT,TRNS), /* Layer4: Mouse mode(HJKL)[Space] @@ -147,9 +147,9 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, WBAK,WFWD,FN8, \ + FN8, NO, NO, NO, NO, NO, NO, WH_D,WH_U,RGHT,NO, FN9, FN10,FN8, \ LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,BTN1,NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ + LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,NO, \ LGUI,LALT, TRNS, RALT,RGUI), #endif #if 0 @@ -201,10 +201,12 @@ const uint16_t fn_actions[] PROGMEM = { [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* [3] = ACTION_LAYER_TAP_KEY(3, KC_SCLN), // Mousekey layer with Semicolon* [4] = ACTION_LAYER_TAP_KEY(4, KC_SPC), // Mousekey layer with Space - [5] = ACTION_LAYER_MOMENTARY(3), // Mousekey layer + [5] = ACTION_LAYER_MOMENTARY(4), // Mousekey layer(IJKL) [6] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT), // RControl with tap Enter [7] = ACTION_MODS_ONESHOT(MOD_LSFT), // Oneshot Shift [8] = ACTION_MACRO(ALT_TAB), // Application switching + [9] = ACTION_MODS_KEY(MOD_LALT, KC_LEFT), + [10] = ACTION_MODS_KEY(MOD_LALT, KC_RIGHT), // [x] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC), // LControl with tap Backspace // [x] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_ESC), // LControl with tap Esc From ce6698865046c2d5e5fae73a74323048036e7d44 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Fri, 16 Jan 2015 08:26:59 +0900 Subject: [PATCH 24/78] hhkb_rn42: Move doc --- keyboard/hhkb_rn42/{ => rn42}/PowerSave.txt | 47 ++------------------- 1 file changed, 4 insertions(+), 43 deletions(-) rename keyboard/hhkb_rn42/{ => rn42}/PowerSave.txt (71%) diff --git a/keyboard/hhkb_rn42/PowerSave.txt b/keyboard/hhkb_rn42/rn42/PowerSave.txt similarity index 71% rename from keyboard/hhkb_rn42/PowerSave.txt rename to keyboard/hhkb_rn42/rn42/PowerSave.txt index 9aa89f441..8aea1c6dd 100644 --- a/keyboard/hhkb_rn42/PowerSave.txt +++ b/keyboard/hhkb_rn42/rn42/PowerSave.txt @@ -1,11 +1,9 @@ -RN-42 -===== +Power Saving +============ -12/11 -Power Comsumption -MCU+HHKB --------- +MCU+HHKB Power Comsumption +-------------------------- Battery drive: idle 18.9mA active 35.8mA @@ -76,40 +74,3 @@ S%,1000 status led and connection control don't work GPIO5: status LED GPIO6: Connection control GPIO2: linked status - - - - - -Ver 6.15 04/26/2013 -(c) Roving Networks -***Settings*** -BTA=00066667BBE9 -BTName=tmkBT-BBE9 -Baudrt(SW4)=115K -Mode =DTR -Authen=1 -Bonded=0 -Rem=001BDC06415B -***ADVANCED Settings*** -SrvName= keyboard/mouse -SrvClass=0000 -DevClass=1F00 -InqWindw=0012 -PagWindw=0012 -CfgTimer=255 -StatuStr=NULL -HidFlags=3c -DTRtimer=8 -KeySwapr=0 -***OTHER Settings*** -Profile= HID -CfgChar= $ -SniffEna=8010 -LowPower=0 S|, -TX Power=fff4 SY, -IOPorts= 0 -IOValues=0 -Sleeptmr=0 -DebugMod=0 -RoleSwch=0 From 099701dd3130d433244b3a4102f36f547aec25ae Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Fri, 16 Jan 2015 10:21:18 +0900 Subject: [PATCH 25/78] hhkb: Integrate RN-42 support, remove hhkb_rn42 --- keyboard/hhkb/Makefile.nodebug | 141 --------- .../Makefile => hhkb/Makefile.rn42} | 22 +- keyboard/hhkb/README.md | 17 +- .../config.h => hhkb/config_rn42.h} | 0 keyboard/hhkb/hhkb_avr.h | 28 +- keyboard/hhkb/matrix.c | 27 +- .../hhkb/{ => not_supported}/Makefile.iwrap | 0 .../hhkb/{ => not_supported}/Makefile.vusb | 0 .../hhkb/{ => not_supported}/config_iwrap.h | 0 .../hhkb/{ => not_supported}/config_vusb.h | 0 keyboard/hhkb/{ => not_supported}/iwrap.txt | 0 keyboard/hhkb/{ => not_supported}/usbconfig.h | 0 keyboard/{hhkb_rn42 => hhkb}/rn42.mk | 0 keyboard/{hhkb_rn42 => hhkb}/rn42/MEMO.txt | 0 .../{hhkb_rn42 => hhkb}/rn42/PowerSave.txt | 0 keyboard/{hhkb_rn42 => hhkb}/rn42/RN42.txt | 0 keyboard/{hhkb_rn42 => hhkb}/rn42/battery.c | 0 keyboard/{hhkb_rn42 => hhkb}/rn42/battery.h | 0 keyboard/{hhkb_rn42 => hhkb}/rn42/main.c | 0 keyboard/{hhkb_rn42 => hhkb}/rn42/rn42.c | 0 keyboard/{hhkb_rn42 => hhkb}/rn42/rn42.h | 0 keyboard/{hhkb_rn42 => hhkb}/rn42/rn42_task.c | 0 keyboard/{hhkb_rn42 => hhkb}/rn42/rn42_task.h | 0 keyboard/{hhkb_rn42 => hhkb}/rn42/suart.S | 0 keyboard/{hhkb_rn42 => hhkb}/rn42/suart.h | 0 keyboard/hhkb_rn42/hhkb_avr.h | 166 ----------- keyboard/hhkb_rn42/keymap_common.c | 33 -- keyboard/hhkb_rn42/keymap_common.h | 84 ------ keyboard/hhkb_rn42/keymap_hasu.c | 282 ------------------ keyboard/hhkb_rn42/keymap_jp.c | 50 ---- keyboard/hhkb_rn42/led.c | 33 -- keyboard/hhkb_rn42/matrix.c | 190 ------------ 32 files changed, 69 insertions(+), 1004 deletions(-) delete mode 100644 keyboard/hhkb/Makefile.nodebug rename keyboard/{hhkb_rn42/Makefile => hhkb/Makefile.rn42} (95%) rename keyboard/{hhkb_rn42/config.h => hhkb/config_rn42.h} (100%) rename keyboard/hhkb/{ => not_supported}/Makefile.iwrap (100%) rename keyboard/hhkb/{ => not_supported}/Makefile.vusb (100%) rename keyboard/hhkb/{ => not_supported}/config_iwrap.h (100%) rename keyboard/hhkb/{ => not_supported}/config_vusb.h (100%) rename keyboard/hhkb/{ => not_supported}/iwrap.txt (100%) rename keyboard/hhkb/{ => not_supported}/usbconfig.h (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42.mk (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/MEMO.txt (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/PowerSave.txt (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/RN42.txt (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/battery.c (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/battery.h (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/main.c (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/rn42.c (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/rn42.h (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/rn42_task.c (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/rn42_task.h (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/suart.S (100%) rename keyboard/{hhkb_rn42 => hhkb}/rn42/suart.h (100%) delete mode 100644 keyboard/hhkb_rn42/hhkb_avr.h delete mode 100644 keyboard/hhkb_rn42/keymap_common.c delete mode 100644 keyboard/hhkb_rn42/keymap_common.h delete mode 100644 keyboard/hhkb_rn42/keymap_hasu.c delete mode 100644 keyboard/hhkb_rn42/keymap_jp.c delete mode 100644 keyboard/hhkb_rn42/led.c delete mode 100644 keyboard/hhkb_rn42/matrix.c diff --git a/keyboard/hhkb/Makefile.nodebug b/keyboard/hhkb/Makefile.nodebug deleted file mode 100644 index 578ba70c4..000000000 --- a/keyboard/hhkb/Makefile.nodebug +++ /dev/null @@ -1,141 +0,0 @@ -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device. -# Please customize your programmer settings(PROGRAM_CMD) -# -# make teensy = Download the hex file to the device, using teensy_loader_cli. -# (must have teensy_loader_cli installed). -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# Target file name (without extension). -TARGET = hhkb_lufa - -# Directory common source filess exist -TOP_DIR = ../.. - -# Directory keyboard dependent files exist -TARGET_DIR = . - - -# List C source files here. (C dependencies are automatically generated.) -SRC += keymap_common.c \ - matrix.c \ - led.c - -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) -else - SRC := keymap_hasu.c $(SRC) -endif - -CONFIG_H = config.h - - -# MCU name -# PJRC Teensy++ 2.0 -#MCU = at90usb1286 -# TMK Alt Controller or PJRC Teensy 2.0 -MCU = atmega32u4 - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task -#OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 (TMK Alt Controller) -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - - -# Build Options -# comment out to disable the options. -# -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration -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 # USB Nkey Rollover -KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TOP_DIR) - -include $(TOP_DIR)/protocol/lufa.mk -include $(TOP_DIR)/common.mk -include $(TOP_DIR)/rules.mk - -debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION -debug-on: all - -debug-off: EXTRAFLAGS += -DNO_DEBUG -DNO_PRINT -debug-off: all diff --git a/keyboard/hhkb_rn42/Makefile b/keyboard/hhkb/Makefile.rn42 similarity index 95% rename from keyboard/hhkb_rn42/Makefile rename to keyboard/hhkb/Makefile.rn42 index 3d9a602a5..b1eacd070 100644 --- a/keyboard/hhkb_rn42/Makefile +++ b/keyboard/hhkb/Makefile.rn42 @@ -39,7 +39,7 @@ #---------------------------------------------------------------------------- # Target file name (without extension). -TARGET = hhkb_lufa +TARGET = hhkb_rn42 # Directory common source filess exist TOP_DIR = ../.. @@ -53,13 +53,10 @@ SRC += keymap_common.c \ matrix.c \ led.c -CONFIG_H = config.h +CONFIG_H = config_rn42.h # MCU name -# PJRC Teensy++ 2.0 -#MCU = at90usb1286 -# TMK Alt Controller or PJRC Teensy 2.0 MCU = atmega32u4 # Processor frequency. @@ -121,11 +118,6 @@ COMMAND_ENABLE = yes # Commands for debug and configuration #HHKB_JP = yes # HHKB JP support -ifdef HHKB_JP - OPT_DEFS += -DHHKB_JP -endif - - # # Keymap file # @@ -134,12 +126,17 @@ ifdef KEYMAP else ifdef HHKB_JP SRC := keymap_jp.c $(SRC) - else - SRC := keymap_hasu.c $(SRC) + else + SRC := keymap_hhkb.c $(SRC) endif endif +ifneq (, $(or $(findstring keymap_jp.c, $(SRC)), $(findstring yes, $(HHKB_JP)))) + OPT_DEFS += -DHHKB_JP +endif + + # Search Path VPATH += $(TARGET_DIR) VPATH += $(TOP_DIR) @@ -154,4 +151,5 @@ debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION debug-on: all debug-off: EXTRAFLAGS += -DNO_DEBUG -DNO_PRINT +debug-off: OPT_DEFS := $(filter-out -DCONSOLE_ENABLE,$(OPT_DEFS)) debug-off: all diff --git a/keyboard/hhkb/README.md b/keyboard/hhkb/README.md index f9fd16507..fcd72e194 100644 --- a/keyboard/hhkb/README.md +++ b/keyboard/hhkb/README.md @@ -10,11 +10,17 @@ See [this thread][AltController] in geekhack.org. [AltController]: http://geekhack.org/index.php?topic=12047.0 +## Update +* Bluetooth module RN-42 is supported.(2015/01) +* V-USB and iWRAP are no longer supported now, but still it'll works with a little fix. See not_supported directory.(2015/01) + + ##Features * Customizable keymap * More keymap layers(more Fn keys) * Mouse keys * USB NKRO +* Bluetooth(RN-42) See README of [tmk_keyboard] for more. @@ -50,8 +56,9 @@ If you use other than **TMK Alt Controller Board** set proper `MCU`, `BOOTLOADER ### Build Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. Just `make` with `KEYMAP` option like: - $ make KEYMAP=[hasu|hhkb|spacefn|<name>] - $ make -f Makefile.jp KEYMAP=[jp|<name>] # for HHKB JP + $ make -f Makefile.<jp|pjrc|rn42> KEYMAP=(hasu|hhkb|spacefn|<name>) + +You can omit `-f` option when you use `Makefile`. `Makefile` is used for **Pro2 and Pro**, `Makefile.jp` fits for **JP** model and `Makefile.rn42` supports Bluetooth module **RN-42**. `Makefile.pjrc` uses **PJRC** as output protocol instead of **LUFA**. ### Program @@ -59,13 +66,11 @@ First, push reset button on board to start bootloader. This command programs the controller with [dfu-programmer] if the tool is installed and configured properly. - $ make dfu - $ make -f Makefile.jp dfu # for HHKB JP + $ make -f Makefile.<variant> KEYMAP=<name> dfu Or you can also use [FLIP] command to program. Also the tool should be installed and configured properly. FLIP GUI application is also available. - $ make flip - $ make -f Makefile.jp flip # for HHKB JP + $ make -f Makefile.<variant> KEYMAP=<name> flip Use [Teensy Loader] if your controller is Teensy/Teensy++. diff --git a/keyboard/hhkb_rn42/config.h b/keyboard/hhkb/config_rn42.h similarity index 100% rename from keyboard/hhkb_rn42/config.h rename to keyboard/hhkb/config_rn42.h diff --git a/keyboard/hhkb/hhkb_avr.h b/keyboard/hhkb/hhkb_avr.h index b7bd507b5..7ea6322c7 100644 --- a/keyboard/hhkb/hhkb_avr.h +++ b/keyboard/hhkb/hhkb_avr.h @@ -41,17 +41,32 @@ static inline void KEY_UNABLE(void) { (PORTB |= (1<<6)); } static inline bool KEY_STATE(void) { return (PIND & (1<<7)); } static inline void KEY_PREV_ON(void) { (PORTB |= (1<<7)); } static inline void KEY_PREV_OFF(void) { (PORTB &= ~(1<<7)); } +#ifdef HHKB_POWER_SAVING +static inline void KEY_POWER_ON(void) { + DDRB = 0xFF; PORTB = 0x40; // change pins output + DDRD |= (1<<4); PORTD |= (1<<4); // MOS FET switch on + /* Without this wait you will miss or get false key events. */ + _delay_ms(5); // wait for powering up +} +static inline void KEY_POWER_OFF(void) { + /* input with pull-up consumes less than without it when pin is open. */ + DDRB = 0x00; PORTB = 0xFF; // change pins input with pull-up + DDRD |= (1<<4); PORTD &= ~(1<<4); // MOS FET switch off +} +static inline bool KEY_POWER_STATE(void) { return PORTD & (1<<4); } +#else static inline void KEY_POWER_ON(void) {} static inline void KEY_POWER_OFF(void) {} +static inline bool KEY_POWER_STATE(void) { return true; } +#endif static inline void KEY_INIT(void) { + /* row,col,prev: output */ DDRB = 0xFF; - PORTB = 0x00; + PORTB = 0x40; // unable + /* key: input with pull-up */ DDRD &= ~0x80; - PORTD |= 0x80; - /* keyswitch board power on */ - DDRD |= (1<<4); - PORTD |= (1<<4); + PORTD |= 0x80; #ifdef HHKB_JP /* row extention for HHKB JP */ DDRC |= (1<<6|1<<7); @@ -59,6 +74,8 @@ static inline void KEY_INIT(void) #endif KEY_UNABLE(); KEY_PREV_OFF(); + + KEY_POWER_OFF(); } static inline void KEY_SELECT(uint8_t ROW, uint8_t COL) { @@ -98,6 +115,7 @@ static inline void KEY_SELECT(uint8_t ROW, uint8_t COL) #define KEY_PREV_OFF() (PORTE &= ~(1<<7)) #define KEY_POWER_ON() #define KEY_POWER_OFF() +#define KEY_POWER_STATE() true #else diff --git a/keyboard/hhkb/matrix.c b/keyboard/hhkb/matrix.c index b0af4baa5..fb9699794 100644 --- a/keyboard/hhkb/matrix.c +++ b/keyboard/hhkb/matrix.c @@ -27,8 +27,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "timer.h" #include "matrix.h" #include "hhkb_avr.h" +#include <avr/wdt.h> +#include "suspend.h" +#include "lufa.h" +// matrix power saving +#define MATRIX_POWER_SAVE 10000 +static uint32_t matrix_last_modified = 0; + // matrix state buffer(1:on, 0:off) static matrix_row_t *matrix; static matrix_row_t *matrix_prev; @@ -72,7 +79,8 @@ uint8_t matrix_scan(void) matrix_prev = matrix; matrix = tmp; - KEY_POWER_ON(); + // power on + if (!KEY_POWER_STATE()) KEY_POWER_ON(); for (uint8_t row = 0; row < MATRIX_ROWS; row++) { for (uint8_t col = 0; col < MATRIX_COLS; col++) { KEY_SELECT(row, col); @@ -126,8 +134,16 @@ uint8_t matrix_scan(void) // This takes 25us or more to make sure KEY_STATE returns to idle state. _delay_us(75); } + if (matrix[row] ^ matrix_prev[row]) matrix_last_modified = timer_read32(); + } + // power off + if (KEY_POWER_STATE() && + (USB_DeviceState == DEVICE_STATE_Suspended || + USB_DeviceState == DEVICE_STATE_Unattached ) && + timer_elapsed32(matrix_last_modified) > MATRIX_POWER_SAVE) { + KEY_POWER_OFF(); + suspend_power_down(); } - KEY_POWER_OFF(); return 1; } @@ -165,3 +181,10 @@ void matrix_print(void) xprintf("%02X: %08b\n", row, bitrev(matrix_get_row(row))); } } + +void matrix_power_up(void) { + KEY_POWER_ON(); +} +void matrix_power_down(void) { + KEY_POWER_OFF(); +} diff --git a/keyboard/hhkb/Makefile.iwrap b/keyboard/hhkb/not_supported/Makefile.iwrap similarity index 100% rename from keyboard/hhkb/Makefile.iwrap rename to keyboard/hhkb/not_supported/Makefile.iwrap diff --git a/keyboard/hhkb/Makefile.vusb b/keyboard/hhkb/not_supported/Makefile.vusb similarity index 100% rename from keyboard/hhkb/Makefile.vusb rename to keyboard/hhkb/not_supported/Makefile.vusb diff --git a/keyboard/hhkb/config_iwrap.h b/keyboard/hhkb/not_supported/config_iwrap.h similarity index 100% rename from keyboard/hhkb/config_iwrap.h rename to keyboard/hhkb/not_supported/config_iwrap.h diff --git a/keyboard/hhkb/config_vusb.h b/keyboard/hhkb/not_supported/config_vusb.h similarity index 100% rename from keyboard/hhkb/config_vusb.h rename to keyboard/hhkb/not_supported/config_vusb.h diff --git a/keyboard/hhkb/iwrap.txt b/keyboard/hhkb/not_supported/iwrap.txt similarity index 100% rename from keyboard/hhkb/iwrap.txt rename to keyboard/hhkb/not_supported/iwrap.txt diff --git a/keyboard/hhkb/usbconfig.h b/keyboard/hhkb/not_supported/usbconfig.h similarity index 100% rename from keyboard/hhkb/usbconfig.h rename to keyboard/hhkb/not_supported/usbconfig.h diff --git a/keyboard/hhkb_rn42/rn42.mk b/keyboard/hhkb/rn42.mk similarity index 100% rename from keyboard/hhkb_rn42/rn42.mk rename to keyboard/hhkb/rn42.mk diff --git a/keyboard/hhkb_rn42/rn42/MEMO.txt b/keyboard/hhkb/rn42/MEMO.txt similarity index 100% rename from keyboard/hhkb_rn42/rn42/MEMO.txt rename to keyboard/hhkb/rn42/MEMO.txt diff --git a/keyboard/hhkb_rn42/rn42/PowerSave.txt b/keyboard/hhkb/rn42/PowerSave.txt similarity index 100% rename from keyboard/hhkb_rn42/rn42/PowerSave.txt rename to keyboard/hhkb/rn42/PowerSave.txt diff --git a/keyboard/hhkb_rn42/rn42/RN42.txt b/keyboard/hhkb/rn42/RN42.txt similarity index 100% rename from keyboard/hhkb_rn42/rn42/RN42.txt rename to keyboard/hhkb/rn42/RN42.txt diff --git a/keyboard/hhkb_rn42/rn42/battery.c b/keyboard/hhkb/rn42/battery.c similarity index 100% rename from keyboard/hhkb_rn42/rn42/battery.c rename to keyboard/hhkb/rn42/battery.c diff --git a/keyboard/hhkb_rn42/rn42/battery.h b/keyboard/hhkb/rn42/battery.h similarity index 100% rename from keyboard/hhkb_rn42/rn42/battery.h rename to keyboard/hhkb/rn42/battery.h diff --git a/keyboard/hhkb_rn42/rn42/main.c b/keyboard/hhkb/rn42/main.c similarity index 100% rename from keyboard/hhkb_rn42/rn42/main.c rename to keyboard/hhkb/rn42/main.c diff --git a/keyboard/hhkb_rn42/rn42/rn42.c b/keyboard/hhkb/rn42/rn42.c similarity index 100% rename from keyboard/hhkb_rn42/rn42/rn42.c rename to keyboard/hhkb/rn42/rn42.c diff --git a/keyboard/hhkb_rn42/rn42/rn42.h b/keyboard/hhkb/rn42/rn42.h similarity index 100% rename from keyboard/hhkb_rn42/rn42/rn42.h rename to keyboard/hhkb/rn42/rn42.h diff --git a/keyboard/hhkb_rn42/rn42/rn42_task.c b/keyboard/hhkb/rn42/rn42_task.c similarity index 100% rename from keyboard/hhkb_rn42/rn42/rn42_task.c rename to keyboard/hhkb/rn42/rn42_task.c diff --git a/keyboard/hhkb_rn42/rn42/rn42_task.h b/keyboard/hhkb/rn42/rn42_task.h similarity index 100% rename from keyboard/hhkb_rn42/rn42/rn42_task.h rename to keyboard/hhkb/rn42/rn42_task.h diff --git a/keyboard/hhkb_rn42/rn42/suart.S b/keyboard/hhkb/rn42/suart.S similarity index 100% rename from keyboard/hhkb_rn42/rn42/suart.S rename to keyboard/hhkb/rn42/suart.S diff --git a/keyboard/hhkb_rn42/rn42/suart.h b/keyboard/hhkb/rn42/suart.h similarity index 100% rename from keyboard/hhkb_rn42/rn42/suart.h rename to keyboard/hhkb/rn42/suart.h diff --git a/keyboard/hhkb_rn42/hhkb_avr.h b/keyboard/hhkb_rn42/hhkb_avr.h deleted file mode 100644 index 0321977d1..000000000 --- a/keyboard/hhkb_rn42/hhkb_avr.h +++ /dev/null @@ -1,166 +0,0 @@ -#ifndef HHKB_AVR_H -#define HHKB_AVR_H - -#include <stdint.h> -#include <stdbool.h> -#include <avr/io.h> -#include <avr/interrupt.h> -#include <util/delay.h> - - -// Timer resolution check -#if (1000000/TIMER_RAW_FREQ > 20) -# error "Timer resolution(>20us) is not enough for HHKB matrix scan tweak on V-USB." -#endif - - -/* - * HHKB Matrix I/O - * - * row: HC4051[A,B,C] selects scan row0-7 - * row-ext: [En0,En1] row extention for JP - * col: LS145[A,B,C,D] selects scan col0-7 and enable(D) - * key: on: 0/off: 1 - * prev: hysteresis control: assert(1) when previous key state is on - */ - - -#if defined(__AVR_ATmega32U4__) -/* - * For TMK HHKB alt controller(ATMega32U4) - * - * row: PB0-2 - * col: PB3-5,6 - * key: PD7(pull-uped) - * prev: PB7 - * power: PD4(L:off/H:on) - * row-ext: PC6,7 for HHKB JP(active low) - */ -static inline void KEY_ENABLE(void) { (PORTB &= ~(1<<6)); } -static inline void KEY_UNABLE(void) { (PORTB |= (1<<6)); } -static inline bool KEY_STATE(void) { return (PIND & (1<<7)); } -static inline void KEY_PREV_ON(void) { (PORTB |= (1<<7)); } -static inline void KEY_PREV_OFF(void) { (PORTB &= ~(1<<7)); } -#ifdef HHKB_POWER_SAVING -static inline void KEY_POWER_ON(void) { - DDRB = 0xFF; PORTB = 0x40; // change pins output - DDRD |= (1<<4); PORTD |= (1<<4); // MOS FET switch on - /* Without this wait you will miss or get false key events. */ - _delay_ms(5); // wait for powering up -} -static inline void KEY_POWER_OFF(void) { - /* input with pull-up consumes less than without it when pin is open. */ - DDRB = 0x00; PORTB = 0xFF; // change pins input with pull-up - DDRD |= (1<<4); PORTD &= ~(1<<4); // MOS FET switch off -} -static inline bool KEY_POWER_STATE(void) { return PORTD & (1<<4); } -#else -static inline void KEY_POWER_ON(void) {} -static inline void KEY_POWER_OFF(void) {} -static inline bool KEY_POWER_STATE(void) { return true; } -#endif -static inline void KEY_INIT(void) -{ - /* row,col,prev: output */ - DDRB = 0xFF; - PORTB = 0x40; // unable - /* key: input with pull-up */ - DDRD &= ~0x80; - PORTD |= 0x80; -#ifdef HHKB_JP - /* row extention for HHKB JP */ - DDRC |= (1<<6|1<<7); - PORTC |= (1<<6|1<<7); -#endif - KEY_UNABLE(); - KEY_PREV_OFF(); - - KEY_POWER_OFF(); -} -static inline void KEY_SELECT(uint8_t ROW, uint8_t COL) -{ - PORTB = (PORTB & 0xC0) | (((COL) & 0x07)<<3) | ((ROW) & 0x07); -#ifdef HHKB_JP - if ((ROW) & 0x08) PORTC = (PORTC & ~(1<<6|1<<7)) | (1<<6); - else PORTC = (PORTC & ~(1<<6|1<<7)) | (1<<7); -#endif -} - - -#elif defined(__AVR_AT90USB1286__) -/* - * For Teensy++(AT90USB1286) - * - * HHKB pro HHKB pro2 - * row: PB0-2 (6-8) (5-7) - * col: PB3-5,6 (9-12) (8-11) - * key: PE6(pull-uped) (4) (3) - * prev: PE7 (5) (4) - * - * TODO: convert into 'staitc inline' function - */ -#define KEY_INIT() do { \ - DDRB |= 0x7F; \ - DDRE |= (1<<7); \ - DDRE &= ~(1<<6); \ - PORTE |= (1<<6); \ -} while (0) -#define KEY_SELECT(ROW, COL) (PORTB = (PORTB & 0xC0) | \ - (((COL) & 0x07)<<3) | \ - ((ROW) & 0x07)) -#define KEY_ENABLE() (PORTB &= ~(1<<6)) -#define KEY_UNABLE() (PORTB |= (1<<6)) -#define KEY_STATE() (PINE & (1<<6)) -#define KEY_PREV_ON() (PORTE |= (1<<7)) -#define KEY_PREV_OFF() (PORTE &= ~(1<<7)) -#define KEY_POWER_ON() -#define KEY_POWER_OFF() - - -#else -# error "define code for matrix scan" -#endif - - -#if 0 -// For ATMega328P with V-USB -// -// #elif defined(__AVR_ATmega328P__) -// Ports for V-USB -// key: PB0(pull-uped) -// prev: PB1 -// row: PB2-4 -// col: PC0-2,3 -// power: PB5(Low:on/Hi-z:off) -#define KEY_INIT() do { \ - DDRB |= 0x3E; \ - DDRB &= ~(1<<0); \ - PORTB |= 1<<0; \ - DDRC |= 0x0F; \ - KEY_UNABLE(); \ - KEY_PREV_OFF(); \ -} while (0) -#define KEY_SELECT(ROW, COL) do { \ - PORTB = (PORTB & 0xE3) | ((ROW) & 0x07)<<2; \ - PORTC = (PORTC & 0xF8) | ((COL) & 0x07); \ -} while (0) -#define KEY_ENABLE() (PORTC &= ~(1<<3)) -#define KEY_UNABLE() (PORTC |= (1<<3)) -#define KEY_STATE() (PINB & (1<<0)) -#define KEY_PREV_ON() (PORTB |= (1<<1)) -#define KEY_PREV_OFF() (PORTB &= ~(1<<1)) -// Power supply switching -#define KEY_POWER_ON() do { \ - KEY_INIT(); \ - PORTB &= ~(1<<5); \ - _delay_ms(1); \ -} while (0) -#define KEY_POWER_OFF() do { \ - DDRB &= ~0x3F; \ - PORTB &= ~0x3F; \ - DDRC &= ~0x0F; \ - PORTC &= ~0x0F; \ -} while (0) -#endif - -#endif diff --git a/keyboard/hhkb_rn42/keymap_common.c b/keyboard/hhkb_rn42/keymap_common.c deleted file mode 100644 index e938fb627..000000000 --- a/keyboard/hhkb_rn42/keymap_common.c +++ /dev/null @@ -1,33 +0,0 @@ -/* -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 <stdint.h> -#include "action.h" -#include <avr/pgmspace.h> -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/keyboard/hhkb_rn42/keymap_common.h b/keyboard/hhkb_rn42/keymap_common.h deleted file mode 100644 index 3622665f3..000000000 --- a/keyboard/hhkb_rn42/keymap_common.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -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/>. -*/ -#ifndef KEYMAP_COMMON_H -#define KEYMAP_COMMON_H - -#include <stdint.h> -#include <stdbool.h> -#include "keycode.h" -#include "action.h" -#include "action_code.h" -#include "action_layer.h" -#include "action_macro.h" -#include "action_util.h" -#include "report.h" -#include "host.h" -#include "print.h" -#include "debug.h" -#include "keymap.h" - - -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - -#define KEYMAP( \ - K31, K30, K00, K10, K11, K20, K21, K40, K41, K60, K61, K70, K71, K50, K51, \ - K32, K01, K02, K13, K12, K23, K22, K42, K43, K62, K63, K73, K72, K52, \ - K33, K04, K03, K14, K15, K24, K25, K45, K44, K65, K64, K74, K53, \ - K34, K05, K06, K07, K16, K17, K26, K46, K66, K76, K75, K55, K54, \ - K35, K36, K37, K57, K56 \ -) \ -{ \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_NO }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_NO }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_NO }, \ - { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_NO } \ -} - - -#define KEYMAP_JP( \ - K02, K32, K62, K22, K12, K52, K72, KA2, K92, K82, KB2, KE2, KF2, KD2, KC2, \ - K03, K63, K23, K13, K53, K73, KA3, K93, K83, KB3, KE3, KF3, KD3, \ - K06, K66, K26, K16, K56, K76, KA6, K96, K86, KB6, KE6, KF6, KD6, KC6, \ - K05, K65, K25, K15, K55, K75, KA5, K95, K85, KB5, KE5, KF5, KD5, KC5, \ - K04, K34, K64, K24, K14, K74, K94, K84, KB4, KE4, KF4, KD4, KC4 \ -) \ -{ \ - { KC_NO, KC_NO, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_NO }, \ - { KC_NO, KC_NO, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_NO }, \ - { KC_NO, KC_NO, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_NO }, \ - { KC_NO, KC_NO, KC_##K32, KC_NO, KC_##K34, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_##K52, KC_##K53, KC_NO, KC_##K55, KC_##K56, KC_NO }, \ - { KC_NO, KC_NO, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_NO }, \ - { KC_NO, KC_NO, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_NO }, \ - { KC_NO, KC_NO, KC_##K82, KC_##K83, KC_##K84, KC_##K85, KC_##K86, KC_NO }, \ - { KC_NO, KC_NO, KC_##K92, KC_##K93, KC_##K94, KC_##K95, KC_##K96, KC_NO }, \ - { KC_NO, KC_NO, KC_##KA2, KC_##KA3, KC_NO, KC_##KA5, KC_##KA6, KC_NO }, \ - { KC_NO, KC_NO, KC_##KB2, KC_##KB3, KC_##KB4, KC_##KB5, KC_##KB6, KC_NO }, \ - { KC_NO, KC_NO, KC_##KC2, KC_NO, KC_##KC4, KC_##KC5, KC_##KC6, KC_NO }, \ - { KC_NO, KC_NO, KC_##KD2, KC_##KD3, KC_##KD4, KC_##KD5, KC_##KD6, KC_NO }, \ - { KC_NO, KC_NO, KC_##KE2, KC_##KE3, KC_##KE4, KC_##KE5, KC_##KE6, KC_NO }, \ - { KC_NO, KC_NO, KC_##KF2, KC_##KF3, KC_##KF4, KC_##KF5, KC_##KF6, KC_NO } \ -} - -#endif diff --git a/keyboard/hhkb_rn42/keymap_hasu.c b/keyboard/hhkb_rn42/keymap_hasu.c deleted file mode 100644 index 433f9cb27..000000000 --- a/keyboard/hhkb_rn42/keymap_hasu.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Hasu: my personal keymap - */ -#include "keymap_common.h" - - -#ifdef KEYMAP_SECTION_ENABLE -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { -#else -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { -#endif - /* 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| [| ]|Backs| - * |-----------------------------------------------------------| - * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Fn6 | - * |-----------------------------------------------------------| - * |Fn7 | Z| X| C| V| B| N| M| ,| .|Fn2|Shift |Fn1| - * `-----------------------------------------------------------' - * |Gui|Alt | Fn4 |Fn5 |Gui| - * `-------------------------------------------' - */ - [0] = \ - KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ - LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,FN6, \ - FN7, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN1, \ - LGUI,LALT, FN4, FN5, RGUI), - - /* Layer 1: HHKB mode[HHKB Fn] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs| - * |-----------------------------------------------------------| - * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | - * |-----------------------------------------------------------| - * |Shift | | | | | | +| -|End|PgD|Dow|Shift | | - * `-----------------------------------------------------------' - * |Gui|Alt | Space |Alt |Gui| - * `-------------------------------------------' - */ - [1] = \ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, BSPC, \ - LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ - LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,TRNS, \ - LGUI,LALT, TRNS, RALT,RGUI), - - /* 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] = \ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ - LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,TRNS, \ - LGUI,LALT, SPC, RALT,RGUI), - - /* 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] = \ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, NO, WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ - LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,FN3, NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,TRNS, \ - LGUI,LALT, BTN1, TRNS,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| | | | | |Mb2|McL|McD|McR|Mb1| |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Mb1 |Fn |Fn | - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - [4] = \ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, NO, WH_D,MS_U,WH_U,RGHT,FN9, FN10,FN8, \ - LCTL,VOLD,VOLU,MUTE,NO, NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,TRNS, \ - LGUI,LALT, TRNS, TRNS,TRNS), - -#if 0 - /* Layer 3: Mouse mode(HJKL)[Semicolon] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|MwU|MwR| | | |Backs| - * |-----------------------------------------------------------| - * |Contro| | | | | |McL|McD|McU|McR|Fn0| |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Mb1 |Alt |Fn0| - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - TAB, NO, NO, NO, NO, NO, NO, WH_D,WH_U,RGHT,NO, NO, NO, BSPC, \ - LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,TRNS,QUOT,ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,SLSH,RSFT,NO, \ - LGUI,LALT, BTN1, RALT,TRNS), - - /* Layer4: Mouse mode(HJKL)[Space] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|MwU|MwR| |Wbk|Wfr|Alt-T| - * |-----------------------------------------------------------| - * |Contro| | | | | |McL|McD|McU|McR|Fn0| |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Fn0 |Alt |Fn0| - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - FN8, NO, NO, NO, NO, NO, NO, WH_D,WH_U,RGHT,NO, FN9, FN10,FN8, \ - LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,BTN1,NO, ENT, \ - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,FN9, FN10,NO, RSFT,NO, \ - LGUI,LALT, TRNS, RALT,RGUI), -#endif -#if 0 - /* Layer x: Matias half-qwerty keyboard style[Space] - * ,-----------------------------------------------------------. - * | -| 0| 9| 8| 7| 6| 5| 4| 3| 2| 1| | | |Esc| - * |-----------------------------------------------------------| - * |Backs| P| O| I| U| Y| T| R| E| W| Q| | |Tab | - * |-----------------------------------------------------------| - * |Contro| ;| L| K| J| H| G| F| D| S| A|Con|Control | - * |-----------------------------------------------------------| - * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Fn0 |Alt |Gui| - * `--------------------------------------------' - */ - KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \ - BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \ - LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \ - LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \ - LGUI,LALT, TRNS, RALT,RGUI), -#endif -}; - - - -/* id for user defined functions */ -enum function_id { - LSHIFT_LPAREN, -}; - -enum macro_id { - HELLO, - VOLUP, - ALT_TAB, -}; - - -/* - * Fn action definition - */ -#ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { -#else -const uint16_t fn_actions[] PROGMEM = { -#endif - [0] = ACTION_DEFAULT_LAYER_SET(0), // Default layer(not used) - [1] = ACTION_LAYER_TAP_TOGGLE(1), // HHKB layer(toggle with 5 taps) - [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* - [3] = ACTION_LAYER_TAP_KEY(3, KC_SCLN), // Mousekey layer with Semicolon* - [4] = ACTION_LAYER_TAP_KEY(4, KC_SPC), // Mousekey layer with Space - [5] = ACTION_LAYER_MOMENTARY(4), // Mousekey layer(IJKL) - [6] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT), // RControl with tap Enter - [7] = ACTION_MODS_ONESHOT(MOD_LSFT), // Oneshot Shift - [8] = ACTION_MACRO(ALT_TAB), // Application switching - [9] = ACTION_MODS_KEY(MOD_LALT, KC_LEFT), - [10] = ACTION_MODS_KEY(MOD_LALT, KC_RIGHT), - -// [x] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC), // LControl with tap Backspace -// [x] = ACTION_LMOD_TAP_KEY(KC_LCTL, KC_ESC), // LControl with tap Esc -// [x] = ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // Function: LShift with tap '(' -// [x] = ACTION_MACRO(HELLO), // Macro: say hello -// [x] = ACTION_MACRO(VOLUP), // Macro: media key -}; - - -/* - * Macro definition - */ -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch (id) { - case HELLO: - return (record->event.pressed ? - MACRO( I(0), T(H), T(E), T(L), T(L), W(255), T(O), END ) : - MACRO_NONE ); - case VOLUP: - return (record->event.pressed ? - MACRO( D(VOLU), U(VOLU), END ) : - MACRO_NONE ); - case ALT_TAB: - return (record->event.pressed ? - MACRO( D(LALT), D(TAB), END ) : - MACRO( U(TAB), END )); - } - return MACRO_NONE; -} - - - -/* - * user defined action function - */ -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - if (record->event.pressed) dprint("P"); else dprint("R"); - dprintf("%d", record->tap.count); - if (record->tap.interrupted) dprint("i"); - dprint("\n"); - - switch (id) { - case LSHIFT_LPAREN: - // Shift parentheses example: LShft + tap '(' - // http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#shift-parentheses - // http://geekhack.org/index.php?topic=41989.msg1304899#msg1304899 - if (record->event.pressed) { - if (record->tap.count > 0 && !record->tap.interrupted) { - if (record->tap.interrupted) { - dprint("tap interrupted\n"); - register_mods(MOD_BIT(KC_LSHIFT)); - } - } else { - register_mods(MOD_BIT(KC_LSHIFT)); - } - } else { - if (record->tap.count > 0 && !(record->tap.interrupted)) { - add_weak_mods(MOD_BIT(KC_LSHIFT)); - send_keyboard_report(); - register_code(KC_9); - unregister_code(KC_9); - del_weak_mods(MOD_BIT(KC_LSHIFT)); - send_keyboard_report(); - record->tap.count = 0; // ad hoc: cancel tap - } else { - unregister_mods(MOD_BIT(KC_LSHIFT)); - } - } - break; - } -} diff --git a/keyboard/hhkb_rn42/keymap_jp.c b/keyboard/hhkb_rn42/keymap_jp.c deleted file mode 100644 index 48d0ee70b..000000000 --- a/keyboard/hhkb_rn42/keymap_jp.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * HHKB JP Layout - */ -#include "keymap_common.h" - - -#ifdef KEYMAP_SECTION_ENABLE -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { -#else -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { -#endif - /* Layer 0: Default Layer */ - KEYMAP_JP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, \ - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,BSLS,ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RO, UP, RSFT, \ - FN0, ZKHK,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,FN0, LEFT,DOWN,RGHT), - - /* Layer 1: HHKB mode (HHKB Fn) - * ,-----------------------------------------------------------. - * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | | | - * |------------------------------------------------------` | - * | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig| | | - * |-----------------------------------------------------------| - * | | | | | | | +| -|End|PgD|Dow| | | | - * |-----------------------------------------------------------| - * | || | | | | | | | | || | | | - * `-----------------------------------------------------------' - */ - KEYMAP_JP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS, UP, TRNS, \ - TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,TRNS,PENT, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS), -}; - - - -/* - * Fn action definition - */ -#ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { -#else -const uint16_t fn_actions[] PROGMEM = { -#endif - [0] = ACTION_LAYER_MOMENTARY(1), -}; diff --git a/keyboard/hhkb_rn42/led.c b/keyboard/hhkb_rn42/led.c deleted file mode 100644 index 8a08fe27f..000000000 --- a/keyboard/hhkb_rn42/led.c +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2011 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 <avr/io.h> -#include "stdint.h" -#include "led.h" - - -/* HHKB has no LEDs */ -void led_set(uint8_t usb_led) -{ - if (usb_led & (1<<USB_LED_CAPS_LOCK)) { - DDRD |= (1<<6); - PORTD |= (1<<6); - } else { - DDRD |= (1<<6); - PORTD &= ~(1<<6); - } -} diff --git a/keyboard/hhkb_rn42/matrix.c b/keyboard/hhkb_rn42/matrix.c deleted file mode 100644 index fb9699794..000000000 --- a/keyboard/hhkb_rn42/matrix.c +++ /dev/null @@ -1,190 +0,0 @@ -/* -Copyright 2011 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/>. -*/ - -/* - * scan matrix - */ -#include <stdint.h> -#include <stdbool.h> -#include <util/delay.h> -#include "print.h" -#include "debug.h" -#include "util.h" -#include "timer.h" -#include "matrix.h" -#include "hhkb_avr.h" -#include <avr/wdt.h> -#include "suspend.h" -#include "lufa.h" - - -// matrix power saving -#define MATRIX_POWER_SAVE 10000 -static uint32_t matrix_last_modified = 0; - -// matrix state buffer(1:on, 0:off) -static matrix_row_t *matrix; -static matrix_row_t *matrix_prev; -static matrix_row_t _matrix0[MATRIX_ROWS]; -static matrix_row_t _matrix1[MATRIX_ROWS]; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ -#ifdef DEBUG - debug_enable = true; - debug_keyboard = true; -#endif - - KEY_INIT(); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; - for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; - matrix = _matrix0; - matrix_prev = _matrix1; -} - -uint8_t matrix_scan(void) -{ - uint8_t *tmp; - - tmp = matrix_prev; - matrix_prev = matrix; - matrix = tmp; - - // power on - if (!KEY_POWER_STATE()) KEY_POWER_ON(); - for (uint8_t row = 0; row < MATRIX_ROWS; row++) { - for (uint8_t col = 0; col < MATRIX_COLS; col++) { - KEY_SELECT(row, col); - _delay_us(5); - - // Not sure this is needed. This just emulates HHKB controller's behaviour. - if (matrix_prev[row] & (1<<col)) { - KEY_PREV_ON(); - } - _delay_us(10); - - // NOTE: KEY_STATE is valid only in 20us after KEY_ENABLE. - // If V-USB interrupts in this section we could lose 40us or so - // and would read invalid value from KEY_STATE. - uint8_t last = TIMER_RAW; - - KEY_ENABLE(); - - // Wait for KEY_STATE outputs its value. - // 1us was ok on one HHKB, but not worked on another. - // no wait doesn't work on Teensy++ with pro(1us works) - // no wait does work on tmk PCB(8MHz) with pro2 - // 1us wait does work on both of above - // 1us wait doesn't work on tmk(16MHz) - // 5us wait does work on tmk(16MHz) - // 5us wait does work on tmk(16MHz/2) - // 5us wait does work on tmk(8MHz) - // 10us wait does work on Teensy++ with pro - // 10us wait does work on 328p+iwrap with pro - // 10us wait doesn't work on tmk PCB(8MHz) with pro2(very lagged scan) - _delay_us(5); - - if (KEY_STATE()) { - matrix[row] &= ~(1<<col); - } else { - matrix[row] |= (1<<col); - } - - // Ignore if this code region execution time elapses more than 20us. - // MEMO: 20[us] * (TIMER_RAW_FREQ / 1000000)[count per us] - // MEMO: then change above using this rule: a/(b/c) = a*1/(b/c) = a*(c/b) - if (TIMER_DIFF_RAW(TIMER_RAW, last) > 20/(1000000/TIMER_RAW_FREQ)) { - matrix[row] = matrix_prev[row]; - } - - _delay_us(5); - KEY_PREV_OFF(); - KEY_UNABLE(); - - // NOTE: KEY_STATE keep its state in 20us after KEY_ENABLE. - // This takes 25us or more to make sure KEY_STATE returns to idle state. - _delay_us(75); - } - if (matrix[row] ^ matrix_prev[row]) matrix_last_modified = timer_read32(); - } - // power off - if (KEY_POWER_STATE() && - (USB_DeviceState == DEVICE_STATE_Suspended || - USB_DeviceState == DEVICE_STATE_Unattached ) && - timer_elapsed32(matrix_last_modified) > MATRIX_POWER_SAVE) { - KEY_POWER_OFF(); - suspend_power_down(); - } - return 1; -} - -bool matrix_is_modified(void) -{ - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix[i] != matrix_prev[i]) - return true; - } - return false; -} - -inline -bool matrix_has_ghost(void) -{ - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ - return matrix[row]; -} - -void matrix_print(void) -{ - print("\nr/c 01234567\n"); - for (uint8_t row = 0; row < matrix_rows(); row++) { - xprintf("%02X: %08b\n", row, bitrev(matrix_get_row(row))); - } -} - -void matrix_power_up(void) { - KEY_POWER_ON(); -} -void matrix_power_down(void) { - KEY_POWER_OFF(); -} From e7289bb029b28b824eb0ef7be23dba279057d7ac Mon Sep 17 00:00:00 2001 From: Nathan Ross Powell <nathanrosspowell@gmail.com> Date: Fri, 16 Jan 2015 00:07:22 -0500 Subject: [PATCH 26/78] KC_INSERT should be KC_INS The short name was incorrectly set as `KC_INT` when we want `KC_INS`. --- doc/keycode.txt | 2 +- keyboard/planck/.keymap_nathan.c.swp | Bin 0 -> 20480 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 keyboard/planck/.keymap_nathan.c.swp diff --git a/doc/keycode.txt b/doc/keycode.txt index 413756692..760c726e3 100644 --- a/doc/keycode.txt +++ b/doc/keycode.txt @@ -81,7 +81,7 @@ KC_F12 45 Keyboard F12 KC_PSCREEN KC_PSCR 46 Keyboard PrintScreen1 KC_SCKLOCK KC_SLCK 47 Keyboard Scroll Lock11 KC_PAUSE KC_PAUS 48 Keyboard Pause1 -KC_INSERT KC_INT 49 Keyboard Insert1 +KC_INSERT KC_INS 49 Keyboard Insert1 KC_HOME 4A Keyboard Home1 KC_PGUP 4B Keyboard PageUp1 KC_DELETE KC_DELETE 4C Keyboard Delete Forward diff --git a/keyboard/planck/.keymap_nathan.c.swp b/keyboard/planck/.keymap_nathan.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..d545015c2b4b9413460d15f512a9b4759ae860c7 GIT binary patch literal 20480 zcmeI2YiuLeb;l=hHf`)CF%q{xQ^&d9wY8L150cV8?X^wuu~L_$#w4X(S+==cX(Vx% z;;?+Iyk5$1ntW(eAWc35*am&1NCVhK(z*@W2JVL@1#GuQAAyTHn>Hwd0{zk!?WY#W zhdzGi%y2|KcDY_l1=@0e|DTt0&pr3dxp(f&Idd<D=cY5}_~?Yiaj#{4@|V6*kmC1# z(z3Fp=4z=b|89L`V}+?$);@k~Da(qV8mraaOU`1mG1gqWT)gaDz37(eOJhNyRw-2% zFU$Y6Qmt6k{zn&k>Fw9|J<#_+4-d4O%OfW~WQ|87;X?->G#~xQY>x*0>b?j19_V|Z z?}5Gt`X1<epzndc2l^iPzvh8v?Jn!TxTyDnPk{IMxQpK~xZD5#K7OA966A|a|LA+5 z?}5Gt`X1<epzndc2l^i9d!X-uz6bgq=zE~=f&V=oC@oo5^hYi0kAZyummI+BAGWO5 zz;A+=!56?&;BN5hhb-$7_!xNegO>F?7y^IuW0v(9@F`FM_k%yX$FkaB7z}{lAenFw zeCY$0^#HgZ{5ZG|yzSfYGQWQdz61UWyqCJ)=l2qL0Q?mA7`PkU_z}zc6YzELW$-2N zYhWD|Km>%rUEuBab1mQ{@M%y2C&5pEkAjbYe?4GX{{r3uKL>smtb<Vy0t4U%iIBI! zD_{=Hf>Yoj@P6<E5+~mUZ-8G0m%w=t2NCd}BwGF%{2llt_yqVC36(zpzXQGqu7eHB zaMYb<t6nvkSUfjV%+6$!kLYQyQUo?j@^7)!a7?C{F2<*lbGe!9sg8oiYI(WoESbkW zRUuOd<tB6S!C{lkCd{BYwRt|>b>8buG|Lfaw_~|vwlI~<C-eK%!(=WN-)rStT_qQ^ z^NgJJeSSM05%Fu5aQER<8jjU{Ldv)7OUHNnplo%1N1u*l(XAHU<>ioBF4316+$p-# zs`9c4na(^Iv^x6acdKwP%rXdPlZ8`(Y-7FLTwFDw^3tH+MwL2OoN9BlR(Bc=rkGS| zi;J#X2|7G&LMu+QxaKZ3LW5?&gfcUU;^cH8bT(d0=clGqg~4{$shoFeaF7|>thXE{ zs9vgfp==M*K8sDGzveW9w&>QEMjq4uk672NMYq~$nzhnm-9>DuwAd`;G_^s_h0x)( zky@`bY+B`N^8_c#OPgi4)*STj#?3Kobgsp8T~+(Gugbd&nJ2y<duSdoFWj!fJk>fb z-Xt-nPkS!Zfw|(Am%Kp<=8%q)FRL;eqGKUC{tSMN#S7Cj*`hZ=yH*yNKnv06t|DE_ z!{D&WMRt|*ZgO8Fd{YsoATpvSvZcS7M80@7Ij@dM=Tn7Y!(8%KH5J~{>8`@wQm4XO zy5Cj!$=R8}jxJl%vH4`Kn3>72BF1v_p{RE~-TJnRL=f?&r_8s=F(#ayn>mw7X3TQ6 z=*`r|g7m?iq=R9)7j^9Q{&)FV-0Yq7oVxWt9vn7fV`im%#W5EaE|^kv$y|8mf>~d6 zs-0WZa;mL0|At|XY<6A9W%I-4_IV0l3>*7QA}c&=`_CA)(9?1zH#dy6)1o)|WSX)# zci5z|k+5=vmXwUKDZx=;W5$L|_!K6VtEN)A>ePKN-n61~J9oV6Z7amJ3z=9UH+{aC zn>m*c{={d}dEe=Woa$0}*}v<r$-Fvr=<GNa`6aCKOIYTY#)HyCP&yivjs>OTLFq(L zIvJE=L21%#81u9x*WIxo8dwkwEQkgcL<0+=fd$dPf@oktG_W8VSP%^?hz1r!v0!+c z1u{O~^+o~<B7p^wz=B9%K_svs5?BxkEQkaaL;?#Ufd!FWEC>e{gaZr0fd%2ff^c9# zIItibSP%{@2nQB~0}H}|1!3O;)<xeF42RAHnEqk<hUpikPniB-`hw{PrVkkXFuLK% z&e)1R8CO{K$#_y$eKL-eRiBI>Wz{F+Mp^aAcu}70jFjk;QG!*Uj1FbhC!<1H^~q>Z zR(&!GlvSU2pYj%c;&XFW{0*x<@iS%BC;p|Z`oyo4RiF5ivg!+~zC%mSa=GdlR_#p8 zE}qFvCqlkkhsG={H$&#a$le@>eSK|FYxaOU`u4`Wk#<L)nAf-O9eZ`Z{5SlLE!n-n zsEjWUEL(T98}HF$^ad!)tEl&+HOp?@G*=ySc%@!mIxLShx7D-`m6xlCcHbx#C##E< z){<imddiB6?%JAL9bG+WSv=fht>&s*KV`g4`zGf$8pd|lol3<#>TRU2yN#Njcw&WT zXl0c4k69A`A0RH3m{sC``R4x$asCBxFZd>LehnD#ZQ}eFK^P2z`@n0&`RgDAZV=;t z2fPYC3nsxs;NOV(zXE2#0q}do^bU~N|25+H7I+v)eE$LPhs5g@@BsJ=;_^QSuYe2S zUhqxg@ES1S+r->2f-v~Le;t3x@9V_XSHJ+cPTeXv1`dGtf%gCl{4TPufX{$17z6hK ziPOIi-U43-zYauS0z|>b!9CyxvHI)a8{oIVOW^b17r~p<|0#GCd<A?Cya;Nb2zEKV zK;RvQ{hQH)tR-^nJR@h{U1YnLOSD+i*SGu1vD?}0{@VUOXrmQEdhDf(wTo>})vWVe zv(UEd&Xq!sCv2wGbWD5Bt&Aui;fZID*(O-Ug9~_fg+QNPe%loJZJWc&2bC`<zn}~S zPu^#=JgB^({Ftx>@mA7)cV-2x1AU^Fz8_S6Liv#LL&^^;KdU^TJfu9Ld_?)Qum$al zeW{4pmx?NnD^I|wqtdHM9aBE8d_wu8awIIZk%)3Mux~G)sytMqq=TxaUS3&kj@3(L z(kNa$sNTT9+YeSf$(w|%UKAbZOJ(KVH<gul-&9uKeN$O^_f2Kx-8Yrx-FIiyYKye7 z^XdE!ZSo3E$V)Sggb|A8P!XHW51V{CewK1V!eU#xGPZPOZ0X9_5;a>C<Vfb@oJ(nS zO5VBgzr3(B3c^{5TVeiWJ*D!FZfto+H@3<rlB#V%GbY_H=N2M+x=!njux$~MKA0}I z!Bg%Ui-^6Fs0z>4Xq6<Bv41y#XOkTk`)s`-Y`r0Dy&-J5As81p+gfAd!%Tdbi4Tt} zkL|a8@v+!gq8%U0k0sk?y4t`ub@EDWyVPnp?R?r@ye!s?sx=eJN0pB$pWa9Nn3{N~ zvu2!>^5z1OKf(-c$Mc+OXFFCNSDQ{Ki+sYV1orLaA|i{XF^3nM^~y-8(i~ZGDo)cm zJnWy+Jo$*zSS;0?&UB43)#~oLDb*c$oj1HbUvwK@c3hR^T2)anS$9g8Yc4|||ME?z zX51@IJ@`X~tACuPS!~rC5&^iTLSWqKsX#!`bZbFxbLB>>R5AHxYpLvZ_sdck(WS8B zEH}q0yxiBft%T__v(v+7QkEaql>F4NNypNxDXFY15qVpd4v$%hD5sN>NKMR~BY7vO zJ7aQZrX=qvw*p5_6Rl54g*mS*8jP7!Cd%iaDMv<GQmnel=^`X668%I2b?JD4^q-^% zFhe<^oKilcjLjTBt<0LpAsIvD<7s*#?HXt+#KeFnwf3AciAWAsRSvF;V_tby8P9Oc zDC@Q2C_G}3YS#Si|KL)XahfHj`_tIdHe<@MO4GE{GN$c(t+dFktUOz*aVE`xn|8uo zXDKwSgr=R7r{TUWg?aga*f!6rWzQ)uDqm5)s9aTEQ(jOGDPL25RM>*{<9#L0jf^Ks z(uZj%FDWl8uPCo7UsArTTv2{RImi9DZ}t^RxTtM@MtfRUc9iSNP35b~E#<PZtIY7y zb~3-|zr9-uCH|Lq^@GH`693B{|9>Lx{}qr1|3TdURq!%+30w!C1)m1b1IZ06gQvkf zI1j?$hvWvn1-=G84_aUzoCXhq1K@|`4BiCSfdh_$yTDuI4Bh}6APOD^|4!cE4R9Tl z!6|SL_#QcguYqe|3P?`j@5v#^-hnTI444K};N##DIfZAzVK4x0kWY}k0g_+%RqzX7 z6&wTifFF=!_-pWG@EmZ!B)Av+1Nnouz;A;MkOPl{`@uir&p!fR1wRkYfnhKJJ`BX) z-z5id14xeH|KqV?F|j*Y3H`*l;U7CHg3S+J8{u1l+6`ZON9Aq(-n`%4aw@smY|)-C zO!0wKJ~8EDnIgq=(^>B$EY}tsu|#5b(U3W+`!B3Ol!BkA(T~}|hxNw;5&sLlebjsT z=x(_;CQaP2NfY~J()b;lG`?RZMeo?8=zf_Lxnq+e`(;x2j!g=CChgpH!rQmr8hkj{ z-~HeJVRb%T-Sqz2+%Ci$X=h)R<mK61B73-o0u{Gd3hdmOVs<uz$2#f~A$fyG9~-vd z+0Nf{p-4Ear_U-UmFJahWf3ogyz_Z2drV59OUi4(Td#M{>z}f23sdvm8hZrlt*Tin zmn!bcki<T^*JreL)hzfHKSMI!+cq+O%WW6D#>g%o@3o%~$;5tihL`d?f+1GBh4Jof z6g1pr!v`^>uR#JWiLGde!i00NwX#yKu85xK$*vt6yX#@~o)c%$^aX8lqGuD?wBR>6 zs7;RdY{H(0Ss4a;DQc5rJ)4l~@fsX4+Tv)>7AHLUAr+tKDSq4&A5ifvn|^k6_%ToX zSrzZSA?K(k{;-PQa&G9(f(cLjAr<dE`s1GXArX)C9%MG>i0hwF@!kXM&#VU#r&azc z@qVSDZErc!+b20$5U*beQjX+TmzzhDnpsd)H=h9n>f2S3sq0cjgm{Dm35g5O!nkB4 zRB7)?;w=MQ)??bB_cZbMi_+qnw&*=m<kl9)>0Yth*t-><$z)>Q<vprh^qwyMX4Sx` z-ZSQ;*FlI5Xf;_Uu+|~nGNQ8GHk2vaOkOc$%Mf+yn5j~?#nYWSrlr(vacZZ|-ypWd zeVsbl8AiJ;cU7kjZ&HWNcHLd6m;9|--gNA`$G2}b^QZjITsi%8duw|;f9~%{EWPuM zYb35QTz03C$nKQJgOZ;NqBato3lHCPHyVn(oP8#Ho{Ub$mc3*<^Zi~@+?Sj!kO!KZ zNt0WG$^B&P^t@4jieY|p()(n_J3G;2kBzrajq_y5yStEEK@(Zz_DN?=DEn90rB1fh zP)%c0X#PvK_)z9E0<4W?iw|Xz_uh6m%3g*)mfy^4r6e=Qw-{xbQKlK}<@~ilO0)VY Vy5ziO^|yQl@N#b6%-WLH`fv1GjI96w literal 0 HcmV?d00001 From f31cbc7219c9a1903331771c10056302817e68ca Mon Sep 17 00:00:00 2001 From: Ralf Schmitt <ralf@bunkertor.net> Date: Wed, 12 Nov 2014 14:05:57 +0100 Subject: [PATCH 27/78] Changed hotkey for bootloader jump --- common/command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/command.c b/common/command.c index 1a507e3a4..c50d3eb4b 100644 --- a/common/command.c +++ b/common/command.c @@ -216,7 +216,7 @@ static bool command_common(uint8_t code) print("C> "); command_state = CONSOLE; break; - case KC_PAUSE: + case KC_B: clear_keyboard(); print("\n\nJump to bootloader... "); _delay_ms(1000); From d9b5f5110ebf3e7da6a11e8640fb4367114aed67 Mon Sep 17 00:00:00 2001 From: Ralf Schmitt <ralf@bunkertor.net> Date: Tue, 11 Nov 2014 14:49:16 +0100 Subject: [PATCH 28/78] Added NerD 60% support --- README.md | 1 + keyboard/nerd/Makefile | 123 ++++++++++++++++++ keyboard/nerd/README.md | 45 +++++++ keyboard/nerd/backlight.c | 75 +++++++++++ keyboard/nerd/backlight.h | 40 ++++++ keyboard/nerd/config.h | 49 ++++++++ keyboard/nerd/keymap_ansi150.c | 39 ++++++ keyboard/nerd/keymap_common.c | 29 +++++ keyboard/nerd/keymap_common.h | 67 ++++++++++ keyboard/nerd/led.c | 25 ++++ keyboard/nerd/matrix.c | 220 +++++++++++++++++++++++++++++++++ 11 files changed, 713 insertions(+) create mode 100644 keyboard/nerd/Makefile create mode 100644 keyboard/nerd/README.md create mode 100644 keyboard/nerd/backlight.c create mode 100644 keyboard/nerd/backlight.h create mode 100644 keyboard/nerd/config.h create mode 100644 keyboard/nerd/keymap_ansi150.c create mode 100644 keyboard/nerd/keymap_common.c create mode 100644 keyboard/nerd/keymap_common.h create mode 100644 keyboard/nerd/led.c create mode 100644 keyboard/nerd/matrix.c diff --git a/README.md b/README.md index e077fc928..e918faa0d 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ You can find some keyboard specific projects under `converter` and `keyboard` di * [KMAC](keyboard/kmac/) - Korean custom keyboard * [Lightsaber](keyboard/lightsaber/) - Korean custom keyboard * [Infinity](keyboard/infinity/) - Massdrop [Infinity keyboard][Infinity] +* [NerD](keyboard/nerd/) - Korean custom keyboard [GH_macway]: http://geekhack.org/showwiki.php?title=Island:11930 [GH_hhkb]: http://geekhack.org/showwiki.php?title=Island:12047 diff --git a/keyboard/nerd/Makefile b/keyboard/nerd/Makefile new file mode 100644 index 000000000..10fa144fb --- /dev/null +++ b/keyboard/nerd/Makefile @@ -0,0 +1,123 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# Target file name (without extension). +TARGET = nerd_lufa + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# project specific files +SRC = keymap_common.c \ + matrix.c \ + backlight.c \ + led.c \ + keymap_ansi150.c + +CONFIG_H = config.h + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 8000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +#MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk + +winkey: OPT_DEFS += -DLAYOUT_WINKEY +winkey: all diff --git a/keyboard/nerd/README.md b/keyboard/nerd/README.md new file mode 100644 index 000000000..0130fe49f --- /dev/null +++ b/keyboard/nerd/README.md @@ -0,0 +1,45 @@ +NerD keyboard firmware +======================== + +Korean Keyboard designed by GON. + +*Note that this is not the official firmware* + + +Hardware revision +----------------- + +This firmware was developed and tested for NerD pcb version 1.61 and 2.0. + + +Supported features +------------------ + +* All layout options are supported +* All leds are supported + + +Changing Bootloader +------------------- + +You can't simply just upload this firmware to a new NerD board because the original +bootloader won't accept DFU connections. + +You can change the bootloader of the keyboard with an ISP programmer of your choice. +The bootloader pins are easy to access on the NerD pcb. + +*Be aware that after changing the bootloader the official configuration software +won't work anymore and you'll lose your warrenty. GON won't provide any support for this firmware.* + + +Build +----- + +Move to this directory then just run `make`. + + +Jump to Bootloader +------------------ + +You can jump to bootloader by software if you have a macro defined for this in your keymap. The +default command is (LSFT+RSFT+PAUS) to access the bootloader by software jump. diff --git a/keyboard/nerd/backlight.c b/keyboard/nerd/backlight.c new file mode 100644 index 000000000..804b4848a --- /dev/null +++ b/keyboard/nerd/backlight.c @@ -0,0 +1,75 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 <avr/io.h> +#include "backlight.h" + +void backlight_init_ports() +{ + DDRB |= 0b11100000; // PB7 (switch), PB6 (pcb), PB5 (caps) +} + +void backlight_set(uint8_t level) +{ + (level & BACKLIGHT_SWITCH) ? backlight_switch_enable() : backlight_switch_disable(); + (level & BACKLIGHT_PCB) ? backlight_pcb_enable() : backlight_pcb_disable(); +} + +void backlight_switch_enable() +{ + PORTB |= 0b10000000; +} + +void backlight_switch_disable() +{ + PORTB &= ~0b10000000; +} + +void backlight_switch_invert() +{ + PORTB ^= 0b10000000; +} + +void backlight_pcb_enable() +{ + PORTB |= 0b01000000; +} + +void backlight_pcb_disable() +{ + PORTB &= ~0b01000000; +} + +void backlight_pcb_invert() +{ + PORTB ^= 0b01000000; +} + +void backlight_caps_enable() +{ + PORTB |= 0b00100000; +} + +void backlight_caps_disable() +{ + PORTB &= ~0b00100000; +} + +void backlight_caps_invert() +{ + PORTB ^= 0b00100000; +} diff --git a/keyboard/nerd/backlight.h b/keyboard/nerd/backlight.h new file mode 100644 index 000000000..4c75d9db6 --- /dev/null +++ b/keyboard/nerd/backlight.h @@ -0,0 +1,40 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 BACKLIGHT_H +#define BACKLIGHT_H + +enum backlight_level { + BACKLIGHT_SWITCH = 0b0000001, + BACKLIGHT_PCB = 0b0000010, +}; + +void backlight_init_ports(void); + +void backlight_switch_invert(void); +void backlight_switch_enable(void); +void backlight_switch_disable(void); + +void backlight_pcb_invert(void); +void backlight_pcb_enable(void); +void backlight_pcb_disable(void); + +void backlight_caps_invert(void); +void backlight_caps_enable(void); +void backlight_caps_disable(void); + +#endif // BACKLIGHT_H diff --git a/keyboard/nerd/config.h b/keyboard/nerd/config.h new file mode 100644 index 000000000..7eab1cb09 --- /dev/null +++ b/keyboard/nerd/config.h @@ -0,0 +1,49 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ +#ifndef CONFIG_H +#define CONFIG_H + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER GON +#define PRODUCT NerD +#define DESCRIPTION t.m.k. keyboard firmware for NerD + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 10 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 2 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +#endif diff --git a/keyboard/nerd/keymap_ansi150.c b/keyboard/nerd/keymap_ansi150.c new file mode 100644 index 000000000..645ad6a83 --- /dev/null +++ b/keyboard/nerd/keymap_ansi150.c @@ -0,0 +1,39 @@ +#include "keymap_common.h" +#include "action_layer.h" +#include "backlight.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Layer 0: Default */ + KEYMAP_ANSI150(GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + ESC, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ + LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT, \ + LCTL,LGUI,LALT, SPC, RALT,FN0 ,RCTL), + /* Layer 1: Arrow keys */ + KEYMAP_ANSI150(TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + LEFT,DOWN,RGHT, TRNS, TRNS,TRNS,TRNS), + /* Layer 2: Space Fn */ + KEYMAP_ANSI150(TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS, FN1, TRNS,TRNS,TRNS), + /* Layer 3: Functions */ + KEYMAP_ANSI150(SLEP,F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, FN4, \ + TRNS,TRNS,UP, END, PSCR,SLCK,BRK, TRNS,INS, HOME,TRNS,VOLD,VOLU,FN5, \ + CAPS,LEFT,DOWN,RGHT,PGDN,TRNS,LEFT,DOWN,UP ,RGHT,TRNS,TRNS, TRNS, \ + TRNS, TRNS,DEL, TRNS,TRNS,PGUP,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + MPRV,MPLY,MNXT, TRNS, FN2,TRNS,FN3), +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(3), // Switch to function layer + [1] = ACTION_LAYER_TAP_KEY(3, KC_SPACE), // Switch to function layer (Space Fn) + [2] = ACTION_LAYER_TOGGLE(1), // Toggle "Arrow keys" layer + [3] = ACTION_LAYER_TOGGLE(2), // Toggle "Space fn" layer + [4] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_SWITCH), // Toggle switch leds + [5] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_PCB), // Toggle pcb leds +}; diff --git a/keyboard/nerd/keymap_common.c b/keyboard/nerd/keymap_common.c new file mode 100644 index 000000000..29ec4e53e --- /dev/null +++ b/keyboard/nerd/keymap_common.c @@ -0,0 +1,29 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 "keymap_common.h" + +/* translates key to keycode */ +uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) +{ + return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); +} + +/* translates Fn keycode to action */ +action_t keymap_fn_to_action(uint8_t keycode) +{ + return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; +} diff --git a/keyboard/nerd/keymap_common.h b/keyboard/nerd/keymap_common.h new file mode 100644 index 000000000..2d801654d --- /dev/null +++ b/keyboard/nerd/keymap_common.h @@ -0,0 +1,67 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 KEYMAP_COMMON_H +#define KEYMAP_COMMON_H + +#include <stdint.h> +#include <avr/pgmspace.h> +#include "keycode.h" +#include "action.h" +#include "action_macro.h" +#include "report.h" +#include "host.h" +#include "print.h" +#include "debug.h" +#include "keymap.h" + +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const uint16_t fn_actions[]; + +#define KEYMAP( \ + K08, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, \ + K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, \ + K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, K71, K65, \ + K07, K79, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, K67, \ + K06, K05, K78, K70, K72, K73, K74, K75 \ +) { \ +/* 0 1 2 3 4 5 6 7 8 9 */\ +/* 0 */ { KC_NO, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_NO }, \ +/* 1 */ { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_NO, KC_NO }, \ +/* 2 */ { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_NO, KC_NO }, \ +/* 3 */ { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_NO, KC_NO }, \ +/* 4 */ { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_NO, KC_NO }, \ +/* 5 */ { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57, KC_NO, KC_NO }, \ +/* 6 */ { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, KC_NO, KC_NO }, \ +/* 7 */ { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_NO, KC_NO, KC_##K78, KC_##K79 } \ +} + +#define KEYMAP_ANSI150( \ + K08, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, \ + K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, \ + K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, K65, \ + K07, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, \ + K06, K05, K78, K70, K73, K74, K75 \ +) KEYMAP( \ + K08, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, \ + K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, \ + K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, NO, K65, \ + K07, NO, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, NO, \ + K06, K05, K78, K70, NO, K73, K74, K75 \ +) + +#endif // KEYMAP_COMMON_H diff --git a/keyboard/nerd/led.c b/keyboard/nerd/led.c new file mode 100644 index 000000000..7d9ce6d87 --- /dev/null +++ b/keyboard/nerd/led.c @@ -0,0 +1,25 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 <avr/io.h> +#include "stdint.h" +#include "led.h" + +void led_set(uint8_t usb_led) +{ + (usb_led & (1<<USB_LED_CAPS_LOCK)) ? backlight_caps_enable() : backlight_caps_disable(); +} diff --git a/keyboard/nerd/matrix.c b/keyboard/nerd/matrix.c new file mode 100644 index 000000000..f0ffe772d --- /dev/null +++ b/keyboard/nerd/matrix.c @@ -0,0 +1,220 @@ +/* +Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> + +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 <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include <util/delay.h> +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "backlight.h" + + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif +static uint8_t debouncing = DEBOUNCE; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static uint16_t read_inputs(void); +static void init_inputs(void); +static void init_outputs(void); +static void reset_inputs(void); +static void reset_outputs(void); +static void select_output(uint8_t col); + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + backlight_init_ports(); + init_inputs(); + init_outputs(); + + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } +} + +uint8_t matrix_scan(void) +{ + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + reset_inputs(); + reset_outputs(); + select_output(col); + _delay_us(3); + uint16_t rows = read_inputs(); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col); + bool curr_bit = rows & (1<<row); + if (prev_bit != curr_bit) { + matrix_debouncing[row] ^= ((matrix_row_t)1<<col); + if (debouncing) { + dprint("bounce!: "); dprintf("%02X", debouncing); dprintln(); + } + debouncing = DEBOUNCE; + } + } + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + return 1; +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<<col)); +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +void matrix_print(void) +{ + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + pbin_reverse16(matrix_get_row(row)); + print("\n"); + } +} + +uint8_t matrix_key_count(void) +{ + uint8_t count = 0; + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + count += bitpop16(matrix[i]); + } + return count; +} + +static void init_inputs(void) +{ + DDRE &= ~0b01000000; // PE6 (Col 0) + DDRB &= ~0b00001111; // PB0 (Col 1), PB1 (Col 2), PB2 (Col 3), PB3 (Col 4) + DDRF &= ~0b00000001; // PF0 (Col 5) + DDRD &= ~0b00100001; // PD0 (Col 6), PD5 (Col 7) +} + +static uint16_t read_inputs(void) +{ + return (PINE&(1<<6) ? 0 : (1<<0)) | // PE6 (Row 0) + (PINB&(1<<0) ? 0 : (1<<1)) | // PB0 (Row 1) + (PINB&(1<<1) ? 0 : (1<<2)) | // PB1 (Row 2) + (PINB&(1<<2) ? 0 : (1<<3)) | // PB2 (Row 3) + (PINB&(1<<3) ? 0 : (1<<4)) | // PB3 (Row 4) + (PINF&(1<<0) ? 0 : (1<<5)) | // PF0 (Row 5) + (PIND&(1<<0) ? 0 : (1<<6)) | // PD0 (Row 6) + (PIND&(1<<5) ? 0 : (1<<7)); // PD5 (Row 7) +} + +static void reset_inputs(void) +{ + PORTE |= 0b01000000; // PE6 (Col 0) + PORTB |= 0b00001111; // PB0 (Col 1), PB1 (Col 2), PB2 (Col 3), PB3 (Col 4) + PORTF |= 0b00000001; // PF0 (Col 5) + PORTD |= 0b00100001; // PD0 (Col 6), PD5 (Col 7) +} + +static void init_outputs(void) +{ + DDRB |= 0b00010000; // PB4 (Row 0) + DDRE |= 0b00000100; // PE2 (Row 1) + DDRF |= 0b11110010; // PF4 (Row 2), PF7 (Row 3), PF1 (Row 4), PF6 (Row 5), PF5 (Row 7) + DDRC |= 0b11000000; // PC6 (Row 6), PC7 (Row 9) + DDRD |= 0b10000000; // PD7 (Row 8) +} + +static void reset_outputs(void) +{ + PORTB |= 0b00010000; // PB4 (Row 0) + PORTE |= 0b00000100; // PE2 (Row 1) + PORTF |= 0b11110010; // PF4 (Row 2), PF7 (Row 3), PF1 (Row 4), PF6 (Row 5), PF5 (Row 7) + PORTC |= 0b11000000; // PC6 (Row 6), PC7 (Row 9) + PORTD |= 0b10000000; // PD7 (Row 8) +} + +static void select_output(uint8_t col) +{ + switch (col) { + case 0: + PORTB &= ~(1<<4); + break; + case 1: + PORTE &= ~(1<<2); + break; + case 2: + PORTF &= ~(1<<4); + break; + case 3: + PORTF &= ~(1<<7); + break; + case 4: + PORTF &= ~(1<<1); + break; + case 5: + PORTF &= ~(1<<6); + break; + case 6: + PORTC &= ~(1<<6); + break; + case 7: + PORTF &= ~(1<<5); + break; + case 8: + PORTD &= ~(1<<7); + break; + case 9: + PORTC &= ~(1<<7); + break; + } +} From 2d740203318e2b0164e584a853bd0172dd9127cb Mon Sep 17 00:00:00 2001 From: Ralf Schmitt <ralf@bunkertor.net> Date: Sun, 23 Nov 2014 13:29:07 +0100 Subject: [PATCH 29/78] Added NerD 80% (TKL) support --- keyboard/nerd/Makefile | 17 ++++--- keyboard/nerd/README.md | 9 +++- keyboard/nerd/backlight.c | 6 +++ keyboard/nerd/config.h | 4 +- keyboard/nerd/keymap_60_ansi150.c | 30 ++++++++++++ keyboard/nerd/keymap_80_ansi150.c | 33 ++++++++++++++ keyboard/nerd/keymap_ansi150.c | 39 ---------------- keyboard/nerd/keymap_common.h | 76 ++++++++++++++++++++----------- keyboard/nerd/led.c | 25 ---------- keyboard/nerd/matrix.c | 21 +++++---- 10 files changed, 149 insertions(+), 111 deletions(-) create mode 100644 keyboard/nerd/keymap_60_ansi150.c create mode 100644 keyboard/nerd/keymap_80_ansi150.c delete mode 100644 keyboard/nerd/keymap_ansi150.c delete mode 100644 keyboard/nerd/led.c diff --git a/keyboard/nerd/Makefile b/keyboard/nerd/Makefile index 10fa144fb..5fd382841 100644 --- a/keyboard/nerd/Makefile +++ b/keyboard/nerd/Makefile @@ -50,9 +50,15 @@ TARGET_DIR = . # project specific files SRC = keymap_common.c \ matrix.c \ - backlight.c \ - led.c \ - keymap_ansi150.c + backlight.c + +ifdef LAYOUT + OPT_DEFS += -DNERD_LAYOUT_$(LAYOUT) +endif + +ifdef KEYMAP + SRC := keymap_$(LAYOUT)_$(KEYMAP).c $(SRC) +endif CONFIG_H = config.h @@ -103,7 +109,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # comment out to disable the options. # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -#MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration @@ -118,6 +124,3 @@ VPATH += $(TOP_DIR) include $(TOP_DIR)/protocol/lufa.mk include $(TOP_DIR)/common.mk include $(TOP_DIR)/rules.mk - -winkey: OPT_DEFS += -DLAYOUT_WINKEY -winkey: all diff --git a/keyboard/nerd/README.md b/keyboard/nerd/README.md index 0130fe49f..5b4acd3ba 100644 --- a/keyboard/nerd/README.md +++ b/keyboard/nerd/README.md @@ -17,6 +17,7 @@ Supported features * All layout options are supported * All leds are supported +* 60% and 80% (TKL) pcbs are supported Changing Bootloader @@ -35,7 +36,13 @@ won't work anymore and you'll lose your warrenty. GON won't provide any support Build ----- -Move to this directory then just run `make`. +For building you have to specify two build-options, LAYOUT and KEYMAP. The layout option defines +pcb layout and can be either 60% or 80% at the momemnt. The keymap option selects your +preferred keymapping. + +Move to this directory then just run `make LAYOUT=60 KEYMAP=ansi150` + +to compile a firmware for a 60% pcb with ANSI 150 key mapping. Jump to Bootloader diff --git a/keyboard/nerd/backlight.c b/keyboard/nerd/backlight.c index 804b4848a..2dc85c753 100644 --- a/keyboard/nerd/backlight.c +++ b/keyboard/nerd/backlight.c @@ -17,12 +17,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <avr/io.h> #include "backlight.h" +#include "led.h" void backlight_init_ports() { DDRB |= 0b11100000; // PB7 (switch), PB6 (pcb), PB5 (caps) } +void led_set(uint8_t usb_led) +{ + (usb_led & (1<<USB_LED_CAPS_LOCK)) ? backlight_caps_enable() : backlight_caps_disable(); +} + void backlight_set(uint8_t level) { (level & BACKLIGHT_SWITCH) ? backlight_switch_enable() : backlight_switch_disable(); diff --git a/keyboard/nerd/config.h b/keyboard/nerd/config.h index 7eab1cb09..ac2e6989d 100644 --- a/keyboard/nerd/config.h +++ b/keyboard/nerd/config.h @@ -26,11 +26,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define DESCRIPTION t.m.k. keyboard firmware for NerD /* key matrix size */ -#define MATRIX_ROWS 8 +#define MATRIX_ROWS 9 #define MATRIX_COLS 10 /* Set 0 if debouncing isn't needed */ -#define DEBOUNCE 5 +#define DEBOUNCE 5 /* number of backlight levels */ #define BACKLIGHT_LEVELS 2 diff --git a/keyboard/nerd/keymap_60_ansi150.c b/keyboard/nerd/keymap_60_ansi150.c new file mode 100644 index 000000000..c43d19533 --- /dev/null +++ b/keyboard/nerd/keymap_60_ansi150.c @@ -0,0 +1,30 @@ +#include "keymap_common.h" +#include "backlight.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Layer 0: Default */ + KEYMAP_ANSI150(GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + ESC, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ + LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT, \ + LCTL,LGUI,LALT, SPC, RALT,FN0 ,RCTL), + /* Layer 1: Space Fn */ + KEYMAP_ANSI150(TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS, FN1, TRNS,FN0, TRNS), + /* Layer 2: Functions */ + KEYMAP_ANSI150(SLEP,F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, MUTE, \ + TRNS,BTN1,MS_U,BTN3,PSCR,SLCK,BRK, HOME,INS, END, MPLY,VOLD,VOLU,FN3, \ + CAPS,MS_L,MS_D,MS_R,PGDN,TRNS,LEFT,DOWN,UP ,RGHT,MPRV,MNXT, FN2, \ + UP, TRNS,DEL, TRNS,TRNS,PGUP,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + LEFT,DOWN,RGHT, TRNS, TRNS,TRNS,TRNS) +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(2), + [1] = ACTION_LAYER_TAP_KEY(2, KC_SPACE), + [2] = ACTION_LAYER_TOGGLE(1), + [3] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_SWITCH) +}; diff --git a/keyboard/nerd/keymap_80_ansi150.c b/keyboard/nerd/keymap_80_ansi150.c new file mode 100644 index 000000000..a2ba279c5 --- /dev/null +++ b/keyboard/nerd/keymap_80_ansi150.c @@ -0,0 +1,33 @@ +#include "keymap_common.h" +#include "backlight.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Layer 0: Default */ + KEYMAP_ANSI150(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK, BRK, \ + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME, PGUP, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, \ + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ + LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT, UP, \ + LCTL,LGUI,LALT, SPC, RALT,FN0, RCTL, LEFT,DOWN,RGHT), + /* Layer 1: Space Fn */ + KEYMAP_ANSI150(TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, \ + ESC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS, FN1, TRNS,FN0, TRNS, TRNS,TRNS,TRNS), + /* Layer 2: Functions */ + KEYMAP_ANSI150(SLEP, MYCM,WSCH,WHOM,MAIL,VOLD,VOLU,MUTE,MSEL,MPLY,MPRV,MNXT,MSTP, TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,END, TRNS,TRNS,TRNS,TRNS,TRNS,HOME,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, \ + TRNS,BTN1,MS_U,BTN3,PSCR,SLCK,TRNS,TRNS,INS, TRNS,TRNS,TRNS,TRNS,FN3, TRNS,TRNS,TRNS, \ + CAPS,MS_L,MS_D,MS_R,PGDN,TRNS,LEFT,DOWN,UP ,RGHT,TRNS,TRNS, FN2, \ + TRNS, TRNS,DEL, TRNS,TRNS,PGUP,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS), +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(2), + [1] = ACTION_LAYER_TAP_KEY(2, KC_SPACE), + [2] = ACTION_LAYER_TOGGLE(1), + [3] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_SWITCH) +}; diff --git a/keyboard/nerd/keymap_ansi150.c b/keyboard/nerd/keymap_ansi150.c deleted file mode 100644 index 645ad6a83..000000000 --- a/keyboard/nerd/keymap_ansi150.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "keymap_common.h" -#include "action_layer.h" -#include "backlight.h" - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Layer 0: Default */ - KEYMAP_ANSI150(GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ - ESC, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ - LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT, \ - LCTL,LGUI,LALT, SPC, RALT,FN0 ,RCTL), - /* Layer 1: Arrow keys */ - KEYMAP_ANSI150(TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - LEFT,DOWN,RGHT, TRNS, TRNS,TRNS,TRNS), - /* Layer 2: Space Fn */ - KEYMAP_ANSI150(TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ - TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS, FN1, TRNS,TRNS,TRNS), - /* Layer 3: Functions */ - KEYMAP_ANSI150(SLEP,F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, FN4, \ - TRNS,TRNS,UP, END, PSCR,SLCK,BRK, TRNS,INS, HOME,TRNS,VOLD,VOLU,FN5, \ - CAPS,LEFT,DOWN,RGHT,PGDN,TRNS,LEFT,DOWN,UP ,RGHT,TRNS,TRNS, TRNS, \ - TRNS, TRNS,DEL, TRNS,TRNS,PGUP,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - MPRV,MPLY,MNXT, TRNS, FN2,TRNS,FN3), -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(3), // Switch to function layer - [1] = ACTION_LAYER_TAP_KEY(3, KC_SPACE), // Switch to function layer (Space Fn) - [2] = ACTION_LAYER_TOGGLE(1), // Toggle "Arrow keys" layer - [3] = ACTION_LAYER_TOGGLE(2), // Toggle "Space fn" layer - [4] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_SWITCH), // Toggle switch leds - [5] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_PCB), // Toggle pcb leds -}; diff --git a/keyboard/nerd/keymap_common.h b/keyboard/nerd/keymap_common.h index 2d801654d..e11663591 100644 --- a/keyboard/nerd/keymap_common.h +++ b/keyboard/nerd/keymap_common.h @@ -33,35 +33,57 @@ extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; extern const uint16_t fn_actions[]; #define KEYMAP( \ - K08, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, \ - K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, \ - K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, K71, K65, \ - K07, K79, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, K67, \ - K06, K05, K78, K70, K72, K73, K74, K75 \ + K08, K09, K18, K19, K28, K29, K38, K39, K48, K49, K58, K59, K68, K69, K88, K89, \ + K00, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, K80, K81, K84, \ + K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, K82, K83, K85, \ + K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, K71, K65, \ + K07, K79, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, K67, K86, \ + K06, K05, K78, K70, K72, K73, K74, K75, K76, K77, K87 \ ) { \ -/* 0 1 2 3 4 5 6 7 8 9 */\ -/* 0 */ { KC_NO, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_NO }, \ -/* 1 */ { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_NO, KC_NO }, \ -/* 2 */ { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_NO, KC_NO }, \ -/* 3 */ { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_NO, KC_NO }, \ -/* 4 */ { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_NO, KC_NO }, \ -/* 5 */ { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57, KC_NO, KC_NO }, \ -/* 6 */ { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, KC_NO, KC_NO }, \ -/* 7 */ { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_NO, KC_NO, KC_##K78, KC_##K79 } \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09 }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19 }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29 }, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39 }, \ + { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_##K48, KC_##K49 }, \ + { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57, KC_##K58, KC_##K59 }, \ + { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, KC_##K68, KC_##K69 }, \ + { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77, KC_##K78, KC_##K79 }, \ + { KC_##K80, KC_##K81, KC_##K82, KC_##K83, KC_##K84, KC_##K85, KC_##K86, KC_##K87, KC_##K88, KC_##K89 } \ } -#define KEYMAP_ANSI150( \ - K08, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, \ - K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, \ - K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, K65, \ - K07, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, \ - K06, K05, K78, K70, K73, K74, K75 \ -) KEYMAP( \ - K08, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, \ - K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, \ - K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, NO, K65, \ - K07, NO, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, NO, \ - K06, K05, K78, K70, NO, K73, K74, K75 \ -) +#ifdef NERD_LAYOUT_60 + #define KEYMAP_ANSI150( \ + K08, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, \ + K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, \ + K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, K65, \ + K07, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, \ + K06, K05, K78, K70, K73, K74, K75 \ + ) KEYMAP( \ + K08, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \ + NO, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, NO, NO, NO, \ + K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, NO, NO, NO, \ + K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, NO, K65, \ + K07, NO, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, NO, NO, \ + K06, K05, K78, K70, NO, K73, K74, K75, NO, NO, NO \ + ) +#endif + +#ifdef NERD_LAYOUT_80 + #define KEYMAP_ANSI150( \ + K08, K09, K18, K19, K28, K29, K38, K39, K48, K49, K58, K59, K68, K69, K88, K89, \ + K00, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, K80, K81, K84, \ + K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, K82, K83, K85, \ + K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, K65, \ + K07, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, K86, \ + K06, K05, K78, K70, K73, K74, K75, K76, K77, K87 \ + ) KEYMAP( \ + K08, K09, K18, K19, K28, K29, K38, K39, K48, K49, K58, K59, K68, K69, K88, K89, \ + K00, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, K80, K81, K84, \ + K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, K82, K83, K85, \ + K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, NO, K65, \ + K07, NO, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, NO, K86, \ + K06, K05, K78, K70, NO, K73, K74, K75, K76, K77, K87 \ + ) +#endif #endif // KEYMAP_COMMON_H diff --git a/keyboard/nerd/led.c b/keyboard/nerd/led.c deleted file mode 100644 index 7d9ce6d87..000000000 --- a/keyboard/nerd/led.c +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> - -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 <avr/io.h> -#include "stdint.h" -#include "led.h" - -void led_set(uint8_t usb_led) -{ - (usb_led & (1<<USB_LED_CAPS_LOCK)) ? backlight_caps_enable() : backlight_caps_disable(); -} diff --git a/keyboard/nerd/matrix.c b/keyboard/nerd/matrix.c index f0ffe772d..eb5a9ab4f 100644 --- a/keyboard/nerd/matrix.c +++ b/keyboard/nerd/matrix.c @@ -142,19 +142,20 @@ static void init_inputs(void) DDRE &= ~0b01000000; // PE6 (Col 0) DDRB &= ~0b00001111; // PB0 (Col 1), PB1 (Col 2), PB2 (Col 3), PB3 (Col 4) DDRF &= ~0b00000001; // PF0 (Col 5) - DDRD &= ~0b00100001; // PD0 (Col 6), PD5 (Col 7) + DDRD &= ~0b00100011; // PD0 (Col 6), PD1 (Col 8 TKL), PD5 (Col 7) } static uint16_t read_inputs(void) { - return (PINE&(1<<6) ? 0 : (1<<0)) | // PE6 (Row 0) - (PINB&(1<<0) ? 0 : (1<<1)) | // PB0 (Row 1) - (PINB&(1<<1) ? 0 : (1<<2)) | // PB1 (Row 2) - (PINB&(1<<2) ? 0 : (1<<3)) | // PB2 (Row 3) - (PINB&(1<<3) ? 0 : (1<<4)) | // PB3 (Row 4) - (PINF&(1<<0) ? 0 : (1<<5)) | // PF0 (Row 5) - (PIND&(1<<0) ? 0 : (1<<6)) | // PD0 (Row 6) - (PIND&(1<<5) ? 0 : (1<<7)); // PD5 (Row 7) + return (PINE&(1<<6) ? 0 : (1<<0)) | // PE6 (Col 0) + (PINB&(1<<0) ? 0 : (1<<1)) | // PB0 (Col 1) + (PINB&(1<<1) ? 0 : (1<<2)) | // PB1 (Col 2) + (PINB&(1<<2) ? 0 : (1<<3)) | // PB2 (Col 3) + (PINB&(1<<3) ? 0 : (1<<4)) | // PB3 (Col 4) + (PINF&(1<<0) ? 0 : (1<<5)) | // PF0 (Col 5) + (PIND&(1<<0) ? 0 : (1<<6)) | // PD0 (Col 6) + (PIND&(1<<5) ? 0 : (1<<7)) | // PD5 (Col 7) + (PIND&(1<<1) ? 0 : (1<<8)); // PD1 (Col 8 TKL) } static void reset_inputs(void) @@ -162,7 +163,7 @@ static void reset_inputs(void) PORTE |= 0b01000000; // PE6 (Col 0) PORTB |= 0b00001111; // PB0 (Col 1), PB1 (Col 2), PB2 (Col 3), PB3 (Col 4) PORTF |= 0b00000001; // PF0 (Col 5) - PORTD |= 0b00100001; // PD0 (Col 6), PD5 (Col 7) + PORTD |= 0b00100011; // PD0 (Col 6), PD1 (Col 8 TKL), PD5 (Col 7) } static void init_outputs(void) From 07b54cb513dbc14322158ca531596fe96dd9df0c Mon Sep 17 00:00:00 2001 From: Ralf Schmitt <ralf@bunkertor.net> Date: Sun, 14 Dec 2014 12:15:17 +0100 Subject: [PATCH 30/78] Added missing keyboards to main README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e918faa0d..312886402 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,8 @@ You can find some keyboard specific projects under `converter` and `keyboard` di * [Lightsaber](keyboard/lightsaber/) - Korean custom keyboard * [Infinity](keyboard/infinity/) - Massdrop [Infinity keyboard][Infinity] * [NerD](keyboard/nerd/) - Korean custom keyboard +* [KittenPaw](keyboard/kittenpaw) - Custom Majestouch controller +* [Lightpad](keyboard/lightpad) - Korean custom keypad [GH_macway]: http://geekhack.org/showwiki.php?title=Island:11930 [GH_hhkb]: http://geekhack.org/showwiki.php?title=Island:12047 From 40fd75e5ededaa4800419426295f35ff6bccb138 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Sat, 17 Jan 2015 15:34:33 +0900 Subject: [PATCH 31/78] hhkb: Update RN-42 docs --- keyboard/hhkb/rn42/PowerSave.txt | 12 +++++++ keyboard/hhkb/rn42/RN42.txt | 62 +++++++++++++++++++++++++++----- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/keyboard/hhkb/rn42/PowerSave.txt b/keyboard/hhkb/rn42/PowerSave.txt index 8aea1c6dd..4b9c8f415 100644 --- a/keyboard/hhkb/rn42/PowerSave.txt +++ b/keyboard/hhkb/rn42/PowerSave.txt @@ -10,6 +10,18 @@ Battery drive: USB powered: 40.0mA + 52mA 01/17 + +Other keyboards: +HHKB Pro 55mA +HHKB Pro2 140mA +HHKB Pro 42mA(Alt) +HHKB Pro2 52mA(Alt BT controller USB mode) +HHKB Pro2 88mA(Alt BT controller BT mode connected) +HHKB Pro2 68mA(Alt BT controller BT mode config mode) +Poker X 6mA +Infinity 24mA(TMK) + 65mA(kiibohd) HHKB key switch power control diff --git a/keyboard/hhkb/rn42/RN42.txt b/keyboard/hhkb/rn42/RN42.txt index ace30da4e..64c3fdd4e 100644 --- a/keyboard/hhkb/rn42/RN42.txt +++ b/keyboard/hhkb/rn42/RN42.txt @@ -3,24 +3,70 @@ RN-42 Bluetooth Module Support Bluetooth controller board works with HHKB Pro2, JP, Type-S and Type-S JP and it supports both USB and Bluetooth as keyboard output protocol. Bluetooth module Roving Networks/Microchip RN-42 is installed on the board. +RN-42: +http://www.microchip.com/wwwproducts/Devices.aspx?product=RN42 + + +Capabitlities: +- USB keyboard functions + completely equivarent to USB controller including mouse keys and NKRO. +- Switching between USB and Bluetooth + You can switch the two connections with BT switch or key combination. +- RN-42 config mode + You can change power/connection configuration of the module if needed. +- Low battery alert + Red LED turns on when low voltage. +- RN-42 status indicator + LED indicates status of Bluetooth connection. +- Pairing + The module stores up to 8 connections. +- Auto connect + The module connects the last connected device automatically. +- iOS support + works as keyboard with iPhone5. No tested completely. +- Android support + works as keyboard and mouse with Nexus5. No tested completely. +- Mouse keys over BT + Note that iOS doesn't accept mouse device. + + Limitations: -- short battery life -- connection switching - the module always connects to the last linked device. Remote address setting does not work as expected. -- HHKB JP requires case modification for power switch and LEDs. +- Short battery life + Around 12hr with 1000mAh +- No connection switching + RN-42 auto-connects to the last connected device. + Some of consumer products can switch between devices, for example Logitech K480. + http://www.logitech.com/en-us/product/multi-device-keyboard-k480?crid=26 +- HHKB JP requires case modification for BT switch and LEDs. without switch power controlled by MCU? Probably using 3.3V regulator enable pin power of RN-42 can be controlled. -- Wiress certification of RN-42 - Japan, Korea, Taiwan, Europe, FCC, Canada - http://www.microchip.com/wwwproducts/Devices.aspx?product=RN42 NOTE: -- Lipo battery is not included. Cannot ship it from Japan due to regulations. +- LIPO BATTERY IS VERY DANGEROUS, TAKE EXTRA CARE OF YOUR SAFETY AND PROPERTY. +- RN-42 version 6.15 is supported. +- No NKRO over Bluetooth +- Check you country's wiress regulation and certification of RN-42. Bugs: Todos: +Lipo Battery +------------ +You can use 3.7V Lithium Ion battery with JST PH 2pin connector and protection circuit. +Battery space inside HHKB is around 54mm x 50mm and its height is 7mm. + +Sparkfun 850mAh +https://www.sparkfun.com/products/341 +Sparkfun 1000mAh +https://www.sparkfun.com/products/339 + +Sparkfun 2000mAh battery won't fit due to its size. + +Learn about Lipo battery: +https://learn.adafruit.com/li-ion-and-lipoly-batteries + + From 507e0636f03f7d30f90782353f6f3509006ec696 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Mon, 19 Jan 2015 10:20:20 +0900 Subject: [PATCH 32/78] Revert "Changed hotkey for bootloader jump" This reverts commit f31cbc7219c9a1903331771c10056302817e68ca. --- common/command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/command.c b/common/command.c index c50d3eb4b..1a507e3a4 100644 --- a/common/command.c +++ b/common/command.c @@ -216,7 +216,7 @@ static bool command_common(uint8_t code) print("C> "); command_state = CONSOLE; break; - case KC_B: + case KC_PAUSE: clear_keyboard(); print("\n\nJump to bootloader... "); _delay_ms(1000); From 1cda7b79fbae90b3dc40ac862f3c14bfd2f1f679 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Mon, 19 Jan 2015 10:35:06 +0900 Subject: [PATCH 33/78] Fix typo 'keyobard' #166 --- converter/adb_usb/README.md | 2 +- keyboard/hhkb/rn42/MEMO.txt | 2 +- protocol/adb.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/converter/adb_usb/README.md b/converter/adb_usb/README.md index defc477e2..21ad318c1 100644 --- a/converter/adb_usb/README.md +++ b/converter/adb_usb/README.md @@ -88,7 +88,7 @@ modifiers except for GUI key(Windows/Command). And most ADB keyboard has no diodes in its matrix so they are not NKRO, though ADB protocol itself supports it. See protocol/adb.c for more info. -If keyobard has ISO layout you need to use ISO keymap with `make KEYMAP=iso`. With ANSI +If keyboard has ISO layout you need to use ISO keymap with `make KEYMAP=iso`. With ANSI keymap you will suffer from swapped keys problem. https://github.com/tmk/tmk_keyboard/issues/35 diff --git a/keyboard/hhkb/rn42/MEMO.txt b/keyboard/hhkb/rn42/MEMO.txt index f772c4cb5..0363c2f43 100644 --- a/keyboard/hhkb/rn42/MEMO.txt +++ b/keyboard/hhkb/rn42/MEMO.txt @@ -161,7 +161,7 @@ TROUBLE SHOOT 07/16 After fix of voltage dividor on GPIO6, had a trouble that it could not send a char to BT module, though could receive. Found R8 had wrong 1K resistor and changed to 10K, after that it can send to the module again. Not sure how it had sent with the wrong 1K before. -07/18 On Linux, had an USB related trouble; keyobard or console didn't work for some reason. Changing PID cured this problem. Very annoying, took very long time before resolved it. +07/18 On Linux, had an USB related trouble; keyboard or console didn't work for some reason. Changing PID cured this problem. Very annoying, took very long time before resolved it. 12/07 rn42_rts() read 1 every time. R12 broke in open mode(no coductive), idk why, too much heat with soldering? and PF1 pin was not soldered. It resolved with resoldering PF1 and new resistor on R12. diff --git a/protocol/adb.c b/protocol/adb.c index f57afac93..bbff66df0 100644 --- a/protocol/adb.c +++ b/protocol/adb.c @@ -360,7 +360,7 @@ Commands 3: mice Registers: - 0: application(keyobard uses this to store its data.) + 0: application(keyboard uses this to store its data.) 1: application 2: application(keyboard uses this for LEDs and state of modifiers) 3: status and command From 771347c4a66a8ae1c377310a09d43d5a135ffd14 Mon Sep 17 00:00:00 2001 From: tmk <hasu@tmk-kbd.com> Date: Mon, 19 Jan 2015 12:43:30 +0900 Subject: [PATCH 34/78] Add external projects using tmk_keyboard --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3dceb9639..280262577 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,11 @@ You can find some keyboard specific projects under `converter` and `keyboard` di * [Lightpad](keyboard/lightpad) - Korean custom keypad * [ghost_squid](keyboard/ghost_squid/) - [The Ghost Squid][ghost_squid] controller for [Cooler Master QuickFire XT][cmxt] +### Extenal projects using tmk_keyboard +* [ErgoDox_cub-uanic][cub-uanic] - Split Ergonomic Keyboard [ErgoDox][ergodox_org] +* [mcdox][mcdox_tmk] - [mcdox][mcdox] + + [GH_macway]: http://geekhack.org/showwiki.php?title=Island:11930 [GH_hhkb]: http://geekhack.org/showwiki.php?title=Island:12047 [GH_ps2]: http://geekhack.org/showwiki.php?title=Island:14618 @@ -80,6 +85,10 @@ You can find some keyboard specific projects under `converter` and `keyboard` di [Infinity]: https://www.massdrop.com/buy/infinity-keyboard-kit [ghost_squid]: http://deskthority.net/wiki/Costar_replacement_controllers#The_Ghost_Squid [cmxt]: http://gaming.coolermaster.com/en/products/keyboards/quickfirext/ +[ergodox_org]: http://ergodox.org/ +[cub-uanic]: https://github.com/cub-uanic/tmk_keyboard/tree/master/keyboard/ergodox +[mcdox]: https://github.com/DavidMcEwan/mcdox +[mcdox_tmk]: https://github.com/DavidMcEwan/tmk_keyboard/tree/master/keyboard/mcdox @@ -284,4 +293,4 @@ Coding Style Other Keyboard Firmware Projects ------------------ -See [doc/other_projects.md](doc/other_projects.md). +You can learn a lot about keyboard firmware from these. See [doc/other_projects.md](doc/other_projects.md). From 012ec9e3794816e245acabac223c5be230ae67d3 Mon Sep 17 00:00:00 2001 From: Ralf Schmitt <ralf@bunkertor.net> Date: Mon, 19 Jan 2015 20:10:49 +0100 Subject: [PATCH 35/78] NerD, turn BRK into PAUS to get bootloader jump back. --- keyboard/nerd/keymap_60_ansi150.c | 2 +- keyboard/nerd/keymap_80_ansi150.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboard/nerd/keymap_60_ansi150.c b/keyboard/nerd/keymap_60_ansi150.c index c43d19533..f85836ab5 100644 --- a/keyboard/nerd/keymap_60_ansi150.c +++ b/keyboard/nerd/keymap_60_ansi150.c @@ -16,7 +16,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS, FN1, TRNS,FN0, TRNS), /* Layer 2: Functions */ KEYMAP_ANSI150(SLEP,F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, MUTE, \ - TRNS,BTN1,MS_U,BTN3,PSCR,SLCK,BRK, HOME,INS, END, MPLY,VOLD,VOLU,FN3, \ + TRNS,BTN1,MS_U,BTN3,PSCR,SLCK,PAUS,HOME,INS, END, MPLY,VOLD,VOLU,FN3, \ CAPS,MS_L,MS_D,MS_R,PGDN,TRNS,LEFT,DOWN,UP ,RGHT,MPRV,MNXT, FN2, \ UP, TRNS,DEL, TRNS,TRNS,PGUP,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ LEFT,DOWN,RGHT, TRNS, TRNS,TRNS,TRNS) diff --git a/keyboard/nerd/keymap_80_ansi150.c b/keyboard/nerd/keymap_80_ansi150.c index a2ba279c5..72a7d83c9 100644 --- a/keyboard/nerd/keymap_80_ansi150.c +++ b/keyboard/nerd/keymap_80_ansi150.c @@ -3,9 +3,9 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0: Default */ - KEYMAP_ANSI150(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK, BRK, \ - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME, PGUP, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, \ + KEYMAP_ANSI150(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, \ + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, \ CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT, UP, \ LCTL,LGUI,LALT, SPC, RALT,FN0, RCTL, LEFT,DOWN,RGHT), From e0f32742e9df2727409c3694c0bab893eb096971 Mon Sep 17 00:00:00 2001 From: Ralf Schmitt <ralf@bunkertor.net> Date: Tue, 20 Jan 2015 20:18:33 +0100 Subject: [PATCH 36/78] Kitten Paw, fix main README link to project. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 280262577..dd03e1403 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ You can find some keyboard specific projects under `converter` and `keyboard` di * [Lightsaber](keyboard/lightsaber/) - Korean custom keyboard * [Infinity](keyboard/infinity/) - Massdrop [Infinity keyboard][Infinity] * [NerD](keyboard/nerd/) - Korean custom keyboard -* [KittenPaw](keyboard/kittenpaw) - Custom Majestouch controller +* [KittenPaw](keyboard/kitten_paw) - Custom Majestouch controller * [Lightpad](keyboard/lightpad) - Korean custom keypad * [ghost_squid](keyboard/ghost_squid/) - [The Ghost Squid][ghost_squid] controller for [Cooler Master QuickFire XT][cmxt] From abf482de8e62880f27c377c2bdbcb664fda0df0b Mon Sep 17 00:00:00 2001 From: Jun Wako <wakojun@gmail.com> Date: Mon, 26 Jan 2015 11:25:22 +0900 Subject: [PATCH 37/78] Fix call parameter of suspend_power_down() --- protocol/bluefruit/main.c | 2 +- protocol/pjrc/main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/protocol/bluefruit/main.c b/protocol/bluefruit/main.c index 094fdb366..871062ab1 100644 --- a/protocol/bluefruit/main.c +++ b/protocol/bluefruit/main.c @@ -104,7 +104,7 @@ int main(void) dprintf("Starting main loop"); while (1) { while (suspend) { - suspend_power_down(WDTO_120MS); + suspend_power_down(); if (remote_wakeup && suspend_wakeup_condition()) { usb_remote_wakeup(); } diff --git a/protocol/pjrc/main.c b/protocol/pjrc/main.c index 4f87a1736..e7bdcc059 100644 --- a/protocol/pjrc/main.c +++ b/protocol/pjrc/main.c @@ -61,7 +61,7 @@ int main(void) #endif while (1) { while (suspend) { - suspend_power_down(WDTO_120MS); + suspend_power_down(); if (remote_wakeup && suspend_wakeup_condition()) { usb_remote_wakeup(); } From ceff93844bdde7b002fb9abc66b583126c2ae907 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Mon, 2 Mar 2015 20:37:17 -0500 Subject: [PATCH 38/78] simon --- keyboard/planck/keymap_brett.c | 4 ++-- keyboard/planck/keymap_jack.c | 2 +- keyboard/planck/keymap_simon.c | 44 ++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 keyboard/planck/keymap_simon.c diff --git a/keyboard/planck/keymap_brett.c b/keyboard/planck/keymap_brett.c index 16a12837c..378e78149 100644 --- a/keyboard/planck/keymap_brett.c +++ b/keyboard/planck/keymap_brett.c @@ -5,7 +5,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, LCTL, A, S, D, F, G, H, J, K, L, SCLN, ENT, LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, - LGUI, TAB, LCTL, LALT, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), + LGUI, TAB, RSFT, LALT, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), [1] = KEYMAP( /* RAISE */ GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, DEL, TRNS, F1, F2, F3, F4, F5, F6, 4, 5, 6, TRNS, TRNS, @@ -13,7 +13,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { MPRV, MNXT, TRNS, MUTE, TRNS, TRNS, FN1, TRNS, TRNS, TRNS, PGDN), [2] = KEYMAP( /* LOWER */ FN22, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, MINS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, EQL, + TRNS, TRNS, TRNS, PAUSE, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, EQL, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MPLY, MSTP, VOLU, VOLD, FN2, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), }; diff --git a/keyboard/planck/keymap_jack.c b/keyboard/planck/keymap_jack.c index 3724bca49..c74812121 100644 --- a/keyboard/planck/keymap_jack.c +++ b/keyboard/planck/keymap_jack.c @@ -24,7 +24,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; const uint16_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay - [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay [3] = ACTION_DEFAULT_LAYER_SET(0), [4] = ACTION_DEFAULT_LAYER_SET(1), diff --git a/keyboard/planck/keymap_simon.c b/keyboard/planck/keymap_simon.c new file mode 100644 index 000000000..37951364b --- /dev/null +++ b/keyboard/planck/keymap_simon.c @@ -0,0 +1,44 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( /* Jack */ + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, DOT, ENT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SCLN, DEL, + LCTL, ENT, LALT, CAPS, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), +[1] = KEYMAP( /* Jack RAISE */ + TRNS, F1, F2, F3, F4, NO, FN11, FN9, FN12, NO, FN14, TRNS, + TRNS, F5, F6, F7, F8, FN16, SLSH, MINS, EQL, LBRC, FN8, TRNS, + TRNS, F9, F10, F11, F12, F15, F16, FN22, SCLN, MINS, QUOT, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), +[2] = KEYMAP( /* Jack LOWER */ + FN22, 1, 2, 3, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC, + TRNS, 4, 5, 6, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, + TRNS, 7, 8, 9, 0, FN28, FN15, F7, F8, F9, F10, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay + + [8] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), + [9] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), + + [29] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE), +}; From c35c4283b9c2c65d62fe8dc5e4b7ca49a8f5af33 Mon Sep 17 00:00:00 2001 From: Jun Wako <wakojun@gmail.com> Date: Thu, 5 Mar 2015 10:38:18 +0900 Subject: [PATCH 39/78] infinity: For production model and add SpaceFn --- keyboard/infinity/Makefile | 7 ++++++- keyboard/infinity/config.h | 4 ++++ keyboard/infinity/keymap.c | 3 ++- keyboard/infinity/keymap_common.h | 28 +++++++++++++++++++++++++--- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/keyboard/infinity/Makefile b/keyboard/infinity/Makefile index 758296f33..e33c239af 100644 --- a/keyboard/infinity/Makefile +++ b/keyboard/infinity/Makefile @@ -12,11 +12,16 @@ OBJDIR = ./build OBJECTS = \ $(OBJDIR)/matrix.o \ - $(OBJDIR)/keymap.o \ $(OBJDIR)/keymap_common.o \ $(OBJDIR)/led.o \ $(OBJDIR)/main.o +ifdef KEYMAP + OBJECTS := $(OBJDIR)/keymap_$(KEYMAP).o $(OBJECTS) +else + OBJECTS := $(OBJDIR)/keymap.o $(OBJECTS) +endif + CONFIG_H = config.h INCLUDE_PATHS = -I. diff --git a/keyboard/infinity/config.h b/keyboard/infinity/config.h index 28f2ca029..dc734dbdb 100644 --- a/keyboard/infinity/config.h +++ b/keyboard/infinity/config.h @@ -36,4 +36,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. /* key combination for command */ #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + +/* for prototype */ +//#define INFINITY_PROTOTYPE + #endif diff --git a/keyboard/infinity/keymap.c b/keyboard/infinity/keymap.c index 100142f41..4726cee65 100644 --- a/keyboard/infinity/keymap.c +++ b/keyboard/infinity/keymap.c @@ -20,6 +20,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \ LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,FN0, \ NO, LGUI,LALT, SPC, RALT,RGUI,NO, NO), + /* Layer 1: HHKB mode (HHKB Fn) * ,-----------------------------------------------------------. * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| @@ -33,7 +34,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | |Gui|Alt | Space |Alt |Gui| | | * `-----------------------------------------------------------' */ - [1]= + [1] = KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS, UP, TRNS, BSPC, \ TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,PENT, \ diff --git a/keyboard/infinity/keymap_common.h b/keyboard/infinity/keymap_common.h index 7a5f778f2..b0f765bfe 100644 --- a/keyboard/infinity/keymap_common.h +++ b/keyboard/infinity/keymap_common.h @@ -33,9 +33,9 @@ extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; extern const uint16_t fn_actions[]; -/* GH60 keymap definition macro - * K2C, K31 and K3C are extra keys for ISO - */ +#ifdef INFINITY_PROTOTYPE + +/* Infinity prototype */ #define KEYMAP( \ K00, K10, K20, K30, K40, K50, K60, K70, K80, K01, K11, K21, K31, K41, K86, \ K51, K61, K71, K81, K02, K12, K22, K32, K42, K52, K62, K72, K82, K03, \ @@ -54,5 +54,27 @@ extern const uint16_t fn_actions[]; { KC_##K80, KC_##K81, KC_##K82, KC_##K83, KC_##K84, KC_##K85, KC_##K86 } \ } +#else + +/* Infinity production */ +#define KEYMAP( \ + K00, K10, K20, K30, K40, K50, K60, K70, K80, K01, K11, K21, K31, K41, K51, \ + K61, K71, K81, K02, K12, K22, K32, K42, K52, K62, K72, K82, K03, K13, \ + K23, K33, K43, K53, K63, K73, K83, K04, K14, K24, K34, K44, K54, \ + K64, K74, K84, K05, K15, K25, K35, K45, K55, K65, K75, K85, K06, \ + K16, K26, K36, K46, K56, K66, K76, K86 \ +) { \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06 }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16 }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26 }, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36 }, \ + { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46 }, \ + { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56 }, \ + { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66 }, \ + { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76 }, \ + { KC_##K80, KC_##K81, KC_##K82, KC_##K83, KC_##K84, KC_##K85, KC_##K86 } \ +} + #endif +#endif From 0fcb3b65f8f980bee606b3be44cad1469c42ea86 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Thu, 5 Mar 2015 14:29:33 -0500 Subject: [PATCH 40/78] brett --- keyboard/planck/keymap_brett.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboard/planck/keymap_brett.c b/keyboard/planck/keymap_brett.c index 378e78149..97d832b47 100644 --- a/keyboard/planck/keymap_brett.c +++ b/keyboard/planck/keymap_brett.c @@ -5,15 +5,15 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, LCTL, A, S, D, F, G, H, J, K, L, SCLN, ENT, LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, - LGUI, TAB, RSFT, LALT, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), + TAB, LGUI, RSFT, LALT, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), [1] = KEYMAP( /* RAISE */ GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, DEL, - TRNS, F1, F2, F3, F4, F5, F6, 4, 5, 6, TRNS, TRNS, - TRNS, F7, F8, F9, F10, F11, F12, 1, 2, 3, TRNS, PGUP, - MPRV, MNXT, TRNS, MUTE, TRNS, TRNS, FN1, TRNS, TRNS, TRNS, PGDN), + TRNS, F1, F2, F3, F4, F5, F6, 4, 5, 6, QUOT, TRNS, + TRNS, F7, F8, F9, F10, F11, F12, 1, 2, 3, TRNS, PGUP, + MPRV, MNXT, TRNS, MUTE, TRNS, TRNS, FN1, 0, 0, TRNS, PGDN), [2] = KEYMAP( /* LOWER */ - FN22, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, MINS, - TRNS, TRNS, TRNS, PAUSE, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, EQL, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MINS, + TRNS, TRNS, TRNS, PAUSE, TRNS, TRNS, TRNS, TRNS, LBRC, RBRC, BSLS, EQL, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MPLY, MSTP, VOLU, VOLD, FN2, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), }; From 15b9bce6bab13d85529fe9aaa91b3df9cd773e13 Mon Sep 17 00:00:00 2001 From: Wilba6582 <Jason.S.Wiliams@gmail.com> Date: Tue, 17 Mar 2015 00:43:37 +1100 Subject: [PATCH 41/78] Initial commit for Planck PCB Rev 1. - Backlight on PB7 controlled by Timer1 Fast PWM (no interrupts). - Backlight commands connected temporarily to top left keys. - Backlight init called from matrix.c, since there's no generic keyboard_init() override function. --- keyboard/planck/Makefile | 6 ++- keyboard/planck/config.h | 4 ++ keyboard/planck/keymap_wilba.c | 56 +++++++++++++++++++++++++ keyboard/planck/led.c | 22 +++++----- keyboard/planck/matrix.c | 74 +++++++++++++++++++++++----------- 5 files changed, 127 insertions(+), 35 deletions(-) create mode 100644 keyboard/planck/keymap_wilba.c diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index c456cb51b..001f17f31 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -50,7 +50,8 @@ TARGET_DIR = . # project specific files SRC = keymap_common.c \ matrix.c \ - led.c + led.c \ + backlight.c ifdef KEYMAP SRC := keymap_$(KEYMAP).c $(SRC) @@ -118,9 +119,10 @@ MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE #SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA - +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h index 81637f45b..0b0c15247 100644 --- a/keyboard/planck/config.h +++ b/keyboard/planck/config.h @@ -34,6 +34,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. /* define if matrix has ghost */ //#define MATRIX_HAS_GHOST +/* number of backlight levels */ +/* NOTE: this is the max value of 0..BACKLIGHT_LEVELS so really 16 levels. */ +#define BACKLIGHT_LEVELS 15 + /* Set 0 if debouncing isn't needed */ #define DEBOUNCE 5 diff --git a/keyboard/planck/keymap_wilba.c b/keyboard/planck/keymap_wilba.c new file mode 100644 index 000000000..696fda42e --- /dev/null +++ b/keyboard/planck/keymap_wilba.c @@ -0,0 +1,56 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( /* Wilba */ + FN27, FN28, FN29, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT, + LCTL, LGUI, LALT, RSFT, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), +[1] = KEYMAP( /* Wilba Alternate */ + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT, + LCTL, LGUI, LALT, RSFT, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), +[2] = KEYMAP( /* Wilba LOWER */ + TRNS, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, TRNS, + TRNS, F11, F12, LBRC, RBRC, FN20, EQL, FN23, FN24, MINS, FN21, TRNS, + TRNS, BSLS, GRV, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, FN1, TRNS, TRNS, MNXT, VOLD, VOLU, MPLY), +[3] = KEYMAP( /* Wilba RAISE */ + TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, TRNS, + TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS, + TRNS, FN25, FN22, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, TRNS), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // LOWER + [2] = ACTION_LAYER_MOMENTARY(3), // RAISE + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), // ! + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), // @ + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), // # + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), // $ + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), // % + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), // ^ + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), // & + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), // * + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), // ( + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), // ) + + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // _ + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // + + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // ~ + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // { + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // } + [25] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // | + + [26] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE), + + [27] = ACTION_BACKLIGHT_TOGGLE(), + [28] = ACTION_BACKLIGHT_INCREASE(), + [29] = ACTION_BACKLIGHT_DECREASE() + +}; diff --git a/keyboard/planck/led.c b/keyboard/planck/led.c index 6cffd5ea7..448df2ccf 100644 --- a/keyboard/planck/led.c +++ b/keyboard/planck/led.c @@ -22,13 +22,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. void led_set(uint8_t usb_led) { - // if (usb_led & (1<<USB_LED_FUNCTION)) { - // // Output high. - // DDRF |= (1<<0); - // PORTF |= (1<<0); - // } else { - // // Output low. - // DDRF &= ~(1<<0); - // PORTF &= ~(1<<0); - // } + // Using PE6 Caps Lock LED + if (usb_led & (1<<USB_LED_CAPS_LOCK)) + { + // Output high. + DDRE |= (1<<6); + PORTE |= (1<<6); + } + else + { + // Output low. + DDRE &= ~(1<<6); + PORTE &= ~(1<<6); + } } diff --git a/keyboard/planck/matrix.c b/keyboard/planck/matrix.c index 38d35e3e0..8cd9ac85b 100644 --- a/keyboard/planck/matrix.c +++ b/keyboard/planck/matrix.c @@ -27,6 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "debug.h" #include "util.h" #include "matrix.h" +#include "backlight.h" // TODO fix this dependency #ifndef DEBOUNCE @@ -57,6 +58,13 @@ uint8_t matrix_cols(void) void matrix_init(void) { + // To use PORTF disable JTAG with writing JTD bit twice within four cycles. + MCUCR |= (1<<JTD); + MCUCR |= (1<<JTD); + + // TODO fix this dependency + backlight_init_ports(); + // initialize row and col unselect_rows(); init_cols(); @@ -134,10 +142,19 @@ uint8_t matrix_key_count(void) return count; } +// +// Planck PCB Rev 1 Pin Assignments +// +// Column: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 +// Pin: F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 +// + static void init_cols(void) { - DDRB &= ~(1<<6 | 1<<5 | 1<<4); - PORTB |= (1<<6 | 1<<5 | 1<<4); + DDRB &= ~(1<<4 | 1<<0); + PORTB |= (1<<4 | 1<<0); + DDRC &= ~(1<<7); + PORTC |= (1<<7); DDRD &= ~(1<<7 | 1<<6 | 1<<4); PORTD |= (1<<7 | 1<<6 | 1<<4); DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); @@ -147,46 +164,55 @@ static void init_cols(void) static matrix_row_t read_cols(void) { - return (PIND&(1<<4) ? 0 : (1<<0)) | - (PIND&(1<<6) ? 0 : (1<<1)) | - (PIND&(1<<7) ? 0 : (1<<2)) | - (PINB&(1<<4) ? 0 : (1<<3)) | - (PINB&(1<<5) ? 0 : (1<<4)) | - (PINB&(1<<6) ? 0 : (1<<5)) | - (PINF&(1<<7) ? 0 : (1<<6)) | - (PINF&(1<<6) ? 0 : (1<<7)) | - (PINF&(1<<5) ? 0 : (1<<8)) | - (PINF&(1<<4) ? 0 : (1<<9)) | - (PINF&(1<<1) ? 0 : (1<<10)) | - (PINF&(1<<0) ? 0 : (1<<11)); + return (PINF&(1<<1) ? 0 : (1<<0)) | + (PINF&(1<<0) ? 0 : (1<<1)) | + (PINB&(1<<0) ? 0 : (1<<2)) | + (PINC&(1<<7) ? 0 : (1<<3)) | + (PINF&(1<<4) ? 0 : (1<<4)) | + (PINF&(1<<5) ? 0 : (1<<5)) | + (PINF&(1<<6) ? 0 : (1<<6)) | + (PINF&(1<<7) ? 0 : (1<<7)) | + (PIND&(1<<4) ? 0 : (1<<8)) | + (PIND&(1<<6) ? 0 : (1<<9)) | + (PINB&(1<<4) ? 0 : (1<<10)) | + (PIND&(1<<7) ? 0 : (1<<11)); } static void unselect_rows(void) { - DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3); - PORTB |= (1<<0 | 1<<1 | 1<<2 | 1<<3); + DDRB &= ~(1<<5 | 1<<6); + PORTB |= (1<<5 | 1<<6); + DDRD &= ~(1<<0 | 1<<5); + PORTD |= (1<<0 | 1<<5); } +// +// Planck PCB Rev 1 Pin Assignments +// +// Row: 0, 1, 2, 3 +// Pin: D0, D5, B5, B6 +// + static void select_row(uint8_t row) { switch (row) { case 0: - DDRB |= (1<<0); - PORTB &= ~(1<<0); + DDRD |= (1<<0); + PORTD &= ~(1<<0); break; case 1: - DDRB |= (1<<1); - PORTB &= ~(1<<1); + DDRD |= (1<<5); + PORTD &= ~(1<<5); break; case 2: - DDRB |= (1<<2); - PORTB &= ~(1<<2); + DDRB |= (1<<5); + PORTB &= ~(1<<5); break; case 3: - DDRB |= (1<<3); - PORTB &= ~(1<<3); + DDRB |= (1<<6); + PORTB &= ~(1<<6); break; } From b80b6b369c5ecb5c7232edf1e8cebe8c12078d6e Mon Sep 17 00:00:00 2001 From: Wilba6582 <Jason.S.Wiliams@gmail.com> Date: Tue, 17 Mar 2015 00:51:36 +1100 Subject: [PATCH 42/78] Added backlight.h, backlight.c --- keyboard/planck/backlight.c | 46 +++++++++++++++++++++++++++++++++++++ keyboard/planck/backlight.h | 2 ++ 2 files changed, 48 insertions(+) create mode 100644 keyboard/planck/backlight.c create mode 100644 keyboard/planck/backlight.h diff --git a/keyboard/planck/backlight.c b/keyboard/planck/backlight.c new file mode 100644 index 000000000..d12dcf238 --- /dev/null +++ b/keyboard/planck/backlight.c @@ -0,0 +1,46 @@ + +#include <avr/io.h> +#include "backlight.h" + + +void backlight_init_ports() +{ + // Setup PB7 as output and output low. + DDRB |= (1<<7); + PORTB &= ~(1<<7); + + // Use full 16-bit resolution. + ICR1 = 0xFFFF; + + // I could write a wall of text here to explain... but TL;DW + // Go read the ATmega32u4 datasheet. + // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on + + // Pin PB7 = OCR1C (Timer 1, Channel C) + // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0 + // (i.e. start high, go low when counter matches.) + // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0 + // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 + + TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010; + TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; + + // Default to zero duty cycle. + OCR1C = 0x0000; +} + +void backlight_set(uint8_t level) +{ + if ( level == 0 ) + { + // Turn off PWM control on PB7, revert to output low. + TCCR1A &= ~(_BV(COM1C1)); + } + else + { + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + OCR1C = level << 12 | 0x0FFF; + } +} + diff --git a/keyboard/planck/backlight.h b/keyboard/planck/backlight.h new file mode 100644 index 000000000..0fe1f4a72 --- /dev/null +++ b/keyboard/planck/backlight.h @@ -0,0 +1,2 @@ + +void backlight_init_ports(void); From 65680819df13585a563296f008be1a4b0ee8045a Mon Sep 17 00:00:00 2001 From: Wilba6582 <Jason.S.Wiliams@gmail.com> Date: Tue, 17 Mar 2015 00:56:41 +1100 Subject: [PATCH 43/78] Replaced tabs with spaces to match TMK convention. --- keyboard/planck/backlight.c | 64 +++++++++++++++++----------------- keyboard/planck/keymap_wilba.c | 12 +++---- keyboard/planck/led.c | 4 +-- keyboard/planck/matrix.c | 6 ++-- 4 files changed, 43 insertions(+), 43 deletions(-) diff --git a/keyboard/planck/backlight.c b/keyboard/planck/backlight.c index d12dcf238..ee7e31ee9 100644 --- a/keyboard/planck/backlight.c +++ b/keyboard/planck/backlight.c @@ -5,42 +5,42 @@ void backlight_init_ports() { - // Setup PB7 as output and output low. - DDRB |= (1<<7); - PORTB &= ~(1<<7); - - // Use full 16-bit resolution. - ICR1 = 0xFFFF; + // Setup PB7 as output and output low. + DDRB |= (1<<7); + PORTB &= ~(1<<7); + + // Use full 16-bit resolution. + ICR1 = 0xFFFF; - // I could write a wall of text here to explain... but TL;DW - // Go read the ATmega32u4 datasheet. - // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on - - // Pin PB7 = OCR1C (Timer 1, Channel C) - // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0 - // (i.e. start high, go low when counter matches.) - // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0 - // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 - - TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010; - TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; - - // Default to zero duty cycle. - OCR1C = 0x0000; + // I could write a wall of text here to explain... but TL;DW + // Go read the ATmega32u4 datasheet. + // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on + + // Pin PB7 = OCR1C (Timer 1, Channel C) + // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0 + // (i.e. start high, go low when counter matches.) + // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0 + // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 + + TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010; + TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; + + // Default to zero duty cycle. + OCR1C = 0x0000; } void backlight_set(uint8_t level) { - if ( level == 0 ) - { - // Turn off PWM control on PB7, revert to output low. - TCCR1A &= ~(_BV(COM1C1)); - } - else - { - // Turn on PWM control of PB7 - TCCR1A |= _BV(COM1C1); - OCR1C = level << 12 | 0x0FFF; - } + if ( level == 0 ) + { + // Turn off PWM control on PB7, revert to output low. + TCCR1A &= ~(_BV(COM1C1)); + } + else + { + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + OCR1C = level << 12 | 0x0FFF; + } } diff --git a/keyboard/planck/keymap_wilba.c b/keyboard/planck/keymap_wilba.c index 696fda42e..9781f8fcd 100644 --- a/keyboard/planck/keymap_wilba.c +++ b/keyboard/planck/keymap_wilba.c @@ -39,7 +39,7 @@ const uint16_t PROGMEM fn_actions[] = { [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), // * [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), // ( [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), // ) - + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // _ [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // ~ @@ -48,9 +48,9 @@ const uint16_t PROGMEM fn_actions[] = { [25] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // | [26] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE), - - [27] = ACTION_BACKLIGHT_TOGGLE(), - [28] = ACTION_BACKLIGHT_INCREASE(), - [29] = ACTION_BACKLIGHT_DECREASE() - + + [27] = ACTION_BACKLIGHT_TOGGLE(), + [28] = ACTION_BACKLIGHT_INCREASE(), + [29] = ACTION_BACKLIGHT_DECREASE() + }; diff --git a/keyboard/planck/led.c b/keyboard/planck/led.c index 448df2ccf..1f3643488 100644 --- a/keyboard/planck/led.c +++ b/keyboard/planck/led.c @@ -22,8 +22,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. void led_set(uint8_t usb_led) { - // Using PE6 Caps Lock LED - if (usb_led & (1<<USB_LED_CAPS_LOCK)) + // Using PE6 Caps Lock LED + if (usb_led & (1<<USB_LED_CAPS_LOCK)) { // Output high. DDRE |= (1<<6); diff --git a/keyboard/planck/matrix.c b/keyboard/planck/matrix.c index 8cd9ac85b..e3926caec 100644 --- a/keyboard/planck/matrix.c +++ b/keyboard/planck/matrix.c @@ -62,9 +62,9 @@ void matrix_init(void) MCUCR |= (1<<JTD); MCUCR |= (1<<JTD); - // TODO fix this dependency - backlight_init_ports(); - + // TODO fix this dependency + backlight_init_ports(); + // initialize row and col unselect_rows(); init_cols(); From a296c83805c051ee0f416f11ded6124fac402579 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Mon, 16 Mar 2015 11:59:21 -0400 Subject: [PATCH 44/78] Create handwire-matrix.c --- keyboard/planck/handwire-matrix.c | 193 ++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 keyboard/planck/handwire-matrix.c diff --git a/keyboard/planck/handwire-matrix.c b/keyboard/planck/handwire-matrix.c new file mode 100644 index 000000000..2f2dbdb10 --- /dev/null +++ b/keyboard/planck/handwire-matrix.c @@ -0,0 +1,193 @@ +/* +Copyright 2012 Jun Wako +Generated by planckkeyboard.com (2014 Jack Humbert) + +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/>. +*/ + +/* + * scan matrix + */ +#include <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include <util/delay.h> +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" + + +#ifndef DEBOUNCE +# define DEBOUNCE 10 +#endif +static uint8_t debouncing = DEBOUNCE; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + // initialize row and col + unselect_rows(); + init_cols(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } +} + +uint8_t matrix_scan(void) +{ + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i] != cols) { + matrix_debouncing[i] = cols; + if (debouncing) { + debug("bounce!: "); debug_hex(debouncing); debug("\n"); + } + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + return 1; +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<col)); +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +void matrix_print(void) +{ + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + pbin_reverse16(matrix_get_row(row)); + print("\n"); + } +} + +uint8_t matrix_key_count(void) +{ + uint8_t count = 0; + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + count += bitpop16(matrix[i]); + } + return count; +} + +static void init_cols(void) +{ + DDRB &= ~(1<<6 | 1<<5 | 1<<4); + PORTB |= (1<<6 | 1<<5 | 1<<4); + DDRD &= ~(1<<7 | 1<<6 | 1<<4); + PORTD |= (1<<7 | 1<<6 | 1<<4); + DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + PORTF |= (1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + +} + +static matrix_row_t read_cols(void) +{ + return (PIND&(1<<4) ? 0 : (1<<0)) | + (PIND&(1<<6) ? 0 : (1<<1)) | + (PIND&(1<<7) ? 0 : (1<<2)) | + (PINB&(1<<4) ? 0 : (1<<3)) | + (PINB&(1<<5) ? 0 : (1<<4)) | + (PINB&(1<<6) ? 0 : (1<<5)) | + (PINF&(1<<7) ? 0 : (1<<6)) | + (PINF&(1<<6) ? 0 : (1<<7)) | + (PINF&(1<<5) ? 0 : (1<<8)) | + (PINF&(1<<4) ? 0 : (1<<9)) | + (PINF&(1<<1) ? 0 : (1<<10)) | + (PINF&(1<<0) ? 0 : (1<<11)); + +} + +static void unselect_rows(void) +{ + DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3); + PORTB |= (1<<0 | 1<<1 | 1<<2 | 1<<3); + +} + +static void select_row(uint8_t row) +{ + switch (row) { + case 0: + DDRB |= (1<<0); + PORTB &= ~(1<<0); + break; + case 1: + DDRB |= (1<<1); + PORTB &= ~(1<<1); + break; + case 2: + DDRB |= (1<<2); + PORTB &= ~(1<<2); + break; + case 3: + DDRB |= (1<<3); + PORTB &= ~(1<<3); + break; + + } +} From be86aefdbda560d6810f9594169fee4385c1422d Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Mon, 16 Mar 2015 11:59:49 -0400 Subject: [PATCH 45/78] Rename handwire-matrix.c to matrix-handwire.c --- keyboard/planck/{handwire-matrix.c => matrix-handwire.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename keyboard/planck/{handwire-matrix.c => matrix-handwire.c} (100%) diff --git a/keyboard/planck/handwire-matrix.c b/keyboard/planck/matrix-handwire.c similarity index 100% rename from keyboard/planck/handwire-matrix.c rename to keyboard/planck/matrix-handwire.c From 9c3a95663410a294f2c85ad2d1c016f328730e0b Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Wed, 18 Mar 2015 10:19:40 -0400 Subject: [PATCH 46/78] Update README.md --- keyboard/planck/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md index cb009c005..206d6ad80 100644 --- a/keyboard/planck/README.md +++ b/keyboard/planck/README.md @@ -9,6 +9,11 @@ DIY/Assembled compact ortholinear keyboard by [Ortholinear Keyboards](http://ort - [Matthew's Fork](https://github.com/pepers/tmk_keyboard/tree/master/keyboard/planck_grid) ## Build + +Follow [this guide](http://deskthority.net/workshop-f7/how-to-build-your-very-own-keyboard-firmware-t7177.html) to setup your development environment before anything else. + +Download the whole firmware [here](https://github.com/jackhumbert/tmk_keyboard/archive/master.zip) and navigate to the keyboard/planck folder. Once your dev env is setup, you'll be able to type "make" to generate your .hex that you can load with the Teensy app onto your Planck (once you've hit reset/shorted GND & RST). + Move to this directory then just run `make` like: $ make From e3169ccc4550490fa12d0960dbac11cf91f5a1d2 Mon Sep 17 00:00:00 2001 From: Jun Wako <wakojun@gmail.com> Date: Wed, 18 Mar 2015 15:56:07 +0900 Subject: [PATCH 47/78] m0110: Add support for international keyboard --- converter/m0110_usb/Makefile | 8 +- converter/m0110_usb/Makefile.teensy | 98 ++++++++++++ converter/m0110_usb/README.md | 21 ++- converter/m0110_usb/keymap.c | 223 --------------------------- converter/m0110_usb/keymap_common.h | 36 +++++ converter/m0110_usb/keymap_default.c | 85 ++++++++++ converter/m0110_usb/keymap_intl.c | 85 ++++++++++ converter/m0110_usb/keymap_plain.c | 2 +- converter/m0110_usb/led.c | 10 +- protocol/m0110.c | 21 ++- 10 files changed, 345 insertions(+), 244 deletions(-) create mode 100644 converter/m0110_usb/Makefile.teensy delete mode 100644 converter/m0110_usb/keymap.c create mode 100644 converter/m0110_usb/keymap_default.c create mode 100644 converter/m0110_usb/keymap_intl.c diff --git a/converter/m0110_usb/Makefile b/converter/m0110_usb/Makefile index ac54945e7..5f3bb98e2 100644 --- a/converter/m0110_usb/Makefile +++ b/converter/m0110_usb/Makefile @@ -17,7 +17,7 @@ SRC = matrix.c \ ifdef KEYMAP SRC += keymap_$(KEYMAP).c else - SRC += keymap_plain.c + SRC += keymap_default.c endif CONFIG_H = config.h @@ -25,10 +25,8 @@ CONFIG_H = config.h # MCU name, you MUST set this to match the board you are using # type "make clean" after changing this, so all files will be rebuilt -#MCU = at90usb162 # Teensy 1.0 -MCU = atmega32u4 # Teensy 2.0 -#MCU = at90usb646 # Teensy++ 1.0 -#MCU = at90usb1286 # Teensy++ 2.0 +MCU = atmega32u2 # TMK converter rev2 +MCU = atmega32u4 # TMK converter rev1 # Processor frequency. diff --git a/converter/m0110_usb/Makefile.teensy b/converter/m0110_usb/Makefile.teensy new file mode 100644 index 000000000..9a5c41068 --- /dev/null +++ b/converter/m0110_usb/Makefile.teensy @@ -0,0 +1,98 @@ +# Target file name (without extension). +TARGET = m0110_lufa + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# keyboard dependent files +SRC = matrix.c \ + led.c \ + keymap_common.c \ + m0110.c + +# To use own keymap file run make like: make keymap=hasu +ifdef KEYMAP + SRC += keymap_$(KEYMAP).c +else + SRC += keymap_default.c +endif + +CONFIG_H = config.h + + +# MCU name, you MUST set this to match the board you are using +# type "make clean" after changing this, so all files will be rebuilt +#MCU = at90usb162 # Teensy 1.0 +MCU = atmega32u4 # Teensy 2.0 +#MCU = at90usb646 # Teensy++ 1.0 +#MCU = at90usb1286 # Teensy++ 2.0 + + +# Processor frequency. +# Normally the first thing your program should do is set the clock prescaler, +# so your program will run at the correct speed. You should also set this +# variable to same clock speed. The _delay_ms() macro uses this, and many +# examples use this variable to calculate timings. Do not add a "UL" here. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in bytes +# Teensy halfKay 512 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# *Comment out* to disable the options. +# +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA +#KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor + + + +#---------------- Programming Options -------------------------- +PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex + + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + + +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/protocol.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk diff --git a/converter/m0110_usb/README.md b/converter/m0110_usb/README.md index 7de36d5de..22a8eb044 100644 --- a/converter/m0110_usb/README.md +++ b/converter/m0110_usb/README.md @@ -1,6 +1,6 @@ M0110/M0110A to USB keyboard converter ====================================== -This firmware converts the protocol of Apple Macintosh keyboard **M0110**, **M0110A** and **M0120** into USB. Target of this project is USB AVR controller **ATmega32U4**. Using this converter you can revive these retro keyboards with modern computer. +This firmware converts the protocol of Apple Macintosh keyboard **M0110**, **M0110A** and **M0120** into USB. Target of this project is USB AVR controller like **ATmega32U2** and **ATmega32U4**. Using this converter you can revive these retro keyboards with modern computer. Read README of top directory too. @@ -20,12 +20,13 @@ Update - 2013/08: Change port for signals `PF` to `PD` - 2013/09: Change port again, it uses inversely `PD0` for data and `PD1` for clock line now. - 2014/06: Change keymaps +- 2015/03: Add support for "International"(ISO) keyboard(keymap_intl.c) Building Hardware ----------------- -You need **4P4C** cable and **ATMega32U4** board like PJRC [Teensy]. Port of the MCU `PD1` is assigned to `CLOCK` line and `PD0` to `DATA` by default, you can change pin configuration with editing `config.h`. +You need [TMK converter] or AVR dev board like PJRC [Teensy]. Port of the MCU `PD1` is assigned to `CLOCK` line and `PD0` to `DATA` by default, you can change pin configuration with editing `config.h`. [](http://i.imgur.com/4G2ZOeg.jpg) @@ -38,6 +39,7 @@ Close-up picture of handset cable. You can see one end of plug has reverse color [](http://i.imgur.com/3S9P1mY.jpg?1) [Teensy]: http://www.pjrc.com/teensy/ +[TMK converter]: https://github.com/tmk/keyboard_converter ### Socket Pinout @@ -53,17 +55,14 @@ You may need pull-up resistors on signal lines(`CLOCK`, `DATA`) in particular wh Building Firmware ----------------- -To compile firmware you need AVR GCC. You can edit *Makefile* and *config.h* to change compile options and pin configuration. +To compile firmware you need AVR GCC. You can edit *Makefile* and *config.h* to change compile options and pin configuration. Also `KEYMAP` option can be used to select keymap. $ git clone git://github.com/tmk/tmk_keyboard.git (or download source) $ cd m0110_usb - $ make clean - $ make + $ make -f Makefile clean + $ make -f Makefile [KEYMAP={default|plain|intl|spacefn|hasu}] -To select keymap use `KEYMAP` option. - - $ make clean - $ make KEYMAP={plain|spacefn|hasu} +Use `Makefile.teensy` instead for Teensy. @@ -71,8 +70,8 @@ Keymap ------ To create your own keymap copy existent keymap file to `keymap_name.c` and edit it. You can build it like this. - $ make clean - $ make KEYMAP=name + $ make -f Makefile clean + $ make -f Makefile KEYMAP=name diff --git a/converter/m0110_usb/keymap.c b/converter/m0110_usb/keymap.c deleted file mode 100644 index 4570dd283..000000000 --- a/converter/m0110_usb/keymap.c +++ /dev/null @@ -1,223 +0,0 @@ -/* -Copyright 2011,2012 Jun Wako <wakojun@gmail.com> - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ -/* M0110A Support was contributed by skagon@github */ - -#include <stdint.h> -#include <stdbool.h> -#include <avr/pgmspace.h> -#include "keycode.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "keymap.h" - - -/* - * The keymap works with both M0110 and M0110A keyboards. As you can see, the M0110A is a superset - * of the M0110 keyboard, with only one exception: 'Enter' in M0110 does not exist - * on the M0110A, but since it generates a unique scan code which is not used for some other key in - * the M0110A, they are totally interchangeable. In fact, the M0110A is functionally (almost) - * identical to the combination of the M0110 along with the M0120 keypad. The only difference - * (which is causing some problems as you will read below) is that the M0110+M0120 don't have - * dedicated arrow keys, while the M0110A does. However, the M0120 did have arrow keys, which - * doubled as the [comma], [/], [*] and [+] keys, when used with the [Shift] key. The M0110A has - * substituted the [comma] key with the [=] key, however its scancode is the same. - * - * Physical layout: - * M0110A - * ,---------------------------------------------------------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Bcksp| |Clr| =| /| *| - * |---------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -| - * |-----------------------------------------------------' | |---------------| - * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | | 4| 5| 6| +| - * |---------------------------------------------------------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| | - * |---------------------------------------------------------' |-----------|Ent| - * |Opt |Mac | Space | \|Lft|Rgt|Dn | | 0| .| | - * `---------------------------------------------------------' `---------------' - * - * M0110 M0120 - * ,---------------------------------------------------------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| -| +| *| - * |---------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| /| - * |---------------------------------------------------------| |---------------| - * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | | 4| 5| 6| ,| - * |---------------------------------------------------------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| | - * `---------------------------------------------------------' |-----------|Ent| - * |Opt|Mac | Space |Ent |Opt| | 0| .| | - * `-----------------------------------------------' `---------------' - * With Shift keys on M0120 work as curosor.(-:Left *:Right /:Up ,:Down) - * - * NOTE: \ is located differently. - * NOTE: Enter on M0110 is different from Enter on keypad(M0120 and M0110A). - * NOTE: Left Shift and right Shift are logically same key. - * NOTE: Left Option and right Option are logically same key. - */ - -/* Keymap definition Macro - * ,---------------------------------------------------------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| =| /| *| - * |---------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -| - * |-----------------------------------------------------' | |---------------| - * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | | 4| 5| 6| +| - * |---------------------------------------------------------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| | - * |---------------------------------------------------------| |-----------|Ent| - * |Opt |Mac | Space |Ent| \|Lft|Rgt|Dn | | 0| .| | - * `---------------------------------------------------------' `---------------' - * NOTE: Ent between Space and \ means Enter on M0110. - */ -#define KEYMAP( \ - K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K68,K6D,K62, \ - K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K4E, \ - K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K66, \ - K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K4D, K53,K54,K55,K4C, \ - K3A,K37, K31, K34,K2A,K46,K42,K48, K52, K41 \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_NO, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO, KC_NO, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_NO, KC_##K46, KC_##K47 }, \ - { KC_##K48, KC_NO, KC_NO, KC_NO, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \ - { KC_NO, KC_NO, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_NO, KC_##K5B, KC_##K5C, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_##K62, KC_NO, KC_NO, KC_NO, KC_##K66, KC_NO }, \ - { KC_##K68, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K6D, KC_NO, KC_NO }, \ -} - -#ifdef KEYMAP_SECTION_ENABLE -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { -#else -static const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { -#endif - /* Default: - * ,---------------------------------------------------------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| =| /| *| - * |---------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -| - * |-----------------------------------------------------' | |---------------| - * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | | 4| 5| 6| +| - * |---------------------------------------------------------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| | - * |---------------------------------------------------------| |-----------|Ent| - * |Ctl |Gui | Space |Alt| \|Lft|Rgt|Dn | | 0| .| | - * `---------------------------------------------------------' `---------------' - */ - [0] = KEYMAP( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, CLR, EQL, PSLS,PAST, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS, - LCAP,A, S, D, F, G, H, J, K, L, SCLN,QUOT, FN15, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, UP, P1, P2, P3, PENT, - LCTL,LGUI, FN16, LALT,FN31,LEFT,RGHT,DOWN, P0, PDOT - ), - /* Cursor Layer(WASD, IJKL) - * ,---------------------------------------------------------. ,---------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| =| /| *| - * |---------------------------------------------------------| |---------------| - * |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up |Ins| | | 7| 8| 9| -| - * |-----------------------------------------------------' | |---------------| - * |Caps |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Enter | | 4| 5| 6| +| - * |---------------------------------------------------------| |---------------| - * |Shift |End| |PgD| | | | |End|PgD|Dow|Shif|PgU| | 1| 2| 3| | - * |---------------------------------------------------------| |-----------|Ent| - * |Ctl |Gui | Space |Alt | \|Hom|End|PgD| | 0| .| | - * `---------------------------------------------------------' `---------------' - */ - [3] = KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, INS, P7, P8, P9, PMNS, - LCAP,LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, FN15, P4, P5, P6, PPLS, - LSFT,END, NO, PGDN,NO, NO, NO, NO, END, PGDN,DOWN, PGUP, P1, P2, P3, PENT, - LCTL,LGUI, FN16, LALT,FN31,HOME,END, PGDN, P0, PDOT - ), - [4] = KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, INS, P7, P8, P9, PMNS, - LCAP,LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, FN15, P4, P5, P6, PPLS, - LSFT,END, NO, PGDN,NO, NO, NO, NO, END, PGDN,DOWN, PGUP, P1, P2, P3, PENT, - LCTL,LGUI, FN16, LALT,FN31,HOME,END, PGDN, P0, PDOT - ), - [7] = {}, -}; - - -/* - * Fn action definition - */ -#ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { -#else -static const uint16_t fn_actions[] PROGMEM = { -#endif - [0] = ACTION_LAYER_MOMENTARY(1), - [1] = ACTION_LAYER_MOMENTARY(2), - [2] = ACTION_LAYER_MOMENTARY(3), - [3] = ACTION_LAYER_MOMENTARY(4), - [4] = ACTION_LAYER_MOMENTARY(5), - [5] = ACTION_LAYER_MOMENTARY(6), - [6] = ACTION_LAYER_MOMENTARY(7), - [7] = ACTION_LAYER_TOGGLE(1), - [8] = ACTION_LAYER_TOGGLE(2), - [9] = ACTION_LAYER_TOGGLE(3), - [10] = ACTION_LAYER_TAP_TOGGLE(1), - [11] = ACTION_LAYER_TAP_TOGGLE(2), - [12] = ACTION_LAYER_TAP_TOGGLE(3), - [13] = ACTION_LAYER_TAP_KEY(1, KC_F), - [14] = ACTION_LAYER_TAP_KEY(2, KC_J), - [15] = ACTION_LAYER_TAP_KEY(3, KC_ENTER), - [16] = ACTION_LAYER_TAP_KEY(4, KC_SPACE), - [17] = ACTION_LAYER_TAP_KEY(5, KC_SCOLON), - [18] = ACTION_LAYER_TAP_KEY(6, KC_QUOTE), - [19] = ACTION_LAYER_TAP_KEY(7, KC_SLASH), - [20] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_SPACE), - [21] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_SPACE), - [22] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_QUOTE), - [23] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENTER), - [24] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC), - [25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPACE), - [26] = ACTION_MODS_ONESHOT(MOD_LCTL), - [27] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_ESC), - [28] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPACE), - [29] = ACTION_MODS_ONESHOT(MOD_LSFT), - [30] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_GRAVE), - [31] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_BSLASH), -}; - - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn index to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - action_t action; - action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); - return action; -} diff --git a/converter/m0110_usb/keymap_common.h b/converter/m0110_usb/keymap_common.h index e1d47342e..8bde7473d 100644 --- a/converter/m0110_usb/keymap_common.h +++ b/converter/m0110_usb/keymap_common.h @@ -105,3 +105,39 @@ extern const uint16_t fn_actions[]; { KC_NO, KC_NO, KC_##K62, KC_NO, KC_NO, KC_NO, KC_##K66, KC_NO }, \ { KC_##K68, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K6D, KC_NO, KC_NO }, \ } + +/* International keyboard + * ,---------------------------------------------------------. + * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| + * |---------------------------------------------------------| + * | 30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| 2A| + * |------------------------------------------------------, | + * | 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | + * |---------------------------------------------------------| + * | 38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 0A| 38| + * `---------------------------------------------------------' + * | 3A| 37| 34 | 31| 3A| + * `------------------------------------------------' + */ +#define KEYMAP_INTL( \ + K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K68,K6D,K62, \ + K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K59,K5B,K5C,K4E, \ + K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,K24, K56,K57,K58,K66, \ + K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,K0A, K4D, K53,K54,K55,K4C, \ + K3A,K37, K34, K31, K46,K42,K48, K52, K41 \ +) { \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ + { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ + { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ + { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO, KC_NO, KC_##K37 }, \ + { KC_##K38, KC_##K39, KC_##K3A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_NO, KC_##K46, KC_##K47 }, \ + { KC_##K48, KC_NO, KC_NO, KC_NO, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \ + { KC_NO, KC_NO, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ + { KC_##K58, KC_##K59, KC_NO, KC_##K5B, KC_##K5C, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_##K62, KC_NO, KC_NO, KC_NO, KC_##K66, KC_NO }, \ + { KC_##K68, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K6D, KC_NO, KC_NO }, \ +} diff --git a/converter/m0110_usb/keymap_default.c b/converter/m0110_usb/keymap_default.c new file mode 100644 index 000000000..b0b8ee220 --- /dev/null +++ b/converter/m0110_usb/keymap_default.c @@ -0,0 +1,85 @@ +/* +Copyright 2011,2012,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/>. +*/ +#include <stdint.h> +#include "keycode.h" +#include "keymap_common.h" + + + +const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + /* Default: + * M0110 M0120 + * ,---------------------------------------------------------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Nlk| -| +| *| + * |---------------------------------------------------------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| /| + * |---------------------------------------------------------| |---------------| + * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| ,| + * |---------------------------------------------------------| |---------------| + * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| | + * `---------------------------------------------------------' |-----------|Ent| + * |Opt|Mac | Space |Fn |Opt| | 0| .| | + * `-----------------------------------------------' `---------------' + * M0110A + * ,---------------------------------------------------------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Nlk| =| /| *| + * |---------------------------------------------------------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -| + * |-----------------------------------------------------' | |---------------| + * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +| + * |---------------------------------------------------------| |---------------| + * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| | + * |---------------------------------------------------------| |-----------|Ent| + * |Opt |Mac | Space | \|Lft|Rgt|Dn | | 0| .| | + * `---------------------------------------------------------' `---------------' + */ + [0] = KEYMAP( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, NLCK,EQL, PSLS,PAST, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, UP, P1, P2, P3, PENT, + LALT,LGUI, SPC, FN0, BSLS,LEFT,RGHT,DOWN, P0, PDOT + ), + /* Cursor Layer + * ,---------------------------------------------------------. ,---------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| -| +| *| + * |---------------------------------------------------------| |---------------| + * |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up | |INS| | 7| 8| 9| /| + * |---------------------------------------------------------| |---------------| + * |Ctrl |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Return| | 4| 5| 6| ,| + * |---------------------------------------------------------| |---------------| + * |Shift |End| |PgD| | | | |End|PgD|Dow|Shift | | 1| 2| 3| | + * `---------------------------------------------------------' |-----------|Ent| + * |Opt|Mac | Space |Fn |Opt| | 0| .| | + * `-----------------------------------------------' `---------------' + */ + [1] = KEYMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, + CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO, P7, P8, P9, PMNS, + LCTL,LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, ENT, P4, P5, P6, PPLS, + LSFT,END, NO, PGDN,NO, NO, NO, NO, END, PGDN,DOWN, PGUP, P1, P2, P3, PENT, + LALT,LGUI, SPC, FN0, INS, HOME,END, PGDN, P0, PDOT + ), +}; + + +/* + * Fn action definition + */ +const uint16_t fn_actions[] PROGMEM = { + [0] = ACTION_LAYER_MOMENTARY(1), +}; diff --git a/converter/m0110_usb/keymap_intl.c b/converter/m0110_usb/keymap_intl.c new file mode 100644 index 000000000..ceb1f18d7 --- /dev/null +++ b/converter/m0110_usb/keymap_intl.c @@ -0,0 +1,85 @@ +/* +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/>. +*/ +#include <stdint.h> +#include "keycode.h" +#include "keymap_common.h" + + + +const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + /* International keyboard + * M0110 M0120 + * ,---------------------------------------------------------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Nlk| -| +| *| + * |---------------------------------------------------------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Ret| | 7| 8| 9| /| + * |------------------------------------------------------, | |---------------| + * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| \| | | 4| 5| 6| ,| + * |---------------------------------------------------------| |---------------| + * |Shif| | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| | + * `---------------------------------------------------------' |-----------|Ent| + * |Opt|Mac | Space |Fn |Opt| | 0| .| | + * `-----------------------------------------------' `---------------' + * M0110A(not existent?) + * ,---------------------------------------------------------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Nlk| =| /| *| + * |---------------------------------------------------------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Ret| | 7| 8| 9| -| + * |------------------------------------------------------, | |---------------| + * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| \| | | 4| 5| 6| +| + * |---------------------------------------------------------| |---------------| + * |Shif| <| Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| | + * |---------------------------------------------------------| |-----------|Ent| + * |Opt |Mac | Space | \|Lft|Rgt|Dn | | 0| .| | + * `---------------------------------------------------------' `---------------' + */ + [0] = KEYMAP_INTL( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, NLCK,EQL, PSLS,PAST, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,ENT, P7, P8, P9, PMNS, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,BSLS, P4, P5, P6, PPLS, + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, UP, P1, P2, P3, PENT, + LALT,LGUI, SPC, FN0, LEFT,RGHT,DOWN, P0, PDOT + ), + /* Cursor Layer + * ,---------------------------------------------------------. ,---------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| -| +| *| + * |---------------------------------------------------------| |---------------| + * |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up | |INS| | 7| 8| 9| /| + * |---------------------------------------------------------| |---------------| + * |Ctrl |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Return| | 4| 5| 6| ,| + * |---------------------------------------------------------| |---------------| + * |Shif| <|End| |PgD| | | | |End|PgD|Dow|Shift | | 1| 2| 3| | + * `---------------------------------------------------------' |-----------|Ent| + * |Opt|Mac | Space |Fn |Opt| | 0| .| | + * `-----------------------------------------------' `---------------' + */ + [1] = KEYMAP_INTL( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, + CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO, ENT, P7, P8, P9, PMNS, + LCTL,LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT,INS, P4, P5, P6, PPLS, + LSFT,NO, END, NO, PGDN,NO, NO, NO, NO, END, PGDN,DOWN, PGUP, P1, P2, P3, PENT, + LALT,LGUI, SPC, FN0, HOME,END, PGDN, P0, PDOT + ), +}; + + +/* + * Fn action definition + */ +const uint16_t fn_actions[] PROGMEM = { + [0] = ACTION_LAYER_MOMENTARY(1), +}; diff --git a/converter/m0110_usb/keymap_plain.c b/converter/m0110_usb/keymap_plain.c index f262dca22..d1507fcaa 100644 --- a/converter/m0110_usb/keymap_plain.c +++ b/converter/m0110_usb/keymap_plain.c @@ -27,7 +27,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |---------------------------------------------------------| |---------------| * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| /| * |---------------------------------------------------------| |---------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| ,| + * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| ,| * |---------------------------------------------------------| |---------------| * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| | * `---------------------------------------------------------' |-----------|Ent| diff --git a/converter/m0110_usb/led.c b/converter/m0110_usb/led.c index f76545f0b..3822a131b 100644 --- a/converter/m0110_usb/led.c +++ b/converter/m0110_usb/led.c @@ -15,10 +15,18 @@ 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 "stdint.h" +#include <stdint.h> +#include <avr/io.h> #include "led.h" void led_set(uint8_t usb_led) { + if (usb_led & (1<<USB_LED_CAPS_LOCK)) { + DDRD |= (1<<6); + PORTD |= (1<<6); + } else { + DDRD |= (1<<6); + PORTD &= ~(1<<6); + } } diff --git a/protocol/m0110.c b/protocol/m0110.c index 924ec316b..0d3a5aaa4 100644 --- a/protocol/m0110.c +++ b/protocol/m0110.c @@ -502,8 +502,10 @@ MODEL NUMBER: Scan Code --------- - m0110_recv_key() function returns following scan codes instead of raw key events. - Scan codes are 1 byte long and MSB(bit7) is set when key is released. + m0110_recv_key() function returns following scan codes instead of M0110 raw codes. + Scan codes are 1 byte size and MSB(bit7) is set when key is released. + + scancode = ((raw&0x80) | ((raw&0x7F)>>1)) M0110 M0120 ,---------------------------------------------------------. ,---------------. @@ -529,6 +531,19 @@ Scan Code | 3A| 37| 31 | 34| 3A| | 52| 41| | `------------------------------------------------' `---------------' + International keyboard(See page 22 of "Technical Info for 128K/512K") + ,---------------------------------------------------------. + | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| + |---------------------------------------------------------| + | 30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| 2A| + |------------------------------------------------------ | + | 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | + |---------------------------------------------------------| + | 38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 0A| 38| + `---------------------------------------------------------' + | 3A| 37| 34 | 31| 3A| + `------------------------------------------------' + M0110A ,---------------------------------------------------------. ,---------------. | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Bcksp| |Clr| =| /| *| @@ -568,7 +583,7 @@ Connector: Signaling: http://www.kbdbabel.org/signaling/kbd_signaling_mac.png http://typematic.blog.shinobi.jp/Entry/14/ -Scan Codes: +M0110 raw scan codes: Page 22 of Tech Info for 128K/512K Page 07 of Tech Info for Plus http://m0115.web.fc2.com/m0110.jpg From 9b4914b005e1dfabc98bec5745b43a2b14f30176 Mon Sep 17 00:00:00 2001 From: Jun Wako <wakojun@gmail.com> Date: Thu, 19 Mar 2015 06:39:13 +0900 Subject: [PATCH 48/78] m0110: Fix README.md and keymap_intl.c --- converter/m0110_usb/README.md | 4 ++-- converter/m0110_usb/keymap_intl.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/converter/m0110_usb/README.md b/converter/m0110_usb/README.md index 22a8eb044..c1ecb53b0 100644 --- a/converter/m0110_usb/README.md +++ b/converter/m0110_usb/README.md @@ -77,6 +77,6 @@ To create your own keymap copy existent keymap file to `keymap_name.c` and edit Debug ----- -You can use [PJRC HID listen](http://www.pjrc.com/teensy/hid_listen.html) to see debug output. The converter has some functions for debug, press `<Command>+H` simultaneously to get help. +You can use [PJRC HID listen](http://www.pjrc.com/teensy/hid_listen.html) to see debug output. The converter has some functions for debug, press `<Magic>+H` simultaneously to get help. -- Command: `Shift+Option+Command`(`Shift+Alt+Gui` or `Shift+Alt+Control`) +- Magic combo: `Shift+Option+⌘` or `Shift+Option+Ctrl`(`Shift+Alt+Gui` or `Shift+Alt+Control`) diff --git a/converter/m0110_usb/keymap_intl.c b/converter/m0110_usb/keymap_intl.c index ceb1f18d7..80b029305 100644 --- a/converter/m0110_usb/keymap_intl.c +++ b/converter/m0110_usb/keymap_intl.c @@ -30,7 +30,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * |------------------------------------------------------, | |---------------| * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| \| | | 4| 5| 6| ,| * |---------------------------------------------------------| |---------------| - * |Shif| | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| | + * |Shif| <| Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| | * `---------------------------------------------------------' |-----------|Ent| * |Opt|Mac | Space |Fn |Opt| | 0| .| | * `-----------------------------------------------' `---------------' @@ -58,9 +58,9 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * ,---------------------------------------------------------. ,---------------. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| -| +| *| * |---------------------------------------------------------| |---------------| - * |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up | |INS| | 7| 8| 9| /| - * |---------------------------------------------------------| |---------------| - * |Ctrl |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Return| | 4| 5| 6| ,| + * |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up | |Ret| | 7| 8| 9| /| + * |------------------------------------------------------, | |---------------| + * |Ctrl |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Ins| | | 4| 5| 6| ,| * |---------------------------------------------------------| |---------------| * |Shif| <|End| |PgD| | | | |End|PgD|Dow|Shift | | 1| 2| 3| | * `---------------------------------------------------------' |-----------|Ent| From d23d95381af8e7eec05a9d04c7d50e244a84fb95 Mon Sep 17 00:00:00 2001 From: Jun Wako <wakojun@gmail.com> Date: Thu, 19 Mar 2015 06:56:56 +0900 Subject: [PATCH 49/78] m0110: Fix Makefile --- converter/m0110_usb/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/converter/m0110_usb/Makefile b/converter/m0110_usb/Makefile index 5f3bb98e2..6f20396f5 100644 --- a/converter/m0110_usb/Makefile +++ b/converter/m0110_usb/Makefile @@ -26,7 +26,7 @@ CONFIG_H = config.h # MCU name, you MUST set this to match the board you are using # type "make clean" after changing this, so all files will be rebuilt MCU = atmega32u2 # TMK converter rev2 -MCU = atmega32u4 # TMK converter rev1 +#MCU = atmega32u4 # TMK converter rev1 # Processor frequency. From e958baca815fb13e93b79798b1b20a8aea26c8ee Mon Sep 17 00:00:00 2001 From: Nathan Ross Powell <nathanrosspowell@gmail.com> Date: Wed, 18 Mar 2015 23:39:01 -0400 Subject: [PATCH 50/78] Delete .keymap_nathan.c.swp --- keyboard/planck/.keymap_nathan.c.swp | Bin 20480 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 keyboard/planck/.keymap_nathan.c.swp diff --git a/keyboard/planck/.keymap_nathan.c.swp b/keyboard/planck/.keymap_nathan.c.swp deleted file mode 100644 index d545015c2b4b9413460d15f512a9b4759ae860c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI2YiuLeb;l=hHf`)CF%q{xQ^&d9wY8L150cV8?X^wuu~L_$#w4X(S+==cX(Vx% z;;?+Iyk5$1ntW(eAWc35*am&1NCVhK(z*@W2JVL@1#GuQAAyTHn>Hwd0{zk!?WY#W zhdzGi%y2|KcDY_l1=@0e|DTt0&pr3dxp(f&Idd<D=cY5}_~?Yiaj#{4@|V6*kmC1# z(z3Fp=4z=b|89L`V}+?$);@k~Da(qV8mraaOU`1mG1gqWT)gaDz37(eOJhNyRw-2% zFU$Y6Qmt6k{zn&k>Fw9|J<#_+4-d4O%OfW~WQ|87;X?->G#~xQY>x*0>b?j19_V|Z z?}5Gt`X1<epzndc2l^iPzvh8v?Jn!TxTyDnPk{IMxQpK~xZD5#K7OA966A|a|LA+5 z?}5Gt`X1<epzndc2l^i9d!X-uz6bgq=zE~=f&V=oC@oo5^hYi0kAZyummI+BAGWO5 zz;A+=!56?&;BN5hhb-$7_!xNegO>F?7y^IuW0v(9@F`FM_k%yX$FkaB7z}{lAenFw zeCY$0^#HgZ{5ZG|yzSfYGQWQdz61UWyqCJ)=l2qL0Q?mA7`PkU_z}zc6YzELW$-2N zYhWD|Km>%rUEuBab1mQ{@M%y2C&5pEkAjbYe?4GX{{r3uKL>smtb<Vy0t4U%iIBI! zD_{=Hf>Yoj@P6<E5+~mUZ-8G0m%w=t2NCd}BwGF%{2llt_yqVC36(zpzXQGqu7eHB zaMYb<t6nvkSUfjV%+6$!kLYQyQUo?j@^7)!a7?C{F2<*lbGe!9sg8oiYI(WoESbkW zRUuOd<tB6S!C{lkCd{BYwRt|>b>8buG|Lfaw_~|vwlI~<C-eK%!(=WN-)rStT_qQ^ z^NgJJeSSM05%Fu5aQER<8jjU{Ldv)7OUHNnplo%1N1u*l(XAHU<>ioBF4316+$p-# zs`9c4na(^Iv^x6acdKwP%rXdPlZ8`(Y-7FLTwFDw^3tH+MwL2OoN9BlR(Bc=rkGS| zi;J#X2|7G&LMu+QxaKZ3LW5?&gfcUU;^cH8bT(d0=clGqg~4{$shoFeaF7|>thXE{ zs9vgfp==M*K8sDGzveW9w&>QEMjq4uk672NMYq~$nzhnm-9>DuwAd`;G_^s_h0x)( zky@`bY+B`N^8_c#OPgi4)*STj#?3Kobgsp8T~+(Gugbd&nJ2y<duSdoFWj!fJk>fb z-Xt-nPkS!Zfw|(Am%Kp<=8%q)FRL;eqGKUC{tSMN#S7Cj*`hZ=yH*yNKnv06t|DE_ z!{D&WMRt|*ZgO8Fd{YsoATpvSvZcS7M80@7Ij@dM=Tn7Y!(8%KH5J~{>8`@wQm4XO zy5Cj!$=R8}jxJl%vH4`Kn3>72BF1v_p{RE~-TJnRL=f?&r_8s=F(#ayn>mw7X3TQ6 z=*`r|g7m?iq=R9)7j^9Q{&)FV-0Yq7oVxWt9vn7fV`im%#W5EaE|^kv$y|8mf>~d6 zs-0WZa;mL0|At|XY<6A9W%I-4_IV0l3>*7QA}c&=`_CA)(9?1zH#dy6)1o)|WSX)# zci5z|k+5=vmXwUKDZx=;W5$L|_!K6VtEN)A>ePKN-n61~J9oV6Z7amJ3z=9UH+{aC zn>m*c{={d}dEe=Woa$0}*}v<r$-Fvr=<GNa`6aCKOIYTY#)HyCP&yivjs>OTLFq(L zIvJE=L21%#81u9x*WIxo8dwkwEQkgcL<0+=fd$dPf@oktG_W8VSP%^?hz1r!v0!+c z1u{O~^+o~<B7p^wz=B9%K_svs5?BxkEQkaaL;?#Ufd!FWEC>e{gaZr0fd%2ff^c9# zIItibSP%{@2nQB~0}H}|1!3O;)<xeF42RAHnEqk<hUpikPniB-`hw{PrVkkXFuLK% z&e)1R8CO{K$#_y$eKL-eRiBI>Wz{F+Mp^aAcu}70jFjk;QG!*Uj1FbhC!<1H^~q>Z zR(&!GlvSU2pYj%c;&XFW{0*x<@iS%BC;p|Z`oyo4RiF5ivg!+~zC%mSa=GdlR_#p8 zE}qFvCqlkkhsG={H$&#a$le@>eSK|FYxaOU`u4`Wk#<L)nAf-O9eZ`Z{5SlLE!n-n zsEjWUEL(T98}HF$^ad!)tEl&+HOp?@G*=ySc%@!mIxLShx7D-`m6xlCcHbx#C##E< z){<imddiB6?%JAL9bG+WSv=fht>&s*KV`g4`zGf$8pd|lol3<#>TRU2yN#Njcw&WT zXl0c4k69A`A0RH3m{sC``R4x$asCBxFZd>LehnD#ZQ}eFK^P2z`@n0&`RgDAZV=;t z2fPYC3nsxs;NOV(zXE2#0q}do^bU~N|25+H7I+v)eE$LPhs5g@@BsJ=;_^QSuYe2S zUhqxg@ES1S+r->2f-v~Le;t3x@9V_XSHJ+cPTeXv1`dGtf%gCl{4TPufX{$17z6hK ziPOIi-U43-zYauS0z|>b!9CyxvHI)a8{oIVOW^b17r~p<|0#GCd<A?Cya;Nb2zEKV zK;RvQ{hQH)tR-^nJR@h{U1YnLOSD+i*SGu1vD?}0{@VUOXrmQEdhDf(wTo>})vWVe zv(UEd&Xq!sCv2wGbWD5Bt&Aui;fZID*(O-Ug9~_fg+QNPe%loJZJWc&2bC`<zn}~S zPu^#=JgB^({Ftx>@mA7)cV-2x1AU^Fz8_S6Liv#LL&^^;KdU^TJfu9Ld_?)Qum$al zeW{4pmx?NnD^I|wqtdHM9aBE8d_wu8awIIZk%)3Mux~G)sytMqq=TxaUS3&kj@3(L z(kNa$sNTT9+YeSf$(w|%UKAbZOJ(KVH<gul-&9uKeN$O^_f2Kx-8Yrx-FIiyYKye7 z^XdE!ZSo3E$V)Sggb|A8P!XHW51V{CewK1V!eU#xGPZPOZ0X9_5;a>C<Vfb@oJ(nS zO5VBgzr3(B3c^{5TVeiWJ*D!FZfto+H@3<rlB#V%GbY_H=N2M+x=!njux$~MKA0}I z!Bg%Ui-^6Fs0z>4Xq6<Bv41y#XOkTk`)s`-Y`r0Dy&-J5As81p+gfAd!%Tdbi4Tt} zkL|a8@v+!gq8%U0k0sk?y4t`ub@EDWyVPnp?R?r@ye!s?sx=eJN0pB$pWa9Nn3{N~ zvu2!>^5z1OKf(-c$Mc+OXFFCNSDQ{Ki+sYV1orLaA|i{XF^3nM^~y-8(i~ZGDo)cm zJnWy+Jo$*zSS;0?&UB43)#~oLDb*c$oj1HbUvwK@c3hR^T2)anS$9g8Yc4|||ME?z zX51@IJ@`X~tACuPS!~rC5&^iTLSWqKsX#!`bZbFxbLB>>R5AHxYpLvZ_sdck(WS8B zEH}q0yxiBft%T__v(v+7QkEaql>F4NNypNxDXFY15qVpd4v$%hD5sN>NKMR~BY7vO zJ7aQZrX=qvw*p5_6Rl54g*mS*8jP7!Cd%iaDMv<GQmnel=^`X668%I2b?JD4^q-^% zFhe<^oKilcjLjTBt<0LpAsIvD<7s*#?HXt+#KeFnwf3AciAWAsRSvF;V_tby8P9Oc zDC@Q2C_G}3YS#Si|KL)XahfHj`_tIdHe<@MO4GE{GN$c(t+dFktUOz*aVE`xn|8uo zXDKwSgr=R7r{TUWg?aga*f!6rWzQ)uDqm5)s9aTEQ(jOGDPL25RM>*{<9#L0jf^Ks z(uZj%FDWl8uPCo7UsArTTv2{RImi9DZ}t^RxTtM@MtfRUc9iSNP35b~E#<PZtIY7y zb~3-|zr9-uCH|Lq^@GH`693B{|9>Lx{}qr1|3TdURq!%+30w!C1)m1b1IZ06gQvkf zI1j?$hvWvn1-=G84_aUzoCXhq1K@|`4BiCSfdh_$yTDuI4Bh}6APOD^|4!cE4R9Tl z!6|SL_#QcguYqe|3P?`j@5v#^-hnTI444K};N##DIfZAzVK4x0kWY}k0g_+%RqzX7 z6&wTifFF=!_-pWG@EmZ!B)Av+1Nnouz;A;MkOPl{`@uir&p!fR1wRkYfnhKJJ`BX) z-z5id14xeH|KqV?F|j*Y3H`*l;U7CHg3S+J8{u1l+6`ZON9Aq(-n`%4aw@smY|)-C zO!0wKJ~8EDnIgq=(^>B$EY}tsu|#5b(U3W+`!B3Ol!BkA(T~}|hxNw;5&sLlebjsT z=x(_;CQaP2NfY~J()b;lG`?RZMeo?8=zf_Lxnq+e`(;x2j!g=CChgpH!rQmr8hkj{ z-~HeJVRb%T-Sqz2+%Ci$X=h)R<mK61B73-o0u{Gd3hdmOVs<uz$2#f~A$fyG9~-vd z+0Nf{p-4Ear_U-UmFJahWf3ogyz_Z2drV59OUi4(Td#M{>z}f23sdvm8hZrlt*Tin zmn!bcki<T^*JreL)hzfHKSMI!+cq+O%WW6D#>g%o@3o%~$;5tihL`d?f+1GBh4Jof z6g1pr!v`^>uR#JWiLGde!i00NwX#yKu85xK$*vt6yX#@~o)c%$^aX8lqGuD?wBR>6 zs7;RdY{H(0Ss4a;DQc5rJ)4l~@fsX4+Tv)>7AHLUAr+tKDSq4&A5ifvn|^k6_%ToX zSrzZSA?K(k{;-PQa&G9(f(cLjAr<dE`s1GXArX)C9%MG>i0hwF@!kXM&#VU#r&azc z@qVSDZErc!+b20$5U*beQjX+TmzzhDnpsd)H=h9n>f2S3sq0cjgm{Dm35g5O!nkB4 zRB7)?;w=MQ)??bB_cZbMi_+qnw&*=m<kl9)>0Yth*t-><$z)>Q<vprh^qwyMX4Sx` z-ZSQ;*FlI5Xf;_Uu+|~nGNQ8GHk2vaOkOc$%Mf+yn5j~?#nYWSrlr(vacZZ|-ypWd zeVsbl8AiJ;cU7kjZ&HWNcHLd6m;9|--gNA`$G2}b^QZjITsi%8duw|;f9~%{EWPuM zYb35QTz03C$nKQJgOZ;NqBato3lHCPHyVn(oP8#Ho{Ub$mc3*<^Zi~@+?Sj!kO!KZ zNt0WG$^B&P^t@4jieY|p()(n_J3G;2kBzrajq_y5yStEEK@(Zz_DN?=DEn90rB1fh zP)%c0X#PvK_)z9E0<4W?iw|Xz_uh6m%3g*)mfy^4r6e=Qw-{xbQKlK}<@~ilO0)VY Vy5ziO^|yQl@N#b6%-WLH`fv1GjI96w From e9df959c131932f7d149b8c0fa07d7fea845f0fc Mon Sep 17 00:00:00 2001 From: Nathan Ross Powell <nathanrosspowell@gmail.com> Date: Wed, 18 Mar 2015 23:58:21 -0400 Subject: [PATCH 51/78] Update keymap_nathan.c Remove macro for KEYMAP_GRID that is in keymap_common.h. Add comments with ASCII art for the two layouts in keymap_common.h. --- keyboard/planck/keymap_common.h | 22 +++++++++++++++ keyboard/planck/keymap_nathan.c | 49 ++++++++------------------------- 2 files changed, 33 insertions(+), 38 deletions(-) diff --git a/keyboard/planck/keymap_common.h b/keyboard/planck/keymap_common.h index 8a55fd9ee..c74c7e9a2 100644 --- a/keyboard/planck/keymap_common.h +++ b/keyboard/planck/keymap_common.h @@ -35,6 +35,17 @@ extern const uint16_t fn_actions[]; // MIT Layout +/* + * ,-----------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------' + */ #define KEYMAP( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \ @@ -48,6 +59,17 @@ extern const uint16_t fn_actions[]; } // Grid Layout +/* + * ,-----------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------' + */ #define KEYMAP_GRID( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \ diff --git a/keyboard/planck/keymap_nathan.c b/keyboard/planck/keymap_nathan.c index 47539188e..5a0900b66 100644 --- a/keyboard/planck/keymap_nathan.c +++ b/keyboard/planck/keymap_nathan.c @@ -3,31 +3,6 @@ #include "keymap_common.h" -#ifndef KEYMAP_GRID - /* Planck keymap definition macro for the 'grid' layout - * ,-----------------------------------------------------------------------. - * | | | | | | | | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * `-----------------------------------------------------------------------' - */ -#define KEYMAP_GRID( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \ - K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \ - K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \ - K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B } \ -} -#endif - const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* 0: main layer * ,-----------------------------------------------------------------------. @@ -50,9 +25,9 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * The top row are Visual Studio combos: * 'Run', 'Breakpoint', 'Step over', 'Step into', 'Set cursor to line' * 2nd row are key combos: - * 'ctrl-alt-delete', 'ctrl-shift-escape' + * 'ctrl-alt-delete', 'ctrl-shift-escape' * 3rd row are macros keys: - * 'P0' - 'P5' execute a script on Windows machines + * 'P0' - 'P5' execute a script on Windows machines * ,-----------------------------------------------------------------------. * | ESC | F5 | F9 | F10 | F11 |S+F11|CSF10|NLock|Num7 |Num8 |Num9 | Del | * |-----------------------------------------------------------------------| @@ -113,7 +88,7 @@ const uint16_t PROGMEM fn_actions[] = { [11] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // { [12] = ACTION_MODS_KEY(MOD_LSFT, KC_COMMA), // < [13] = ACTION_MODS_KEY(MOD_LSFT, KC_0), // ) - [14] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // { + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // } [15] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // > // Combo [16] = ACTION_MODS_KEY(MOD_LALT | MOD_LCTL, KC_DEL), // Ctrl+Alt+Delete @@ -127,7 +102,7 @@ const uint16_t PROGMEM fn_actions[] = { [23] = ACTION_MODS_KEY(MOD_LSFT, KC_6), // ^ [24] = ACTION_MODS_KEY(MOD_LSFT, KC_7), // & [25] = ACTION_MODS_KEY(MOD_LSFT, KC_8), // * - [26] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // + + [26] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // + [27] = ACTION_MODS_KEY(MOD_LSFT, KC_MINUS), // _ [28] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOTE), // " [29] = ACTION_MODS_KEY(MOD_LSFT, KC_GRAVE), // ~ @@ -142,39 +117,37 @@ const uint16_t PROGMEM fn_actions[] = { // *return* #define RUN_PYTHON_PROGRAM_ON_WIN MACRO( T(ENT), END ) -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { keyevent_t event = record->event; switch (id) { case M_P0: return event.pressed ? - ADD_PYTHON_PROGRAM_ON_WIN( 0 ) : + ADD_PYTHON_PROGRAM_ON_WIN( 0 ) : RUN_PYTHON_PROGRAM_ON_WIN; case M_P1: return event.pressed ? - ADD_PYTHON_PROGRAM_ON_WIN( 1 ) : + ADD_PYTHON_PROGRAM_ON_WIN( 1 ) : RUN_PYTHON_PROGRAM_ON_WIN; case M_P2: return event.pressed ? - ADD_PYTHON_PROGRAM_ON_WIN( 2 ) : + ADD_PYTHON_PROGRAM_ON_WIN( 2 ) : RUN_PYTHON_PROGRAM_ON_WIN; case M_P3: return event.pressed ? - ADD_PYTHON_PROGRAM_ON_WIN( 3 ) : + ADD_PYTHON_PROGRAM_ON_WIN( 3 ) : RUN_PYTHON_PROGRAM_ON_WIN; case M_P4: return event.pressed ? - ADD_PYTHON_PROGRAM_ON_WIN( 4 ) : + ADD_PYTHON_PROGRAM_ON_WIN( 4 ) : RUN_PYTHON_PROGRAM_ON_WIN; case M_P5: return event.pressed ? - ADD_PYTHON_PROGRAM_ON_WIN( 5 ) : + ADD_PYTHON_PROGRAM_ON_WIN( 5 ) : RUN_PYTHON_PROGRAM_ON_WIN; case M_USERNAME: return event.pressed ? MACRO( T(N), T(A), T(T), T(H), T(A), T(N), T(R), T(O), T(S), T(S), T(P), T(O), T(W), T(E), T(L), T(L), END ) : MACRO_NONE; - } return MACRO_NONE; } From b688e68539c866a03652b00a7e0c013861421cf7 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Thu, 19 Mar 2015 14:18:41 -0400 Subject: [PATCH 52/78] Create keymap_tim.c --- keyboard/planck/keymap_tim.c | 44 ++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 keyboard/planck/keymap_tim.c diff --git a/keyboard/planck/keymap_tim.c b/keyboard/planck/keymap_tim.c new file mode 100644 index 000000000..7444f3877 --- /dev/null +++ b/keyboard/planck/keymap_tim.c @@ -0,0 +1,44 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, ENT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, + LCTL, LALT, DEL, LGUI, FN2, SPC, FN1, F2, F5, F9, F12), +[2] = KEYMAP( /* RAISE */ + TRNS, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC, + GRV, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, QUOT, FN29, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN1, TRNS, TRNS, TRNS, TRNS), +[3] = KEYMAP( /* LOWER */ + TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC, + FN22, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, QUOT, FN29, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), + [29] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), +}; From 708f95a472327e25355b28899fbd13d89f6925f5 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Fri, 20 Mar 2015 13:36:13 -0400 Subject: [PATCH 53/78] working extended keymap --- common/keymap.c | 3 +- keyboard/planck/Makefile | 20 +- keyboard/planck/extended_keymap_common.c | 171 +++++++++++++++ keyboard/planck/extended_keymap_common.h | 72 +++++++ keyboard/planck/extended_keymap_jack.c | 36 ++++ keyboard/planck/keymap_tim.c | 44 ++++ keyboard/planck/matrix_center.c | 202 ++++++++++++++++++ .../{matrix-handwire.c => matrix_handwire.c} | 0 8 files changed, 542 insertions(+), 6 deletions(-) create mode 100644 keyboard/planck/extended_keymap_common.c create mode 100644 keyboard/planck/extended_keymap_common.h create mode 100644 keyboard/planck/extended_keymap_jack.c create mode 100644 keyboard/planck/keymap_tim.c create mode 100644 keyboard/planck/matrix_center.c rename keyboard/planck/{matrix-handwire.c => matrix_handwire.c} (100%) diff --git a/common/keymap.c b/common/keymap.c index 4c0b61b8c..7b7797226 100644 --- a/common/keymap.c +++ b/common/keymap.c @@ -27,6 +27,7 @@ static action_t keycode_to_action(uint8_t keycode); /* converts key to action */ +__attribute__ ((weak)) action_t action_for_key(uint8_t layer, keypos_t key) { uint8_t keycode = keymap_key_to_keycode(layer, key); @@ -117,8 +118,6 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } - - /* translates keycode to action */ static action_t keycode_to_action(uint8_t keycode) { diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 001f17f31..3716f0db9 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -47,16 +47,28 @@ TOP_DIR = ../.. # Directory keyboard dependent files exist TARGET_DIR = . +# # project specific files +# SRC = keymap_common.c \ +# matrix_handwire.c \ +# led.c \ +# backlight.c + +# ifdef KEYMAP +# SRC := keymap_$(KEYMAP).c $(SRC) +# else +# SRC := keymap_jack.c $(SRC) +# endif + # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC = extended_keymap_common.c \ + matrix_handwire.c \ led.c \ backlight.c ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) + SRC := extended_keymap_$(KEYMAP).c $(SRC) else - SRC := keymap_jack.c $(SRC) + SRC := extended_keymap_jack.c $(SRC) endif CONFIG_H = config.h diff --git a/keyboard/planck/extended_keymap_common.c b/keyboard/planck/extended_keymap_common.c new file mode 100644 index 000000000..895c7418b --- /dev/null +++ b/keyboard/planck/extended_keymap_common.c @@ -0,0 +1,171 @@ +/* +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 "extended_keymap_common.h" +#include "report.h" +#include "keycode.h" +#include "action_layer.h" +#include "action.h" +#include "action_macro.h" +#include "debug.h" + + +static action_t keycode_to_action(uint16_t keycode); + + +/* converts key to action */ +action_t action_for_key(uint8_t layer, keypos_t key) +{ + uint16_t keycode = keymap_key_to_keycode(layer, key); + + // Handle mods in keymap + if (keycode > 0x00FF) { + action_t action; + action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); + return action; + } + + switch (keycode) { + case KC_FN0 ... KC_FN31: + return keymap_fn_to_action(keycode); +#ifdef BOOTMAGIC_ENABLE + case KC_CAPSLOCK: + case KC_LOCKING_CAPS: + if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { + return keycode_to_action(KC_LCTL); + } + return keycode_to_action(keycode); + case KC_LCTL: + if (keymap_config.swap_control_capslock) { + return keycode_to_action(KC_CAPSLOCK); + } + return keycode_to_action(KC_LCTL); + case KC_LALT: + if (keymap_config.swap_lalt_lgui) { + if (keymap_config.no_gui) { + return keycode_to_action(ACTION_NO); + } + return keycode_to_action(KC_LGUI); + } + return keycode_to_action(KC_LALT); + case KC_LGUI: + if (keymap_config.swap_lalt_lgui) { + return keycode_to_action(KC_LALT); + } + if (keymap_config.no_gui) { + return keycode_to_action(ACTION_NO); + } + return keycode_to_action(KC_LGUI); + case KC_RALT: + if (keymap_config.swap_ralt_rgui) { + if (keymap_config.no_gui) { + return keycode_to_action(ACTION_NO); + } + return keycode_to_action(KC_RGUI); + } + return keycode_to_action(KC_RALT); + case KC_RGUI: + if (keymap_config.swap_ralt_rgui) { + return keycode_to_action(KC_RALT); + } + if (keymap_config.no_gui) { + return keycode_to_action(ACTION_NO); + } + return keycode_to_action(KC_RGUI); + case KC_GRAVE: + if (keymap_config.swap_grave_esc) { + return keycode_to_action(KC_ESC); + } + return keycode_to_action(KC_GRAVE); + case KC_ESC: + if (keymap_config.swap_grave_esc) { + return keycode_to_action(KC_GRAVE); + } + return keycode_to_action(KC_ESC); + case KC_BSLASH: + if (keymap_config.swap_backslash_backspace) { + return keycode_to_action(KC_BSPACE); + } + return keycode_to_action(KC_BSLASH); + case KC_BSPACE: + if (keymap_config.swap_backslash_backspace) { + return keycode_to_action(KC_BSLASH); + } + return keycode_to_action(KC_BSPACE); +#endif + default: + return keycode_to_action(keycode); + } +} + + +/* Macro */ +__attribute__ ((weak)) +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + return MACRO_NONE; +} + +/* Function */ +__attribute__ ((weak)) +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +} + +/* translates keycode to action */ +static action_t keycode_to_action(uint16_t keycode) +{ + action_t action; + switch (keycode) { + case KC_A ... KC_EXSEL: + case KC_LCTRL ... KC_RGUI: + action.code = ACTION_KEY(keycode); + break; + case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: + action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); + break; + case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: + action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); + break; + case KC_MS_UP ... KC_MS_ACCEL2: + action.code = ACTION_MOUSEKEY(keycode); + break; + case KC_TRNS: + action.code = ACTION_TRANSPARENT; + break; + default: + action.code = ACTION_NO; + break; + } + return action; +} + + +/* translates key to keycode */ +uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) +{ + // return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); + // This limits it to a byte + + return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); +} + +/* translates Fn keycode to action */ +action_t keymap_fn_to_action(uint16_t keycode) +{ + return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; +} diff --git a/keyboard/planck/extended_keymap_common.h b/keyboard/planck/extended_keymap_common.h new file mode 100644 index 000000000..773b1c515 --- /dev/null +++ b/keyboard/planck/extended_keymap_common.h @@ -0,0 +1,72 @@ +/* +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/>. +*/ + +#ifndef KEYMAP_H +#define KEYMAP_H + +#include <stdint.h> +#include <stdbool.h> +#include "action.h" +#include <avr/pgmspace.h> +#include "keycode.h" +#include "keymap.h" +#include "action_macro.h" +#include "report.h" +#include "host.h" +#include "print.h" +#include "debug.h" + +#ifdef BOOTMAGIC_ENABLE +/* NOTE: Not portable. Bit field order depends on implementation */ +typedef union { + uint16_t raw; + struct { + bool swap_control_capslock:1; + bool capslock_to_control:1; + bool swap_lalt_lgui:1; + bool swap_ralt_rgui:1; + bool no_gui:1; + bool swap_grave_esc:1; + bool swap_backslash_backspace:1; + bool nkro:1; + }; +} keymap_config_t; +keymap_config_t keymap_config; +#endif + +/* translates key to keycode */ +uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); + +/* translates Fn keycode to action */ +action_t keymap_fn_to_action(uint16_t keycode); + +extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const uint16_t fn_actions[]; + +// Ability to use mods in layouts +#define LCTL(kc) kc | 0x0100 +#define LSFT(kc) kc | 0x0200 +#define LALT(kc) kc | 0x0400 +#define LGUI(kc) kc | 0x0800 +#define RCTL(kc) kc | 0x1100 +#define RSFT(kc) kc | 0x1200 +#define RALT(kc) kc | 0x1400 +#define RGUI(kc) kc | 0x1800 + +#define S(kc) LSFT(kc) + +#endif diff --git a/keyboard/planck/extended_keymap_jack.c b/keyboard/planck/extended_keymap_jack.c new file mode 100644 index 000000000..b5fea732b --- /dev/null +++ b/keyboard/planck/extended_keymap_jack.c @@ -0,0 +1,36 @@ +#include "extended_keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Jack */ + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {KC_RSFT, KC_LCTL, KC_LALT, KC_LGUI, KC_FN2, KC_SPC, KC_NO, KC_FN1, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[1] = { /* Jack colemak */ + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, KC_FN2, KC_SPC, KC_NO, KC_FN1, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[2] = { /* Jack RAISE */ + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_TRNS, KC_FN3, KC_FN4, KC_PAUSE, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_FN1, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[3] = { /* Jack LOWER */ + {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, + {KC_TRNS, KC_FN3, KC_FN4, KC_PAUSE, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, + {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_FN2, KC_TRNS, KC_NO, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +} +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + +}; \ No newline at end of file diff --git a/keyboard/planck/keymap_tim.c b/keyboard/planck/keymap_tim.c new file mode 100644 index 000000000..7444f3877 --- /dev/null +++ b/keyboard/planck/keymap_tim.c @@ -0,0 +1,44 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, ENT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, + LCTL, LALT, DEL, LGUI, FN2, SPC, FN1, F2, F5, F9, F12), +[2] = KEYMAP( /* RAISE */ + TRNS, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC, + GRV, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, QUOT, FN29, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN1, TRNS, TRNS, TRNS, TRNS), +[3] = KEYMAP( /* LOWER */ + TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC, + FN22, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, QUOT, FN29, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), + [29] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), +}; diff --git a/keyboard/planck/matrix_center.c b/keyboard/planck/matrix_center.c new file mode 100644 index 000000000..8e34130d6 --- /dev/null +++ b/keyboard/planck/matrix_center.c @@ -0,0 +1,202 @@ +/* +Copyright 2012 Jun Wako <wakojun@gmail.com> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +/* + * scan matrix + */ +#include <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include <util/delay.h> +#include "action_layer.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" + + +#ifndef DEBOUNCE +# define DEBOUNCE 10 +#endif +static uint8_t debouncing = DEBOUNCE; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); + + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + // initialize row and col + unselect_rows(); + init_cols(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } +} + +uint8_t matrix_scan(void) +{ + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i] != cols) { + matrix_debouncing[i] = cols; + if (debouncing) { + debug("bounce!: "); debug_hex(debouncing); debug("\n"); + } + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + return 1; +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<<col)); +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +void matrix_print(void) +{ + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + pbin_reverse16(matrix_get_row(row)); + print("\n"); + } +} + +uint8_t matrix_key_count(void) +{ + uint8_t count = 0; + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + count += bitpop16(matrix[i]); + } + return count; +} + +/* Column pin configuration + * col: 0 1 2 3 4 5 6 7 8 9 10 11 + * pin: F0 F1 F4 F5 F6 F7 B6 B5 B4 D7 D5 D4 + */ + +static void init_cols(void) +{ + DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + PORTF |= (1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + DDRD &= ~(1<<0); + PORTD |= (1<<0); + DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<7); + PORTB |= (1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<7); +} + +static matrix_row_t read_cols(void) +{ + return (PINB&(1<<0) ? 0 : (1<< 0)) | + (PINB&(1<<1) ? 0 : (1<< 1)) | + (PINB&(1<<2) ? 0 : (1<< 2)) | + (PINB&(1<<3) ? 0 : (1<< 3)) | + (PINB&(1<<7) ? 0 : (1<< 4)) | + (PIND&(1<<0) ? 0 : (1<< 5)) | + (PINF&(1<<7) ? 0 : (1<< 6)) | + (PINF&(1<<6) ? 0 : (1<< 7)) | + (PINF&(1<<5) ? 0 : (1<< 8)) | + (PINF&(1<<4) ? 0 : (1<< 9)) | + (PINF&(1<<1) ? 0 : (1<<10)) | + (PINF&(1<<0) ? 0 : (1<<11)); +} + +/* Row pin configuration + * row: 0 1 2 3 + * pin: B0 B1 B2 B3 + */ +static void unselect_rows(void) +{ + // Hi-Z(DDR:0, PORT:0) to unselect + DDRB &= ~0b01110000; + PORTB &= ~0b01110000; + DDRD &= ~0b10000000; + PORTD &= ~0b10000000; +} + +static void select_row(uint8_t row) +{ + switch (row) { + case 0: + DDRB |= (1<<6); + PORTB &= ~(1<<6); + break; + case 1: + DDRB |= (1<<5); + PORTB &= ~(1<<5); + break; + case 2: + DDRB |= (1<<4); + PORTB &= ~(1<<4); + break; + case 3: + DDRD |= (1<<7); + PORTD &= ~(1<<7); + break; + } +} diff --git a/keyboard/planck/matrix-handwire.c b/keyboard/planck/matrix_handwire.c similarity index 100% rename from keyboard/planck/matrix-handwire.c rename to keyboard/planck/matrix_handwire.c From 5c45ba947c760cbb28e67d6eabb887fb56cdb170 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Fri, 20 Mar 2015 22:49:32 -0400 Subject: [PATCH 54/78] function stuff too --- keyboard/planck/extended_keymap_common.c | 10 +++++++++- keyboard/planck/extended_keymap_common.h | 6 ++++++ keyboard/planck/extended_keymap_jack.c | 6 +++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/keyboard/planck/extended_keymap_common.c b/keyboard/planck/extended_keymap_common.c index 895c7418b..387ad43d3 100644 --- a/keyboard/planck/extended_keymap_common.c +++ b/keyboard/planck/extended_keymap_common.c @@ -33,10 +33,12 @@ action_t action_for_key(uint8_t layer, keypos_t key) uint16_t keycode = keymap_key_to_keycode(layer, key); // Handle mods in keymap - if (keycode > 0x00FF) { + if (keycode > 0x00FF && keycode < 0x2000) { action_t action; action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); return action; + } else if (keycode > 0x1FFF && keycode < 0x3000) { + return keymap_func_to_action(keycode & 0xFFF); } switch (keycode) { @@ -169,3 +171,9 @@ action_t keymap_fn_to_action(uint16_t keycode) { return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; } + +/* translates Fn keycode to action */ +action_t keymap_func_to_action(uint16_t keycode) +{ + return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) }; +} \ No newline at end of file diff --git a/keyboard/planck/extended_keymap_common.h b/keyboard/planck/extended_keymap_common.h index 773b1c515..fdce9df97 100644 --- a/keyboard/planck/extended_keymap_common.h +++ b/keyboard/planck/extended_keymap_common.h @@ -54,6 +54,9 @@ uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); /* translates Fn keycode to action */ action_t keymap_fn_to_action(uint16_t keycode); +/* translates Fn keycode to action */ +action_t keymap_func_to_action(uint16_t keycode); + extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; extern const uint16_t fn_actions[]; @@ -67,6 +70,9 @@ extern const uint16_t fn_actions[]; #define RALT(kc) kc | 0x1400 #define RGUI(kc) kc | 0x1800 +#define FUNC(kc) kc | 0x2000 + #define S(kc) LSFT(kc) +#define F(kc) FUNC(kc) #endif diff --git a/keyboard/planck/extended_keymap_jack.c b/keyboard/planck/extended_keymap_jack.c index b5fea732b..3f620afbb 100644 --- a/keyboard/planck/extended_keymap_jack.c +++ b/keyboard/planck/extended_keymap_jack.c @@ -5,7 +5,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_RSFT, KC_LCTL, KC_LALT, KC_LGUI, KC_FN2, KC_SPC, KC_NO, KC_FN1, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {KC_RSFT, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, KC_FN1, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, [1] = { /* Jack colemak */ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, @@ -21,7 +21,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }, [3] = { /* Jack LOWER */ {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, - {KC_TRNS, KC_FN3, KC_FN4, KC_PAUSE, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, + {KC_TRNS, FUNC(3), KC_FN4, LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_FN2, KC_TRNS, KC_NO, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} } @@ -33,4 +33,4 @@ const uint16_t PROGMEM fn_actions[] = { [3] = ACTION_DEFAULT_LAYER_SET(0), [4] = ACTION_DEFAULT_LAYER_SET(1), -}; \ No newline at end of file +}; From 3d286a813e6a8ad77cf947978b7898b167ac0024 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Sat, 21 Mar 2015 01:01:09 -0400 Subject: [PATCH 55/78] colemak shortcuts --- keyboard/planck/extended_keymap_common.c | 10 ++++--- keyboard/planck/extended_keymap_common.h | 37 ++++++++++++++++++++++++ keyboard/planck/extended_keymap_jack.c | 26 +++++++++-------- 3 files changed, 57 insertions(+), 16 deletions(-) diff --git a/keyboard/planck/extended_keymap_common.c b/keyboard/planck/extended_keymap_common.c index 387ad43d3..d9f79ac04 100644 --- a/keyboard/planck/extended_keymap_common.c +++ b/keyboard/planck/extended_keymap_common.c @@ -30,14 +30,17 @@ static action_t keycode_to_action(uint16_t keycode); /* converts key to action */ action_t action_for_key(uint8_t layer, keypos_t key) { + // 16bit keycodes - important uint16_t keycode = keymap_key_to_keycode(layer, key); - // Handle mods in keymap if (keycode > 0x00FF && keycode < 0x2000) { + // Has a modifier action_t action; + // Split it up action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); return action; } else if (keycode > 0x1FFF && keycode < 0x3000) { + // Is a shortcut for function layer, pull last 12bits return keymap_func_to_action(keycode & 0xFFF); } @@ -160,9 +163,7 @@ static action_t keycode_to_action(uint16_t keycode) /* translates key to keycode */ uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { - // return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); - // This limits it to a byte - + // Read entire word (16bits) return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); } @@ -175,5 +176,6 @@ action_t keymap_fn_to_action(uint16_t keycode) /* translates Fn keycode to action */ action_t keymap_func_to_action(uint16_t keycode) { + // For FUNC without 8bit limit return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) }; } \ No newline at end of file diff --git a/keyboard/planck/extended_keymap_common.h b/keyboard/planck/extended_keymap_common.h index fdce9df97..24c2cb848 100644 --- a/keyboard/planck/extended_keymap_common.h +++ b/keyboard/planck/extended_keymap_common.h @@ -70,9 +70,46 @@ extern const uint16_t fn_actions[]; #define RALT(kc) kc | 0x1400 #define RGUI(kc) kc | 0x1800 +// Alias for function layers than expand past FN31 #define FUNC(kc) kc | 0x2000 +// Aliases #define S(kc) LSFT(kc) #define F(kc) FUNC(kc) +// For software implementation of colemak +#define CM_Q KC_Q +#define CM_W KC_W +#define CM_F KC_E +#define CM_P KC_R +#define CM_G KC_T +#define CM_J KC_Y +#define CM_L KC_U +#define CM_U KC_I +#define CM_Y KC_O +#define CM_SCLN KC_P + +#define CM_A KC_A +#define CM_R KC_S +#define CM_S KC_D +#define CM_T KC_F +#define CM_D KC_G +#define CM_H KC_H +#define CM_N KC_J +#define CM_E KC_K +#define CM_I KC_L +#define CM_O KC_SCLN + +#define CM_Z KC_Z +#define CM_X KC_X +#define CM_C KC_C +#define CM_V KC_V +#define CM_B KC_B +#define CM_K KC_N +#define CM_M KC_M +#define CM_COMM KC_COMM +#define CM_DOT KC_DOT +#define CM_SLSH KC_SLSH + + #endif diff --git a/keyboard/planck/extended_keymap_jack.c b/keyboard/planck/extended_keymap_jack.c index 3f620afbb..ef1eae49f 100644 --- a/keyboard/planck/extended_keymap_jack.c +++ b/keyboard/planck/extended_keymap_jack.c @@ -1,31 +1,33 @@ #include "extended_keymap_common.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Jack */ - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_RSFT, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, KC_FN1, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +[0] = { /* Jack soft-coded colemak */ + {KC_TAB, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_BSPC}, + {KC_ESC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_QUOT}, + {KC_LSFT, CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, CM_COMM, CM_DOT, CM_SLSH, KC_ENT}, + {KC_RSFT, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, -[1] = { /* Jack colemak */ +[1] = { /* Jack hard-coded colemak */ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, KC_FN2, KC_SPC, KC_NO, KC_FN1, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, [2] = { /* Jack RAISE */ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TRNS, KC_FN3, KC_FN4, KC_PAUSE, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, {KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_FN1, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, [3] = { /* Jack LOWER */ {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, - {KC_TRNS, FUNC(3), KC_FN4, LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, + {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_FN2, KC_TRNS, KC_NO, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_NO, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} } }; + + const uint16_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay @@ -33,4 +35,4 @@ const uint16_t PROGMEM fn_actions[] = { [3] = ACTION_DEFAULT_LAYER_SET(0), [4] = ACTION_DEFAULT_LAYER_SET(1), -}; +}; \ No newline at end of file From a33ec2f504e790bb253412f09dabd5ffebcfaaa4 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Sat, 21 Mar 2015 01:17:22 -0400 Subject: [PATCH 56/78] updated readme --- keyboard/planck/README.md | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md index 206d6ad80..530fc2121 100644 --- a/keyboard/planck/README.md +++ b/keyboard/planck/README.md @@ -1,29 +1,39 @@ Planck keyboard firmware ====================== -DIY/Assembled compact ortholinear keyboard by [Ortholinear Keyboards](http://ortholinearkeyboards.com). +DIY/Assembled compact ortholinear 40% keyboard by [Ortholinear Keyboards](http://ortholinearkeyboards.com). -## Notable TMK forks (which some of the keymap files are from) -- [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck) -- [Pierre's Fork](https://github.com/pcarrier/tmk_keyboard/blob/pcarrier/planck/keyboard/gh60/keymap_planck.c) -- [Nathan's Fork](https://github.com/nathanrosspowell/tmk_keyboard/tree/planck-jack/keyboard/planck) -- [Matthew's Fork](https://github.com/pepers/tmk_keyboard/tree/master/keyboard/planck_grid) +## Extended Keymap +If you include extended_keymap_common.h instead of keymap_common.h at the top of your file, you'll have access to a bunch of goodies: + +- Use `LSFT()`, `LCTL()`, et. al. (listed in extended_keymap_common.h) as modifiers for keys (daisy-chain-able) +- Use `FUNC(1)` instead of `FN1` (etc.) to access the function layers beyond the 32 function layer limit +- Use `CM_F` instead of `KC_F` to get the ColeMak equivilent for shortcuts (maps backwards) + +### Some notes on usage: + +- The `KEYMAP()` macro is unable to be used due to the bitwise modifications that take place - refer to extended_keymap_jack.c to see how to set things up with the `KC_` prefix +- Keep an eye on the Makefile - this needs to include the correct files to work +- Don't forget to use `const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {` instead of the 8bit equivilent ## Build Follow [this guide](http://deskthority.net/workshop-f7/how-to-build-your-very-own-keyboard-firmware-t7177.html) to setup your development environment before anything else. -Download the whole firmware [here](https://github.com/jackhumbert/tmk_keyboard/archive/master.zip) and navigate to the keyboard/planck folder. Once your dev env is setup, you'll be able to type "make" to generate your .hex that you can load with the Teensy app onto your Planck (once you've hit reset/shorted GND & RST). +Download the whole firmware [here](https://github.com/jackhumbert/tmk_keyboard/archive/master.zip) and navigate to the keyboard/planck folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex that you can load with the Teensy app onto your Planck (once you've hit reset/shorted GND & RST). Move to this directory then just run `make` like: $ make -Use `make -f Makefile.pjrc` if you want to use PJRC stack but I find no reason to do so now. - - ## Keymap -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document(you can find in top README.md) and existent keymap files. +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files. To build firmware binary hex file with a certain keymap just do `make` with `KEYMAP` option like: $ make KEYMAP=[<name>] + +## Notable TMK forks (which some of the keymap files are from) +- [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck) +- [Pierre's Fork](https://github.com/pcarrier/tmk_keyboard/blob/pcarrier/planck/keyboard/gh60/keymap_planck.c) +- [Nathan's Fork](https://github.com/nathanrosspowell/tmk_keyboard/tree/planck-jack/keyboard/planck) +- [Matthew's Fork](https://github.com/pepers/tmk_keyboard/tree/master/keyboard/planck_grid) \ No newline at end of file From 9514ee8df71350076b668fddee32c1c143c65372 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Sat, 21 Mar 2015 01:24:01 -0400 Subject: [PATCH 57/78] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dd03e1403..79f170ea6 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,8 @@ You can find some keyboard specific projects under `converter` and `keyboard` di * [KittenPaw](keyboard/kitten_paw) - Custom Majestouch controller * [Lightpad](keyboard/lightpad) - Korean custom keypad * [ghost_squid](keyboard/ghost_squid/) - [The Ghost Squid][ghost_squid] controller for [Cooler Master QuickFire XT][cmxt] +* [planck](keyboard/planck/) - [Planck] Ortholinear 40% keyboard +* [atomic](keyboard/atomic/) - [Atomic] Ortholinear 60% keyboard ### Extenal projects using tmk_keyboard * [ErgoDox_cub-uanic][cub-uanic] - Split Ergonomic Keyboard [ErgoDox][ergodox_org] @@ -89,7 +91,8 @@ You can find some keyboard specific projects under `converter` and `keyboard` di [cub-uanic]: https://github.com/cub-uanic/tmk_keyboard/tree/master/keyboard/ergodox [mcdox]: https://github.com/DavidMcEwan/mcdox [mcdox_tmk]: https://github.com/DavidMcEwan/tmk_keyboard/tree/master/keyboard/mcdox - +[Planck]: http://planckkeyboard.com +[Atomic]: http://atomickeyboard.com License From 4454ded0af219362604cda0e3f5eb6001b90dc6d Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Mon, 23 Mar 2015 00:33:54 -0400 Subject: [PATCH 58/78] macros --- keyboard/planck/extended_keymap_common.c | 11 ++++--- keyboard/planck/extended_keymap_common.h | 37 ++++++++++++++++++++++++ keyboard/planck/extended_keymap_jack.c | 15 ++++++++-- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/keyboard/planck/extended_keymap_common.c b/keyboard/planck/extended_keymap_common.c index d9f79ac04..f8fc3209f 100644 --- a/keyboard/planck/extended_keymap_common.c +++ b/keyboard/planck/extended_keymap_common.c @@ -33,15 +33,19 @@ action_t action_for_key(uint8_t layer, keypos_t key) // 16bit keycodes - important uint16_t keycode = keymap_key_to_keycode(layer, key); - if (keycode > 0x00FF && keycode < 0x2000) { + if (keycode >= 0x0100 && keycode < 0x2000) { // Has a modifier action_t action; // Split it up action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); return action; - } else if (keycode > 0x1FFF && keycode < 0x3000) { + } else if (keycode >= 0x2000 && keycode < 0x3000) { // Is a shortcut for function layer, pull last 12bits return keymap_func_to_action(keycode & 0xFFF); + } else if (keycode >= 0x3000 && keycode < 0x4000) { + action_t action; + action.code = ACTION_MACRO(keycode & 0xFF); + return action; } switch (keycode) { @@ -173,9 +177,8 @@ action_t keymap_fn_to_action(uint16_t keycode) return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; } -/* translates Fn keycode to action */ action_t keymap_func_to_action(uint16_t keycode) { // For FUNC without 8bit limit return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) }; -} \ No newline at end of file +} diff --git a/keyboard/planck/extended_keymap_common.h b/keyboard/planck/extended_keymap_common.h index 24c2cb848..66712459c 100644 --- a/keyboard/planck/extended_keymap_common.h +++ b/keyboard/planck/extended_keymap_common.h @@ -111,5 +111,42 @@ extern const uint16_t fn_actions[]; #define CM_DOT KC_DOT #define CM_SLSH KC_SLSH +// Make it easy to support these in macros +#define KC_CM_Q CM_Q +#define KC_CM_W CM_W +#define KC_CM_F CM_F +#define KC_CM_P CM_P +#define KC_CM_G CM_G +#define KC_CM_J CM_J +#define KC_CM_L CM_L +#define KC_CM_U CM_U +#define KC_CM_Y CM_Y +#define KC_CM_SCLN CM_SCLN + +#define KC_CM_A CM_A +#define KC_CM_R CM_R +#define KC_CM_S CM_S +#define KC_CM_T CM_T +#define KC_CM_D CM_D +#define KC_CM_H CM_H +#define KC_CM_N CM_N +#define KC_CM_E CM_E +#define KC_CM_I CM_I +#define KC_CM_O CM_O + +#define KC_CM_Z CM_Z +#define KC_CM_X CM_X +#define KC_CM_C CM_C +#define KC_CM_V CM_V +#define KC_CM_B CM_B +#define KC_CM_K CM_K +#define KC_CM_M CM_M +#define KC_CM_COMM CM_COMM +#define KC_CM_DOT CM_DOT +#define KC_CM_SLSH CM_SLSH + +#define M(kc) kc | 0x3000 + +#define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE) #endif diff --git a/keyboard/planck/extended_keymap_jack.c b/keyboard/planck/extended_keymap_jack.c index ef1eae49f..416ae8345 100644 --- a/keyboard/planck/extended_keymap_jack.c +++ b/keyboard/planck/extended_keymap_jack.c @@ -5,7 +5,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_TAB, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_BSPC}, {KC_ESC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_QUOT}, {KC_LSFT, CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, CM_COMM, CM_DOT, CM_SLSH, KC_ENT}, - {KC_RSFT, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {M(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, [1] = { /* Jack hard-coded colemak */ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, @@ -35,4 +35,15 @@ const uint16_t PROGMEM fn_actions[] = { [3] = ACTION_DEFAULT_LAYER_SET(0), [4] = ACTION_DEFAULT_LAYER_SET(1), -}; \ No newline at end of file +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + return MACRODOWN(T(CM_T), END); + break; + } + return MACRO_NONE; +}; From f1daa266ade67a417cb4dabd38b363442941de79 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Mon, 23 Mar 2015 00:35:05 -0400 Subject: [PATCH 59/78] macros --- keyboard/planck/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md index 530fc2121..1b76c559a 100644 --- a/keyboard/planck/README.md +++ b/keyboard/planck/README.md @@ -8,6 +8,7 @@ If you include extended_keymap_common.h instead of keymap_common.h at the top of - Use `LSFT()`, `LCTL()`, et. al. (listed in extended_keymap_common.h) as modifiers for keys (daisy-chain-able) - Use `FUNC(1)` instead of `FN1` (etc.) to access the function layers beyond the 32 function layer limit - Use `CM_F` instead of `KC_F` to get the ColeMak equivilent for shortcuts (maps backwards) +- Use `MACRODOWN()` instead of `MACRO()` to easily make a keydown macro (`CM_*` works here too) ### Some notes on usage: From 4209486b138f3cdbba1aa0c15ca376a6010a72a0 Mon Sep 17 00:00:00 2001 From: Sean Hunter <shunter@palantir.com> Date: Thu, 2 Apr 2015 09:11:20 +0100 Subject: [PATCH 60/78] Latest custom map with lower + raise --- keyboard/planck/keymap_sean.c | 45 ++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/keyboard/planck/keymap_sean.c b/keyboard/planck/keymap_sean.c index 9ad572a72..4fe07f701 100644 --- a/keyboard/planck/keymap_sean.c +++ b/keyboard/planck/keymap_sean.c @@ -2,34 +2,41 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = KEYMAP( /* Matrix Dvorak */ - QUOT, COMM, DOT, P, Y, SLSH, EQL, F, G, C, R, L, - A, O, E, U, I, ESC, BSPC, D, H, T, N, S, - SCLN, Q, J, K, X, TAB, ENT, B, M, W, V, Z, - LSFT, LCTL, LALT, LGUI, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), + QUOT, COMM, DOT, P, Y, SLSH, EQL, F, G, C, R, L, + A, O, E, U, I, ESC, BSPC, D, H, T, N, S, + SCLN, Q, J, K, X, TAB, ENT, B, M, W, V, Z, + LSFT, LCTL, LALT, LGUI, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), [1] = KEYMAP( /* Matrix Qwerty */ - Q, W, E, R, T, SLSH, EQL, Y, U, I, O, P, - A, S, D, F, G, ESC, BSPC, H, J, K, L, SCLN, - Z, X, C, V, B, TAB, ENT, N, M, COMM, DOT, SLSH, - LSFT, LCTL, LALT, LGUI, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), + Q, W, E, R, T, QUOT, EQL, Y, U, I, O, P, + A, S, D, F, G, ESC, BSPC, H, J, K, L, SCLN, + Z, X, C, V, B, TAB, ENT, N, M, COMM, DOT, SLSH, + LSFT, LCTL, LALT, LGUI, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), [2] = KEYMAP( /* fn1 lower */ - F1, F2, F3, F4, F5, TRNS, TRNS, F6, F7, F8, F9, F10, - 1, 2, 3, 4, 5, ESC, DEL, 6, 7, 8, 9, 0, - FN3, FN4, TRNS, GRV, MINS, TRNS, TRNS, BSLS, LBRC, RBRC, TRNS, TRNS, - TRNS, TRNS, TRNS, TRNS, FN1, TRNS, TRNS, HOME, PGDN, PGUP, END), + F1, F2, F3, F4, F5, TRNS, TRNS, F6, F7, F8, F9, F10, + 1, 2, 3, 4, 5, F18, DEL, 6, 7, 8, 9, 0, + FN3, FN4, TRNS, GRV, MINS, TRNS, TRNS, BSLS, LBRC, RBRC, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN5, HOME, PGDN, PGUP, END), [3] = KEYMAP( /* fn2 raise */ - F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, - FN10, FN11, FN12, FN13, FN14, ESC, DEL, FN15, FN16, FN17, FN18, FN19, - FN3, FN4, TRNS, FN22, FN20, TRNS, TRNS, FN28, FN23, FN24, TRNS, TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN2, MNXT, VOLD, VOLU, MPLY), + F1, F2, F3, F4, F5, TRNS, TRNS, F6, F7, F8, F9, F10, + F11, F12, F13, F14, F15, F18, DEL, F16, F17, F18, F19, F20, + FN3, FN4, TRNS, TRNS, TRNS, TRNS, TRNS, EJCT, PWR, LSFT,PAUSE, RSFT, + LEFT, DOWN, UP, RGHT, FN5, TRNS, TRNS, MNXT, VOLD, VOLU, MUTE), + + [4] = KEYMAP( /* lower + raise */ + LEFT, DOWN, UP, RGHT, TRNS, TRNS, TRNS, TRNS, LEFT, DOWN, UP, RGHT, + HOME, PGDN, PGUP, END, TRNS, F18, DEL, TRNS, HOME, PGDN, PGUP, END, + FN3, FN4, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, EJCT, PWR, MPLY, RSFT, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MNXT, VOLD, VOLU, MUTE), }; const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay - [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay + [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay LOWER + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay RAISE [3] = ACTION_DEFAULT_LAYER_SET(0), [4] = ACTION_DEFAULT_LAYER_SET(1), + [5] = ACTION_LAYER_MOMENTARY(4), // to Fn overlay LOWER + RAISE [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), @@ -47,4 +54,4 @@ const uint16_t PROGMEM fn_actions[] = { [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), -}; \ No newline at end of file +}; From bf1987e23311b6ea19899e4d12eec26b02539379 Mon Sep 17 00:00:00 2001 From: Reed Swiernik <rswiernik@csh.rit.edu> Date: Wed, 22 Apr 2015 00:45:03 -0400 Subject: [PATCH 61/78] updated makefile --- keyboard/planck/Makefile | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 3716f0db9..68a4181f9 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -48,18 +48,22 @@ TOP_DIR = ../.. TARGET_DIR = . # # project specific files -# SRC = keymap_common.c \ -# matrix_handwire.c \ -# led.c \ -# backlight.c +ifdef COMMON +SRC = keymap_common.c \ + matrix_handwire.c \ + led.c \ + backlight.c -# ifdef KEYMAP -# SRC := keymap_$(KEYMAP).c $(SRC) -# else -# SRC := keymap_jack.c $(SRC) -# endif +ifdef KEYMAP + SRC := keymap_$(KEYMAP).c $(SRC) +else + SRC := keymap_jack.c $(SRC) +endif + +else # project specific files + SRC = extended_keymap_common.c \ matrix_handwire.c \ led.c \ @@ -71,6 +75,8 @@ else SRC := extended_keymap_jack.c $(SRC) endif +endif + CONFIG_H = config.h # MCU name From 480b313b1ede34adb2e339ee8885e44b1c8a699f Mon Sep 17 00:00:00 2001 From: Reed Swiernik <rswiernik@csh.rit.edu> Date: Wed, 22 Apr 2015 21:39:43 -0400 Subject: [PATCH 62/78] Added keymap w/ game mode --- keyboard/planck/keymap_reed.c | 60 +++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 keyboard/planck/keymap_reed.c diff --git a/keyboard/planck/keymap_reed.c b/keyboard/planck/keymap_reed.c new file mode 100644 index 000000000..601da44b0 --- /dev/null +++ b/keyboard/planck/keymap_reed.c @@ -0,0 +1,60 @@ +#include "keymap_common.h" + +/* + * This layout works off of Jack's layout, making some changes that I + * feel significantly improve the function of the keyboard. + * + */ +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP_GRID( /* Reed */ + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN5, + LCTL, CAPS, LALT, LGUI, FN2, FN7, SPC, FN1, LEFT, DOWN, UP, RGHT), + +[1] = KEYMAP_GRID( /* Reed EXTREME GAMING */ + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN5, + LCTL, 1, 2, 3, 4, SPC, FN2, FN1, LEFT, DOWN, UP, RGHT), + +[2] = KEYMAP_GRID( /* Reed RAISE */ + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, DEL, + TRNS, FN3, FN4, PAUSE, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS, + TRNS, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN1, MNXT, VOLD, VOLU, MPLY), + +[3] = KEYMAP_GRID( /* Reed LOWER */ + TRNS , FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC, + TRNS, TRNS, TRNS, PAUSE, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, + TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS, + TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, MNXT, VOLD, VOLU, MPLY), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay LOWER + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + [5] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_ENT), + [7] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPC), + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), + + [29] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE), +}; From 0541af4ff9a7f510f3d0f1ef55df86f995023748 Mon Sep 17 00:00:00 2001 From: Reed Swiernik <rswiernik@csh.rit.edu> Date: Thu, 23 Apr 2015 04:31:39 -0400 Subject: [PATCH 63/78] Updated makefile to properly handle non extended keymaps --- keyboard/planck/Makefile | 11 ++++++----- keyboard/planck/keymap_reed.c | 20 ++++++++++++++------ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 68a4181f9..ef11e3d32 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -47,9 +47,12 @@ TOP_DIR = ../.. # Directory keyboard dependent files exist TARGET_DIR = . + + # # project specific files -ifdef COMMON -SRC = keymap_common.c \ +ifdef COMMON_KEYMAP + + SRC = keymap_common.c \ matrix_handwire.c \ led.c \ backlight.c @@ -62,9 +65,7 @@ endif else -# project specific files - -SRC = extended_keymap_common.c \ +SRC = extended_keymap_common.c \ matrix_handwire.c \ led.c \ backlight.c diff --git a/keyboard/planck/keymap_reed.c b/keyboard/planck/keymap_reed.c index 601da44b0..097bf395d 100644 --- a/keyboard/planck/keymap_reed.c +++ b/keyboard/planck/keymap_reed.c @@ -1,8 +1,15 @@ #include "keymap_common.h" /* + * make KEYMAP=reed COMMON_KEYMAP=true + * + * * This layout works off of Jack's layout, making some changes that I - * feel significantly improve the function of the keyboard. + * feel significantly improve the function of the keyboard. Major changes + * include adding a "gaming mode" that will allow users to still access + * the number keys 1 through 4 easily for games that require it. Also + * included is the ability to use the tap/hold function for easy use of + * right shift and thumb shift with their tapped companions. * */ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -21,22 +28,23 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [2] = KEYMAP_GRID( /* Reed RAISE */ GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, DEL, TRNS, FN3, FN4, PAUSE, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS, - TRNS, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, TRNS, + TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN1, MNXT, VOLD, VOLU, MPLY), [3] = KEYMAP_GRID( /* Reed LOWER */ TRNS , FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC, TRNS, TRNS, TRNS, PAUSE, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, - TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS, + TRNS, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, TRNS, TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, MNXT, VOLD, VOLU, MPLY), }; const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay RAISE - [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay LOWER + [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay - RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay - LOWER [3] = ACTION_DEFAULT_LAYER_SET(0), [4] = ACTION_DEFAULT_LAYER_SET(1), - [5] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_ENT), + // Actions for the tap/hold modifiers listed above + [5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), [7] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPC), [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), From b060714efd5cb809f14264253ea4987732f1def5 Mon Sep 17 00:00:00 2001 From: Reed Swiernik <rswiernik@csh.rit.edu> Date: Fri, 24 Apr 2015 00:40:04 -0400 Subject: [PATCH 64/78] Changed del key and added docs --- keyboard/planck/keymap_reed.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/keyboard/planck/keymap_reed.c b/keyboard/planck/keymap_reed.c index 097bf395d..f19957ac5 100644 --- a/keyboard/planck/keymap_reed.c +++ b/keyboard/planck/keymap_reed.c @@ -1,8 +1,14 @@ #include "keymap_common.h" /* - * make KEYMAP=reed COMMON_KEYMAP=true + * BUILD: + * Simply run the command below in the keyboard/planck directory + * to build against this keymap * + * make KEYMAP=reed COMMON_KEYMAP=true + * + * + * DETAILS: * * This layout works off of Jack's layout, making some changes that I * feel significantly improve the function of the keyboard. Major changes @@ -26,13 +32,13 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LCTL, 1, 2, 3, 4, SPC, FN2, FN1, LEFT, DOWN, UP, RGHT), [2] = KEYMAP_GRID( /* Reed RAISE */ - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, DEL, + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC, TRNS, FN3, FN4, PAUSE, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS, TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN1, MNXT, VOLD, VOLU, MPLY), [3] = KEYMAP_GRID( /* Reed LOWER */ - TRNS , FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC, + TRNS , FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, DEL, TRNS, TRNS, TRNS, PAUSE, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, TRNS, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, TRNS, TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, MNXT, VOLD, VOLU, MPLY), From e3ebae521e0113edf09f7f3825435d03525b6920 Mon Sep 17 00:00:00 2001 From: Reed Swiernik <rswiernik@csh.rit.edu> Date: Fri, 24 Apr 2015 18:28:03 -0400 Subject: [PATCH 65/78] Updated readme with new build info --- keyboard/planck/README.md | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md index 1b76c559a..d59956d92 100644 --- a/keyboard/planck/README.md +++ b/keyboard/planck/README.md @@ -18,13 +18,31 @@ If you include extended_keymap_common.h instead of keymap_common.h at the top of ## Build -Follow [this guide](http://deskthority.net/workshop-f7/how-to-build-your-very-own-keyboard-firmware-t7177.html) to setup your development environment before anything else. +Follow [this guide](http://deskthority.net/workshop-f7/how-to-build-your-very-own-keyboard-firmware-t7177.html) to setup your development environment before anything else. Abbreviated instructions are provide at the [bottom of this document](https://github.com/rswiernik/tmk_keyboard/tree/rswiernik_dev/keyboard/planck#environment-setup) -Download the whole firmware [here](https://github.com/jackhumbert/tmk_keyboard/archive/master.zip) and navigate to the keyboard/planck folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex that you can load with the Teensy app onto your Planck (once you've hit reset/shorted GND & RST). +Download the whole firmware [here](https://github.com/jackhumbert/tmk_keyboard/archive/master.zip) and navigate to the keyboard/planck folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex that you can load with the Teensy app onto your Planck (once you've hit reset/shorted GND & RST). -Move to this directory then just run `make` like: +Depending on which keymap you would like to use, you will have to compile slightly differently. - $ make +**Extended Keymaps (default)** +Extended keymaps need to be specified as follows: +``` +$ make KEYMAP=[common|jack|<name>] +``` +Applicable keymaps should follow the format **__extended\_keymap\_name.c__** + +**Common Keymaps** +Common keymaps need to be specified as follows: +``` +$ make KEYMAP=[common|jack|<name>] COMMON=true +``` +Applicable keymaps should follow the format **__keymap\_name.c__** + + +To build the default keymap, simply move to the tmk\_keyboard/keyboard/planck/ and run `make` as follows: +``` +$ make +``` ## Keymap Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files. @@ -37,4 +55,7 @@ To build firmware binary hex file with a certain keymap just do `make` with `KEY - [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck) - [Pierre's Fork](https://github.com/pcarrier/tmk_keyboard/blob/pcarrier/planck/keyboard/gh60/keymap_planck.c) - [Nathan's Fork](https://github.com/nathanrosspowell/tmk_keyboard/tree/planck-jack/keyboard/planck) -- [Matthew's Fork](https://github.com/pepers/tmk_keyboard/tree/master/keyboard/planck_grid) \ No newline at end of file +- [Matthew's Fork](https://github.com/pepers/tmk_keyboard/tree/master/keyboard/planck_grid) + +## Environment Setup + From c85f68d9cd2963e0a00dfe05fea75b824d5f4fcc Mon Sep 17 00:00:00 2001 From: Reed Swiernik <reed.swiernik@gmail.com> Date: Fri, 24 Apr 2015 18:29:50 -0400 Subject: [PATCH 66/78] Update README.md Changed formatting mistake --- keyboard/planck/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md index d59956d92..b106fd8c4 100644 --- a/keyboard/planck/README.md +++ b/keyboard/planck/README.md @@ -25,6 +25,7 @@ Download the whole firmware [here](https://github.com/jackhumbert/tmk_keyboard/a Depending on which keymap you would like to use, you will have to compile slightly differently. **Extended Keymaps (default)** + Extended keymaps need to be specified as follows: ``` $ make KEYMAP=[common|jack|<name>] @@ -32,6 +33,7 @@ $ make KEYMAP=[common|jack|<name>] Applicable keymaps should follow the format **__extended\_keymap\_name.c__** **Common Keymaps** + Common keymaps need to be specified as follows: ``` $ make KEYMAP=[common|jack|<name>] COMMON=true From 835207193a8d5c366d783c8953d4aeaee5ee094a Mon Sep 17 00:00:00 2001 From: Reed Swiernik <reed.swiernik@gmail.com> Date: Fri, 24 Apr 2015 18:35:57 -0400 Subject: [PATCH 67/78] Update README.md Updated formatting again... --- keyboard/planck/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md index b106fd8c4..84d5000bb 100644 --- a/keyboard/planck/README.md +++ b/keyboard/planck/README.md @@ -24,7 +24,13 @@ Download the whole firmware [here](https://github.com/jackhumbert/tmk_keyboard/a Depending on which keymap you would like to use, you will have to compile slightly differently. -**Extended Keymaps (default)** +####Default +To build the default keymap, simply move to the tmk\_keyboard/keyboard/planck/ and run `make` as follows: +``` +$ make +``` + +####**Extended Keymaps** Extended keymaps need to be specified as follows: ``` @@ -32,7 +38,7 @@ $ make KEYMAP=[common|jack|<name>] ``` Applicable keymaps should follow the format **__extended\_keymap\_name.c__** -**Common Keymaps** +####**Common Keymaps** Common keymaps need to be specified as follows: ``` @@ -40,12 +46,6 @@ $ make KEYMAP=[common|jack|<name>] COMMON=true ``` Applicable keymaps should follow the format **__keymap\_name.c__** - -To build the default keymap, simply move to the tmk\_keyboard/keyboard/planck/ and run `make` as follows: -``` -$ make -``` - ## Keymap Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files. From d0391d9ed7d74e0a6cbf82db1700e7eaa456d386 Mon Sep 17 00:00:00 2001 From: Reed Swiernik <reed.swiernik@gmail.com> Date: Fri, 24 Apr 2015 18:36:57 -0400 Subject: [PATCH 68/78] Update README.md This stupid readme... --- keyboard/planck/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md index 84d5000bb..0e573652e 100644 --- a/keyboard/planck/README.md +++ b/keyboard/planck/README.md @@ -36,7 +36,7 @@ Extended keymaps need to be specified as follows: ``` $ make KEYMAP=[common|jack|<name>] ``` -Applicable keymaps should follow the format **__extended\_keymap\_name.c__** +Applicable keymaps should follow the format **__extended\_keymap\_<name>.c__** ####**Common Keymaps** @@ -44,7 +44,7 @@ Common keymaps need to be specified as follows: ``` $ make KEYMAP=[common|jack|<name>] COMMON=true ``` -Applicable keymaps should follow the format **__keymap\_name.c__** +Applicable keymaps should follow the format **__keymap\_<name>.c__** ## Keymap Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files. From 79f70b20d993f92c676112986b1d137109b35ce7 Mon Sep 17 00:00:00 2001 From: Reed Swiernik <reed.swiernik@gmail.com> Date: Fri, 24 Apr 2015 18:49:49 -0400 Subject: [PATCH 69/78] Update README.md Switched around more readme stuff --- keyboard/planck/README.md | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md index 0e573652e..8931b5fcc 100644 --- a/keyboard/planck/README.md +++ b/keyboard/planck/README.md @@ -25,33 +25,29 @@ Download the whole firmware [here](https://github.com/jackhumbert/tmk_keyboard/a Depending on which keymap you would like to use, you will have to compile slightly differently. ####Default -To build the default keymap, simply move to the tmk\_keyboard/keyboard/planck/ and run `make` as follows: +To build with the default keymap, simply move to the tmk\_keyboard/keyboard/planck/ and run `make` as follows: ``` $ make ``` +## Keymap +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files. + ####**Extended Keymaps** -Extended keymaps need to be specified as follows: +To build the firmware binary hex file with an extended keymap just do `make` with `KEYMAP` option like: ``` $ make KEYMAP=[common|jack|<name>] ``` -Applicable keymaps should follow the format **__extended\_keymap\_<name>.c__** +_The only applicable keymaps will work with this option._ Extended keymaps follow the format **__extended\_keymap\_\<name\>.c__** ####**Common Keymaps** -Common keymaps need to be specified as follows: +Building with a common keymap is as simple as adding the COMMON option. Note that only ``` $ make KEYMAP=[common|jack|<name>] COMMON=true ``` -Applicable keymaps should follow the format **__keymap\_<name>.c__** - -## Keymap -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files. - -To build firmware binary hex file with a certain keymap just do `make` with `KEYMAP` option like: - - $ make KEYMAP=[<name>] +_The only applicable keymaps will work with this option._ Common keymaps follow the format **__keymap\_\<name\>.c__** ## Notable TMK forks (which some of the keymap files are from) - [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck) From eadb08b113e26468a7915d1ea60a3f166527c3b0 Mon Sep 17 00:00:00 2001 From: Reed Swiernik <reed.swiernik@gmail.com> Date: Fri, 24 Apr 2015 18:54:03 -0400 Subject: [PATCH 70/78] Update README.md --- keyboard/planck/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md index 8931b5fcc..ee824d26e 100644 --- a/keyboard/planck/README.md +++ b/keyboard/planck/README.md @@ -54,6 +54,3 @@ _The only applicable keymaps will work with this option._ Common keymaps follow - [Pierre's Fork](https://github.com/pcarrier/tmk_keyboard/blob/pcarrier/planck/keyboard/gh60/keymap_planck.c) - [Nathan's Fork](https://github.com/nathanrosspowell/tmk_keyboard/tree/planck-jack/keyboard/planck) - [Matthew's Fork](https://github.com/pepers/tmk_keyboard/tree/master/keyboard/planck_grid) - -## Environment Setup - From 85f8506caa00b06f525fc8e62a9fac2093ab8310 Mon Sep 17 00:00:00 2001 From: Reed Swiernik <rswiernik@csh.rit.edu> Date: Wed, 29 Apr 2015 02:47:56 -0400 Subject: [PATCH 71/78] Moved keymap file location and fixed bugs in keymap_reed.c --- keyboard/planck/Makefile | 8 ++++---- keyboard/planck/{ => common_keymaps}/keymap_brett.c | 0 keyboard/planck/{ => common_keymaps}/keymap_dotcom.c | 0 keyboard/planck/{ => common_keymaps}/keymap_jack.c | 0 keyboard/planck/{ => common_keymaps}/keymap_joe.c | 0 .../planck/{ => common_keymaps}/keymap_matthew.c | 0 keyboard/planck/{ => common_keymaps}/keymap_nathan.c | 0 .../planck/{ => common_keymaps}/keymap_peasant.c | 0 keyboard/planck/{ => common_keymaps}/keymap_reed.c | 12 ++++++------ keyboard/planck/{ => common_keymaps}/keymap_sean.c | 0 keyboard/planck/{ => common_keymaps}/keymap_shane.c | 0 keyboard/planck/{ => common_keymaps}/keymap_simon.c | 0 keyboard/planck/{ => common_keymaps}/keymap_tim.c | 0 keyboard/planck/{ => common_keymaps}/keymap_wilba.c | 0 .../{ => extended_keymaps}/extended_keymap_jack.c | 0 15 files changed, 10 insertions(+), 10 deletions(-) rename keyboard/planck/{ => common_keymaps}/keymap_brett.c (100%) rename keyboard/planck/{ => common_keymaps}/keymap_dotcom.c (100%) rename keyboard/planck/{ => common_keymaps}/keymap_jack.c (100%) rename keyboard/planck/{ => common_keymaps}/keymap_joe.c (100%) rename keyboard/planck/{ => common_keymaps}/keymap_matthew.c (100%) rename keyboard/planck/{ => common_keymaps}/keymap_nathan.c (100%) rename keyboard/planck/{ => common_keymaps}/keymap_peasant.c (100%) rename keyboard/planck/{ => common_keymaps}/keymap_reed.c (88%) rename keyboard/planck/{ => common_keymaps}/keymap_sean.c (100%) rename keyboard/planck/{ => common_keymaps}/keymap_shane.c (100%) rename keyboard/planck/{ => common_keymaps}/keymap_simon.c (100%) rename keyboard/planck/{ => common_keymaps}/keymap_tim.c (100%) rename keyboard/planck/{ => common_keymaps}/keymap_wilba.c (100%) rename keyboard/planck/{ => extended_keymaps}/extended_keymap_jack.c (100%) diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index ef11e3d32..e32e4f97e 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -58,9 +58,9 @@ ifdef COMMON_KEYMAP backlight.c ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) + SRC := common_keymaps/keymap_$(KEYMAP).c $(SRC) else - SRC := keymap_jack.c $(SRC) + SRC := common_keymaps/keymap_jack.c $(SRC) endif else @@ -71,9 +71,9 @@ SRC = extended_keymap_common.c \ backlight.c ifdef KEYMAP - SRC := extended_keymap_$(KEYMAP).c $(SRC) + SRC := extended_keymaps/extended_keymap_$(KEYMAP).c $(SRC) else - SRC := extended_keymap_jack.c $(SRC) + SRC := extended_keymaps/extended_keymap_jack.c $(SRC) endif endif diff --git a/keyboard/planck/keymap_brett.c b/keyboard/planck/common_keymaps/keymap_brett.c similarity index 100% rename from keyboard/planck/keymap_brett.c rename to keyboard/planck/common_keymaps/keymap_brett.c diff --git a/keyboard/planck/keymap_dotcom.c b/keyboard/planck/common_keymaps/keymap_dotcom.c similarity index 100% rename from keyboard/planck/keymap_dotcom.c rename to keyboard/planck/common_keymaps/keymap_dotcom.c diff --git a/keyboard/planck/keymap_jack.c b/keyboard/planck/common_keymaps/keymap_jack.c similarity index 100% rename from keyboard/planck/keymap_jack.c rename to keyboard/planck/common_keymaps/keymap_jack.c diff --git a/keyboard/planck/keymap_joe.c b/keyboard/planck/common_keymaps/keymap_joe.c similarity index 100% rename from keyboard/planck/keymap_joe.c rename to keyboard/planck/common_keymaps/keymap_joe.c diff --git a/keyboard/planck/keymap_matthew.c b/keyboard/planck/common_keymaps/keymap_matthew.c similarity index 100% rename from keyboard/planck/keymap_matthew.c rename to keyboard/planck/common_keymaps/keymap_matthew.c diff --git a/keyboard/planck/keymap_nathan.c b/keyboard/planck/common_keymaps/keymap_nathan.c similarity index 100% rename from keyboard/planck/keymap_nathan.c rename to keyboard/planck/common_keymaps/keymap_nathan.c diff --git a/keyboard/planck/keymap_peasant.c b/keyboard/planck/common_keymaps/keymap_peasant.c similarity index 100% rename from keyboard/planck/keymap_peasant.c rename to keyboard/planck/common_keymaps/keymap_peasant.c diff --git a/keyboard/planck/keymap_reed.c b/keyboard/planck/common_keymaps/keymap_reed.c similarity index 88% rename from keyboard/planck/keymap_reed.c rename to keyboard/planck/common_keymaps/keymap_reed.c index f19957ac5..1aa24e10d 100644 --- a/keyboard/planck/keymap_reed.c +++ b/keyboard/planck/common_keymaps/keymap_reed.c @@ -33,15 +33,15 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [2] = KEYMAP_GRID( /* Reed RAISE */ GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC, - TRNS, FN3, FN4, PAUSE, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS, - TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS, + TRNS, FN3, FN4, PAUSE, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS, + TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN1, MNXT, VOLD, VOLU, MPLY), [3] = KEYMAP_GRID( /* Reed LOWER */ - TRNS , FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, DEL, - TRNS, TRNS, TRNS, PAUSE, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, - TRNS, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, TRNS, - TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, MNXT, VOLD, VOLU, MPLY), + TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, DEL, + TRNS, TRNS, INS, HOME, PGUP, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, + TRNS, TRNS, DEL, END, PGDN, F11, F12, F13, TRNS, VOLD, VOLU, TRNS, + TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, MPRV, MUTE, MPLY, MNXT), }; const uint16_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay - RAISE diff --git a/keyboard/planck/keymap_sean.c b/keyboard/planck/common_keymaps/keymap_sean.c similarity index 100% rename from keyboard/planck/keymap_sean.c rename to keyboard/planck/common_keymaps/keymap_sean.c diff --git a/keyboard/planck/keymap_shane.c b/keyboard/planck/common_keymaps/keymap_shane.c similarity index 100% rename from keyboard/planck/keymap_shane.c rename to keyboard/planck/common_keymaps/keymap_shane.c diff --git a/keyboard/planck/keymap_simon.c b/keyboard/planck/common_keymaps/keymap_simon.c similarity index 100% rename from keyboard/planck/keymap_simon.c rename to keyboard/planck/common_keymaps/keymap_simon.c diff --git a/keyboard/planck/keymap_tim.c b/keyboard/planck/common_keymaps/keymap_tim.c similarity index 100% rename from keyboard/planck/keymap_tim.c rename to keyboard/planck/common_keymaps/keymap_tim.c diff --git a/keyboard/planck/keymap_wilba.c b/keyboard/planck/common_keymaps/keymap_wilba.c similarity index 100% rename from keyboard/planck/keymap_wilba.c rename to keyboard/planck/common_keymaps/keymap_wilba.c diff --git a/keyboard/planck/extended_keymap_jack.c b/keyboard/planck/extended_keymaps/extended_keymap_jack.c similarity index 100% rename from keyboard/planck/extended_keymap_jack.c rename to keyboard/planck/extended_keymaps/extended_keymap_jack.c From 15110bf7a06badecb80dba351bb52fce6588dabe Mon Sep 17 00:00:00 2001 From: Reed Swiernik <rswiernik@csh.rit.edu> Date: Wed, 29 Apr 2015 02:49:58 -0400 Subject: [PATCH 72/78] Corrected makefile common var --- keyboard/planck/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index e32e4f97e..e021e9e90 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -50,7 +50,7 @@ TARGET_DIR = . # # project specific files -ifdef COMMON_KEYMAP +ifdef COMMON SRC = keymap_common.c \ matrix_handwire.c \ From 1e0ae2936bfacc9d8048f64719c38b6f78790bb9 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Sat, 2 May 2015 23:00:47 -0400 Subject: [PATCH 73/78] quark --- keyboard/quark/Makefile | 155 +++++++++++++ keyboard/quark/Makefile.pjrc | 116 ++++++++++ keyboard/quark/README.md | 53 +++++ keyboard/quark/backlight.c | 46 ++++ keyboard/quark/backlight.h | 2 + keyboard/quark/common_keymaps/keymap_brett.c | 42 ++++ keyboard/quark/common_keymaps/keymap_dotcom.c | 34 +++ keyboard/quark/common_keymaps/keymap_jack.c | 50 ++++ keyboard/quark/common_keymaps/keymap_joe.c | 107 +++++++++ .../quark/common_keymaps/keymap_matthew.c | 70 ++++++ keyboard/quark/common_keymaps/keymap_nathan.c | 153 ++++++++++++ .../quark/common_keymaps/keymap_peasant.c | 51 ++++ keyboard/quark/common_keymaps/keymap_reed.c | 74 ++++++ keyboard/quark/common_keymaps/keymap_sean.c | 57 +++++ keyboard/quark/common_keymaps/keymap_shane.c | 100 ++++++++ keyboard/quark/common_keymaps/keymap_simon.c | 44 ++++ keyboard/quark/common_keymaps/keymap_tim.c | 44 ++++ keyboard/quark/common_keymaps/keymap_wilba.c | 56 +++++ keyboard/quark/config.h | 74 ++++++ keyboard/quark/extended_keymap_common.c | 184 +++++++++++++++ keyboard/quark/extended_keymap_common.h | 152 ++++++++++++ .../extended_keymaps/extended_keymap_jack.c | 49 ++++ keyboard/quark/keymap_common.c | 30 +++ keyboard/quark/keymap_common.h | 86 +++++++ keyboard/quark/led.c | 38 +++ keyboard/quark/matrix.c | 219 ++++++++++++++++++ keyboard/quark/matrix_center.c | 202 ++++++++++++++++ keyboard/quark/matrix_handwire.c | 193 +++++++++++++++ teensy-sdk | 1 + 29 files changed, 2482 insertions(+) create mode 100644 keyboard/quark/Makefile create mode 100644 keyboard/quark/Makefile.pjrc create mode 100644 keyboard/quark/README.md create mode 100644 keyboard/quark/backlight.c create mode 100644 keyboard/quark/backlight.h create mode 100644 keyboard/quark/common_keymaps/keymap_brett.c create mode 100644 keyboard/quark/common_keymaps/keymap_dotcom.c create mode 100644 keyboard/quark/common_keymaps/keymap_jack.c create mode 100644 keyboard/quark/common_keymaps/keymap_joe.c create mode 100644 keyboard/quark/common_keymaps/keymap_matthew.c create mode 100644 keyboard/quark/common_keymaps/keymap_nathan.c create mode 100644 keyboard/quark/common_keymaps/keymap_peasant.c create mode 100644 keyboard/quark/common_keymaps/keymap_reed.c create mode 100644 keyboard/quark/common_keymaps/keymap_sean.c create mode 100644 keyboard/quark/common_keymaps/keymap_shane.c create mode 100644 keyboard/quark/common_keymaps/keymap_simon.c create mode 100644 keyboard/quark/common_keymaps/keymap_tim.c create mode 100644 keyboard/quark/common_keymaps/keymap_wilba.c create mode 100644 keyboard/quark/config.h create mode 100644 keyboard/quark/extended_keymap_common.c create mode 100644 keyboard/quark/extended_keymap_common.h create mode 100644 keyboard/quark/extended_keymaps/extended_keymap_jack.c create mode 100644 keyboard/quark/keymap_common.c create mode 100644 keyboard/quark/keymap_common.h create mode 100644 keyboard/quark/led.c create mode 100644 keyboard/quark/matrix.c create mode 100644 keyboard/quark/matrix_center.c create mode 100644 keyboard/quark/matrix_handwire.c create mode 160000 teensy-sdk diff --git a/keyboard/quark/Makefile b/keyboard/quark/Makefile new file mode 100644 index 000000000..df012064d --- /dev/null +++ b/keyboard/quark/Makefile @@ -0,0 +1,155 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# Target file name (without extension). +TARGET = quark_lufa + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + + + +# # project specific files +ifdef COMMON + + SRC = keymap_common.c \ + matrix_handwire.c \ + led.c \ + backlight.c + +ifdef KEYMAP + SRC := common_keymaps/keymap_$(KEYMAP).c $(SRC) +else + SRC := common_keymaps/keymap_jack.c $(SRC) +endif + +else + +SRC = extended_keymap_common.c \ + matrix_handwire.c \ + led.c \ + backlight.c + +ifdef KEYMAP + SRC := extended_keymaps/extended_keymap_$(KEYMAP).c $(SRC) +else + SRC := extended_keymaps/extended_keymap_jack.c $(SRC) +endif + +endif + +CONFIG_H = config.h + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality + +# Optimize size but this may cause error "relocation truncated to fit" +#EXTRALDFLAGS = -Wl,--relax + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk diff --git a/keyboard/quark/Makefile.pjrc b/keyboard/quark/Makefile.pjrc new file mode 100644 index 000000000..be83ba18b --- /dev/null +++ b/keyboard/quark/Makefile.pjrc @@ -0,0 +1,116 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# Target file name (without extension). +TARGET = gh60_pjrc + +# Directory common source filess exist +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# project specific files +SRC = keymap_common.c \ + matrix.c \ + led.c + +ifdef KEYMAP + SRC := keymap_$(KEYMAP).c $(SRC) +else + SRC := keymap_jack.c $(SRC) +endif + +CONFIG_H = config.h + + +# MCU name, you MUST set this to match the board you are using +# type "make clean" after changing this, so all files will be rebuilt +MCU = atmega32u4 +#MCU = at90usb1286 + + +# Processor frequency. +# Normally the first thing your program should do is set the clock prescaler, +# so your program will run at the correct speed. You should also set this +# variable to same clock speed. The _delay_ms() macro uses this, and many +# examples use this variable to calculate timings. Do not add a "UL" here. +F_CPU = 16000000 + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+5000) +EXTRAKEY_ENABLE = yes # Audio control and System control(+600) +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = yes # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover(+500) +#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support + + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) + +include $(TOP_DIR)/protocol/pjrc.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk + +plain: OPT_DEFS += -DKEYMAP_PLAIN +plain: all + +poker: OPT_DEFS += -DKEYMAP_POKER +poker: all + +poker_set: OPT_DEFS += -DKEYMAP_POKER_SET +poker_set: all + +poker_bit: OPT_DEFS += -DKEYMAP_POKER_BIT +poker_bit: all diff --git a/keyboard/quark/README.md b/keyboard/quark/README.md new file mode 100644 index 000000000..59afbab1a --- /dev/null +++ b/keyboard/quark/README.md @@ -0,0 +1,53 @@ +Quark keyboard firmware +====================== +DIY/Assembled compact 40% keyboard by [Ortholinear Keyboards](http://ortholinearkeyboards.com). + +## Extended Keymap +If you include extended_keymap_common.h instead of keymap_common.h at the top of your file, you'll have access to a bunch of goodies: + +- Use `LSFT()`, `LCTL()`, et. al. (listed in extended_keymap_common.h) as modifiers for keys (daisy-chain-able) +- Use `FUNC(1)` instead of `FN1` (etc.) to access the function layers beyond the 32 function layer limit +- Use `CM_F` instead of `KC_F` to get the ColeMak equivilent for shortcuts (maps backwards) +- Use `MACRODOWN()` instead of `MACRO()` to easily make a keydown macro (`CM_*` works here too) + +### Some notes on usage: + +- The `KEYMAP()` macro is unable to be used due to the bitwise modifications that take place - refer to extended_keymap_jack.c to see how to set things up with the `KC_` prefix +- Keep an eye on the Makefile - this needs to include the correct files to work +- Don't forget to use `const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {` instead of the 8bit equivilent + +## Build + +Follow [this guide](http://deskthority.net/workshop-f7/how-to-build-your-very-own-keyboard-firmware-t7177.html) to setup your development environment before anything else. Abbreviated instructions are provide at the [bottom of this document](https://github.com/rswiernik/tmk_keyboard/tree/rswiernik_dev/keyboard/quark#environment-setup) + +Download the whole firmware [here](https://github.com/jackhumbert/tmk_keyboard/archive/master.zip) and navigate to the keyboard/quark folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex that you can load with the Teensy app onto your Planck (once you've hit reset/shorted GND & RST). + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +####Default +To build with the default keymap, simply move to the tmk\_keyboard/keyboard/quark/ and run `make` as follows: +``` +$ make +``` + +## Keymap +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files. + +####**Extended Keymaps** + +To build the firmware binary hex file with an extended keymap just do `make` with `KEYMAP` option like: +``` +$ make KEYMAP=[common|jack|<name>] +``` +_The only applicable keymaps will work with this option._ Extended keymaps follow the format **__extended\_keymap\_\<name\>.c__** + +####**Common Keymaps** + +Building with a common keymap is as simple as adding the COMMON option. Note that only +``` +$ make KEYMAP=[common|jack|<name>] COMMON=true +``` +_The only applicable keymaps will work with this option._ Common keymaps follow the format **__keymap\_\<name\>.c__** + +## Notable TMK forks (which some of the keymap files are from) +- (add yours) diff --git a/keyboard/quark/backlight.c b/keyboard/quark/backlight.c new file mode 100644 index 000000000..ee7e31ee9 --- /dev/null +++ b/keyboard/quark/backlight.c @@ -0,0 +1,46 @@ + +#include <avr/io.h> +#include "backlight.h" + + +void backlight_init_ports() +{ + // Setup PB7 as output and output low. + DDRB |= (1<<7); + PORTB &= ~(1<<7); + + // Use full 16-bit resolution. + ICR1 = 0xFFFF; + + // I could write a wall of text here to explain... but TL;DW + // Go read the ATmega32u4 datasheet. + // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on + + // Pin PB7 = OCR1C (Timer 1, Channel C) + // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0 + // (i.e. start high, go low when counter matches.) + // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0 + // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 + + TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010; + TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; + + // Default to zero duty cycle. + OCR1C = 0x0000; +} + +void backlight_set(uint8_t level) +{ + if ( level == 0 ) + { + // Turn off PWM control on PB7, revert to output low. + TCCR1A &= ~(_BV(COM1C1)); + } + else + { + // Turn on PWM control of PB7 + TCCR1A |= _BV(COM1C1); + OCR1C = level << 12 | 0x0FFF; + } +} + diff --git a/keyboard/quark/backlight.h b/keyboard/quark/backlight.h new file mode 100644 index 000000000..0fe1f4a72 --- /dev/null +++ b/keyboard/quark/backlight.h @@ -0,0 +1,2 @@ + +void backlight_init_ports(void); diff --git a/keyboard/quark/common_keymaps/keymap_brett.c b/keyboard/quark/common_keymaps/keymap_brett.c new file mode 100644 index 000000000..97d832b47 --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_brett.c @@ -0,0 +1,42 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + LCTL, A, S, D, F, G, H, J, K, L, SCLN, ENT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, + TAB, LGUI, RSFT, LALT, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), +[1] = KEYMAP( /* RAISE */ + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, DEL, + TRNS, F1, F2, F3, F4, F5, F6, 4, 5, 6, QUOT, TRNS, + TRNS, F7, F8, F9, F10, F11, F12, 1, 2, 3, TRNS, PGUP, + MPRV, MNXT, TRNS, MUTE, TRNS, TRNS, FN1, 0, 0, TRNS, PGDN), +[2] = KEYMAP( /* LOWER */ + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MINS, + TRNS, TRNS, TRNS, PAUSE, TRNS, TRNS, TRNS, TRNS, LBRC, RBRC, BSLS, EQL, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + MPLY, MSTP, VOLU, VOLD, FN2, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), + + [29] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE), +}; diff --git a/keyboard/quark/common_keymaps/keymap_dotcom.c b/keyboard/quark/common_keymaps/keymap_dotcom.c new file mode 100644 index 000000000..347f6dea9 --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_dotcom.c @@ -0,0 +1,34 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + FN1, A, S, D, F, G, H, J, K, L, SCLN, ENT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, LBRC, + LCTL, BSLS, QUOT, LALT, FN22, SPC, LEFT, UP, DOWN, RGHT, RBRC), +[1] = KEYMAP( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, DEL, + TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, TRNS, TRNS, TRNS, + TRNS, FN18, FN19, FN22, EQL, MINS, FN20, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN1, TRNS, VOLD, VOLU, TRNS), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), +}; diff --git a/keyboard/quark/common_keymaps/keymap_jack.c b/keyboard/quark/common_keymaps/keymap_jack.c new file mode 100644 index 000000000..c74812121 --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_jack.c @@ -0,0 +1,50 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( /* Jack */ + TAB, Q, W, E, R, T, Y, U, I, O, P, BSPC, + ESC, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT, + RSFT, LCTL, LALT, LGUI, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), +[1] = KEYMAP( /* Jack colemak */ + TAB, Q, W, F, P, G, J, L, U, Y, SCLN, BSPC, + ESC, A, R, S, T, D, H, N, E, I, O, QUOT, + LSFT, Z, X, C, V, B, K, M, COMM, DOT, SLSH, ENT, + FN3, LCTL, LALT, LGUI, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), +[2] = KEYMAP( /* Jack RAISE */ + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC, + TRNS, FN3, FN4, PAUSE, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS, + TRNS, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN1, MNXT, VOLD, VOLU, MPLY), +[3] = KEYMAP( /* Jack LOWER */ + FN22, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC, + TRNS, FN3, FN4, PAUSE, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, + TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS, + TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, MNXT, VOLD, VOLU, MPLY), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), + + [29] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE), +}; diff --git a/keyboard/quark/common_keymaps/keymap_joe.c b/keyboard/quark/common_keymaps/keymap_joe.c new file mode 100644 index 000000000..07122b702 --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_joe.c @@ -0,0 +1,107 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( /* Joe colemak */ + ESC, Q, W, F, P, G, J, L, U, Y, SCLN, MINS, + BSPC, A, R, S, T, D, H, N, E, I, O, ENT, + TAB, Z, X, C, V, B, K, M, COMM, DOT, SLSH, QUOT, + LCTL, LGUI, LALT, LSFT, FN1, SPC, FN0, LEFT, DOWN, UP, RGHT), +[1] = KEYMAP( /* Joe qwerty */ + ESC, Q, W, E, R, T, Y, U, I, O, P, MINS, + BSPC, A, S, D, F, G, H, J, K, L, SCLN, ENT, + TAB, Z, X, C, V, B, N, M, COMM, DOT, SLSH, QUOT, + LCTL, LGUI, LALT, LSFT, FN1, SPC, FN0, LEFT, DOWN, UP, RGHT), +[2] = KEYMAP( /* Joe RAISE */ + F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, + DEL, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, TRNS, + BSLS, FN5, FN6, TRNS, TRNS, MENU, CAPS, INS, PSCR, LBRC, RBRC, FN21, + TRNS, TRNS, TRNS, TRNS, FN2, TRNS, FN0, FN26, FN27, FN28, FN29), +[3] = KEYMAP( /* Joe LOWER */ + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN7, FN8, FN9, FN30, FN31, + DEL, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, TRNS, + FN25, FN3, FN4, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN23, FN24, EQL, + TRNS, TRNS, TRNS, TRNS, FN1, TRNS, FN2, HOME, PGDN, PGUP, END), +[4] = KEYMAP( /* Joe LOWER + RAISE */ + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MNXT, VOLD, VOLU, MPLY), +}; + +enum macro_id { + M_Q0, + M_Q1, + M_Q2, + M_Q3, + M_Q4 +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay + [1] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(4), // to Fn overlay + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + + [5] = ACTION_MODS_KEY(MOD_LCTL, KC_PGDN), + [6] = ACTION_MODS_KEY(MOD_LCTL, KC_PGUP), + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [25] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), + + [7] = ACTION_MACRO(M_Q0), + [8] = ACTION_MACRO(M_Q1), + [9] = ACTION_MACRO(M_Q2), + [30] = ACTION_MACRO(M_Q3), + [31] = ACTION_MACRO(M_Q4), + + [26] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT, KC_LEFT), + [27] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT, KC_DOWN), + [28] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT, KC_UP), + [29] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT, KC_RGHT), + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + keyevent_t event = record->event; + switch (id) { + case M_Q0: + return event.pressed ? + MACRO( D(LSFT), T(SCLN), U(LSFT), T(SLSH), END ) : + MACRO_NONE; + case M_Q1: + return event.pressed ? + MACRO( D(LSFT), T(SCLN), T(9), U(LSFT), END ) : + MACRO_NONE; + case M_Q2: + return event.pressed ? + MACRO( D(LSFT), T(0), T(SCLN), U(LSFT), END ) : + MACRO_NONE; + case M_Q3: + return event.pressed ? + MACRO( D(LSFT), T(9), T(SCLN), U(LSFT), END ) : + MACRO_NONE; + case M_Q4: + return event.pressed ? + MACRO( D(LSFT), T(SCLN), T(0), U(LSFT), END ) : + MACRO_NONE; + + } + return MACRO_NONE; +} \ No newline at end of file diff --git a/keyboard/quark/common_keymaps/keymap_matthew.c b/keyboard/quark/common_keymaps/keymap_matthew.c new file mode 100644 index 000000000..56e7003a9 --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_matthew.c @@ -0,0 +1,70 @@ +// by Matthew Pepers - https://github.com/pepers + +/* grid planck layout - modified programmer dvorak +,-----------------------------------------------------------------------------------------------. +| pause | @ | | | ^ | | | | | * | # | $ | del | +| esc | ; : | , < | . > | P | Y | F | G | G | C | R | bkspc | +| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | +|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------| +| & | / | { | ( | [ | = | ! | ] | ) | } | \ | + | +| ` ~ | A | O | E | U | I | D | H | T | N | S | - _ | +| % | 7 | 5 | 3 | 1 | 9 | 0 | 2 | 4 | 6 | 8 | ? | +|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------| +| | | | | | | | | | | | prtsc | +| tab | ' " | Q | J | K | X | B | M | W | V | Z | retrn | +| | | | | | | | | | | | insrt | +|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------| +| | | | | | | | | | | | | +| lctrl | lgui | lalt | ralt | lower | shift | space | raise | left | down | up | right | +| | | | | | | | | home | pgdn | pgup | end | +`-----------------------------------------------------------------------------------------------' +*/ + +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: dvorak */ + [0] = KEYMAP_GRID( ESC, SCLN, COMM, DOT, P, Y, F, G, C, R, L, BSPC, \ + GRV, A, O, E, U, I, D, H, T, N, S, MINS, \ + TAB, QUOT, Q, J, K, X, B, M, W, V, Z, ENT, \ + LCTL, LGUI, LALT, RALT, FN1, LSFT, SPC, FN2, LEFT, DOWN, UP, RGHT), + + /* 1: lower (FN1) */ + [1] = KEYMAP_GRID( F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, \ + FN17, 7, 5, 3, 1, 9, 0, 2, 4, 6, 8, FN18, \ + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, INS, \ + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, HOME, PGDN, PGUP, END), + + /* 2: raise (FN2) */ + [2] = KEYMAP_GRID(PAUS, FN19, FN20, FN21, TRNS, TRNS, TRNS, TRNS, FN22, FN23, FN24, DEL, \ + FN10, SLSH, FN11, FN12, LBRC, EQL, FN13, RBRC, FN14, FN15, BSLS, FN16, \ + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, PSCR, \ + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), + +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(1), // lower Fn layer + [2] = ACTION_LAYER_MOMENTARY(2), // raise Fn layer + + // lower row1 + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_5), // % + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_SLASH), // ? + + // raise row0 + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_2), // @ + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLASH), // | + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_6), // ^ + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_8), // * + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_3), // # + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_4), // $ + + // raise row1 + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_7), // & + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRACKET), // { + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_9), // ( + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_1), // ! + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_0), // ) + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRACKET), // } + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_EQUAL), // + +}; diff --git a/keyboard/quark/common_keymaps/keymap_nathan.c b/keyboard/quark/common_keymaps/keymap_nathan.c new file mode 100644 index 000000000..5a0900b66 --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_nathan.c @@ -0,0 +1,153 @@ +// Author: Nathan Ross Powell <nathanrospowell@gmail.com> +// https://github.com/nathanrosspowell/tmk_keyboard/blob/planck-jack/keyboard/planck/keymap_nathan.c + +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: main layer + * ,-----------------------------------------------------------------------. + * |Tab | q | w | e | r | t | y | u | i | o | p | BS | + * |-----------------------------------------------------------------------| + * |Ctrl | a | s | d | f | g | h | j | k | l | ; | Ret | + * |-----------------------------------------------------------------------| + * |Shift| z | x | c | v | b | n | m | [ | ( | { | < | + * |-----------------------------------------------------------------------| + * |Meta | \ | / | Alt |Lower|Space|Space|Upper|Left |Down | Up |Right| + * `-----------------------------------------------------------------------' + */ + [0] = KEYMAP_GRID( + TAB, Q, W, E, R, T, Y, U, I, O, P, BSPC, + LCTL, A, S, D, F, G, H, J, K, L, SCLN, ENT, + RSFT, Z, X, C, V, B, N, M, LBRC, FN10, FN11, FN12, + LGUI, BSLS, SLSH, LALT, FN0, SPC, SPC, FN1, LEFT, DOWN, UP, RGHT), + + /* 1: fn left/lower layer + * The top row are Visual Studio combos: + * 'Run', 'Breakpoint', 'Step over', 'Step into', 'Set cursor to line' + * 2nd row are key combos: + * 'ctrl-alt-delete', 'ctrl-shift-escape' + * 3rd row are macros keys: + * 'P0' - 'P5' execute a script on Windows machines + * ,-----------------------------------------------------------------------. + * | ESC | F5 | F9 | F10 | F11 |S+F11|CSF10|NLock|Num7 |Num8 |Num9 | Del | + * |-----------------------------------------------------------------------| + * | |C/A/D|C/S/E| Ins |Print|Pause|SLock|Num0 |Num4 |Num5 |Num6 |Num= | + * |-----------------------------------------------------------------------| + * | | P0 | P1 | P2 | P3 | P4 | P5 |Num. |Num1 |Num2 |Num3 |Num/ | + * |-----------------------------------------------------------------------| + * | |User | | | | | | |Home |PgDn |PgUp | End | + * `-----------------------------------------------------------------------' + */ + [1] = KEYMAP_GRID( + ESC, F5, F9, F10, F11, FN30, FN31, NLCK, P7, P8, P9, DEL, + TRNS, FN16, FN17, INS, PSCR, PAUS, SLCK, P0, P4, P5, P6, PEQL, + TRNS, FN2, FN3, FN4, FN5, FN6, FN7, PDOT, P1, P2, P3, PSLS, + TRNS, FN8, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, HOME, PGDN, PGUP, END ), + + /* 2: fn right/raise layer + * ,-----------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 |F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |-----------------------------------------------------------------------| + * | | ! | @ | # | $ | % | ^ | & | * | - | + | = | + * |-----------------------------------------------------------------------| + * | | _ | ' | " | ` | ~ | , | . | ] | ) | } | > | + * |-----------------------------------------------------------------------| + * | |NextT|PrevT| | | | Esc | |Mute |Vol- |Vol+ | P/P | + * `-----------------------------------------------------------------------' + */ + [2] = KEYMAP_GRID( + F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, + TRNS, FN18, FN19, FN20, FN21, FN22, FN23, FN24, FN25, MINS, FN26, PAST, + TRNS, FN27, QUOT, FN28, GRV, FN29, COMM, DOT, RBRC, FN13, FN14, FN15, + TRNS, MNXT, MPRV, TRNS, TRNS, TRNS, ESC, TRNS, MUTE, VOLD, VOLU, MPLY ), +}; + +enum macro_id { + M_P0, + M_P1, + M_P2, + M_P3, + M_P4, + M_P5, + M_USERNAME +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(1), // left/lower layer + [1] = ACTION_LAYER_MOMENTARY(2), // right/raise layer + // Program macros + [2] = ACTION_MACRO(M_P0), + [3] = ACTION_MACRO(M_P1), + [4] = ACTION_MACRO(M_P2), + [5] = ACTION_MACRO(M_P3), + [6] = ACTION_MACRO(M_P4), + [7] = ACTION_MACRO(M_P5), + [8] = ACTION_MACRO(M_USERNAME), + // Braces + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_9), // ( + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // { + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_COMMA), // < + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_0), // ) + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // } + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // > + // Combo + [16] = ACTION_MODS_KEY(MOD_LALT | MOD_LCTL, KC_DEL), // Ctrl+Alt+Delete + [17] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_ESC), // Ctrl+Shft+Escape + // Symbols + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_1), // ! + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_2), // @ + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_3), // # + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_4), // $ + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_5), // % + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_6), // ^ + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_7), // & + [25] = ACTION_MODS_KEY(MOD_LSFT, KC_8), // * + [26] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // + + [27] = ACTION_MODS_KEY(MOD_LSFT, KC_MINUS), // _ + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOTE), // " + [29] = ACTION_MODS_KEY(MOD_LSFT, KC_GRAVE), // ~ + // Debugging + [30] = ACTION_MODS_KEY(MOD_LSFT, KC_F11), // Step into + [31] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_F10), // Set cursor to line + }; + +// Run a script and pass a key number to it. This is Windows specific and the script needs to be on your path. +// *open run dialog* keypress.py [PRG_NUM] +#define ADD_PYTHON_PROGRAM_ON_WIN( PRG_NUM ) MACRO( D(LGUI), T(R), U(LGUI), W(100), T(K), T(E), T(Y), T(P), T(R), T(E), T(S), T(S), T(DOT), T(P), T(Y), T(SPC), T(PRG_NUM), END ) +// *return* +#define RUN_PYTHON_PROGRAM_ON_WIN MACRO( T(ENT), END ) + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + keyevent_t event = record->event; + switch (id) { + case M_P0: + return event.pressed ? + ADD_PYTHON_PROGRAM_ON_WIN( 0 ) : + RUN_PYTHON_PROGRAM_ON_WIN; + case M_P1: + return event.pressed ? + ADD_PYTHON_PROGRAM_ON_WIN( 1 ) : + RUN_PYTHON_PROGRAM_ON_WIN; + case M_P2: + return event.pressed ? + ADD_PYTHON_PROGRAM_ON_WIN( 2 ) : + RUN_PYTHON_PROGRAM_ON_WIN; + case M_P3: + return event.pressed ? + ADD_PYTHON_PROGRAM_ON_WIN( 3 ) : + RUN_PYTHON_PROGRAM_ON_WIN; + case M_P4: + return event.pressed ? + ADD_PYTHON_PROGRAM_ON_WIN( 4 ) : + RUN_PYTHON_PROGRAM_ON_WIN; + case M_P5: + return event.pressed ? + ADD_PYTHON_PROGRAM_ON_WIN( 5 ) : + RUN_PYTHON_PROGRAM_ON_WIN; + case M_USERNAME: + return event.pressed ? + MACRO( T(N), T(A), T(T), T(H), T(A), T(N), T(R), T(O), T(S), T(S), T(P), T(O), T(W), T(E), T(L), T(L), END ) : + MACRO_NONE; + } + return MACRO_NONE; +} diff --git a/keyboard/quark/common_keymaps/keymap_peasant.c b/keyboard/quark/common_keymaps/keymap_peasant.c new file mode 100644 index 000000000..ddacb614e --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_peasant.c @@ -0,0 +1,51 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = KEYMAP( /* Native */ + ESC, Q, W, E, R, T, Y, U, I, O, P, FN2, + BSPC, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + TAB, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT, + DEL, LCTL, NO, LSFT, LALT, SPC, NO, LEFT, DOWN, UP, RGHT), + [1] = KEYMAP( /* QWERTY->PHOTOSHOP */ + DELETE, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, FN1, + O, G, S, U, T, FN27, F21, F10, F11, F7, F8, F9, + TAB, FN4, FN5, FN6, F1, FN7, F18, F19, F23, F20, F22, FN9, + COMM, DOT, FN10, FN11, FN3, SPC, FN12, F2, FN8, F3, F14), + [2] = KEYMAP( /* 2: FN3 PHOTOSHOP */ + ESC, FN25, FN26, NO, NO, NO, NO, NO, NO, NO, NO, NO, + NO, NO, NO, NO, NO, NO, NO, NO, NO, FN19, FN20, FN21, + C, NO, FN22, FN5, NO, FN23, NO, NO, NO, NO, FN13, NO, + FN14, FN15, FN16, FN17, FN3, SPC, FN18, NO, NO, F24, NO), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_DEFAULT_LAYER_SET(0), // set Qwerty layout + [2] = ACTION_DEFAULT_LAYER_SET(1), // set Photoshop presets + [3] = ACTION_LAYER_ON_OFF(2), // Photoshop function layer + + [4] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F9), // photo folder AHK + [5] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_I), // select inverse + [6] = ACTION_MODS_KEY(MOD_LSFT, KC_M), // marquee select + [7] = ACTION_MODS_KEY(MOD_LALT, KC_BSPC), // fill + [8] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_X), // warp + [9] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT | MOD_LSFT, KC_F12), // merge all new layer + [10] = ACTION_MODS_KEY(MOD_LCTL, KC_MINS), // zoom out + [11] = ACTION_MODS_KEY(MOD_LCTL, KC_H), // RBG sliders + [12] = ACTION_MODS_KEY(MOD_LCTL, KC_S), // save + [13] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_F5), // layer mask from transparancy + [14] = ACTION_MODS_KEY(MOD_LALT, KC_LBRC), // prev layer + [15] = ACTION_MODS_KEY(MOD_LALT, KC_RBRC), // next layer + [16] = ACTION_MODS_KEY(MOD_LCTL, KC_EQL), // zoom in + [17] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_H), // HSV sliders + [18] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F11), // save as PNG + [19] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F7), // gaussian blur + [20] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F8), // motion blur + [21] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_X), // liquify filter + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // prev layer blending + [23] = ACTION_MODS_KEY(MOD_LSFT | MOD_LALT, KC_N), // normal layer blending + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // next layer blending + [25] = ACTION_MODS_KEY(MOD_LCTL, KC_Z), // step back + [26] = ACTION_MODS_KEY(MOD_LCTL, KC_Y), // step forward + [27] = ACTION_MODS_KEY(MOD_LCTL, KC_R), // rasterize + +}; diff --git a/keyboard/quark/common_keymaps/keymap_reed.c b/keyboard/quark/common_keymaps/keymap_reed.c new file mode 100644 index 000000000..1aa24e10d --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_reed.c @@ -0,0 +1,74 @@ +#include "keymap_common.h" + +/* + * BUILD: + * Simply run the command below in the keyboard/planck directory + * to build against this keymap + * + * make KEYMAP=reed COMMON_KEYMAP=true + * + * + * DETAILS: + * + * This layout works off of Jack's layout, making some changes that I + * feel significantly improve the function of the keyboard. Major changes + * include adding a "gaming mode" that will allow users to still access + * the number keys 1 through 4 easily for games that require it. Also + * included is the ability to use the tap/hold function for easy use of + * right shift and thumb shift with their tapped companions. + * + */ +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP_GRID( /* Reed */ + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN5, + LCTL, CAPS, LALT, LGUI, FN2, FN7, SPC, FN1, LEFT, DOWN, UP, RGHT), + +[1] = KEYMAP_GRID( /* Reed EXTREME GAMING */ + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN5, + LCTL, 1, 2, 3, 4, SPC, FN2, FN1, LEFT, DOWN, UP, RGHT), + +[2] = KEYMAP_GRID( /* Reed RAISE */ + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC, + TRNS, FN3, FN4, PAUSE, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS, + TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN1, MNXT, VOLD, VOLU, MPLY), + +[3] = KEYMAP_GRID( /* Reed LOWER */ + TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, DEL, + TRNS, TRNS, INS, HOME, PGUP, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, + TRNS, TRNS, DEL, END, PGDN, F11, F12, F13, TRNS, VOLD, VOLU, TRNS, + TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, MPRV, MUTE, MPLY, MNXT), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay - RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay - LOWER + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + // Actions for the tap/hold modifiers listed above + [5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), + [7] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPC), + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), + + [29] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE), +}; diff --git a/keyboard/quark/common_keymaps/keymap_sean.c b/keyboard/quark/common_keymaps/keymap_sean.c new file mode 100644 index 000000000..4fe07f701 --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_sean.c @@ -0,0 +1,57 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = KEYMAP( /* Matrix Dvorak */ + QUOT, COMM, DOT, P, Y, SLSH, EQL, F, G, C, R, L, + A, O, E, U, I, ESC, BSPC, D, H, T, N, S, + SCLN, Q, J, K, X, TAB, ENT, B, M, W, V, Z, + LSFT, LCTL, LALT, LGUI, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), + + [1] = KEYMAP( /* Matrix Qwerty */ + Q, W, E, R, T, QUOT, EQL, Y, U, I, O, P, + A, S, D, F, G, ESC, BSPC, H, J, K, L, SCLN, + Z, X, C, V, B, TAB, ENT, N, M, COMM, DOT, SLSH, + LSFT, LCTL, LALT, LGUI, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), + + [2] = KEYMAP( /* fn1 lower */ + F1, F2, F3, F4, F5, TRNS, TRNS, F6, F7, F8, F9, F10, + 1, 2, 3, 4, 5, F18, DEL, 6, 7, 8, 9, 0, + FN3, FN4, TRNS, GRV, MINS, TRNS, TRNS, BSLS, LBRC, RBRC, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN5, HOME, PGDN, PGUP, END), + + [3] = KEYMAP( /* fn2 raise */ + F1, F2, F3, F4, F5, TRNS, TRNS, F6, F7, F8, F9, F10, + F11, F12, F13, F14, F15, F18, DEL, F16, F17, F18, F19, F20, + FN3, FN4, TRNS, TRNS, TRNS, TRNS, TRNS, EJCT, PWR, LSFT,PAUSE, RSFT, + LEFT, DOWN, UP, RGHT, FN5, TRNS, TRNS, MNXT, VOLD, VOLU, MUTE), + + [4] = KEYMAP( /* lower + raise */ + LEFT, DOWN, UP, RGHT, TRNS, TRNS, TRNS, TRNS, LEFT, DOWN, UP, RGHT, + HOME, PGDN, PGUP, END, TRNS, F18, DEL, TRNS, HOME, PGDN, PGUP, END, + FN3, FN4, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, EJCT, PWR, MPLY, RSFT, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MNXT, VOLD, VOLU, MUTE), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay LOWER + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay RAISE + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + [5] = ACTION_LAYER_MOMENTARY(4), // to Fn overlay LOWER + RAISE + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), +}; diff --git a/keyboard/quark/common_keymaps/keymap_shane.c b/keyboard/quark/common_keymaps/keymap_shane.c new file mode 100644 index 000000000..d4e40fe63 --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_shane.c @@ -0,0 +1,100 @@ +// https://github.com/shanecelis/tmk_keyboard/blob/master/keyboard/planck/keymap_shane.c + +#include "keymap_common.h" +#include "action_layer.h" +#include "action.h" +#include "action_util.h" + +/* + Shane's Planck Layout + http://www.keyboard-layout-editor.com/#/layouts/015d9011102619d7695c86ffe57cf441 +*/ +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = KEYMAP_AND_SWAP( /* Base */ + TAB, Q, W, E, R, T, Y, U, I, O, P, MINS, + LCTL, A, S, D, F, G, H, J, K, L, SCLN, BSPC, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN5, + /*ALPHA*/FN3, /*HYPER*/ /*SUPER*/LGUI, /*META*/LALT, LCTL, FN2, FN6, FN1, LEFT, DOWN, UP, RGHT), + [2] = KEYMAP_AND_SWAP( /* More modifiers */ + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RCTL, RALT, RGUI, TRNS), + [4] = KEYMAP_AND_SWAP( /* WASD */ + TRNS, TRNS, UP, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, LEFT, DOWN, RIGHT, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), + [6] = KEYMAP_AND_SWAP( /* Raise/FN1 */ + FN23, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, EQL, + TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, ENT, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, BSLS, TRNS, + PAUS, TRNS, TRNS, TRNS, TRNS, BSPC, TRNS, MUTE, PGUP, PGDN, MNXT), + [8] = KEYMAP_AND_SWAP( /* Lower/FN2 */ + ESC, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN19, FN20, TRNS, + TRNS, TRNS, TRNS, TRNS, CAPS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, QUOT, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN24, FN25, LBRC, RBRC, TRNS, TRNS, + FN4, TRNS, TRNS, TRNS, TRNS, ENT, TRNS, MPLY, VOLD, VOLU, MPRV), +}; + +enum function_id { + SPACE_FN, +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch (id) { + case SPACE_FN: + if (record->event.pressed) { + // Change the keyboard maps. + // Whatever even layer's are on, turn on the odd one's too. + for (uint8_t i = 0; i < 9; i += 2) { + if (layer_state & (1UL << i)) + layer_on(i + 1); + } + layer_on(1); + } else { + // turn off all the even layers. + for (uint8_t i = 0; i < 9; i += 2) + layer_off(i + 1); + + if (record->tap.count != 0) { + // Space was tapped rather than used like a modifier. + // So send a space up and down event. + add_key(KC_SPC); + send_keyboard_report(); + del_key(KC_SPC); + send_keyboard_report(); + } + } + break; + } +} + + + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(6), // to fist Fn overlay + [2] = ACTION_LAYER_MOMENTARY(8), // to second Fn overlay + [3] = ACTION_LAYER_TOGGLE(2), // toggle more modifiers + [4] = ACTION_LAYER_TOGGLE(4), // toggle wasd + [5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), + [6] = ACTION_FUNCTION_TAP(SPACE_FN), + + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [25] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [26] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), +}; diff --git a/keyboard/quark/common_keymaps/keymap_simon.c b/keyboard/quark/common_keymaps/keymap_simon.c new file mode 100644 index 000000000..37951364b --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_simon.c @@ -0,0 +1,44 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( /* Jack */ + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, DOT, ENT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SCLN, DEL, + LCTL, ENT, LALT, CAPS, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), +[1] = KEYMAP( /* Jack RAISE */ + TRNS, F1, F2, F3, F4, NO, FN11, FN9, FN12, NO, FN14, TRNS, + TRNS, F5, F6, F7, F8, FN16, SLSH, MINS, EQL, LBRC, FN8, TRNS, + TRNS, F9, F10, F11, F12, F15, F16, FN22, SCLN, MINS, QUOT, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), +[2] = KEYMAP( /* Jack LOWER */ + FN22, 1, 2, 3, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC, + TRNS, 4, 5, 6, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, + TRNS, 7, 8, 9, 0, FN28, FN15, F7, F8, F9, F10, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay + + [8] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), + [9] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), + + [29] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE), +}; diff --git a/keyboard/quark/common_keymaps/keymap_tim.c b/keyboard/quark/common_keymaps/keymap_tim.c new file mode 100644 index 000000000..7444f3877 --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_tim.c @@ -0,0 +1,44 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, ENT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, + LCTL, LALT, DEL, LGUI, FN2, SPC, FN1, F2, F5, F9, F12), +[2] = KEYMAP( /* RAISE */ + TRNS, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC, + GRV, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, QUOT, FN29, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN1, TRNS, TRNS, TRNS, TRNS), +[3] = KEYMAP( /* LOWER */ + TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC, + FN22, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, QUOT, FN29, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), + [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), + [29] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), +}; diff --git a/keyboard/quark/common_keymaps/keymap_wilba.c b/keyboard/quark/common_keymaps/keymap_wilba.c new file mode 100644 index 000000000..9781f8fcd --- /dev/null +++ b/keyboard/quark/common_keymaps/keymap_wilba.c @@ -0,0 +1,56 @@ +#include "keymap_common.h" + +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( /* Wilba */ + FN27, FN28, FN29, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT, + LCTL, LGUI, LALT, RSFT, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), +[1] = KEYMAP( /* Wilba Alternate */ + ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC, + TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT, + LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT, + LCTL, LGUI, LALT, RSFT, FN1, SPC, FN2, LEFT, DOWN, UP, RGHT), +[2] = KEYMAP( /* Wilba LOWER */ + TRNS, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, TRNS, + TRNS, F11, F12, LBRC, RBRC, FN20, EQL, FN23, FN24, MINS, FN21, TRNS, + TRNS, BSLS, GRV, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, FN1, TRNS, TRNS, MNXT, VOLD, VOLU, MPLY), +[3] = KEYMAP( /* Wilba RAISE */ + TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, TRNS, + TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS, + TRNS, FN25, FN22, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, + TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN2, TRNS, TRNS, TRNS, TRNS), +}; +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // LOWER + [2] = ACTION_LAYER_MOMENTARY(3), // RAISE + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + + [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), // ! + [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), // @ + [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), // # + [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), // $ + [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), // % + [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), // ^ + [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), // & + [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), // * + [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), // ( + [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), // ) + + [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // _ + [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // + + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // ~ + [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // { + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // } + [25] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // | + + [26] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE), + + [27] = ACTION_BACKLIGHT_TOGGLE(), + [28] = ACTION_BACKLIGHT_INCREASE(), + [29] = ACTION_BACKLIGHT_DECREASE() + +}; diff --git a/keyboard/quark/config.h b/keyboard/quark/config.h new file mode 100644 index 000000000..7f9a48ce4 --- /dev/null +++ b/keyboard/quark/config.h @@ -0,0 +1,74 @@ +/* +Copyright 2012 Jun Wako <wakojun@gmail.com> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef CONFIG_H +#define CONFIG_H + + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER jackhumbert +#define PRODUCT Quark +#define DESCRIPTION t.m.k. keyboard firmware for the Quark + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +/* NOTE: this is the max value of 0..BACKLIGHT_LEVELS so really 16 levels. */ +#define BACKLIGHT_LEVELS 15 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* 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 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + + +/* + * 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 + +#endif diff --git a/keyboard/quark/extended_keymap_common.c b/keyboard/quark/extended_keymap_common.c new file mode 100644 index 000000000..f8fc3209f --- /dev/null +++ b/keyboard/quark/extended_keymap_common.c @@ -0,0 +1,184 @@ +/* +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 "extended_keymap_common.h" +#include "report.h" +#include "keycode.h" +#include "action_layer.h" +#include "action.h" +#include "action_macro.h" +#include "debug.h" + + +static action_t keycode_to_action(uint16_t keycode); + + +/* converts key to action */ +action_t action_for_key(uint8_t layer, keypos_t key) +{ + // 16bit keycodes - important + uint16_t keycode = keymap_key_to_keycode(layer, key); + + if (keycode >= 0x0100 && keycode < 0x2000) { + // Has a modifier + action_t action; + // Split it up + action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); + return action; + } else if (keycode >= 0x2000 && keycode < 0x3000) { + // Is a shortcut for function layer, pull last 12bits + return keymap_func_to_action(keycode & 0xFFF); + } else if (keycode >= 0x3000 && keycode < 0x4000) { + action_t action; + action.code = ACTION_MACRO(keycode & 0xFF); + return action; + } + + switch (keycode) { + case KC_FN0 ... KC_FN31: + return keymap_fn_to_action(keycode); +#ifdef BOOTMAGIC_ENABLE + case KC_CAPSLOCK: + case KC_LOCKING_CAPS: + if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { + return keycode_to_action(KC_LCTL); + } + return keycode_to_action(keycode); + case KC_LCTL: + if (keymap_config.swap_control_capslock) { + return keycode_to_action(KC_CAPSLOCK); + } + return keycode_to_action(KC_LCTL); + case KC_LALT: + if (keymap_config.swap_lalt_lgui) { + if (keymap_config.no_gui) { + return keycode_to_action(ACTION_NO); + } + return keycode_to_action(KC_LGUI); + } + return keycode_to_action(KC_LALT); + case KC_LGUI: + if (keymap_config.swap_lalt_lgui) { + return keycode_to_action(KC_LALT); + } + if (keymap_config.no_gui) { + return keycode_to_action(ACTION_NO); + } + return keycode_to_action(KC_LGUI); + case KC_RALT: + if (keymap_config.swap_ralt_rgui) { + if (keymap_config.no_gui) { + return keycode_to_action(ACTION_NO); + } + return keycode_to_action(KC_RGUI); + } + return keycode_to_action(KC_RALT); + case KC_RGUI: + if (keymap_config.swap_ralt_rgui) { + return keycode_to_action(KC_RALT); + } + if (keymap_config.no_gui) { + return keycode_to_action(ACTION_NO); + } + return keycode_to_action(KC_RGUI); + case KC_GRAVE: + if (keymap_config.swap_grave_esc) { + return keycode_to_action(KC_ESC); + } + return keycode_to_action(KC_GRAVE); + case KC_ESC: + if (keymap_config.swap_grave_esc) { + return keycode_to_action(KC_GRAVE); + } + return keycode_to_action(KC_ESC); + case KC_BSLASH: + if (keymap_config.swap_backslash_backspace) { + return keycode_to_action(KC_BSPACE); + } + return keycode_to_action(KC_BSLASH); + case KC_BSPACE: + if (keymap_config.swap_backslash_backspace) { + return keycode_to_action(KC_BSLASH); + } + return keycode_to_action(KC_BSPACE); +#endif + default: + return keycode_to_action(keycode); + } +} + + +/* Macro */ +__attribute__ ((weak)) +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + return MACRO_NONE; +} + +/* Function */ +__attribute__ ((weak)) +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +} + +/* translates keycode to action */ +static action_t keycode_to_action(uint16_t keycode) +{ + action_t action; + switch (keycode) { + case KC_A ... KC_EXSEL: + case KC_LCTRL ... KC_RGUI: + action.code = ACTION_KEY(keycode); + break; + case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: + action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); + break; + case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: + action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); + break; + case KC_MS_UP ... KC_MS_ACCEL2: + action.code = ACTION_MOUSEKEY(keycode); + break; + case KC_TRNS: + action.code = ACTION_TRANSPARENT; + break; + default: + action.code = ACTION_NO; + break; + } + return action; +} + + +/* translates key to keycode */ +uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) +{ + // Read entire word (16bits) + return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); +} + +/* translates Fn keycode to action */ +action_t keymap_fn_to_action(uint16_t keycode) +{ + return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; +} + +action_t keymap_func_to_action(uint16_t keycode) +{ + // For FUNC without 8bit limit + return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) }; +} diff --git a/keyboard/quark/extended_keymap_common.h b/keyboard/quark/extended_keymap_common.h new file mode 100644 index 000000000..66712459c --- /dev/null +++ b/keyboard/quark/extended_keymap_common.h @@ -0,0 +1,152 @@ +/* +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/>. +*/ + +#ifndef KEYMAP_H +#define KEYMAP_H + +#include <stdint.h> +#include <stdbool.h> +#include "action.h" +#include <avr/pgmspace.h> +#include "keycode.h" +#include "keymap.h" +#include "action_macro.h" +#include "report.h" +#include "host.h" +#include "print.h" +#include "debug.h" + +#ifdef BOOTMAGIC_ENABLE +/* NOTE: Not portable. Bit field order depends on implementation */ +typedef union { + uint16_t raw; + struct { + bool swap_control_capslock:1; + bool capslock_to_control:1; + bool swap_lalt_lgui:1; + bool swap_ralt_rgui:1; + bool no_gui:1; + bool swap_grave_esc:1; + bool swap_backslash_backspace:1; + bool nkro:1; + }; +} keymap_config_t; +keymap_config_t keymap_config; +#endif + +/* translates key to keycode */ +uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); + +/* translates Fn keycode to action */ +action_t keymap_fn_to_action(uint16_t keycode); + +/* translates Fn keycode to action */ +action_t keymap_func_to_action(uint16_t keycode); + +extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const uint16_t fn_actions[]; + +// Ability to use mods in layouts +#define LCTL(kc) kc | 0x0100 +#define LSFT(kc) kc | 0x0200 +#define LALT(kc) kc | 0x0400 +#define LGUI(kc) kc | 0x0800 +#define RCTL(kc) kc | 0x1100 +#define RSFT(kc) kc | 0x1200 +#define RALT(kc) kc | 0x1400 +#define RGUI(kc) kc | 0x1800 + +// Alias for function layers than expand past FN31 +#define FUNC(kc) kc | 0x2000 + +// Aliases +#define S(kc) LSFT(kc) +#define F(kc) FUNC(kc) + +// For software implementation of colemak +#define CM_Q KC_Q +#define CM_W KC_W +#define CM_F KC_E +#define CM_P KC_R +#define CM_G KC_T +#define CM_J KC_Y +#define CM_L KC_U +#define CM_U KC_I +#define CM_Y KC_O +#define CM_SCLN KC_P + +#define CM_A KC_A +#define CM_R KC_S +#define CM_S KC_D +#define CM_T KC_F +#define CM_D KC_G +#define CM_H KC_H +#define CM_N KC_J +#define CM_E KC_K +#define CM_I KC_L +#define CM_O KC_SCLN + +#define CM_Z KC_Z +#define CM_X KC_X +#define CM_C KC_C +#define CM_V KC_V +#define CM_B KC_B +#define CM_K KC_N +#define CM_M KC_M +#define CM_COMM KC_COMM +#define CM_DOT KC_DOT +#define CM_SLSH KC_SLSH + +// Make it easy to support these in macros +#define KC_CM_Q CM_Q +#define KC_CM_W CM_W +#define KC_CM_F CM_F +#define KC_CM_P CM_P +#define KC_CM_G CM_G +#define KC_CM_J CM_J +#define KC_CM_L CM_L +#define KC_CM_U CM_U +#define KC_CM_Y CM_Y +#define KC_CM_SCLN CM_SCLN + +#define KC_CM_A CM_A +#define KC_CM_R CM_R +#define KC_CM_S CM_S +#define KC_CM_T CM_T +#define KC_CM_D CM_D +#define KC_CM_H CM_H +#define KC_CM_N CM_N +#define KC_CM_E CM_E +#define KC_CM_I CM_I +#define KC_CM_O CM_O + +#define KC_CM_Z CM_Z +#define KC_CM_X CM_X +#define KC_CM_C CM_C +#define KC_CM_V CM_V +#define KC_CM_B CM_B +#define KC_CM_K CM_K +#define KC_CM_M CM_M +#define KC_CM_COMM CM_COMM +#define KC_CM_DOT CM_DOT +#define KC_CM_SLSH CM_SLSH + +#define M(kc) kc | 0x3000 + +#define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE) + +#endif diff --git a/keyboard/quark/extended_keymaps/extended_keymap_jack.c b/keyboard/quark/extended_keymaps/extended_keymap_jack.c new file mode 100644 index 000000000..416ae8345 --- /dev/null +++ b/keyboard/quark/extended_keymaps/extended_keymap_jack.c @@ -0,0 +1,49 @@ +#include "extended_keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Jack soft-coded colemak */ + {KC_TAB, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_BSPC}, + {KC_ESC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_QUOT}, + {KC_LSFT, CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, CM_COMM, CM_DOT, CM_SLSH, KC_ENT}, + {M(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[1] = { /* Jack hard-coded colemak */ + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[2] = { /* Jack RAISE */ + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[3] = { /* Jack LOWER */ + {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, + {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, + {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_NO, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +} +}; + + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + return MACRODOWN(T(CM_T), END); + break; + } + return MACRO_NONE; +}; diff --git a/keyboard/quark/keymap_common.c b/keyboard/quark/keymap_common.c new file mode 100644 index 000000000..fdb1769e1 --- /dev/null +++ b/keyboard/quark/keymap_common.c @@ -0,0 +1,30 @@ +/* +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 "keymap_common.h" + + +/* translates key to keycode */ +uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) +{ + return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); +} + +/* translates Fn keycode to action */ +action_t keymap_fn_to_action(uint8_t keycode) +{ + return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; +} diff --git a/keyboard/quark/keymap_common.h b/keyboard/quark/keymap_common.h new file mode 100644 index 000000000..c74c7e9a2 --- /dev/null +++ b/keyboard/quark/keymap_common.h @@ -0,0 +1,86 @@ +/* +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/>. +*/ +#ifndef KEYMAP_COMMON_H +#define KEYMAP_COMMON_H + +#include <stdint.h> +#include <stdbool.h> +#include <avr/pgmspace.h> +#include "keycode.h" +#include "action.h" +#include "action_macro.h" +#include "report.h" +#include "host.h" +#include "print.h" +#include "debug.h" +#include "keymap.h" + + +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const uint16_t fn_actions[]; + + +// MIT Layout +/* + * ,-----------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------' + */ +#define KEYMAP( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \ + K30, K31, K32, K33, K34, K35, K37, K38, K39, K3A, K3B \ +) { \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B }, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_NO, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B } \ +} + +// Grid Layout +/* + * ,-----------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------' + */ +#define KEYMAP_GRID( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B \ +) { \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B }, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B } \ +} + + +#endif diff --git a/keyboard/quark/led.c b/keyboard/quark/led.c new file mode 100644 index 000000000..1f3643488 --- /dev/null +++ b/keyboard/quark/led.c @@ -0,0 +1,38 @@ +/* +Copyright 2012 Jun Wako <wakojun@gmail.com> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <avr/io.h> +#include "stdint.h" +#include "led.h" + + +void led_set(uint8_t usb_led) +{ + // Using PE6 Caps Lock LED + if (usb_led & (1<<USB_LED_CAPS_LOCK)) + { + // Output high. + DDRE |= (1<<6); + PORTE |= (1<<6); + } + else + { + // Output low. + DDRE &= ~(1<<6); + PORTE &= ~(1<<6); + } +} diff --git a/keyboard/quark/matrix.c b/keyboard/quark/matrix.c new file mode 100644 index 000000000..e3926caec --- /dev/null +++ b/keyboard/quark/matrix.c @@ -0,0 +1,219 @@ +/* +Copyright 2012 Jun Wako +Generated by planckkeyboard.com (2014 Jack Humbert) + +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/>. +*/ + +/* + * scan matrix + */ +#include <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include <util/delay.h> +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "backlight.h" // TODO fix this dependency + + +#ifndef DEBOUNCE +# define DEBOUNCE 10 +#endif +static uint8_t debouncing = DEBOUNCE; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + // To use PORTF disable JTAG with writing JTD bit twice within four cycles. + MCUCR |= (1<<JTD); + MCUCR |= (1<<JTD); + + // TODO fix this dependency + backlight_init_ports(); + + // initialize row and col + unselect_rows(); + init_cols(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } +} + +uint8_t matrix_scan(void) +{ + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i] != cols) { + matrix_debouncing[i] = cols; + if (debouncing) { + debug("bounce!: "); debug_hex(debouncing); debug("\n"); + } + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + return 1; +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<col)); +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +void matrix_print(void) +{ + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + pbin_reverse16(matrix_get_row(row)); + print("\n"); + } +} + +uint8_t matrix_key_count(void) +{ + uint8_t count = 0; + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + count += bitpop16(matrix[i]); + } + return count; +} + +// +// Planck PCB Rev 1 Pin Assignments +// +// Column: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 +// Pin: F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 +// + +static void init_cols(void) +{ + DDRB &= ~(1<<4 | 1<<0); + PORTB |= (1<<4 | 1<<0); + DDRC &= ~(1<<7); + PORTC |= (1<<7); + DDRD &= ~(1<<7 | 1<<6 | 1<<4); + PORTD |= (1<<7 | 1<<6 | 1<<4); + DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + PORTF |= (1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + +} + +static matrix_row_t read_cols(void) +{ + return (PINF&(1<<1) ? 0 : (1<<0)) | + (PINF&(1<<0) ? 0 : (1<<1)) | + (PINB&(1<<0) ? 0 : (1<<2)) | + (PINC&(1<<7) ? 0 : (1<<3)) | + (PINF&(1<<4) ? 0 : (1<<4)) | + (PINF&(1<<5) ? 0 : (1<<5)) | + (PINF&(1<<6) ? 0 : (1<<6)) | + (PINF&(1<<7) ? 0 : (1<<7)) | + (PIND&(1<<4) ? 0 : (1<<8)) | + (PIND&(1<<6) ? 0 : (1<<9)) | + (PINB&(1<<4) ? 0 : (1<<10)) | + (PIND&(1<<7) ? 0 : (1<<11)); + +} + +static void unselect_rows(void) +{ + DDRB &= ~(1<<5 | 1<<6); + PORTB |= (1<<5 | 1<<6); + DDRD &= ~(1<<0 | 1<<5); + PORTD |= (1<<0 | 1<<5); + +} + +// +// Planck PCB Rev 1 Pin Assignments +// +// Row: 0, 1, 2, 3 +// Pin: D0, D5, B5, B6 +// + +static void select_row(uint8_t row) +{ + switch (row) { + case 0: + DDRD |= (1<<0); + PORTD &= ~(1<<0); + break; + case 1: + DDRD |= (1<<5); + PORTD &= ~(1<<5); + break; + case 2: + DDRB |= (1<<5); + PORTB &= ~(1<<5); + break; + case 3: + DDRB |= (1<<6); + PORTB &= ~(1<<6); + break; + + } +} \ No newline at end of file diff --git a/keyboard/quark/matrix_center.c b/keyboard/quark/matrix_center.c new file mode 100644 index 000000000..8e34130d6 --- /dev/null +++ b/keyboard/quark/matrix_center.c @@ -0,0 +1,202 @@ +/* +Copyright 2012 Jun Wako <wakojun@gmail.com> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +/* + * scan matrix + */ +#include <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include <util/delay.h> +#include "action_layer.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" + + +#ifndef DEBOUNCE +# define DEBOUNCE 10 +#endif +static uint8_t debouncing = DEBOUNCE; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); + + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + // initialize row and col + unselect_rows(); + init_cols(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } +} + +uint8_t matrix_scan(void) +{ + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i] != cols) { + matrix_debouncing[i] = cols; + if (debouncing) { + debug("bounce!: "); debug_hex(debouncing); debug("\n"); + } + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + return 1; +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<<col)); +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +void matrix_print(void) +{ + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + pbin_reverse16(matrix_get_row(row)); + print("\n"); + } +} + +uint8_t matrix_key_count(void) +{ + uint8_t count = 0; + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + count += bitpop16(matrix[i]); + } + return count; +} + +/* Column pin configuration + * col: 0 1 2 3 4 5 6 7 8 9 10 11 + * pin: F0 F1 F4 F5 F6 F7 B6 B5 B4 D7 D5 D4 + */ + +static void init_cols(void) +{ + DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + PORTF |= (1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + DDRD &= ~(1<<0); + PORTD |= (1<<0); + DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<7); + PORTB |= (1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<7); +} + +static matrix_row_t read_cols(void) +{ + return (PINB&(1<<0) ? 0 : (1<< 0)) | + (PINB&(1<<1) ? 0 : (1<< 1)) | + (PINB&(1<<2) ? 0 : (1<< 2)) | + (PINB&(1<<3) ? 0 : (1<< 3)) | + (PINB&(1<<7) ? 0 : (1<< 4)) | + (PIND&(1<<0) ? 0 : (1<< 5)) | + (PINF&(1<<7) ? 0 : (1<< 6)) | + (PINF&(1<<6) ? 0 : (1<< 7)) | + (PINF&(1<<5) ? 0 : (1<< 8)) | + (PINF&(1<<4) ? 0 : (1<< 9)) | + (PINF&(1<<1) ? 0 : (1<<10)) | + (PINF&(1<<0) ? 0 : (1<<11)); +} + +/* Row pin configuration + * row: 0 1 2 3 + * pin: B0 B1 B2 B3 + */ +static void unselect_rows(void) +{ + // Hi-Z(DDR:0, PORT:0) to unselect + DDRB &= ~0b01110000; + PORTB &= ~0b01110000; + DDRD &= ~0b10000000; + PORTD &= ~0b10000000; +} + +static void select_row(uint8_t row) +{ + switch (row) { + case 0: + DDRB |= (1<<6); + PORTB &= ~(1<<6); + break; + case 1: + DDRB |= (1<<5); + PORTB &= ~(1<<5); + break; + case 2: + DDRB |= (1<<4); + PORTB &= ~(1<<4); + break; + case 3: + DDRD |= (1<<7); + PORTD &= ~(1<<7); + break; + } +} diff --git a/keyboard/quark/matrix_handwire.c b/keyboard/quark/matrix_handwire.c new file mode 100644 index 000000000..2f2dbdb10 --- /dev/null +++ b/keyboard/quark/matrix_handwire.c @@ -0,0 +1,193 @@ +/* +Copyright 2012 Jun Wako +Generated by planckkeyboard.com (2014 Jack Humbert) + +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/>. +*/ + +/* + * scan matrix + */ +#include <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include <util/delay.h> +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" + + +#ifndef DEBOUNCE +# define DEBOUNCE 10 +#endif +static uint8_t debouncing = DEBOUNCE; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + // initialize row and col + unselect_rows(); + init_cols(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } +} + +uint8_t matrix_scan(void) +{ + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i] != cols) { + matrix_debouncing[i] = cols; + if (debouncing) { + debug("bounce!: "); debug_hex(debouncing); debug("\n"); + } + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + return 1; +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<col)); +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +void matrix_print(void) +{ + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + pbin_reverse16(matrix_get_row(row)); + print("\n"); + } +} + +uint8_t matrix_key_count(void) +{ + uint8_t count = 0; + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + count += bitpop16(matrix[i]); + } + return count; +} + +static void init_cols(void) +{ + DDRB &= ~(1<<6 | 1<<5 | 1<<4); + PORTB |= (1<<6 | 1<<5 | 1<<4); + DDRD &= ~(1<<7 | 1<<6 | 1<<4); + PORTD |= (1<<7 | 1<<6 | 1<<4); + DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + PORTF |= (1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + +} + +static matrix_row_t read_cols(void) +{ + return (PIND&(1<<4) ? 0 : (1<<0)) | + (PIND&(1<<6) ? 0 : (1<<1)) | + (PIND&(1<<7) ? 0 : (1<<2)) | + (PINB&(1<<4) ? 0 : (1<<3)) | + (PINB&(1<<5) ? 0 : (1<<4)) | + (PINB&(1<<6) ? 0 : (1<<5)) | + (PINF&(1<<7) ? 0 : (1<<6)) | + (PINF&(1<<6) ? 0 : (1<<7)) | + (PINF&(1<<5) ? 0 : (1<<8)) | + (PINF&(1<<4) ? 0 : (1<<9)) | + (PINF&(1<<1) ? 0 : (1<<10)) | + (PINF&(1<<0) ? 0 : (1<<11)); + +} + +static void unselect_rows(void) +{ + DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3); + PORTB |= (1<<0 | 1<<1 | 1<<2 | 1<<3); + +} + +static void select_row(uint8_t row) +{ + switch (row) { + case 0: + DDRB |= (1<<0); + PORTB &= ~(1<<0); + break; + case 1: + DDRB |= (1<<1); + PORTB &= ~(1<<1); + break; + case 2: + DDRB |= (1<<2); + PORTB &= ~(1<<2); + break; + case 3: + DDRB |= (1<<3); + PORTB &= ~(1<<3); + break; + + } +} diff --git a/teensy-sdk b/teensy-sdk new file mode 160000 index 000000000..19892c196 --- /dev/null +++ b/teensy-sdk @@ -0,0 +1 @@ +Subproject commit 19892c196894e6676fa69c732e05a03a68d5cb07 From cb3e499cc7dbff2607bc43cb05fc8c29a2eb9d30 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Thu, 7 May 2015 15:34:46 -0400 Subject: [PATCH 74/78] backlight stuff --- keyboard/planck/Makefile | 4 +-- keyboard/planck/backlight.c | 17 +++++++----- keyboard/planck/backlight.h | 2 -- keyboard/planck/config.h | 4 +-- keyboard/planck/extended_keymap_common.c | 26 ++++++++++++++++++- keyboard/planck/extended_keymap_common.h | 25 ++++++++++++++++++ .../extended_keymaps/extended_keymap_jack.c | 2 +- keyboard/planck/matrix.c | 4 +-- 8 files changed, 67 insertions(+), 17 deletions(-) delete mode 100644 keyboard/planck/backlight.h diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index e021e9e90..773783ad1 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -53,7 +53,7 @@ TARGET_DIR = . ifdef COMMON SRC = keymap_common.c \ - matrix_handwire.c \ + matrix.c \ led.c \ backlight.c @@ -66,7 +66,7 @@ endif else SRC = extended_keymap_common.c \ - matrix_handwire.c \ + matrix.c \ led.c \ backlight.c diff --git a/keyboard/planck/backlight.c b/keyboard/planck/backlight.c index ee7e31ee9..a560687ec 100644 --- a/keyboard/planck/backlight.c +++ b/keyboard/planck/backlight.c @@ -2,9 +2,11 @@ #include <avr/io.h> #include "backlight.h" +#define CHANNEL OCR1C -void backlight_init_ports() +void backlight_init_ports(uint8_t level) { + // Setup PB7 as output and output low. DDRB |= (1<<7); PORTB &= ~(1<<7); @@ -24,9 +26,8 @@ void backlight_init_ports() TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010; TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; - - // Default to zero duty cycle. - OCR1C = 0x0000; + + backlight_init(); } void backlight_set(uint8_t level) @@ -35,12 +36,14 @@ void backlight_set(uint8_t level) { // Turn off PWM control on PB7, revert to output low. TCCR1A &= ~(_BV(COM1C1)); + // CHANNEL = level << OFFSET | 0x0FFF; + CHANNEL = ((1 << level) - 1); } else { // Turn on PWM control of PB7 TCCR1A |= _BV(COM1C1); - OCR1C = level << 12 | 0x0FFF; + // CHANNEL = level << OFFSET | 0x0FFF; + CHANNEL = ((1 << level) - 1); } -} - +} \ No newline at end of file diff --git a/keyboard/planck/backlight.h b/keyboard/planck/backlight.h deleted file mode 100644 index 0fe1f4a72..000000000 --- a/keyboard/planck/backlight.h +++ /dev/null @@ -1,2 +0,0 @@ - -void backlight_init_ports(void); diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h index 0b0c15247..4e49a2b89 100644 --- a/keyboard/planck/config.h +++ b/keyboard/planck/config.h @@ -23,9 +23,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x6060 #define DEVICE_VER 0x0001 -#define MANUFACTURER jackhumbert +#define MANUFACTURER Ortholinear Keyboards #define PRODUCT Planck -#define DESCRIPTION t.m.k. keyboard firmware for the Planck +#define DESCRIPTION A compact ortholinear keyboard /* key matrix size */ #define MATRIX_ROWS 4 diff --git a/keyboard/planck/extended_keymap_common.c b/keyboard/planck/extended_keymap_common.c index f8fc3209f..841b24943 100644 --- a/keyboard/planck/extended_keymap_common.c +++ b/keyboard/planck/extended_keymap_common.c @@ -22,6 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "action.h" #include "action_macro.h" #include "debug.h" +#include "backlight.h" static action_t keycode_to_action(uint16_t keycode); @@ -46,7 +47,30 @@ action_t action_for_key(uint8_t layer, keypos_t key) action_t action; action.code = ACTION_MACRO(keycode & 0xFF); return action; - } + } else if (keycode >= BL_0 & keycode <= BL_15) { + action_t action; + action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F); + return action; + } else if (keycode == BL_DEC) { + action_t action; + action.code = ACTION_BACKLIGHT_DECREASE(); + return action; + } else if (keycode == BL_INC) { + action_t action; + action.code = ACTION_BACKLIGHT_INCREASE(); + return action; + } else if (keycode == BL_TOGG) { + action_t action; + action.code = ACTION_BACKLIGHT_TOGGLE(); + return action; + } else if (keycode == BL_STEP) { + action_t action; + action.code = ACTION_BACKLIGHT_STEP(); + return action; + } else if (keycode == RESET) { + bootloader_jump(); + return; + } switch (keycode) { case KC_FN0 ... KC_FN31: diff --git a/keyboard/planck/extended_keymap_common.h b/keyboard/planck/extended_keymap_common.h index 66712459c..21d8978b7 100644 --- a/keyboard/planck/extended_keymap_common.h +++ b/keyboard/planck/extended_keymap_common.h @@ -149,4 +149,29 @@ extern const uint16_t fn_actions[]; #define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE) +#define BL_ON 0x4009 +#define BL_OFF 0x4000 +#define BL_0 0x4000 +#define BL_1 0x4001 +#define BL_2 0x4002 +#define BL_3 0x4003 +#define BL_4 0x4004 +#define BL_5 0x4005 +#define BL_6 0x4006 +#define BL_7 0x4007 +#define BL_8 0x4008 +#define BL_9 0x4009 +#define BL_10 0x400A +#define BL_11 0x400B +#define BL_12 0x400C +#define BL_13 0x400D +#define BL_14 0x400E +#define BL_15 0x400F +#define BL_DEC 0x4010 +#define BL_INC 0x4011 +#define BL_TOGG 0x4012 +#define BL_STEP 0x4013 + +#define RESET 0x5000 + #endif diff --git a/keyboard/planck/extended_keymaps/extended_keymap_jack.c b/keyboard/planck/extended_keymaps/extended_keymap_jack.c index 416ae8345..de966ca9d 100644 --- a/keyboard/planck/extended_keymaps/extended_keymap_jack.c +++ b/keyboard/planck/extended_keymaps/extended_keymap_jack.c @@ -5,7 +5,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_TAB, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_BSPC}, {KC_ESC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_QUOT}, {KC_LSFT, CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, CM_COMM, CM_DOT, CM_SLSH, KC_ENT}, - {M(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, [1] = { /* Jack hard-coded colemak */ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, diff --git a/keyboard/planck/matrix.c b/keyboard/planck/matrix.c index e3926caec..156e081d1 100644 --- a/keyboard/planck/matrix.c +++ b/keyboard/planck/matrix.c @@ -62,8 +62,8 @@ void matrix_init(void) MCUCR |= (1<<JTD); MCUCR |= (1<<JTD); - // TODO fix this dependency - backlight_init_ports(); + // Pass default level here + backlight_init_ports(15); // initialize row and col unselect_rows(); From 0e189b6bddb6b71d2aaa019689fbdb03beafa8a3 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Fri, 15 May 2015 21:57:29 -0400 Subject: [PATCH 75/78] quark --- keyboard/planck/Makefile | 4 +- keyboard/planck/backlight.c | 2 +- .../extended_keymaps/extended_keymap_jack.c | 9 +- keyboard/planck/keymap_common.h | 4 +- keyboard/planck/led.c | 26 +-- keyboard/planck/matrix.c | 76 +++---- keyboard/planck/matrix_handwire.c | 193 ----------------- keyboard/quark/Makefile | 6 +- .../extended_keymap_default.c | 40 ++++ .../extended_keymaps/extended_keymap_jack.c | 49 ----- keyboard/quark/matrix.c | 76 +++---- keyboard/quark/matrix_center.c | 202 ------------------ keyboard/quark/matrix_handwire.c | 193 ----------------- rules.mk | 5 + 14 files changed, 121 insertions(+), 764 deletions(-) delete mode 100644 keyboard/planck/matrix_handwire.c create mode 100644 keyboard/quark/extended_keymaps/extended_keymap_default.c delete mode 100644 keyboard/quark/extended_keymaps/extended_keymap_jack.c delete mode 100644 keyboard/quark/matrix_center.c delete mode 100644 keyboard/quark/matrix_handwire.c diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 773783ad1..2f5517b1b 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -53,7 +53,7 @@ TARGET_DIR = . ifdef COMMON SRC = keymap_common.c \ - matrix.c \ + matrix_pcb.c \ led.c \ backlight.c @@ -66,7 +66,7 @@ endif else SRC = extended_keymap_common.c \ - matrix.c \ + matrix_pcb.c \ led.c \ backlight.c diff --git a/keyboard/planck/backlight.c b/keyboard/planck/backlight.c index a560687ec..06f103b4a 100644 --- a/keyboard/planck/backlight.c +++ b/keyboard/planck/backlight.c @@ -4,7 +4,7 @@ #define CHANNEL OCR1C -void backlight_init_ports(uint8_t level) +void backlight_init_ports() { // Setup PB7 as output and output low. diff --git a/keyboard/planck/extended_keymaps/extended_keymap_jack.c b/keyboard/planck/extended_keymaps/extended_keymap_jack.c index de966ca9d..d39dc5b84 100644 --- a/keyboard/planck/extended_keymaps/extended_keymap_jack.c +++ b/keyboard/planck/extended_keymaps/extended_keymap_jack.c @@ -5,25 +5,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_TAB, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_BSPC}, {KC_ESC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_QUOT}, {KC_LSFT, CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, CM_COMM, CM_DOT, CM_SLSH, KC_ENT}, - {BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + // Space is repeated to accommadate for both spacebar wiring positions }, [1] = { /* Jack hard-coded colemak */ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, [2] = { /* Jack RAISE */ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, {KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, [3] = { /* Jack LOWER */ {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_NO, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} } }; diff --git a/keyboard/planck/keymap_common.h b/keyboard/planck/keymap_common.h index c74c7e9a2..d888d8173 100644 --- a/keyboard/planck/keymap_common.h +++ b/keyboard/planck/keymap_common.h @@ -50,12 +50,12 @@ extern const uint16_t fn_actions[]; K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \ - K30, K31, K32, K33, K34, K35, K37, K38, K39, K3A, K3B \ + K30, K31, K32, K33, K34, K35, K37, K38, K39, K3A, K3B \ ) { \ { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B }, \ { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B }, \ { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_NO, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B } \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K35, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B } \ } // Grid Layout diff --git a/keyboard/planck/led.c b/keyboard/planck/led.c index 1f3643488..2c0574660 100644 --- a/keyboard/planck/led.c +++ b/keyboard/planck/led.c @@ -22,17 +22,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. void led_set(uint8_t usb_led) { - // Using PE6 Caps Lock LED - if (usb_led & (1<<USB_LED_CAPS_LOCK)) - { - // Output high. - DDRE |= (1<<6); - PORTE |= (1<<6); - } - else - { - // Output low. - DDRE &= ~(1<<6); - PORTE &= ~(1<<6); - } + // // Using PE6 Caps Lock LED + // if (usb_led & (1<<USB_LED_CAPS_LOCK)) + // { + // // Output high. + // DDRE |= (1<<6); + // PORTE |= (1<<6); + // } + // else + // { + // // Output low. + // DDRE &= ~(1<<6); + // PORTE &= ~(1<<6); + // } } diff --git a/keyboard/planck/matrix.c b/keyboard/planck/matrix.c index 156e081d1..2f2dbdb10 100644 --- a/keyboard/planck/matrix.c +++ b/keyboard/planck/matrix.c @@ -27,7 +27,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "debug.h" #include "util.h" #include "matrix.h" -#include "backlight.h" // TODO fix this dependency #ifndef DEBOUNCE @@ -58,13 +57,6 @@ uint8_t matrix_cols(void) void matrix_init(void) { - // To use PORTF disable JTAG with writing JTD bit twice within four cycles. - MCUCR |= (1<<JTD); - MCUCR |= (1<<JTD); - - // Pass default level here - backlight_init_ports(15); - // initialize row and col unselect_rows(); init_cols(); @@ -142,19 +134,10 @@ uint8_t matrix_key_count(void) return count; } -// -// Planck PCB Rev 1 Pin Assignments -// -// Column: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 -// Pin: F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 -// - static void init_cols(void) { - DDRB &= ~(1<<4 | 1<<0); - PORTB |= (1<<4 | 1<<0); - DDRC &= ~(1<<7); - PORTC |= (1<<7); + DDRB &= ~(1<<6 | 1<<5 | 1<<4); + PORTB |= (1<<6 | 1<<5 | 1<<4); DDRD &= ~(1<<7 | 1<<6 | 1<<4); PORTD |= (1<<7 | 1<<6 | 1<<4); DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); @@ -164,56 +147,47 @@ static void init_cols(void) static matrix_row_t read_cols(void) { - return (PINF&(1<<1) ? 0 : (1<<0)) | - (PINF&(1<<0) ? 0 : (1<<1)) | - (PINB&(1<<0) ? 0 : (1<<2)) | - (PINC&(1<<7) ? 0 : (1<<3)) | - (PINF&(1<<4) ? 0 : (1<<4)) | - (PINF&(1<<5) ? 0 : (1<<5)) | - (PINF&(1<<6) ? 0 : (1<<6)) | - (PINF&(1<<7) ? 0 : (1<<7)) | - (PIND&(1<<4) ? 0 : (1<<8)) | - (PIND&(1<<6) ? 0 : (1<<9)) | - (PINB&(1<<4) ? 0 : (1<<10)) | - (PIND&(1<<7) ? 0 : (1<<11)); + return (PIND&(1<<4) ? 0 : (1<<0)) | + (PIND&(1<<6) ? 0 : (1<<1)) | + (PIND&(1<<7) ? 0 : (1<<2)) | + (PINB&(1<<4) ? 0 : (1<<3)) | + (PINB&(1<<5) ? 0 : (1<<4)) | + (PINB&(1<<6) ? 0 : (1<<5)) | + (PINF&(1<<7) ? 0 : (1<<6)) | + (PINF&(1<<6) ? 0 : (1<<7)) | + (PINF&(1<<5) ? 0 : (1<<8)) | + (PINF&(1<<4) ? 0 : (1<<9)) | + (PINF&(1<<1) ? 0 : (1<<10)) | + (PINF&(1<<0) ? 0 : (1<<11)); } static void unselect_rows(void) { - DDRB &= ~(1<<5 | 1<<6); - PORTB |= (1<<5 | 1<<6); - DDRD &= ~(1<<0 | 1<<5); - PORTD |= (1<<0 | 1<<5); + DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3); + PORTB |= (1<<0 | 1<<1 | 1<<2 | 1<<3); } -// -// Planck PCB Rev 1 Pin Assignments -// -// Row: 0, 1, 2, 3 -// Pin: D0, D5, B5, B6 -// - static void select_row(uint8_t row) { switch (row) { case 0: - DDRD |= (1<<0); - PORTD &= ~(1<<0); + DDRB |= (1<<0); + PORTB &= ~(1<<0); break; case 1: - DDRD |= (1<<5); - PORTD &= ~(1<<5); + DDRB |= (1<<1); + PORTB &= ~(1<<1); break; case 2: - DDRB |= (1<<5); - PORTB &= ~(1<<5); + DDRB |= (1<<2); + PORTB &= ~(1<<2); break; case 3: - DDRB |= (1<<6); - PORTB &= ~(1<<6); + DDRB |= (1<<3); + PORTB &= ~(1<<3); break; } -} \ No newline at end of file +} diff --git a/keyboard/planck/matrix_handwire.c b/keyboard/planck/matrix_handwire.c deleted file mode 100644 index 2f2dbdb10..000000000 --- a/keyboard/planck/matrix_handwire.c +++ /dev/null @@ -1,193 +0,0 @@ -/* -Copyright 2012 Jun Wako -Generated by planckkeyboard.com (2014 Jack Humbert) - -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/>. -*/ - -/* - * scan matrix - */ -#include <stdint.h> -#include <stdbool.h> -#include <avr/io.h> -#include <util/delay.h> -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" - - -#ifndef DEBOUNCE -# define DEBOUNCE 10 -#endif -static uint8_t debouncing = DEBOUNCE; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -static matrix_row_t read_cols(void); -static void init_cols(void); -static void unselect_rows(void); -static void select_row(uint8_t row); - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - // initialize row and col - unselect_rows(); - init_cols(); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) { - matrix[i] = 0; - matrix_debouncing[i] = 0; - } -} - -uint8_t matrix_scan(void) -{ - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - select_row(i); - _delay_us(30); // without this wait read unstable value. - matrix_row_t cols = read_cols(); - if (matrix_debouncing[i] != cols) { - matrix_debouncing[i] = cols; - if (debouncing) { - debug("bounce!: "); debug_hex(debouncing); debug("\n"); - } - debouncing = DEBOUNCE; - } - unselect_rows(); - } - - if (debouncing) { - if (--debouncing) { - _delay_ms(1); - } else { - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - matrix[i] = matrix_debouncing[i]; - } - } - } - - return 1; -} - -bool matrix_is_modified(void) -{ - if (debouncing) return false; - return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ - return matrix[row]; -} - -void matrix_print(void) -{ - print("\nr/c 0123456789ABCDEF\n"); - for (uint8_t row = 0; row < MATRIX_ROWS; row++) { - phex(row); print(": "); - pbin_reverse16(matrix_get_row(row)); - print("\n"); - } -} - -uint8_t matrix_key_count(void) -{ - uint8_t count = 0; - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - count += bitpop16(matrix[i]); - } - return count; -} - -static void init_cols(void) -{ - DDRB &= ~(1<<6 | 1<<5 | 1<<4); - PORTB |= (1<<6 | 1<<5 | 1<<4); - DDRD &= ~(1<<7 | 1<<6 | 1<<4); - PORTD |= (1<<7 | 1<<6 | 1<<4); - DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); - PORTF |= (1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); - -} - -static matrix_row_t read_cols(void) -{ - return (PIND&(1<<4) ? 0 : (1<<0)) | - (PIND&(1<<6) ? 0 : (1<<1)) | - (PIND&(1<<7) ? 0 : (1<<2)) | - (PINB&(1<<4) ? 0 : (1<<3)) | - (PINB&(1<<5) ? 0 : (1<<4)) | - (PINB&(1<<6) ? 0 : (1<<5)) | - (PINF&(1<<7) ? 0 : (1<<6)) | - (PINF&(1<<6) ? 0 : (1<<7)) | - (PINF&(1<<5) ? 0 : (1<<8)) | - (PINF&(1<<4) ? 0 : (1<<9)) | - (PINF&(1<<1) ? 0 : (1<<10)) | - (PINF&(1<<0) ? 0 : (1<<11)); - -} - -static void unselect_rows(void) -{ - DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3); - PORTB |= (1<<0 | 1<<1 | 1<<2 | 1<<3); - -} - -static void select_row(uint8_t row) -{ - switch (row) { - case 0: - DDRB |= (1<<0); - PORTB &= ~(1<<0); - break; - case 1: - DDRB |= (1<<1); - PORTB &= ~(1<<1); - break; - case 2: - DDRB |= (1<<2); - PORTB &= ~(1<<2); - break; - case 3: - DDRB |= (1<<3); - PORTB &= ~(1<<3); - break; - - } -} diff --git a/keyboard/quark/Makefile b/keyboard/quark/Makefile index df012064d..f79445e23 100644 --- a/keyboard/quark/Makefile +++ b/keyboard/quark/Makefile @@ -53,7 +53,7 @@ TARGET_DIR = . ifdef COMMON SRC = keymap_common.c \ - matrix_handwire.c \ + matrix.c \ led.c \ backlight.c @@ -66,14 +66,14 @@ endif else SRC = extended_keymap_common.c \ - matrix_handwire.c \ + matrix.c \ led.c \ backlight.c ifdef KEYMAP SRC := extended_keymaps/extended_keymap_$(KEYMAP).c $(SRC) else - SRC := extended_keymaps/extended_keymap_jack.c $(SRC) + SRC := extended_keymaps/extended_keymap_default.c $(SRC) endif endif diff --git a/keyboard/quark/extended_keymaps/extended_keymap_default.c b/keyboard/quark/extended_keymaps/extended_keymap_default.c new file mode 100644 index 000000000..7ddc1aad9 --- /dev/null +++ b/keyboard/quark/extended_keymaps/extended_keymap_default.c @@ -0,0 +1,40 @@ +#include "extended_keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { + {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + { KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_NO, KC_ENT}, + {KC_CAPS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT}, + { KC_LCTL, KC_LALT, KC_LGUI, KC_NO, FUNC(2), KC_SPC, KC_NO, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_RGHT} +}, +[1] = { + {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, + { KC_TAB, KC_A, KC_S,S(KC_BSLS), S(KC_COMM),S(KC_DOT),S(KC_MINS),S(KC_GRV),S(KC_LBRC), S(KC_RBRC), KC_NO, KC_ENT}, + {KC_CAPS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_SCLN, S(KC_SCLN), KC_HOME, KC_PGUP, KC_RSFT}, + { KC_LCTL, KC_LALT, KC_LGUI, KC_NO, FUNC(2), KC_SPC, KC_NO, KC_NO, FUNC(1), KC_SCLN, KC_QUOT, KC_SLSH} +}, +[2] = { + {KC_ESC, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, + { KC_TAB, KC_A, KC_S, KC_D, KC_BSLS, KC_SLSH, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_NO, KC_ENT}, + {KC_CAPS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, S(KC_7), S(KC_EQL), KC_COMM, KC_UP, KC_RSFT}, + { KC_LCTL, KC_LALT, KC_LGUI, KC_NO, FUNC(2), KC_SPC, KC_NO, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_RGHT} +} +}; + + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay + [2] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + return MACRO_NONE; + break; + } + return MACRO_NONE; +}; diff --git a/keyboard/quark/extended_keymaps/extended_keymap_jack.c b/keyboard/quark/extended_keymaps/extended_keymap_jack.c deleted file mode 100644 index 416ae8345..000000000 --- a/keyboard/quark/extended_keymaps/extended_keymap_jack.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "extended_keymap_common.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Jack soft-coded colemak */ - {KC_TAB, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_BSPC}, - {KC_ESC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_QUOT}, - {KC_LSFT, CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, CM_COMM, CM_DOT, CM_SLSH, KC_ENT}, - {M(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[1] = { /* Jack hard-coded colemak */ - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_NO, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[2] = { /* Jack RAISE */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[3] = { /* Jack LOWER */ - {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, - {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, - {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_NO, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -} -}; - - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay - [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay - - [3] = ACTION_DEFAULT_LAYER_SET(0), - [4] = ACTION_DEFAULT_LAYER_SET(1), - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - return MACRODOWN(T(CM_T), END); - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/quark/matrix.c b/keyboard/quark/matrix.c index e3926caec..2f2dbdb10 100644 --- a/keyboard/quark/matrix.c +++ b/keyboard/quark/matrix.c @@ -27,7 +27,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "debug.h" #include "util.h" #include "matrix.h" -#include "backlight.h" // TODO fix this dependency #ifndef DEBOUNCE @@ -58,13 +57,6 @@ uint8_t matrix_cols(void) void matrix_init(void) { - // To use PORTF disable JTAG with writing JTD bit twice within four cycles. - MCUCR |= (1<<JTD); - MCUCR |= (1<<JTD); - - // TODO fix this dependency - backlight_init_ports(); - // initialize row and col unselect_rows(); init_cols(); @@ -142,19 +134,10 @@ uint8_t matrix_key_count(void) return count; } -// -// Planck PCB Rev 1 Pin Assignments -// -// Column: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 -// Pin: F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 -// - static void init_cols(void) { - DDRB &= ~(1<<4 | 1<<0); - PORTB |= (1<<4 | 1<<0); - DDRC &= ~(1<<7); - PORTC |= (1<<7); + DDRB &= ~(1<<6 | 1<<5 | 1<<4); + PORTB |= (1<<6 | 1<<5 | 1<<4); DDRD &= ~(1<<7 | 1<<6 | 1<<4); PORTD |= (1<<7 | 1<<6 | 1<<4); DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); @@ -164,56 +147,47 @@ static void init_cols(void) static matrix_row_t read_cols(void) { - return (PINF&(1<<1) ? 0 : (1<<0)) | - (PINF&(1<<0) ? 0 : (1<<1)) | - (PINB&(1<<0) ? 0 : (1<<2)) | - (PINC&(1<<7) ? 0 : (1<<3)) | - (PINF&(1<<4) ? 0 : (1<<4)) | - (PINF&(1<<5) ? 0 : (1<<5)) | - (PINF&(1<<6) ? 0 : (1<<6)) | - (PINF&(1<<7) ? 0 : (1<<7)) | - (PIND&(1<<4) ? 0 : (1<<8)) | - (PIND&(1<<6) ? 0 : (1<<9)) | - (PINB&(1<<4) ? 0 : (1<<10)) | - (PIND&(1<<7) ? 0 : (1<<11)); + return (PIND&(1<<4) ? 0 : (1<<0)) | + (PIND&(1<<6) ? 0 : (1<<1)) | + (PIND&(1<<7) ? 0 : (1<<2)) | + (PINB&(1<<4) ? 0 : (1<<3)) | + (PINB&(1<<5) ? 0 : (1<<4)) | + (PINB&(1<<6) ? 0 : (1<<5)) | + (PINF&(1<<7) ? 0 : (1<<6)) | + (PINF&(1<<6) ? 0 : (1<<7)) | + (PINF&(1<<5) ? 0 : (1<<8)) | + (PINF&(1<<4) ? 0 : (1<<9)) | + (PINF&(1<<1) ? 0 : (1<<10)) | + (PINF&(1<<0) ? 0 : (1<<11)); } static void unselect_rows(void) { - DDRB &= ~(1<<5 | 1<<6); - PORTB |= (1<<5 | 1<<6); - DDRD &= ~(1<<0 | 1<<5); - PORTD |= (1<<0 | 1<<5); + DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3); + PORTB |= (1<<0 | 1<<1 | 1<<2 | 1<<3); } -// -// Planck PCB Rev 1 Pin Assignments -// -// Row: 0, 1, 2, 3 -// Pin: D0, D5, B5, B6 -// - static void select_row(uint8_t row) { switch (row) { case 0: - DDRD |= (1<<0); - PORTD &= ~(1<<0); + DDRB |= (1<<0); + PORTB &= ~(1<<0); break; case 1: - DDRD |= (1<<5); - PORTD &= ~(1<<5); + DDRB |= (1<<1); + PORTB &= ~(1<<1); break; case 2: - DDRB |= (1<<5); - PORTB &= ~(1<<5); + DDRB |= (1<<2); + PORTB &= ~(1<<2); break; case 3: - DDRB |= (1<<6); - PORTB &= ~(1<<6); + DDRB |= (1<<3); + PORTB &= ~(1<<3); break; } -} \ No newline at end of file +} diff --git a/keyboard/quark/matrix_center.c b/keyboard/quark/matrix_center.c deleted file mode 100644 index 8e34130d6..000000000 --- a/keyboard/quark/matrix_center.c +++ /dev/null @@ -1,202 +0,0 @@ -/* -Copyright 2012 Jun Wako <wakojun@gmail.com> - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -/* - * scan matrix - */ -#include <stdint.h> -#include <stdbool.h> -#include <avr/io.h> -#include <util/delay.h> -#include "action_layer.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" - - -#ifndef DEBOUNCE -# define DEBOUNCE 10 -#endif -static uint8_t debouncing = DEBOUNCE; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -static matrix_row_t read_cols(void); -static void init_cols(void); -static void unselect_rows(void); -static void select_row(uint8_t row); - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - // initialize row and col - unselect_rows(); - init_cols(); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) { - matrix[i] = 0; - matrix_debouncing[i] = 0; - } -} - -uint8_t matrix_scan(void) -{ - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - select_row(i); - _delay_us(30); // without this wait read unstable value. - matrix_row_t cols = read_cols(); - if (matrix_debouncing[i] != cols) { - matrix_debouncing[i] = cols; - if (debouncing) { - debug("bounce!: "); debug_hex(debouncing); debug("\n"); - } - debouncing = DEBOUNCE; - } - unselect_rows(); - } - - if (debouncing) { - if (--debouncing) { - _delay_ms(1); - } else { - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - matrix[i] = matrix_debouncing[i]; - } - } - } - - return 1; -} - -bool matrix_is_modified(void) -{ - if (debouncing) return false; - return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1<<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ - return matrix[row]; -} - -void matrix_print(void) -{ - print("\nr/c 0123456789ABCDEF\n"); - for (uint8_t row = 0; row < MATRIX_ROWS; row++) { - phex(row); print(": "); - pbin_reverse16(matrix_get_row(row)); - print("\n"); - } -} - -uint8_t matrix_key_count(void) -{ - uint8_t count = 0; - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - count += bitpop16(matrix[i]); - } - return count; -} - -/* Column pin configuration - * col: 0 1 2 3 4 5 6 7 8 9 10 11 - * pin: F0 F1 F4 F5 F6 F7 B6 B5 B4 D7 D5 D4 - */ - -static void init_cols(void) -{ - DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); - PORTF |= (1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); - DDRD &= ~(1<<0); - PORTD |= (1<<0); - DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<7); - PORTB |= (1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<7); -} - -static matrix_row_t read_cols(void) -{ - return (PINB&(1<<0) ? 0 : (1<< 0)) | - (PINB&(1<<1) ? 0 : (1<< 1)) | - (PINB&(1<<2) ? 0 : (1<< 2)) | - (PINB&(1<<3) ? 0 : (1<< 3)) | - (PINB&(1<<7) ? 0 : (1<< 4)) | - (PIND&(1<<0) ? 0 : (1<< 5)) | - (PINF&(1<<7) ? 0 : (1<< 6)) | - (PINF&(1<<6) ? 0 : (1<< 7)) | - (PINF&(1<<5) ? 0 : (1<< 8)) | - (PINF&(1<<4) ? 0 : (1<< 9)) | - (PINF&(1<<1) ? 0 : (1<<10)) | - (PINF&(1<<0) ? 0 : (1<<11)); -} - -/* Row pin configuration - * row: 0 1 2 3 - * pin: B0 B1 B2 B3 - */ -static void unselect_rows(void) -{ - // Hi-Z(DDR:0, PORT:0) to unselect - DDRB &= ~0b01110000; - PORTB &= ~0b01110000; - DDRD &= ~0b10000000; - PORTD &= ~0b10000000; -} - -static void select_row(uint8_t row) -{ - switch (row) { - case 0: - DDRB |= (1<<6); - PORTB &= ~(1<<6); - break; - case 1: - DDRB |= (1<<5); - PORTB &= ~(1<<5); - break; - case 2: - DDRB |= (1<<4); - PORTB &= ~(1<<4); - break; - case 3: - DDRD |= (1<<7); - PORTD &= ~(1<<7); - break; - } -} diff --git a/keyboard/quark/matrix_handwire.c b/keyboard/quark/matrix_handwire.c deleted file mode 100644 index 2f2dbdb10..000000000 --- a/keyboard/quark/matrix_handwire.c +++ /dev/null @@ -1,193 +0,0 @@ -/* -Copyright 2012 Jun Wako -Generated by planckkeyboard.com (2014 Jack Humbert) - -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/>. -*/ - -/* - * scan matrix - */ -#include <stdint.h> -#include <stdbool.h> -#include <avr/io.h> -#include <util/delay.h> -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" - - -#ifndef DEBOUNCE -# define DEBOUNCE 10 -#endif -static uint8_t debouncing = DEBOUNCE; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -static matrix_row_t read_cols(void); -static void init_cols(void); -static void unselect_rows(void); -static void select_row(uint8_t row); - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - // initialize row and col - unselect_rows(); - init_cols(); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) { - matrix[i] = 0; - matrix_debouncing[i] = 0; - } -} - -uint8_t matrix_scan(void) -{ - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - select_row(i); - _delay_us(30); // without this wait read unstable value. - matrix_row_t cols = read_cols(); - if (matrix_debouncing[i] != cols) { - matrix_debouncing[i] = cols; - if (debouncing) { - debug("bounce!: "); debug_hex(debouncing); debug("\n"); - } - debouncing = DEBOUNCE; - } - unselect_rows(); - } - - if (debouncing) { - if (--debouncing) { - _delay_ms(1); - } else { - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - matrix[i] = matrix_debouncing[i]; - } - } - } - - return 1; -} - -bool matrix_is_modified(void) -{ - if (debouncing) return false; - return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1<col)); -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ - return matrix[row]; -} - -void matrix_print(void) -{ - print("\nr/c 0123456789ABCDEF\n"); - for (uint8_t row = 0; row < MATRIX_ROWS; row++) { - phex(row); print(": "); - pbin_reverse16(matrix_get_row(row)); - print("\n"); - } -} - -uint8_t matrix_key_count(void) -{ - uint8_t count = 0; - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - count += bitpop16(matrix[i]); - } - return count; -} - -static void init_cols(void) -{ - DDRB &= ~(1<<6 | 1<<5 | 1<<4); - PORTB |= (1<<6 | 1<<5 | 1<<4); - DDRD &= ~(1<<7 | 1<<6 | 1<<4); - PORTD |= (1<<7 | 1<<6 | 1<<4); - DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); - PORTF |= (1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); - -} - -static matrix_row_t read_cols(void) -{ - return (PIND&(1<<4) ? 0 : (1<<0)) | - (PIND&(1<<6) ? 0 : (1<<1)) | - (PIND&(1<<7) ? 0 : (1<<2)) | - (PINB&(1<<4) ? 0 : (1<<3)) | - (PINB&(1<<5) ? 0 : (1<<4)) | - (PINB&(1<<6) ? 0 : (1<<5)) | - (PINF&(1<<7) ? 0 : (1<<6)) | - (PINF&(1<<6) ? 0 : (1<<7)) | - (PINF&(1<<5) ? 0 : (1<<8)) | - (PINF&(1<<4) ? 0 : (1<<9)) | - (PINF&(1<<1) ? 0 : (1<<10)) | - (PINF&(1<<0) ? 0 : (1<<11)); - -} - -static void unselect_rows(void) -{ - DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3); - PORTB |= (1<<0 | 1<<1 | 1<<2 | 1<<3); - -} - -static void select_row(uint8_t row) -{ - switch (row) { - case 0: - DDRB |= (1<<0); - PORTB &= ~(1<<0); - break; - case 1: - DDRB |= (1<<1); - PORTB &= ~(1<<1); - break; - case 2: - DDRB |= (1<<2); - PORTB &= ~(1<<2); - break; - case 3: - DDRB |= (1<<3); - PORTB &= ~(1<<3); - break; - - } -} diff --git a/rules.mk b/rules.mk index 83c9da5f8..b7380fc89 100644 --- a/rules.mk +++ b/rules.mk @@ -422,6 +422,11 @@ dfu: $(TARGET).hex dfu-programmer $(MCU) erase dfu-programmer $(MCU) flash $(TARGET).hex dfu-programmer $(MCU) reset + +dfu-force: $(TARGET).hex + dfu-programmer $(MCU) erase --force + dfu-programmer $(MCU) flash $(TARGET).hex + dfu-programmer $(MCU) reset dfu-start: dfu-programmer $(MCU) reset From b90ee43f57ac6ecf862f6a25cbce5ececc7a868e Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Mon, 18 May 2015 21:14:21 -0400 Subject: [PATCH 76/78] files --- keyboard/planck/__avr_gdbinit | 6 + .../extended_keymap_charlie.c | 54 +++++ keyboard/planck/matrix_pcb.c | 222 ++++++++++++++++++ 3 files changed, 282 insertions(+) create mode 100644 keyboard/planck/__avr_gdbinit create mode 100644 keyboard/planck/extended_keymaps/extended_keymap_charlie.c create mode 100644 keyboard/planck/matrix_pcb.c diff --git a/keyboard/planck/__avr_gdbinit b/keyboard/planck/__avr_gdbinit new file mode 100644 index 000000000..afc51e6d1 --- /dev/null +++ b/keyboard/planck/__avr_gdbinit @@ -0,0 +1,6 @@ +define reset +SIGNAL SIGHUP +end +file planck_lufa.elf +target remote localhost:4242 +break main diff --git a/keyboard/planck/extended_keymaps/extended_keymap_charlie.c b/keyboard/planck/extended_keymaps/extended_keymap_charlie.c new file mode 100644 index 000000000..18657c8e4 --- /dev/null +++ b/keyboard/planck/extended_keymaps/extended_keymap_charlie.c @@ -0,0 +1,54 @@ +#include "extended_keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = { /* Native */ + {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, FUNC(2)}, + {KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_TAB, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {KC_DEL, KC_LCTL, KC_NO, KC_LSFT, KC_LALT, KC_SPC, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + [1] = { /* QWERTY->PHOTOSHOP */ + {KC_DELETE, KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, FUNC(1)}, + {KC_O, KC_G, KC_S, KC_U, KC_T, FUNC(27), KC_F21, KC_F10, KC_F11, KC_F7, KC_F8, KC_F9}, + {KC_TAB, FUNC(4), FUNC(5), FUNC(6), KC_F1, FUNC(7), KC_F18, KC_F19, KC_F23, KC_F20, KC_F22, FUNC(9)}, + {KC_COMM, KC_DOT, KC_R, FUNC(11), FUNC(3), KC_SPC, FUNC(12), KC_F2, FUNC(8), KC_F3, KC_F14} + }, + [2] = { /* 2: FUNC(3 PHOTOSHOP */ + {KC_ESC, FUNC(25), FUNC(26), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, + {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, FUNC(19), FUNC(20), FUNC(21)}, + {KC_C, KC_NO, FUNC(22), FUNC(5), KC_NO, FUNC(23), KC_NO, KC_NO, KC_NO, KC_NO, FUNC(13), KC_NO}, + {FUNC(14), FUNC(15), FUNC(16), FUNC(17), FUNC(3), KC_SPC, FUNC(18), KC_NO, KC_NO, KC_F24, KC_NO} + } +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_DEFAULT_LAYER_SET(0), // set Qwerty layout + [2] = ACTION_DEFAULT_LAYER_SET(1), // set Photoshop presets + [3] = ACTION_LAYER_MOMENTARY(2), // Photoshop function layer + + [4] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F9), // photo folder AHK + [5] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_I), // select inverse + [6] = ACTION_MODS_KEY(MOD_LSFT, KC_M), // marquee select + [7] = ACTION_MODS_KEY(MOD_LALT, KC_BSPC), // fill + [8] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_X), // warp + [9] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT | MOD_LSFT, KC_F12), // merge all new layer + [10] = ACTION_MODS_KEY(MOD_LCTL, KC_MINS), // zoom out + [11] = ACTION_MODS_KEY(MOD_LCTL, KC_H), // RBG sliders + [12] = ACTION_MODS_KEY(MOD_LCTL, KC_S), // save + [13] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_F5), // layer mask from transparancy + [14] = ACTION_MODS_KEY(MOD_LCTL, KC_F2), // stroke + [15] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_F2), // stroke layer + [16] = ACTION_MODS_KEY(MOD_LCTL, KC_0), // zoom 0 + [17] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_H), // HSV sliders + [18] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_S), // save as + [19] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F7), // gaussian blur + [20] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F8), // motion blur + [21] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_X), // liquify filter + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // prev layer blending + [23] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_BSPC), // KC_NOrmal layer blending + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // next layer blending + [25] = ACTION_MODS_KEY(MOD_LCTL, KC_Z), // step back + [26] = ACTION_MODS_KEY(MOD_LCTL, KC_Y), // step forward + [27] = ACTION_MODS_KEY(MOD_LCTL, KC_R), // rasterize + +}; diff --git a/keyboard/planck/matrix_pcb.c b/keyboard/planck/matrix_pcb.c new file mode 100644 index 000000000..7d46baf3d --- /dev/null +++ b/keyboard/planck/matrix_pcb.c @@ -0,0 +1,222 @@ +/* +Copyright 2012 Jun Wako +Generated by planckkeyboard.com (2014 Jack Humbert) + +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/>. +*/ + +/* + * scan matrix + */ +#include <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include <util/delay.h> +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "backlight.h" // TODO fix this dependency + + +#ifndef DEBOUNCE +# define DEBOUNCE 10 +#endif +static uint8_t debouncing = DEBOUNCE; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + // To use PORTF disable JTAG with writing JTD bit twice within four cycles. + MCUCR |= (1<<JTD); + MCUCR |= (1<<JTD); + + backlight_init_ports(); + + // Turn status LED on + DDRE |= (1<<6); + PORTE |= (1<<6); + + // initialize row and col + unselect_rows(); + init_cols(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } +} + +uint8_t matrix_scan(void) +{ + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i] != cols) { + matrix_debouncing[i] = cols; + if (debouncing) { + debug("bounce!: "); debug_hex(debouncing); debug("\n"); + } + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + return 1; +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<col)); +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +void matrix_print(void) +{ + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + pbin_reverse16(matrix_get_row(row)); + print("\n"); + } +} + +uint8_t matrix_key_count(void) +{ + uint8_t count = 0; + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + count += bitpop16(matrix[i]); + } + return count; +} + +// +// Planck PCB Rev 1 Pin Assignments +// +// Column: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 +// Pin: F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 +// + +static void init_cols(void) +{ + DDRB &= ~(1<<4 | 1<<0); + PORTB |= (1<<4 | 1<<0); + DDRC &= ~(1<<7); + PORTC |= (1<<7); + DDRD &= ~(1<<7 | 1<<6 | 1<<4); + PORTD |= (1<<7 | 1<<6 | 1<<4); + DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + PORTF |= (1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7); + +} + +static matrix_row_t read_cols(void) +{ + return (PINF&(1<<1) ? 0 : (1<<0)) | + (PINF&(1<<0) ? 0 : (1<<1)) | + (PINB&(1<<0) ? 0 : (1<<2)) | + (PINC&(1<<7) ? 0 : (1<<3)) | + (PINF&(1<<4) ? 0 : (1<<4)) | + (PINF&(1<<5) ? 0 : (1<<5)) | + (PINF&(1<<6) ? 0 : (1<<6)) | + (PINF&(1<<7) ? 0 : (1<<7)) | + (PIND&(1<<4) ? 0 : (1<<8)) | + (PIND&(1<<6) ? 0 : (1<<9)) | + (PINB&(1<<4) ? 0 : (1<<10)) | + (PIND&(1<<7) ? 0 : (1<<11)); + +} + +static void unselect_rows(void) +{ + DDRB &= ~(1<<5 | 1<<6); + PORTB |= (1<<5 | 1<<6); + DDRD &= ~(1<<0 | 1<<5); + PORTD |= (1<<0 | 1<<5); + +} + +// +// Planck PCB Rev 1 Pin Assignments +// +// Row: 0, 1, 2, 3 +// Pin: D0, D5, B5, B6 +// + +static void select_row(uint8_t row) +{ + switch (row) { + case 0: + DDRD |= (1<<0); + PORTD &= ~(1<<0); + break; + case 1: + DDRD |= (1<<5); + PORTD &= ~(1<<5); + break; + case 2: + DDRB |= (1<<5); + PORTB &= ~(1<<5); + break; + case 3: + DDRB |= (1<<6); + PORTB &= ~(1<<6); + break; + + } +} \ No newline at end of file From cdccebafe1baa396041656d8cca69ed427d9e087 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Tue, 19 May 2015 01:03:54 -0400 Subject: [PATCH 77/78] default w/qwerty --- .../extended_keymap_default.c | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 keyboard/planck/extended_keymaps/extended_keymap_default.c diff --git a/keyboard/planck/extended_keymaps/extended_keymap_default.c b/keyboard/planck/extended_keymaps/extended_keymap_default.c new file mode 100644 index 000000000..c35b28367 --- /dev/null +++ b/keyboard/planck/extended_keymaps/extended_keymap_default.c @@ -0,0 +1,50 @@ +#include "extended_keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Qwerty */ + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + // Space is repeated to accommadate for both spacebar wiring positions +}, +[1] = { /* Colemak */ + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[2] = { /* RAISE */ + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[3] = { /* LOWER */ + {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, + {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, + {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +} +}; + + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + return MACRODOWN(T(CM_T), END); + break; + } + return MACRO_NONE; +}; From d61d1f5ca3a7dcccc495ac6688e0632c601c0623 Mon Sep 17 00:00:00 2001 From: Jack Humbert <jack.humb@gmail.com> Date: Thu, 21 May 2015 19:59:39 -0400 Subject: [PATCH 78/78] layouts, default --- keyboard/planck/Makefile | 2 +- .../extended_keymaps/extended_keymap_austin.c | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 keyboard/planck/extended_keymaps/extended_keymap_austin.c diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 2f5517b1b..964e6832e 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -73,7 +73,7 @@ SRC = extended_keymap_common.c \ ifdef KEYMAP SRC := extended_keymaps/extended_keymap_$(KEYMAP).c $(SRC) else - SRC := extended_keymaps/extended_keymap_jack.c $(SRC) + SRC := extended_keymaps/extended_keymap_default.c $(SRC) endif endif diff --git a/keyboard/planck/extended_keymaps/extended_keymap_austin.c b/keyboard/planck/extended_keymaps/extended_keymap_austin.c new file mode 100644 index 000000000..35330be74 --- /dev/null +++ b/keyboard/planck/extended_keymaps/extended_keymap_austin.c @@ -0,0 +1,50 @@ +#include "extended_keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Qwerty */ + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {BL_STEP, KC_LGUI, KC_LALT, KC_LCTL, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + // Space is repeated to accommadate for both spacebar wiring positions +}, +[1] = { /* Colemak */ + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {KC_FN3, KC_LGUI, KC_LALT, KC_LCTL, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[2] = { /* RAISE */ + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[3] = { /* LOWER */ + {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, + {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, + {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +} +}; + + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + return MACRODOWN(T(CM_T), END); + break; + } + return MACRO_NONE; +};