This creates a v1 and v2 subproject. V1 retains all the same implementations of the bootmapper-ported Mechmnini 1 including #2196. V2 adds the Mechmini 2.0 kayboard support (I know it took me way to long to get it a pull request in). All readme's updated to reflect compiling the two seperate keyboards. Simply either `make mechmini/v1:default` or `make mechmini/v2:defualt`. Utilizing the rules.mk using `make mechmini:default` will automatically create the Mechmini 2 default keymap as this is the current version and has a much wider user base.audio_out
parent
0a5d302622
commit
9cb1d36974
@ -1,45 +1,28 @@ |
||||
/*
|
||||
Copyright 2017 Luiz Ribeiro <luizribeiro@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/>.
|
||||
/* Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
* Copyright 2018 TurboMech /u/TurboMech <discord> @A9entOran9e#6134 |
||||
* 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 "config_common.h" |
||||
|
||||
#ifndef CONFIG_H |
||||
#define CONFIG_H |
||||
|
||||
#define VENDOR_ID 0x20A0 |
||||
#define PRODUCT_ID 0x422D |
||||
// TODO: share these strings with usbconfig.h
|
||||
// Edit usbconfig.h to change these.
|
||||
#define MANUFACTURER winkeyless.kr |
||||
#define PRODUCT mechmini |
||||
|
||||
/* matrix size */ |
||||
#define MATRIX_ROWS 8 |
||||
#define MATRIX_COLS 15 |
||||
|
||||
#define NO_UART 1 |
||||
|
||||
/* RGB underglow */ |
||||
// The RGB_DI_PIN value seems to be shared between all PS2AVRGB boards.
|
||||
// The same pin is used on the JJ40, at least.
|
||||
#define RGBLED_NUM 16 |
||||
#define RGBLIGHT_ANIMATIONS |
||||
#define RGB_DI_PIN E2 |
||||
|
||||
/* key combination for command */ |
||||
#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) |
||||
#define VENDOR_ID 0xFEED |
||||
#define PRODUCT_ID 0xCA40 |
||||
#define MANUFACTURER MECHKEYS |
||||
#define PRODUCT Mechmini |
||||
#define DESCRIPTION 40% modular keyboard |
||||
|
||||
#endif |
||||
|
@ -1,42 +1,30 @@ |
||||
/*
|
||||
Copyright 2017 Luiz Ribeiro <luizribeiro@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/>.
|
||||
/* Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
* Copyright 2018 TurboMech /u/TurboMech <discord> @A9entOran9e#6134 |
||||
* 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 MECHMINI_H |
||||
#define MECHMINI_H |
||||
|
||||
#include "keycode.h" |
||||
#include "action.h" |
||||
#include "quantum.h" |
||||
|
||||
#define KEYMAP( \ |
||||
K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, \
|
||||
K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, \
|
||||
K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, \
|
||||
K00, K10, K20, K56, K57, KB0, KC0, K66 \
|
||||
) \
|
||||
{ \
|
||||
{ K00, K10, K20, K56, KC_NO, K57, KC_NO, KC_NO, KB0, KC0, K66, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
|
||||
} |
||||
#ifdef KEYBOARD_mechmini_v1 |
||||
#include "v1.h" |
||||
#endif |
||||
|
||||
#ifdef KEYBOARD_mechmini_v2 |
||||
#include "v2.h" |
||||
#endif |
||||
|
||||
#endif |
||||
|
@ -1,50 +1 @@ |
||||
# Copyright 2017 Luiz Ribeiro <luizribeiro@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/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
PROTOCOL = VUSB
|
||||
|
||||
# unsupported features for now
|
||||
NO_UART = yes
|
||||
NO_SUSPEND_POWER_DOWN = yes
|
||||
|
||||
# processor frequency
|
||||
F_CPU = 12000000
|
||||
|
||||
# Bootloader
|
||||
# This definition is optional, and if your keyboard supports multiple bootloaders of
|
||||
# different sizes, comment this out, and the correct address will be loaded
|
||||
# automatically (+60). See bootloader.mk for all options.
|
||||
BOOTLOADER = atmel-dfu
|
||||
|
||||
# build options
|
||||
BOOTMAGIC_ENABLE = yes
|
||||
MOUSEKEY_ENABLE = yes
|
||||
EXTRAKEY_ENABLE = yes
|
||||
CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = no
|
||||
RGBLIGHT_ENABLE = yes
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
# custom matrix setup
|
||||
CUSTOM_MATRIX = yes
|
||||
SRC = matrix.c i2c.c
|
||||
|
||||
# programming options
|
||||
PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex
|
||||
DEFAULT_FOLDER = mechmini/v2
|
||||
|
@ -0,0 +1,83 @@ |
||||
Mechmini V1 |
||||
=========== |
||||
|
||||
A 40% ortholinear/staggered keyboard, that was originally bootmapper and can be ported to QMK following this readme. This version is no longer in production [More info on MECHKEYS](https://mechkeys.ca). |
||||
|
||||
Keyboard Maintainer: QMK Community |
||||
Hardware Supported: Mechmini 1 PCB |
||||
Hardware Availability: Version 1 (Bootmapper) no longer in production [MECHKEYS](https://mechkeys.ca) |
||||
|
||||
Make example for this keyboard (after setting up your build environment): |
||||
|
||||
make mechmini/v1:default |
||||
|
||||
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. |
||||
|
||||
## Mechmini Notes |
||||
|
||||
Note that this is a complete replacement for the firmware, so you won't be |
||||
using Bootmapper Client to change any keyboard settings, since not all the |
||||
USB report options are supported. |
||||
|
||||
## Installing |
||||
|
||||
First, install the requirements. These commands are for OSX, but all you |
||||
need is the AVR toolchain and `bootloadHID` for flashing: |
||||
|
||||
``` |
||||
$ brew cask install crosspack-avr |
||||
$ brew install --HEAD https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb |
||||
``` |
||||
|
||||
In order to use the `./program` script, which can reboot the board into |
||||
the bootloader, you'll need Python 2 with PyUSB installed: |
||||
|
||||
``` |
||||
$ pip install pyusb |
||||
``` |
||||
|
||||
Then, with the keyboard plugged in, simply run this command from the |
||||
`qmk_firmware` directory: |
||||
|
||||
``` |
||||
$ make mechmini:program |
||||
``` |
||||
|
||||
If you prefer, you can just build it and flash the firmware directly with |
||||
`bootloadHID` if you boot the board while holding down `L_Ctrl` to keep it |
||||
in the bootloader: |
||||
|
||||
``` |
||||
$ make mechmini |
||||
$ bootloadHID -r mechmini_default.hex |
||||
``` |
||||
|
||||
## Troubleshooting |
||||
|
||||
From my experience, it's really hard to brick these boards. But these |
||||
tricks have been useful when it got stuck in a weird scenario. |
||||
|
||||
1. Try plugging the board in while pressing `L_Ctrl`. This will force it |
||||
to boot only the bootloader without loading the firmware. Once this is |
||||
done, just reflash the board with the original firmware. |
||||
2. Sometimes USB hubs can act weird, so try connecting the board directly |
||||
to your computer or plugging/unplugging the USB hub. |
||||
3. If errors happen with |
||||
`./tmk_core/common/avr/suspend.c` it is likely you implemented a RGB underglow sleep setting previously. Simply comment out the following code found under `void suspend_wakeup_init(void)`: |
||||
``` |
||||
ifdef RGBLIGHT_ANIMATIONS |
||||
rgblight_timer_enable(); |
||||
_delay_ms(50); |
||||
rgblight_set(); |
||||
#endif |
||||
``` |
||||
So that the resulting code should know reflect: |
||||
``` |
||||
/*#ifdef RGBLIGHT_ANIMATIONS |
||||
rgblight_timer_enable(); |
||||
_delay_ms(50); |
||||
rgblight_set(); |
||||
#endif*/ |
||||
``` |
||||
|
||||
|
@ -0,0 +1,48 @@ |
||||
/*
|
||||
Copyright 2017 Luiz Ribeiro <luizribeiro@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 V1_CONFIG_H |
||||
#define V1_CONFIG_H |
||||
|
||||
#include "config_common.h" |
||||
|
||||
#define VENDOR_ID 0xFEED |
||||
#define PRODUCT_ID 0xCA40 |
||||
#define DEVICE_VER 0x0001 |
||||
// TODO: share these strings with usbconfig.h
|
||||
// Edit usbconfig.h to change these.
|
||||
#define MANUFACTURER MECHKEYS |
||||
#define PRODUCT Mechmini |
||||
#define DESCRIPTION 40% modular keyboard |
||||
|
||||
/* matrix size */ |
||||
#define MATRIX_ROWS 8 |
||||
#define MATRIX_COLS 15 |
||||
|
||||
#define NO_UART 1 |
||||
|
||||
/* RGB underglow */ |
||||
// The RGB_DI_PIN value seems to be shared between all PS2AVRGB boards.
|
||||
// The same pin is used on the JJ40, at least.
|
||||
#define RGBLED_NUM 16 |
||||
#define RGBLIGHT_ANIMATIONS |
||||
#define RGB_DI_PIN E2 |
||||
|
||||
/* key combination for command */ |
||||
#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) |
||||
|
||||
#endif |
@ -0,0 +1,50 @@ |
||||
# Copyright 2017 Luiz Ribeiro <luizribeiro@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/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
PROTOCOL = VUSB
|
||||
|
||||
# unsupported features for now
|
||||
NO_UART = yes
|
||||
NO_SUSPEND_POWER_DOWN = yes
|
||||
|
||||
# processor frequency
|
||||
F_CPU = 12000000
|
||||
|
||||
# Bootloader
|
||||
# This definition is optional, and if your keyboard supports multiple bootloaders of
|
||||
# different sizes, comment this out, and the correct address will be loaded
|
||||
# automatically (+60). See bootloader.mk for all options.
|
||||
BOOTLOADER = atmel-dfu
|
||||
|
||||
# build options
|
||||
BOOTMAGIC_ENABLE = yes
|
||||
MOUSEKEY_ENABLE = yes
|
||||
EXTRAKEY_ENABLE = yes
|
||||
CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = no
|
||||
RGBLIGHT_ENABLE = yes
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
# custom matrix setup
|
||||
CUSTOM_MATRIX = yes
|
||||
SRC = matrix.c i2c.c
|
||||
|
||||
# programming options
|
||||
PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex
|
@ -0,0 +1,44 @@ |
||||
/*
|
||||
Copyright 2017 Luiz Ribeiro <luizribeiro@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 "v1.h" |
||||
#include <avr/pgmspace.h> |
||||
#include "action_layer.h" |
||||
#include "i2c.h" |
||||
#include "quantum.h" |
||||
#include "rgblight.h" |
||||
|
||||
// custom RGB driver
|
||||
extern rgblight_config_t rgblight_config; |
||||
void rgblight_set(void) { |
||||
if (!rgblight_config.enable) { |
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) { |
||||
led[i].r = 0; |
||||
led[i].g = 0; |
||||
led[i].b = 0; |
||||
} |
||||
} |
||||
|
||||
i2c_init(); |
||||
i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM); |
||||
} |
||||
|
||||
__attribute__ ((weak)) |
||||
void matrix_scan_user(void) { |
||||
rgblight_task(); |
||||
/* add other tasks to be done on each matrix scan */ |
||||
} |
@ -0,0 +1,43 @@ |
||||
/*
|
||||
Copyright 2017 Luiz Ribeiro <luizribeiro@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 V1_H |
||||
#define V2_H |
||||
|
||||
#include "../mechmini.h" |
||||
#include "keycode.h" |
||||
#include "action.h" |
||||
#include "quantum.h" |
||||
|
||||
#define KEYMAP( \ |
||||
K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, \
|
||||
K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, \
|
||||
K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, \
|
||||
K00, K10, K20, K56, K57, KB0, KC0, K66 \
|
||||
) \
|
||||
{ \
|
||||
{ K00, K10, K20, K56, KC_NO, K57, KC_NO, KC_NO, KB0, KC0, K66, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
|
||||
} |
||||
|
||||
#endif |
@ -0,0 +1,20 @@ |
||||
Mechmini 2.0 |
||||
============ |
||||
|
||||
A 40% compact ortholinear/staggered keyboard. |
||||
|
||||
Version 2 (Mechmini 2.0) was shipped powered by QMK [More info on MECHKEYS](https://mechkeys.ca). |
||||
|
||||
Keyboard Maintainer: [TurboMech](https://github.com/TurboMech) |
||||
Hardware Supported: Mechmini 2.0 keyboard |
||||
Hardware Availability: https://mechkeys.ca/collections/keyboards/products/mechmini-2-0 |
||||
|
||||
Make example for this keyboard (after setting up your build environment), this will make the Mechmini 2.0 default keymap (split space): |
||||
|
||||
make mechmini/v2:default |
||||
|
||||
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. |
||||
|
||||
## Mechmini Notes |
||||
|
||||
There are 2 versions of the Mechmini keyboard. Please read the readme for the version you have for make instructions. |
@ -0,0 +1,77 @@ |
||||
/* Copyright 2018 TurboMech /u/TurboMech <discord> @A9entOran9e#6134
|
||||
* 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 V2_CONFIG_H |
||||
#define V2_CONFIG_H |
||||
|
||||
#include "config_common.h" |
||||
|
||||
|
||||
/* USB Device descriptor parameter */ |
||||
#define VENDOR_ID 0xFEED |
||||
#define PRODUCT_ID 0xCA40 |
||||
#define DEVICE_VER 0x0002 |
||||
#define MANUFACTURER MECHKEYS |
||||
#undef PRODUCT |
||||
#define PRODUCT Mechmini 2 |
||||
#undef DESCRIPTION |
||||
#define DESCRIPTION 40% modular keyboard |
||||
|
||||
/* key matrix size */ |
||||
#undef MATRIX_COLS |
||||
#undef MATRIX_ROWS |
||||
#define MATRIX_ROWS 4 |
||||
#define MATRIX_COLS 12 |
||||
|
||||
/* key matrix pins */ |
||||
#define MATRIX_ROW_PINS { D0, D1, D2, D3 } |
||||
#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, B3, B1, B0, D5, B7, C7 } |
||||
#define UNUSED_PINS |
||||
|
||||
/* COL2ROW or ROW2COL */ |
||||
#define DIODE_DIRECTION COL2ROW |
||||
|
||||
/* number of backlight levels */ |
||||
#define BACKLIGHT_PIN B6 |
||||
#ifdef BACKLIGHT_PIN |
||||
#define BACKLIGHT_LEVELS 3 |
||||
#endif |
||||
|
||||
/* Set 0 if debouncing isn't needed */ |
||||
#define DEBOUNCING_DELAY 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)) \
|
||||
) |
||||
|
||||
/* prevent stuck modifiers */ |
||||
#define PREVENT_STUCK_MODIFIERS |
||||
|
||||
#define RGB_DI_PIN E2 |
||||
#ifdef RGB_DI_PIN |
||||
#define RGBLIGHT_ANIMATIONS |
||||
#define RGBLED_NUM 14 |
||||
#define RGBLIGHT_HUE_STEP 8 |
||||
#define RGBLIGHT_SAT_STEP 8 |
||||
#define RGBLIGHT_VAL_STEP 8 |
||||
#endif |
||||
|
||||
#endif |
@ -0,0 +1,124 @@ |
||||
#include "mechmini.h" |
||||
|
||||
#define _BL 0 |
||||
#define _FN1 1 |
||||
#define _FN2 2 |
||||
|
||||
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) |
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
|
||||
[_BL] = KEYMAP_2U_SPACE_ORTHO( |
||||
F(0), 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_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_CAPS, KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT), |
||||
|
||||
[_FN1] = KEYMAP_2U_SPACE_ORTHO( |
||||
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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_BSLS, KC_DEL, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, M(1), M(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY), |
||||
|
||||
[_FN2] = KEYMAP_2U_SPACE_ORTHO( |
||||
KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, |
||||
KC_TRNS, BL_TOGG, BL_STEP, BL_INC, BL_DEC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, |
||||
KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_HOME, KC_END, KC_TRNS, |
||||
RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_PGDN, KC_PGUP, KC_MPLY), |
||||
|
||||
}; |
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { |
||||
|
||||
|
||||
switch (id) { |
||||
case 1: |
||||
if (record->event.pressed) { |
||||
return MACRO( D(LCTL), T(C), U(LCTL), END ); |
||||
} |
||||
break; |
||||
case 2: |
||||
if (record->event.pressed) { |
||||
return MACRO( D(LCTL), T(V), U(LCTL), END ); |
||||
} |
||||
break; |
||||
} |
||||
return MACRO_NONE; |
||||
} |
||||
|
||||
void matrix_init_user(void) { |
||||
} |
||||
|
||||
void matrix_scan_user(void) { |
||||
} |
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
||||
return true; |
||||
} |
||||
|
||||
void led_set_user(uint8_t usb_led) { |
||||
|
||||
if (usb_led & (1 << USB_LED_NUM_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_CAPS_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_COMPOSE)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_KANA)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
enum function_id { |
||||
SHIFT_ESC, |
||||
}; |
||||
|
||||
const uint16_t PROGMEM fn_actions[] = { |
||||
[0] = ACTION_FUNCTION(SHIFT_ESC), |
||||
}; |
||||
|
||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { |
||||
static uint8_t shift_esc_shift_mask; |
||||
switch (id) { |
||||
case SHIFT_ESC: |
||||
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; |
||||
if (record->event.pressed) { |
||||
if (shift_esc_shift_mask) { |
||||
add_key(KC_GRV); |
||||
send_keyboard_report(); |
||||
} else { |
||||
add_key(KC_ESC); |
||||
send_keyboard_report(); |
||||
} |
||||
} else { |
||||
if (shift_esc_shift_mask) { |
||||
del_key(KC_GRV); |
||||
send_keyboard_report(); |
||||
} else { |
||||
del_key(KC_ESC); |
||||
send_keyboard_report(); |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
} |
@ -0,0 +1,116 @@ |
||||
#include "mechmini.h" |
||||
|
||||
#define _BL 0 |
||||
#define _FN1 1 |
||||
#define _FN2 2 |
||||
|
||||
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) |
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
|
||||
[_BL] = KEYMAP_625_SPACE( |
||||
F(0), 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_ENT, |
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_LSFT, KC_DOT, |
||||
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, MO(1), MO(2)), |
||||
|
||||
[_FN1] = KEYMAP_625_SPACE( |
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, |
||||
KC_TRNS, KC_PGUP, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_TRNS, |
||||
KC_LSFT, KC_PGDN, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_SCLN, KC_QUOT, KC_SLSH, KC_TRNS, KC_HOME, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), |
||||
|
||||
[_FN2] = KEYMAP_625_SPACE( |
||||
KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET, |
||||
KC_TRNS, BL_TOGG, BL_STEP, BL_INC, BL_DEC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_CAPS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_END, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), |
||||
|
||||
|
||||
}; |
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { |
||||
|
||||
|
||||
switch (id) { |
||||
|
||||
} |
||||
return MACRO_NONE; |
||||
} |
||||
|
||||
void matrix_init_user(void) { |
||||
} |
||||
|
||||
void matrix_scan_user(void) { |
||||
} |
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
||||
return true; |
||||
} |
||||
|
||||
void led_set_user(uint8_t usb_led) { |
||||
|
||||
if (usb_led & (1 << USB_LED_NUM_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_CAPS_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_COMPOSE)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_KANA)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
enum function_id { |
||||
SHIFT_ESC, |
||||
}; |
||||
|
||||
const uint16_t PROGMEM fn_actions[] = { |
||||
[0] = ACTION_FUNCTION(SHIFT_ESC), |
||||
}; |
||||
|
||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { |
||||
static uint8_t shift_esc_shift_mask; |
||||
switch (id) { |
||||
case SHIFT_ESC: |
||||
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; |
||||
if (record->event.pressed) { |
||||
if (shift_esc_shift_mask) { |
||||
add_key(KC_GRV); |
||||
send_keyboard_report(); |
||||
} else { |
||||
add_key(KC_ESC); |
||||
send_keyboard_report(); |
||||
} |
||||
} else { |
||||
if (shift_esc_shift_mask) { |
||||
del_key(KC_GRV); |
||||
send_keyboard_report(); |
||||
} else { |
||||
del_key(KC_ESC); |
||||
send_keyboard_report(); |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
} |
@ -0,0 +1,115 @@ |
||||
#include "mechmini.h" |
||||
|
||||
#define _BL 0 |
||||
#define _FN1 1 |
||||
#define _FN2 2 |
||||
|
||||
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) |
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
|
||||
[_BL] = KEYMAP_SPLIT_SPACE( |
||||
F(0), 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_ENT, |
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_RSFT, KC_DOT, |
||||
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_RCTL, MO(1), MO(2)), |
||||
|
||||
[_FN1] = KEYMAP_SPLIT_SPACE( |
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, |
||||
KC_TRNS, KC_PGUP, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_TRNS, |
||||
KC_LSFT, KC_PGDN, KC_VOLD, KC_TRNS, KC_TRNS, KC_SCLN, KC_QUOT, KC_SLSH, KC_COMM, KC_TRNS, KC_HOME, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), |
||||
|
||||
[_FN2] = KEYMAP_SPLIT_SPACE( |
||||
KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET, |
||||
KC_TRNS, BL_TOGG, BL_STEP, BL_INC, BL_DEC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_CAPS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_END, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), |
||||
|
||||
}; |
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { |
||||
|
||||
|
||||
switch (id) { |
||||
|
||||
} |
||||
return MACRO_NONE; |
||||
} |
||||
|
||||
void matrix_init_user(void) { |
||||
} |
||||
|
||||
void matrix_scan_user(void) { |
||||
} |
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
||||
return true; |
||||
} |
||||
|
||||
void led_set_user(uint8_t usb_led) { |
||||
|
||||
if (usb_led & (1 << USB_LED_NUM_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_CAPS_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_COMPOSE)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_KANA)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
enum function_id { |
||||
SHIFT_ESC, |
||||
}; |
||||
|
||||
const uint16_t PROGMEM fn_actions[] = { |
||||
[0] = ACTION_FUNCTION(SHIFT_ESC), |
||||
}; |
||||
|
||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { |
||||
static uint8_t shift_esc_shift_mask; |
||||
switch (id) { |
||||
case SHIFT_ESC: |
||||
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; |
||||
if (record->event.pressed) { |
||||
if (shift_esc_shift_mask) { |
||||
add_key(KC_GRV); |
||||
send_keyboard_report(); |
||||
} else { |
||||
add_key(KC_ESC); |
||||
send_keyboard_report(); |
||||
} |
||||
} else { |
||||
if (shift_esc_shift_mask) { |
||||
del_key(KC_GRV); |
||||
send_keyboard_report(); |
||||
} else { |
||||
del_key(KC_ESC); |
||||
send_keyboard_report(); |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
} |
@ -0,0 +1,2 @@ |
||||
# The Default Mechmini 2.0 Layout - the same as split_space keymap |
||||
|
@ -0,0 +1,124 @@ |
||||
#include "mechmini.h" |
||||
|
||||
#define _BL 0 |
||||
#define _FN1 1 |
||||
#define _FN2 2 |
||||
|
||||
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) |
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
|
||||
[_BL] = KEYMAP_ORTHO( |
||||
F(0), 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_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_CAPS, KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT), |
||||
|
||||
[_FN1] = KEYMAP_ORTHO( |
||||
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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_BSLS, KC_DEL, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, M(1), M(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY), |
||||
|
||||
[_FN2] = KEYMAP_ORTHO( |
||||
KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, |
||||
KC_TRNS, BL_TOGG, BL_STEP, BL_INC, BL_DEC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, |
||||
KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_HOME, KC_END, KC_TRNS, |
||||
RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_PGDN, KC_PGUP, KC_MPLY), |
||||
|
||||
}; |
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { |
||||
|
||||
|
||||
switch (id) { |
||||
case 1: |
||||
if (record->event.pressed) { |
||||
return MACRO( D(LCTL), T(C), U(LCTL), END ); |
||||
} |
||||
break; |
||||
case 2: |
||||
if (record->event.pressed) { |
||||
return MACRO( D(LCTL), T(V), U(LCTL), END ); |
||||
} |
||||
break; |
||||
} |
||||
return MACRO_NONE; |
||||
} |
||||
|
||||
void matrix_init_user(void) { |
||||
} |
||||
|
||||
void matrix_scan_user(void) { |
||||
} |
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
||||
return true; |
||||
} |
||||
|
||||
void led_set_user(uint8_t usb_led) { |
||||
|
||||
if (usb_led & (1 << USB_LED_NUM_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_CAPS_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_COMPOSE)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_KANA)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
enum function_id { |
||||
SHIFT_ESC, |
||||
}; |
||||
|
||||
const uint16_t PROGMEM fn_actions[] = { |
||||
[0] = ACTION_FUNCTION(SHIFT_ESC), |
||||
}; |
||||
|
||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { |
||||
static uint8_t shift_esc_shift_mask; |
||||
switch (id) { |
||||
case SHIFT_ESC: |
||||
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; |
||||
if (record->event.pressed) { |
||||
if (shift_esc_shift_mask) { |
||||
add_key(KC_GRV); |
||||
send_keyboard_report(); |
||||
} else { |
||||
add_key(KC_ESC); |
||||
send_keyboard_report(); |
||||
} |
||||
} else { |
||||
if (shift_esc_shift_mask) { |
||||
del_key(KC_GRV); |
||||
send_keyboard_report(); |
||||
} else { |
||||
del_key(KC_ESC); |
||||
send_keyboard_report(); |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
} |
@ -0,0 +1,115 @@ |
||||
#include "mechmini.h" |
||||
|
||||
#define _BL 0 |
||||
#define _FN1 1 |
||||
#define _FN2 2 |
||||
|
||||
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) |
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
|
||||
[_BL] = KEYMAP_SPLIT_SPACE( |
||||
F(0), 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_ENT, |
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_RSFT, KC_DOT, |
||||
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_RCTL, MO(1), MO(2)), |
||||
|
||||
[_FN1] = KEYMAP_SPLIT_SPACE( |
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, |
||||
KC_TRNS, KC_PGUP, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_TRNS, |
||||
KC_LSFT, KC_PGDN, KC_VOLD, KC_TRNS, KC_TRNS, KC_SCLN, KC_QUOT, KC_SLSH, KC_COMM, KC_TRNS, KC_HOME, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), |
||||
|
||||
[_FN2] = KEYMAP_SPLIT_SPACE( |
||||
KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET, |
||||
KC_TRNS, BL_TOGG, BL_STEP, BL_INC, BL_DEC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_CAPS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_END, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), |
||||
|
||||
}; |
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { |
||||
|
||||
|
||||
switch (id) { |
||||
|
||||
} |
||||
return MACRO_NONE; |
||||
} |
||||
|
||||
void matrix_init_user(void) { |
||||
} |
||||
|
||||
void matrix_scan_user(void) { |
||||
} |
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
||||
return true; |
||||
} |
||||
|
||||
void led_set_user(uint8_t usb_led) { |
||||
|
||||
if (usb_led & (1 << USB_LED_NUM_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_CAPS_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_COMPOSE)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
if (usb_led & (1 << USB_LED_KANA)) { |
||||
|
||||
} else { |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
enum function_id { |
||||
SHIFT_ESC, |
||||
}; |
||||
|
||||
const uint16_t PROGMEM fn_actions[] = { |
||||
[0] = ACTION_FUNCTION(SHIFT_ESC), |
||||
}; |
||||
|
||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { |
||||
static uint8_t shift_esc_shift_mask; |
||||
switch (id) { |
||||
case SHIFT_ESC: |
||||
shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; |
||||
if (record->event.pressed) { |
||||
if (shift_esc_shift_mask) { |
||||
add_key(KC_GRV); |
||||
send_keyboard_report(); |
||||
} else { |
||||
add_key(KC_ESC); |
||||
send_keyboard_report(); |
||||
} |
||||
} else { |
||||
if (shift_esc_shift_mask) { |
||||
del_key(KC_GRV); |
||||
send_keyboard_report(); |
||||
} else { |
||||
del_key(KC_ESC); |
||||
send_keyboard_report(); |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
} |
@ -0,0 +1,2 @@ |
||||
# The Default Mechmini 2.0 Layout |
||||
|
@ -0,0 +1,63 @@ |
||||
# 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 = 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)
|
||||
|
||||
# Bootloader
|
||||
# This definition is optional, and if your keyboard supports multiple bootloaders of
|
||||
# different sizes, comment this out, and the correct address will be loaded
|
||||
# automatically (+60). See bootloader.mk for all options.
|
||||
BOOTLOADER = atmel-dfu
|
||||
|
||||
|
||||
# Interrupt driven control endpoint task(+60)
|
||||
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||
|
||||
|
||||
# Boot Section Size in *bytes*
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||
|
||||
|
||||
# Build Options
|
||||
# comment out to disable the options.
|
||||
#
|
||||
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||
AUDIO_ENABLE = no
|
||||
RGBLIGHT_ENABLE = yes
|
@ -0,0 +1 @@ |
||||
#include "v2.h" |
@ -0,0 +1,69 @@ |
||||
/* Copyright 2018 TurboMech /u/TurboMech <discord> @A9entOran9e#6134
|
||||
* 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 V2_H |
||||
#define V2_H |
||||
|
||||
#include "../mechmini.h" |
||||
|
||||
#define KEYMAP_ORTHO( \ |
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \
|
||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \
|
||||
{ K300, K301, K302, K303, K304, K305, K305, K307, K308, K309, K310, K311 } \
|
||||
} |
||||
|
||||
#define KEYMAP_625_SPACE( \ |
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K111, \
|
||||
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \
|
||||
K300, K301, K302, K306, K310, K311 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, KC_NO, K111 }, \
|
||||
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \
|
||||
{ K300, K301, K302, KC_NO, KC_NO, KC_NO, K306, KC_NO, KC_NO, KC_NO, K310, K311 } \
|
||||
} |
||||
|
||||
#define KEYMAP_SPLIT_SPACE( \ |
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K111, \
|
||||
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \
|
||||
K300, K301, K302, K304, K307, K309, K310, K311 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, KC_NO, K111 }, \
|
||||
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \
|
||||
{ K300, K301, K302, KC_NO, K304, KC_NO, KC_NO, K307, KC_NO, K309, K310, K311 } \
|
||||
} |
||||
|
||||
#define KEYMAP_2U_SPACE_ORTHO( \ |
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \
|
||||
K300, K301, K302, K303, K304, K305, K307, K308, K309, K310, K311 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \
|
||||
{ K300, K301, K302, K303, K304, K305, K305, K307, K308, K309, K310, K311 } \
|
||||
} |
||||
|
||||
#endif |
Loading…
Reference in new issue