Compare commits
119 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ea7c2a434 | ||
|
|
67adc29aa3 | ||
|
|
d8eace35eb | ||
|
|
52ccd8d89f | ||
|
|
cad0e3b90c | ||
|
|
81ad6cac7e | ||
|
|
9c136e1168 | ||
|
|
2c4109394f | ||
|
|
d9c5e5870e | ||
|
|
07c6c4acb9 | ||
|
|
3ac6989cc1 | ||
|
|
aad4319b40 | ||
|
|
d28684da90 | ||
|
|
3cf179be61 | ||
|
|
ebbc372f72 | ||
|
|
9c2d776123 | ||
|
|
808ff7275e | ||
|
|
722cee3362 | ||
|
|
dc6b6c29ba | ||
|
|
84c2418817 | ||
|
|
3bd30085d8 | ||
|
|
64c957d907 | ||
|
|
9eb7b7919f | ||
|
|
103d904fab | ||
|
|
c5707708ed | ||
|
|
cd9262d7b2 | ||
|
|
6e984a8b5e | ||
|
|
2898699804 | ||
|
|
2bfac351ed | ||
|
|
2c0bc5ed6b | ||
|
|
4aaa4b3428 | ||
|
|
90046af17f | ||
|
|
27b512d9f5 | ||
|
|
9153ff59d4 | ||
|
|
ac7a9e3c66 | ||
|
|
ea47be936b | ||
|
|
5b5f452bf9 | ||
|
|
be666b2d8a | ||
|
|
d6cc90d027 | ||
|
|
3527efcbd2 | ||
|
|
3e45bc775e | ||
|
|
aff5c49ee9 | ||
|
|
7f4f0f7685 | ||
|
|
b1ed855871 | ||
|
|
563ce3f225 | ||
|
|
38e01a7480 | ||
|
|
54b572159f | ||
|
|
6f80217958 | ||
|
|
e76bf17d36 | ||
|
|
6cb2d7ba6d | ||
|
|
526bc4c7cc | ||
|
|
484c85bd0d | ||
|
|
a7b1b146d1 | ||
|
|
7b5fa4b13e | ||
|
|
c71c078dff | ||
|
|
134a69f4ad | ||
|
|
40383089d0 | ||
|
|
7f0def77a2 | ||
|
|
b7688590b8 | ||
|
|
0c0e208a36 | ||
|
|
3ddec14eb8 | ||
|
|
46b4b4407f | ||
|
|
c2390bf321 | ||
|
|
c043edd138 | ||
|
|
cc7bf108a9 | ||
|
|
bb1b441325 | ||
|
|
e2f60eba2f | ||
|
|
8443481aea | ||
|
|
d9abb833e5 | ||
|
|
2c6c483096 | ||
|
|
6b46c06018 | ||
|
|
c0859ac096 | ||
|
|
93b004c943 | ||
|
|
fbcbf44926 | ||
|
|
3744a2b641 | ||
|
|
cfba216541 | ||
|
|
0c1256e60a | ||
|
|
b7d2a9f980 | ||
|
|
ee1be3e5b5 | ||
|
|
8e0444618f | ||
|
|
de78d9e1ff | ||
|
|
08e9fc142c | ||
|
|
41dee98ec4 | ||
|
|
72d4e4bfd7 | ||
|
|
2149f3b588 | ||
|
|
33483b440c | ||
|
|
fc921a9c54 | ||
|
|
7e56c4bcb1 | ||
|
|
2c3706611f | ||
|
|
5e52eda0ca | ||
|
|
7bbd299fba | ||
|
|
ea1fe35ae7 | ||
|
|
4d98c69e02 | ||
|
|
ff8b1b9c69 | ||
|
|
af84f0ff86 | ||
|
|
f0863286cc | ||
|
|
b21c592f1e | ||
|
|
ca35647535 | ||
|
|
afd5cda4a0 | ||
|
|
30c3f3b2bd | ||
|
|
6395853148 | ||
|
|
1586548b4f | ||
|
|
29830f306f | ||
|
|
af55ef8418 | ||
|
|
374ed67e87 | ||
|
|
f3cbb7bd6e | ||
|
|
5eb8f3f6b5 | ||
|
|
b13162f7fd | ||
|
|
df33618b26 | ||
|
|
fdeec29636 | ||
|
|
40bf3a2ce9 | ||
|
|
3054c7bda0 | ||
|
|
584a7a0395 | ||
|
|
8181c8dc97 | ||
|
|
06f1901783 | ||
|
|
e59f331268 | ||
|
|
9eedaa8802 | ||
|
|
eeda99bf2e | ||
|
|
20e134e681 |
@@ -19,6 +19,7 @@ install:
|
||||
before_script:
|
||||
- avr-gcc --version
|
||||
script:
|
||||
- git rev-parse --short HEAD
|
||||
- make test:all AUTOGEN=false
|
||||
- bash util/travis_build.sh
|
||||
- bash util/travis_docs.sh
|
||||
@@ -33,7 +34,7 @@ addons:
|
||||
- diffutils
|
||||
- dos2unix
|
||||
- doxygen
|
||||
after_success:
|
||||
after_success:
|
||||
bash util/travis_compiled_push.sh
|
||||
notifications:
|
||||
webhooks:
|
||||
|
||||
@@ -21,5 +21,4 @@ COMMON_VPATH += $(QUANTUM_PATH)/keymap_extras
|
||||
COMMON_VPATH += $(QUANTUM_PATH)/audio
|
||||
COMMON_VPATH += $(QUANTUM_PATH)/process_keycode
|
||||
COMMON_VPATH += $(QUANTUM_PATH)/api
|
||||
COMMON_VPATH += $(QUANTUM_PATH)/split_common
|
||||
COMMON_VPATH += $(DRIVER_PATH)
|
||||
|
||||
@@ -115,7 +115,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
||||
endif
|
||||
|
||||
RGB_MATRIX_ENABLE ?= no
|
||||
VALID_MATRIX_TYPES := yes IS31FL3731 IS31FL3733 IS31FL3737 custom
|
||||
VALID_MATRIX_TYPES := yes IS31FL3731 IS31FL3733 custom
|
||||
ifneq ($(strip $(RGB_MATRIX_ENABLE)), no)
|
||||
ifeq ($(filter $(RGB_MATRIX_ENABLE),$(VALID_MATRIX_TYPES)),)
|
||||
$(error RGB_MATRIX_ENABLE="$(RGB_MATRIX_ENABLE)" is not a valid matrix type)
|
||||
@@ -132,26 +132,19 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3731)
|
||||
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
OPT_DEFS += -DIS31FL3731
|
||||
COMMON_VPATH += $(DRIVER_PATH)/issi
|
||||
SRC += is31fl3731.c
|
||||
SRC += i2c_master.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3733)
|
||||
OPT_DEFS += -DIS31FL3733 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
OPT_DEFS += -DIS31FL3733
|
||||
COMMON_VPATH += $(DRIVER_PATH)/issi
|
||||
SRC += is31fl3733.c
|
||||
SRC += i2c_master.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3737)
|
||||
OPT_DEFS += -DIS31FL3737 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
COMMON_VPATH += $(DRIVER_PATH)/issi
|
||||
SRC += is31fl3737.c
|
||||
SRC += i2c_master.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
|
||||
OPT_DEFS += -DTAP_DANCE_ENABLE
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
|
||||
@@ -270,14 +263,10 @@ ifneq ($(strip $(CUSTOM_MATRIX)), yes)
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
|
||||
SERIAL_BACKWARD_COMPAT := $(wildcard $(QUANTUM_DIR)/split_common/serial_backward_compatibility.h)
|
||||
ifneq ($(SERIAL_BACKWARD_COMPAT),)
|
||||
CONFIG_H += $(SERIAL_BACKWARD_COMPAT)
|
||||
# $(info CONFIG_H=$(CONFIG_H))
|
||||
endif
|
||||
OPT_DEFS += -DSPLIT_KEYBOARD
|
||||
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_flags.c \
|
||||
$(QUANTUM_DIR)/split_common/split_util.c
|
||||
QUANTUM_LIB_SRC += $(QUANTUM_DIR)/split_common/i2c.c
|
||||
QUANTUM_LIB_SRC += $(QUANTUM_DIR)/split_common/serial.c
|
||||
COMMON_VPATH += $(QUANTUM_PATH)/split_common
|
||||
endif
|
||||
|
||||
@@ -109,9 +109,9 @@ If you define these options you will disable the associated feature, which can s
|
||||
* `#define NO_ACTION_ONESHOT`
|
||||
* disable one-shot modifiers
|
||||
* `#define NO_ACTION_MACRO`
|
||||
* disable all macro handling
|
||||
* disable old style macro handling: MACRO() & action_get_macro
|
||||
* `#define NO_ACTION_FUNCTION`
|
||||
* disable the action function (deprecated)
|
||||
* disable calling of action_function() from the fn_actions array (deprecated)
|
||||
|
||||
## Features That Can Be Enabled
|
||||
|
||||
@@ -143,8 +143,11 @@ If you define these options you will enable the associated feature, which may in
|
||||
* Breaks any Tap Toggle functionality (`TT` or the One Shot Tap Toggle)
|
||||
* `#define LEADER_TIMEOUT 300`
|
||||
* how long before the leader key times out
|
||||
* If you're having issues finishing the sequence before it times out, you may need to increase the timeout setting. Or you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped.
|
||||
* `#define LEADER_PER_KEY_TIMING`
|
||||
* sets the timer for leader key chords to run on each key press rather than overall
|
||||
* `#define LEADER_KEY_STRICT_KEY_PROCESSING`
|
||||
* Disables keycode filtering for Mod-Tap and Layer-Tap keycodes. Eg, if you enable this, you would need to specify `MT(MOD_CTL, KC_A)` if you want to use `KC_A`.
|
||||
* `#define ONESHOT_TIMEOUT 300`
|
||||
* how long before oneshot times out
|
||||
* `#define ONESHOT_TAP_TOGGLE 2`
|
||||
@@ -194,8 +197,27 @@ If you define these options you will enable the associated feature, which may in
|
||||
|
||||
Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk
|
||||
|
||||
* `#define SPLIT_HAND_PIN B7`
|
||||
* For using high/low pin to determine handedness, low = right hand, high = left hand. Replace 'B7' with the pin you are using. This is optional and you can still use the EEHANDS method or MASTER_LEFT / MASTER_RIGHT defines like the stock Let's Split uses.
|
||||
### Setting Handedness
|
||||
|
||||
One thing to remember, the side that the USB port is plugged into is always the master half. The side not plugged into USB is the slave.
|
||||
|
||||
There are a few different ways to set handedness for split keyboards (listed in order of precedence):
|
||||
|
||||
1. Set `SPLIT_HAND_PIN`: Reads a pin to determine handedness. If pin is high, it's the left side, if low, the half is determined to be the right side
|
||||
2. Set `EE_HANDS` and flash `eeprom-lefthand.eep`/`eeprom-righthand.eep` to each half
|
||||
3. Set `MASTER_RIGHT`: Half that is plugged into the USB port is determined to be the master and right half (inverse of the default)
|
||||
4. Default: The side that is plugged into the USB port is the master half and is assumed to be the left half. The slave side is the right half
|
||||
|
||||
* `#define SPLIT_HAND_PIN B7`
|
||||
* For using high/low pin to determine handedness, low = right hand, high = left hand. Replace `B7` with the pin you are using. This is optional, and if you leave `SPLIT_HAND_PIN` undefined, then you can still use the EE_HANDS method or MASTER_LEFT / MASTER_RIGHT defines like the stock Let's Split uses.
|
||||
|
||||
* `#define EE_HANDS` (only works if `SPLIT_HAND_PIN` is not defined)
|
||||
* Reads the handedness value stored in the EEPROM after `eeprom-lefthand.eep`/`eeprom-righthand.eep` has been flashed to their respective halves.
|
||||
|
||||
* `#define MASTER_RIGHT`
|
||||
* Master half is defined to be the right half.
|
||||
|
||||
### Other Options
|
||||
|
||||
* `#define USE_I2C`
|
||||
* For using I2C instead of Serial (defaults to serial)
|
||||
@@ -203,6 +225,20 @@ Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in yo
|
||||
* `#define SOFT_SERIAL_PIN D0`
|
||||
* When using serial, define this. `D0` or `D1`,`D2`,`D3`,`E6`.
|
||||
|
||||
* `#define MATRIX_ROW_PINS_RIGHT { <row pins> }`
|
||||
* `#define MATRIX_COL_PINS_RIGHT { <col pins> }`
|
||||
* If you want to specify a different pinout for the right half than the left half, you can define `MATRIX_ROW_PINS_RIGHT`/`MATRIX_COL_PINS_RIGHT`. Currently, the size of `MATRIX_ROW_PINS` must be the same as `MATRIX_ROW_PINS_RIGHT` and likewise for the definition of columns.
|
||||
|
||||
* `#define SELECT_SOFT_SERIAL_SPEED <speed>` (default speed is 1)
|
||||
* Sets the protocol speed when using serial communication
|
||||
* Speeds:
|
||||
* 0: about 189kbps (Experimental only)
|
||||
* 1: about 137kbps (default)
|
||||
* 2: about 75kbps
|
||||
* 3: about 39kbps
|
||||
* 4: about 26kbps
|
||||
* 5: about 20kbps
|
||||
|
||||
# The `rules.mk` File
|
||||
|
||||
This is a [make](https://www.gnu.org/software/make/manual/make.html) file that is included by the top-level `Makefile`. It is used to set some information about the MCU that we will be compiling for as well as enabling and disabling certain features.
|
||||
|
||||
@@ -21,7 +21,7 @@ Additionally, if at least one right-handed modifier is specified in a Mod Tap or
|
||||
|
||||
# Switching and Toggling Layers
|
||||
|
||||
These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. For a detailed explanation of layers, see [Keymap Overview](keymap.md#keymap-and-layers)
|
||||
These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. For a detailed explanation of layers, see [Keymap Overview](keymap.md#keymap-and-layers) When using momentary layer switching with MO(), LM(), TT(), or LT(), make sure to leave the key on the above layers transparent or it may not work as intended.
|
||||
|
||||
* `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).)
|
||||
* `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated.
|
||||
@@ -107,23 +107,23 @@ This key would activate Left Control and Left Shift when held, and send Escape w
|
||||
|
||||
For convenience, QMK includes some Mod-Tap shortcuts to make common combinations more compact in your keymap:
|
||||
|
||||
|Key |Aliases |Description |
|
||||
|------------|---------------------------------------|-------------------------------------------------------|
|
||||
|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|
||||
|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
|
||||
|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|
||||
|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
|
||||
|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
|
||||
|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|
||||
|`LGUI_T(kc)`|`LCMD_T(kc)`, `RWIN_T(kc)`, `GUI_T(kc)`|Left GUI when held, `kc` when tapped |
|
||||
|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|
||||
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|
||||
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
|
||||
|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
|
||||
|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
|
||||
|`ALL_T(kc)` | |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
|
||||
|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|
||||
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|
||||
|Key |Aliases |Description |
|
||||
|------------|-----------------------------------------------------------------|-------------------------------------------------------|
|
||||
|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|
||||
|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
|
||||
|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|
||||
|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
|
||||
|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
|
||||
|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|
||||
|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|
||||
|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|
||||
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|
||||
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
|
||||
|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
|
||||
|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
|
||||
|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
|
||||
|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|
||||
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|
||||
|
||||
## Caveats
|
||||
|
||||
|
||||
@@ -5,10 +5,11 @@ If you've ever used Vim, you know what a Leader key is. If not, you're about to
|
||||
That's what `KC_LEAD` does. Here's an example:
|
||||
|
||||
1. Pick a key on your keyboard you want to use as the Leader key. Assign it the keycode `KC_LEAD`. This key would be dedicated just for this -- it's a single action key, can't be used for anything else.
|
||||
2. Include the line `#define LEADER_TIMEOUT 300` in your config.h. The 300 there is 300ms -- that's how long you have for the sequence of keys following the leader. You can tweak this value for comfort, of course.
|
||||
3. Within your `matrix_scan_user` function, do something like this:
|
||||
2. Include the line `#define LEADER_TIMEOUT 300` in your `config.h`. This sets the timeout for the `KC_LEAD` key. Specifically, when you press the `KC_LEAD` key, you only have a certain amount of time to complete the Leader Key sequence. The `300` here sets that to 300ms, and you can increase this value to give you more time to hit the sequence. But any keys pressed during this timeout are intercepted and not sent, so you may want to keep this value low. .
|
||||
* By default, this timeout is how long after pressing `KC_LEAD` to complete your entire sequence. This may be very low for some people. So you may want to increase this timeout. Optionally, you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped. This allows you to maintain a low value here, but still be able to use the longer sequences. To enable this option, add `#define LEADER_PER_KEY_TIMING` to your `config.h`.
|
||||
3. Within your `matrix_scan_user` function, add something like this:
|
||||
|
||||
```
|
||||
```c
|
||||
LEADER_EXTERNS();
|
||||
|
||||
void matrix_scan_user(void) {
|
||||
@@ -44,7 +45,7 @@ Each of these accepts one or more keycodes as arguments. This is an important po
|
||||
|
||||
To add support for Leader Key you simply need to add a single line to your keymap's `rules.mk`:
|
||||
|
||||
```
|
||||
```make
|
||||
LEADER_ENABLE = yes
|
||||
```
|
||||
|
||||
@@ -53,20 +54,93 @@ LEADER_ENABLE = yes
|
||||
Rather than relying on an incredibly high timeout for long leader key strings or those of us without 200wpm typing skills, we can enable per key timing to ensure that each key pressed provides us with more time to finish our stroke. This is incredibly helpful with leader key emulation of tap dance (read: multiple taps of the same key like C, C, C).
|
||||
|
||||
In order to enable this, place this in your `config.h`:
|
||||
```
|
||||
```c
|
||||
#define LEADER_PER_KEY_TIMING
|
||||
```
|
||||
|
||||
After this, it's recommended that you lower your `LEADER_TIMEOUT` to something less that 300ms.
|
||||
|
||||
```
|
||||
```c
|
||||
#define LEADER_TIMEOUT 250
|
||||
```
|
||||
|
||||
Now, something like this won't seem impossible to do without a 1000MS leader key timeout:
|
||||
|
||||
```
|
||||
```c
|
||||
SEQ_THREE_KEYS(KC_C, KC_C, KC_C) {
|
||||
SEND_STRING("Per key timing is great!!!");
|
||||
}
|
||||
```
|
||||
|
||||
## Strict Key Processing
|
||||
|
||||
By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](feature_advanced_keycodes.md#mod-tap) and [`Layer Tap`](feature_advanced_keycodes.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users.
|
||||
|
||||
While, this may be fine for most, if you want to specify the whole keycode (eg, `LT(3, KC_A)` from the example above) in the sequence, you can enable this by added `#define LEADER_KEY_STRICT_KEY_PROCESSING` to your `config.h` file. This well then disable the filtering, and you'll need to specify the whole keycode.
|
||||
|
||||
## Customization
|
||||
|
||||
The Leader Key feature has some additional customization to how the Leader Key feature works. It has two functions that can be called at certain parts of the process. Namely `leader_start()` and `leader_end()`.
|
||||
|
||||
The `leader_start()` function is called when you tap the `KC_LEAD` key, and the `leader_end()` function is called when either the leader sequence is completed, or the leader timeout is hit.
|
||||
|
||||
You can add these functions to your code (`keymap.c` usually) to add feedback to the Leader sequences (such as beeping or playing music).
|
||||
|
||||
```c
|
||||
void leader_start(void) {
|
||||
// sequence started
|
||||
}
|
||||
|
||||
void leader_end(void) {
|
||||
// sequence ended (no success/failuer detection)
|
||||
}
|
||||
```
|
||||
|
||||
### Example
|
||||
|
||||
This example will play the Mario "One Up" sound when you hit `KC_LEAD` to start the Leader Sequence, and will play "All Star" if it completes successfully or "Rick Roll" you if it fails.
|
||||
|
||||
```c
|
||||
bool did_leader_succeed;
|
||||
#ifdef AUDIO_ENABLE
|
||||
float leader_start[][2] = SONG(ONE_UP_SOUND );
|
||||
float leader_succeed[][2] = SONG(ALL_STAR);
|
||||
float leader_fail[][2] = SONG(RICK_ROLL);
|
||||
#endif
|
||||
LEADER_EXTERNS();
|
||||
|
||||
void matrix_scan_user(void) {
|
||||
LEADER_DICTIONARY() {
|
||||
did_leader_succeed = leading = false;
|
||||
|
||||
SEQ_ONE_KEY(KC_E) {
|
||||
// Anything you can do in a macro.
|
||||
SEND_STRING(SS_LCTRL(SS_LSFT("t")));
|
||||
did_leader_succeed = true;
|
||||
} else
|
||||
SEQ_TWO_KEYS(KC_E, KC_D) {
|
||||
SEND_STRING(SS_LGUI("r")"cmd"SS_TAP(KC_ENTER)SS_LCTRL("c"));
|
||||
did_leader_succeed = true;
|
||||
}
|
||||
leader_end();
|
||||
}
|
||||
}
|
||||
|
||||
void leader_start(void) {
|
||||
#ifdef AUDIO_ENABLE
|
||||
PLAY_SONG(leader_start);
|
||||
#endif
|
||||
}
|
||||
|
||||
void leader_end(void) {
|
||||
if (did_leader_succeed) {
|
||||
#ifdef AUDIO_ENABLE
|
||||
PLAY_SONG(leader_succeed);
|
||||
#endif
|
||||
} else {
|
||||
#ifdef AUDIO_ENABLE
|
||||
PLAY_SONG(leader_fail);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -1,94 +1,154 @@
|
||||
# Unicode Support
|
||||
|
||||
There are three Unicode keymap definition method available in QMK:
|
||||
There are three Unicode keymap definition methods available in QMK:
|
||||
|
||||
## UNICODE_ENABLE
|
||||
## `UNICODE_ENABLE`
|
||||
|
||||
Supports Unicode input up to 0xFFFF. The keycode function is `UC(n)` in keymap file, where *n* is a 4 digit hexadecimal.
|
||||
Supports Unicode up to `0x7FFF`. This covers characters for most modern languages, as well as symbols, but it doesn't cover emoji. The keycode function is `UC(c)` in the keymap file, where _c_ is the code point's number (preferably hexadecimal, up to 4 digits long). For example: `UC(0x45B)`, `UC(0x30C4)`.
|
||||
|
||||
## UNICODEMAP_ENABLE
|
||||
## `UNICODEMAP_ENABLE`
|
||||
|
||||
Supports Unicode up to 0xFFFFFFFF. You need to maintain a separate mapping table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file. The keycode function is `X(n)` where *n* is the array index of the mapping table.
|
||||
Supports Unicode up to `0x10FFFF` (all possible code points). You need to maintain a separate mapping table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file. The keycode function is `X(i)`, where _i_ is an array index into the mapping table. The table may contain at most 1024 entries.
|
||||
|
||||
And you may want to have an enum to make reference easier. So you'd want to add something like this to your keymap:
|
||||
You may want to have an enum to make referencing easier. So, you could add something like this to your keymap file:
|
||||
|
||||
```c
|
||||
enum unicode_name {
|
||||
BANG, // ‽
|
||||
IRONY, // ⸮
|
||||
SNEK // snke 🐍
|
||||
enum unicode_names {
|
||||
BANG,
|
||||
IRONY,
|
||||
SNEK,
|
||||
};
|
||||
|
||||
const uint32_t PROGMEM unicode_map[] = {
|
||||
[BANG] = 0x0203D, // ‽
|
||||
[IRONY] = 0x02E2E, // ⸮
|
||||
[SNEK] = 0x1F40D // snke 🐍
|
||||
}:
|
||||
[BANG] = 0x203D, // ‽
|
||||
[IRONY] = 0x2E2E, // ⸮
|
||||
[SNEK] = 0x1F40D, // 🐍
|
||||
};
|
||||
```
|
||||
|
||||
Make sure that the order for both matches.
|
||||
Then you can use `X(BANG)` etc. in your keymap.
|
||||
|
||||
## UCIS_ENABLE
|
||||
## `UCIS_ENABLE`
|
||||
|
||||
Supports Unicode up to 0xFFFFFFFF. As with `UNICODE_MAP`, you may want to maintain a mapping table in your keymap file. However, there is no keycodes for this feature, you will have to add a keycode or function to call `qk_ucis_start()`. Once you've run that, you can just type the text for your unicode, and then hit space or enter to complete it, or ESC to cancel it. And if it matches an entry in your table, it will automatically "backspace" the trigger word (from your table) and then will input the unicode sequence.
|
||||
Supports Unicode up to `0x10FFFF` (all possible code points). As with `UNICODEMAP`, you need to maintain a mapping table in your keymap file. However, there are no built-in keycodes for this feature — you will have to add a keycode or function that calls `qk_ucis_start()`. Once this function's been called, you can type the corresponding mnemonic for your character, then hit Space or Enter to complete it, or Esc to cancel. If the mnemonic matches an entry in your table, the typed text will automatically be erased and the corresponding Unicode character inserted.
|
||||
|
||||
For instance, you would need to have a table like this in your keymap:
|
||||
For instance, you would define a table like this in your keymap file:
|
||||
|
||||
```c
|
||||
const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE
|
||||
(
|
||||
UCIS_SYM("poop", 0x1f4a9),
|
||||
UCIS_SYM("rofl", 0x1f923),
|
||||
UCIS_SYM("kiss", 0x1f619)
|
||||
const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE(
|
||||
UCIS_SYM("poop", 0x1F4A9), // 💩
|
||||
UCIS_SYM("rofl", 0x1F923), // 🤣
|
||||
UCIS_SYM("kiss", 0x1F619) // 😙
|
||||
);
|
||||
```
|
||||
|
||||
You run the function, and then type "rofl" and hit enter, it should backspace remove "rofl" and input the `0x1f923` unicode.
|
||||
You call `qk_ucis_start()`, then type "rofl" and hit Enter. QMK should erase the "rofl" text and input the laughing emoji.
|
||||
|
||||
### Customization
|
||||
|
||||
There are several functions that you can add to your keymap to customize the functionality of this feature.
|
||||
There are several functions that you can define in your keymap to customize the functionality of this feature.
|
||||
|
||||
* `void qk_ucis_start_user(void)` - This runs when you run the "start" function, and can be used to provide feedback. By default, it types out a keyboard emoji.
|
||||
* `void qk_ucis_success(uint8_t symbol_index)` - This runs when the unicode input has matched something, and has completed. Default doesn't do anything.
|
||||
* `void qk_ucis_symbol_fallback (void)` - This runs if the input text doesn't match anything. The default function falls back to trying that input as a unicode code.
|
||||
* `void qk_ucis_start_user(void)` – This runs when you call the "start" function, and can be used to provide feedback. By default, it types out a keyboard emoji.
|
||||
* `void qk_ucis_success(uint8_t symbol_index)` – This runs when the input has matched something and has completed. By default, it doesn't do anything.
|
||||
* `void qk_ucis_symbol_fallback (void)` – This runs when the input doesn't match anything. By default, it falls back to trying that input as a Unicode code.
|
||||
|
||||
The default code for these are:
|
||||
You can find the default implementations of these functions in [`process_ucis.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_ucis.c).
|
||||
|
||||
## Input Modes
|
||||
|
||||
Unicode input in QMK works by inputting a sequence of characters to the OS, sort of like a macro. Unfortunately, the way this is done differs for each platform. Specifically, each platform requires a different combination of keys to trigger Unicode input. Therefore, a corresponding input mode has to be set in QMK.
|
||||
|
||||
The following input modes are available:
|
||||
|
||||
* **`UC_OSX`**: Mac OS X built-in Unicode hex input. Supports code points up to `0xFFFF` (`0x10FFFF` with `UNICODEMAP`).
|
||||
|
||||
To enable, go to _System Preferences > Keyboard > Input Sources_, add _Unicode Hex Input_ to the list (it's under _Other_), then activate it from the input dropdown in the Menu Bar.
|
||||
By default, this mode uses the left Option key (`KC_LALT`), but this can be changed by defining [`UNICODE_OSX_KEY`](#input-key-configuration) with another keycode.
|
||||
|
||||
* **`UC_LNX`**: Linux built-in IBus Unicode input. Supports code points up to `0x10FFFF` (all possible code points).
|
||||
|
||||
Enabled by default and works almost anywhere on IBus-enabled distros. Without IBus, this mode works under GTK apps, but rarely anywhere else.
|
||||
|
||||
* **`UC_WIN`**: _(not recommended)_ Windows built-in hex numpad Unicode input. Supports code points up to `0xFFFF`.
|
||||
|
||||
To enable, create a registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad` and set its value to `1`. This can be done from the Command Prompt by running `reg add "HKCU\Control Panel\Input Method" -v EnableHexNumpad -t REG_SZ -d 1` with administrator privileges. Afterwards, reboot.
|
||||
This mode is not recommended because of reliability and compatibility issues; use the `UC_WINC` mode instead.
|
||||
|
||||
* **`UC_BSD`**: _(non implemented)_ Unicode input under BSD. Not implemented at this time. If you're a BSD user and want to help add support for it, please [open an issue on GitHub](https://github.com/qmk/qmk_firmware/issues).
|
||||
|
||||
* **`UC_WINC`**: Windows Unicode input using [WinCompose](https://github.com/samhocevar/wincompose). As of v0.8.2, supports code points up to `0xFFFFF` (all currently assigned code points).
|
||||
|
||||
To enable, install the [latest release](https://github.com/samhocevar/wincompose/releases/latest). Once installed, WinCompose will automatically run on startup. Works reliably under all version of Windows supported by the app.
|
||||
By default, this mode uses the right Alt key (`KC_RALT`), but this can be changed in the WinCompose settings and by defining [`UNICODE_WINC_KEY`](#input-key-configuration) with another keycode.
|
||||
|
||||
### Switching Input Modes
|
||||
|
||||
There are two ways to set the input mode for Unicode: by keycode or by function. Keep in mind that both methods write to persistent storage (EEPROM), and are loaded each time the keyboard starts. So once you've set it the first time, you don't need to set it again unless you want to change it, or you've reset the EEPROM settings.
|
||||
|
||||
You can switch the input mode at any time by using one of the following keycodes. The easiest way is to add the ones you use to your keymap.
|
||||
|
||||
|Keycode |Alias |Input mode |Description |
|
||||
|-----------------------|---------|-------------|-----------------------------------------|
|
||||
|`UNICODE_MODE_FORWARD` |`UC_MOD` | |Cycles forwards through the available modes. [(Disabled by default)](#input-method-cycling)|
|
||||
|`UNICODE_MODE_REVERSE` |`UC_RMOD`| |Cycles forwards through the available modes. [(Disabled by default)](#input-method-cycling)|
|
||||
|`UNICODE_MODE_OSX` |`UC_M_OS`|`UC_OSX` |Switch to Mac OS X input. |
|
||||
|`UNICODE_MODE_LNX` |`UC_M_LN`|`UC_LNX` |Switch to Linux input. |
|
||||
|`UNICODE_MODE_WIN` |`UC_M_WI`|`UC_WIN` |Switch to Windows input. |
|
||||
|`UNICODE_MODE_BSD` |`UC_M_BS`|`UC_BSD` |Switch to BSD input (not implemented). |
|
||||
|`UNICODE_MODE_WINC` |`UC_M_WC`|`UC_WINC` |Switch to Windows input using WinCompose.|
|
||||
|
||||
You can also switch the input mode by calling `set_unicode_input_mode(x)` in your code, where _x_ is one of the above input mode constants (e.g. `UC_LNX`). Since the function only needs to be called once, it's recommended that you do it in `eeconfig_init_user` (or a similar function). For example:
|
||||
|
||||
```c
|
||||
void qk_ucis_start_user(void) { // outputs keyboard emoji
|
||||
unicode_input_start();
|
||||
register_hex(0x2328);
|
||||
unicode_input_finish();
|
||||
}
|
||||
|
||||
void qk_ucis_success(uint8_t symbol_index) {
|
||||
}
|
||||
|
||||
void qk_ucis_symbol_fallback (void) { // falls back to manual unicode entry
|
||||
for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) {
|
||||
uint8_t code = qk_ucis_state.codes[i];
|
||||
register_code(code);
|
||||
unregister_code(code);
|
||||
wait_ms(UNICODE_TYPE_DELAY);
|
||||
}
|
||||
void eeconfig_init_user(void) {
|
||||
set_unicode_input_mode(UC_LNX);
|
||||
}
|
||||
```
|
||||
|
||||
## Unicode Input methods
|
||||
### Audio Feedback
|
||||
|
||||
Unicode input in QMK works by inputting a sequence of characters to the OS,
|
||||
sort of like macro. Unfortunately, each OS has different ideas on how Unicode is input.
|
||||
If you have the [Audio feature](feature_audio.md) enabled on the board, you can set melodies to be played when you press the above keys. That way you can have some audio feedback when switching input modes.
|
||||
|
||||
This is the current list of Unicode input method in QMK:
|
||||
For instance, you can add these definitions to your `config.h` file:
|
||||
|
||||
* __UC_OSX__: MacOS Unicode Hex Input support. Works only up to 0xFFFF. Disabled by default. To enable: go to System Preferences -> Keyboard -> Input Sources, and enable Unicode Hex.
|
||||
* __UC_OSX_RALT__: Same as UC_OSX, but sends the Right Alt key for unicode input
|
||||
* __UC_LNX__: Unicode input method under Linux. Works up to 0xFFFFF. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else.
|
||||
* __UC_WIN__: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead.
|
||||
* __UC_WINC__: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows.
|
||||
```c
|
||||
#define UNICODE_SONG_OSX COIN_SOUND
|
||||
#define UNICODE_SONG_LNX UNICODE_LINUX
|
||||
#define UNICODE_SONG_BSD MARIO_GAMEOVER
|
||||
#define UNICODE_SONG_WIN UNICODE_WINDOWS
|
||||
#define UNICODE_SONG_WINC UNICODE_WINDOWS
|
||||
```
|
||||
|
||||
At some point, you need to call `set_unicode_input_mode(x)` to set the correct unicode method. This sets the method that is used to send the unicode, and stores it in EEPROM, so you only need to call this once.
|
||||
### Additional Customization
|
||||
|
||||
Because Unicode is such a large and variable feature, there are a number of options that you can customize to work better on your system.
|
||||
|
||||
#### Start and Finish input functions
|
||||
|
||||
The functions for starting and finishing Unicode input on your platform can be overridden locally. Possible uses include customizing input mode behavior if you don't use the default keys, or adding extra visual/audio feedback to Unicode input.
|
||||
|
||||
* `void unicode_input_start(void)` – This sends the initial sequence that tells your platform to enter Unicode input mode. For example, it presses Ctrl+Shift+U on Linux and holds the Option key on Mac.
|
||||
* `void unicode_input_finish(void)` – This is called to exit Unicode input mode, for example by pressing Space or releasing the Option key.
|
||||
|
||||
You can find the default implementations of these functions in [`process_unicode_common.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_unicode_common.c).
|
||||
|
||||
|
||||
#### Input Key Configuration
|
||||
|
||||
Additionally, you can customize the keys used to trigger the unicode input for macOS and WinCompose by adding defines to your `config.h`
|
||||
|
||||
```c
|
||||
#define UNICODE_OSX_KEY KC_LALT
|
||||
#define UNICODE_WINC_KEY KC_RALT
|
||||
```
|
||||
|
||||
#### Input Method Cycling
|
||||
|
||||
Also, you can choose which input methods are availble for cycling through. By default, this is disabled. But if you want to enabled it, then limiting it to just those modes makes sense. Note that `UNICODE_SELECTED_MODES` define is comma delimited.
|
||||
|
||||
```c
|
||||
#define UNICODE_SELECTED_MODES UC_OSX, UC_LNX, UC_WIN, UC_BSD, UC_WINC
|
||||
```
|
||||
|
||||
## `send_unicode_hex_string`
|
||||
|
||||
|
||||
@@ -41,6 +41,12 @@ Debian / Ubuntu example:
|
||||
Fedora / Red Hat example:
|
||||
|
||||
sudo dnf install gcc unzip wget zip dfu-util dfu-programmer avr-gcc avr-libc binutils-avr32-linux-gnu arm-none-eabi-gcc-cs arm-none-eabi-binutils-cs arm-none-eabi-newlib
|
||||
|
||||
Arch / Manjaro example:
|
||||
|
||||
pacman -S base-devel gcc unzip wget zip avr-gcc avr-binutils avr-libc dfu-util arm-none-eabi-gcc arm-none-eabi-binutils arm-none-eabi-newlib git
|
||||
|
||||
(the `dfu-programmer` package is availble on AUR only so you should download from there or use an AUR helper)
|
||||
|
||||
## Nix
|
||||
|
||||
|
||||
@@ -93,19 +93,17 @@ This enables MIDI sending and receiving with your keyboard. To enter MIDI send m
|
||||
|
||||
`UNICODE_ENABLE`
|
||||
|
||||
This allows you to send unicode symbols via `UC(<unicode>)` in your keymap. Only codes up to 0x7FFF are currently supported.
|
||||
This allows you to send Unicode characters using `UC(<code point>)` in your keymap. Code points up to `0x7FFF` are supported. This covers characters for most modern languages, as well as symbols, but it doesn't cover emoji.
|
||||
|
||||
`UNICODEMAP_ENABLE`
|
||||
|
||||
This allows sending unicode symbols using `X(<unicode>)` in your keymap. Codes
|
||||
up to 0xFFFFFFFF are supported, including emojis. You will need to maintain
|
||||
a separate mapping table in your keymap file.
|
||||
This allows you to send Unicode characters using `X(<map index>)` in your keymap. You will need to maintain a mapping table in your keymap file. All possible code points (up to `0x10FFFF`) are supported.
|
||||
|
||||
Known limitations:
|
||||
- Under Mac OS, only codes up to 0xFFFF are supported.
|
||||
- Under Linux ibus, only codes up to 0xFFFFF are supported (but anything important is still under this limit for now).
|
||||
`UCIS_ENABLE`
|
||||
|
||||
Characters out of range supported by the OS will be ignored.
|
||||
This allows you to send Unicode characters by inputting a mnemonic corresponding to the character you want to send. You will need to maintain a mapping table in your keymap file. All possible code points (up to `0x10FFFF`) are supported.
|
||||
|
||||
For further details, as well as limitations, see the [Unicode page](feature_unicode.md).
|
||||
|
||||
`BLUETOOTH_ENABLE`
|
||||
|
||||
@@ -117,7 +115,7 @@ This allows you output audio on the C6 pin (needs abstracting). See the [audio p
|
||||
|
||||
`FAUXCLICKY_ENABLE`
|
||||
|
||||
Uses buzzer to emulate clicky switches. A cheap imitation of the Cherry blue switches. By default, uses the C6 pin, same as AUDIO_ENABLE.
|
||||
Uses buzzer to emulate clicky switches. A cheap imitation of the Cherry blue switches. By default, uses the C6 pin, same as `AUDIO_ENABLE`.
|
||||
|
||||
`VARIABLE_TRACE`
|
||||
|
||||
|
||||
@@ -342,23 +342,23 @@ This is a reference only. Each group of keys links to the page documenting their
|
||||
|
||||
## [Mod-Tap Keys](feature_advanced_keycodes.md#mod-tap)
|
||||
|
||||
|Key |Aliases |Description |
|
||||
|------------|---------------------------------------|-------------------------------------------------------|
|
||||
|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|
||||
|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
|
||||
|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|
||||
|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
|
||||
|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
|
||||
|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|
||||
|`LGUI_T(kc)`|`LCMD_T(kc)`, `RWIN_T(kc)`, `GUI_T(kc)`|Left GUI when held, `kc` when tapped |
|
||||
|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|
||||
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|
||||
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
|
||||
|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
|
||||
|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
|
||||
|`ALL_T(kc)` | |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
|
||||
|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|
||||
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|
||||
|Key |Aliases |Description |
|
||||
|------------|-----------------------------------------------------------------|-------------------------------------------------------|
|
||||
|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|
||||
|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
|
||||
|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|
||||
|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
|
||||
|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
|
||||
|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|
||||
|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|
||||
|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|
||||
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|
||||
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
|
||||
|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
|
||||
|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
|
||||
|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
|
||||
|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|
||||
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|
||||
|
||||
## [RGB Lighting](feature_rgblight.md)
|
||||
|
||||
@@ -454,7 +454,7 @@ This is a reference only. Each group of keys links to the page documenting their
|
||||
|
||||
## [Unicode Support](feature_unicode.md)
|
||||
|
||||
|Key |Aliases| |
|
||||
|------------|-------|-------------------------------------------------|
|
||||
|`UNICODE(n)`|`UC(n)`|Send Unicode character `n` |
|
||||
|`X(n)` | |Send Unicode character `n` via a different method|
|
||||
|Key |Description |
|
||||
|-------|---------------------------------------------------------------------------|
|
||||
|`UC(c)`|Send Unicode code point `c` (`UNICODE_ENABLE`) |
|
||||
|`X(i)` |Send Unicode code point at index `i` in `unicode_map` (`UNICODEMAP_ENABLE`)|
|
||||
|
||||
@@ -12,7 +12,7 @@ You can think of QMK as no different from any other computer program. It is star
|
||||
|
||||
The reason for this is the different platforms that QMK supports. The most common platform is `lufa`, which runs on AVR processors such at the atmega32u4. We also support `chibios` and `vusb`.
|
||||
|
||||
We'll focus on AVR processors for the moment, which use the `lufa` platform. You can find the `main()` function in [tmk_core/protocol/lufa/lufa.c](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/tmk_core/protocol/lufa/lufa.c#L1019). If you browse through that function you'll find that it initializes any hardware that has been configured (including USB to the host) and then it starts the core part of the program with a [`while(1)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/tmk_core/protocol/lufa/lufa.c#L1060). This is [The Main Loop](#the-main-loop).
|
||||
We'll focus on AVR processors for the moment, which use the `lufa` platform. You can find the `main()` function in [tmk_core/protocol/lufa/lufa.c](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/protocol/lufa/lufa.c#L1028). If you browse through that function you'll find that it initializes any hardware that has been configured (including USB to the host) and then it starts the core part of the program with a [`while(1)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/protocol/lufa/lufa.c#L1069). This is [The Main Loop](#the-main-loop).
|
||||
|
||||
## The Main Loop
|
||||
|
||||
@@ -22,7 +22,7 @@ This section of code is called "The Main Loop" because it's responsible for loop
|
||||
keyboard_task();
|
||||
```
|
||||
|
||||
This is where all the keyboard specific functionality is dispatched. The source code for `keyboard_task()` can be found in [tmk_core/common/keyboard.c](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/tmk_core/common/keyboard.c#L206), and it is responsible for detecting changes in the matrix and turning status LED's on and off.
|
||||
This is where all the keyboard specific functionality is dispatched. The source code for `keyboard_task()` can be found in [tmk_core/common/keyboard.c](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/common/keyboard.c#L216), and it is responsible for detecting changes in the matrix and turning status LED's on and off.
|
||||
|
||||
Within `keyboard_task()` you'll find code to handle:
|
||||
|
||||
@@ -77,7 +77,7 @@ At the keyboard level we define a C macro (typically named `KEYMAP()`) which map
|
||||
|
||||
Notice how the second block of our `KEYMAP()` macro matches the Matrix Scanning array above? This macro is what will map the matrix scanning array to keycodes. However, if you look at a 17 key numpad you'll notice that it has 3 places where the matrix could have a switch but doesn't, due to larger keys. We have populated those spaces with `KC_NO` so that our keymap definition doesn't have to.
|
||||
|
||||
You can also use this macro to handle unusual matrix layouts, for example the [Clueboard rev 2](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/keyboards/clueboard/66/rev2/rev2.h). Explaining that is outside the scope of this document.
|
||||
You can also use this macro to handle unusual matrix layouts, for example the [Clueboard rev 2](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/66/rev2/rev2.h). Explaining that is outside the scope of this document.
|
||||
|
||||
##### Keycode Assignment
|
||||
|
||||
@@ -130,31 +130,33 @@ Comparing against our keymap we can see that the pressed key is KC_NLCK. From he
|
||||
|
||||
##### Process Record
|
||||
|
||||
The `process_record()` function itself is deceptively simple, but hidden within is a gateway to overriding functionality at various levels of QMK. The chain of events is listed below, using cluecard whenever we need to look at the keyboard/keymap level functions. Depending on options set in rule.mk or elsewhere, only a subset of the functions below will be included in final firmware.
|
||||
The `process_record()` function itself is deceptively simple, but hidden within is a gateway to overriding functionality at various levels of QMK. The chain of events is listed below, using cluecard whenever we need to look at the keyboard/keymap level functions. Depending on options set in `rules.mk` or elsewhere, only a subset of the functions below will be included in final firmware.
|
||||
|
||||
* [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/tmk_core/common/action.c#L172)
|
||||
* [`bool process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/quantum.c#L193)
|
||||
* [Map this record to a keycode](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/quantum.c#L213)
|
||||
* [`void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/process_keycode/process_tap_dance.c#L115)
|
||||
* [`bool process_key_lock(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/process_keycode/process_key_lock.c#L62)
|
||||
* [`bool process_clicky(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/process_keycode/process_clicky.c#L44)
|
||||
* [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/keyboards/clueboard/card/card.c#L20)
|
||||
* [`bool process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/keyboards/clueboard/card/keymaps/default/keymap.c#L58)
|
||||
* [`bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/fdd0f915271f79b104aa5d216566bcc3fd134e85/quantum/rgb_matrix.c#L139)
|
||||
* [`bool process_midi(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_midi.c#L81)
|
||||
* [`bool process_audio(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_audio.c#L19)
|
||||
* [`bool process_steno(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_steno.c#L160)
|
||||
* [`bool process_music(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_music.c#L114)
|
||||
* [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_tap_dance.c#L136)
|
||||
* [`bool process_leader(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_leader.c#L38)
|
||||
* [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_combo.c#L115)
|
||||
* [`bool process_unicode(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_unicode.c#L22)
|
||||
* [`bool process_ucis(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_ucis.c#L91)
|
||||
* [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_printer.c#L77)
|
||||
* [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_auto_shift.c#L94)
|
||||
* [`bool process_unicode_map(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_unicodemap.c#L47)
|
||||
* [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_terminal.c#L264)
|
||||
* [Identify and process quantum specific keycodes](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/quantum.c#L287)
|
||||
* [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/common/action.c#L172)
|
||||
* [`bool process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L206)
|
||||
* [Map this record to a keycode](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L226)
|
||||
* [`void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_tap_dance.c#L119)
|
||||
* [`bool process_key_lock(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_key_lock.c#L62)
|
||||
* [`bool process_clicky(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_clicky.c#L79)
|
||||
* [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/card.c#L20)
|
||||
* [`bool process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/keymaps/default/keymap.c#L58)
|
||||
* [`bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/rgb_matrix.c#L139)
|
||||
* [`bool process_midi(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_midi.c#L81)
|
||||
* [`bool process_audio(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_audio.c#L19)
|
||||
* [`bool process_steno(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_steno.c#L160)
|
||||
* [`bool process_music(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_music.c#L114)
|
||||
* [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_tap_dance.c#L141)
|
||||
* [`bool process_unicode_common(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicode_common.c#L169)
|
||||
calls one of:
|
||||
* [`bool process_unicode(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicode.c#L20)
|
||||
* [`bool process_unicodemap(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicodemap.c#L46)
|
||||
* [`bool process_ucis(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_ucis.c#L95)
|
||||
* [`bool process_leader(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_leader.c#L51)
|
||||
* [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_combo.c#L115)
|
||||
* [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_printer.c#L77)
|
||||
* [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_auto_shift.c#L94)
|
||||
* [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_terminal.c#L264)
|
||||
* [Identify and process Quantum-specific keycodes](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291)
|
||||
|
||||
At any step during this chain of events a function (such as `process_record_kb()`) can `return false` to halt all further processing.
|
||||
|
||||
|
||||
@@ -45,16 +45,14 @@ static const I2CConfig i2cconfig = {
|
||||
__attribute__ ((weak))
|
||||
void i2c_init(void)
|
||||
{
|
||||
//palSetGroupMode(GPIOB, GPIOB_PIN6 | GPIOB_PIN7, 0, PAL_MODE_INPUT);
|
||||
|
||||
// Try releasing special pins for a short time
|
||||
palSetPadMode(GPIOB, 6, PAL_MODE_INPUT);
|
||||
palSetPadMode(GPIOB, 7, PAL_MODE_INPUT);
|
||||
|
||||
chThdSleepMilliseconds(10);
|
||||
|
||||
palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP);
|
||||
palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP);
|
||||
palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN);
|
||||
palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN);
|
||||
|
||||
//i2cInit(); //This is invoked by halInit() so no need to redo it.
|
||||
}
|
||||
|
||||
@@ -179,6 +179,9 @@ i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16
|
||||
status = i2c_write(regaddr, timeout);
|
||||
if (status) return status;
|
||||
|
||||
status = i2c_stop(timeout);
|
||||
if (status) return status;
|
||||
|
||||
status = i2c_start(devaddr | 0x01, timeout);
|
||||
if (status) return status;
|
||||
|
||||
@@ -217,4 +220,4 @@ i2c_status_t i2c_stop(uint16_t timeout)
|
||||
}
|
||||
|
||||
return I2C_STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,10 +24,10 @@
|
||||
#include "wait.h"
|
||||
#endif
|
||||
|
||||
#include "is31fl3733.h"
|
||||
#include <string.h>
|
||||
#include "i2c_master.h"
|
||||
#include "progmem.h"
|
||||
#include "rgb_matrix.h"
|
||||
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
// set to 0 for write, 1 for read (as per I2C protocol)
|
||||
|
||||
@@ -1,252 +0,0 @@
|
||||
/* Copyright 2017 Jason Williams
|
||||
* Copyright 2018 Jack Humbert
|
||||
* Copyright 2018 Yiancar
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
#ifdef __AVR__
|
||||
#include <avr/interrupt.h>
|
||||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
#else
|
||||
#include "wait.h"
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include "i2c_master.h"
|
||||
#include "progmem.h"
|
||||
#include "rgb_matrix.h"
|
||||
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
// set to 0 for write, 1 for read (as per I2C protocol)
|
||||
// The address will vary depending on your wiring:
|
||||
// 00 <-> GND
|
||||
// 01 <-> SCL
|
||||
// 10 <-> SDA
|
||||
// 11 <-> VCC
|
||||
// ADDR1 represents A1:A0 of the 7-bit address.
|
||||
// ADDR2 represents A3:A2 of the 7-bit address.
|
||||
// The result is: 0b101(ADDR2)(ADDR1)
|
||||
#define ISSI_ADDR_DEFAULT 0x50
|
||||
|
||||
#define ISSI_COMMANDREGISTER 0xFD
|
||||
#define ISSI_COMMANDREGISTER_WRITELOCK 0xFE
|
||||
#define ISSI_INTERRUPTMASKREGISTER 0xF0
|
||||
#define ISSI_INTERRUPTSTATUSREGISTER 0xF1
|
||||
|
||||
#define ISSI_PAGE_LEDCONTROL 0x00 //PG0
|
||||
#define ISSI_PAGE_PWM 0x01 //PG1
|
||||
#define ISSI_PAGE_AUTOBREATH 0x02 //PG2
|
||||
#define ISSI_PAGE_FUNCTION 0x03 //PG3
|
||||
|
||||
#define ISSI_REG_CONFIGURATION 0x00 //PG3
|
||||
#define ISSI_REG_GLOBALCURRENT 0x01 //PG3
|
||||
#define ISSI_REG_RESET 0x11// PG3
|
||||
#define ISSI_REG_SWPULLUP 0x0F //PG3
|
||||
#define ISSI_REG_CSPULLUP 0x10 //PG3
|
||||
|
||||
#ifndef ISSI_TIMEOUT
|
||||
#define ISSI_TIMEOUT 100
|
||||
#endif
|
||||
|
||||
#ifndef ISSI_PERSISTENCE
|
||||
#define ISSI_PERSISTENCE 0
|
||||
#endif
|
||||
|
||||
// Transfer buffer for TWITransmitData()
|
||||
uint8_t g_twi_transfer_buffer[20];
|
||||
|
||||
// These buffers match the IS31FL3737 PWM registers.
|
||||
// The control buffers match the PG0 LED On/Off registers.
|
||||
// Storing them like this is optimal for I2C transfers to the registers.
|
||||
// We could optimize this and take out the unused registers from these
|
||||
// buffers and the transfers in IS31FL3737_write_pwm_buffer() but it's
|
||||
// probably not worth the extra complexity.
|
||||
uint8_t g_pwm_buffer[DRIVER_COUNT][192];
|
||||
bool g_pwm_buffer_update_required = false;
|
||||
|
||||
uint8_t g_led_control_registers[DRIVER_COUNT][24] = { { 0 } };
|
||||
bool g_led_control_registers_update_required = false;
|
||||
|
||||
void IS31FL3737_write_register( uint8_t addr, uint8_t reg, uint8_t data )
|
||||
{
|
||||
g_twi_transfer_buffer[0] = reg;
|
||||
g_twi_transfer_buffer[1] = data;
|
||||
|
||||
#if ISSI_PERSISTENCE > 0
|
||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0)
|
||||
break;
|
||||
}
|
||||
#else
|
||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
||||
#endif
|
||||
}
|
||||
|
||||
void IS31FL3737_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer )
|
||||
{
|
||||
// assumes PG1 is already selected
|
||||
|
||||
// transmit PWM registers in 12 transfers of 16 bytes
|
||||
// g_twi_transfer_buffer[] is 20 bytes
|
||||
|
||||
// iterate over the pwm_buffer contents at 16 byte intervals
|
||||
for ( int i = 0; i < 192; i += 16 ) {
|
||||
g_twi_transfer_buffer[0] = i;
|
||||
// copy the data from i to i+15
|
||||
// device will auto-increment register for data after the first byte
|
||||
// thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer
|
||||
for ( int j = 0; j < 16; j++ ) {
|
||||
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
||||
}
|
||||
|
||||
#if ISSI_PERSISTENCE > 0
|
||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0)
|
||||
break;
|
||||
}
|
||||
#else
|
||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void IS31FL3737_init( uint8_t addr )
|
||||
{
|
||||
// In order to avoid the LEDs being driven with garbage data
|
||||
// in the LED driver's PWM registers, shutdown is enabled last.
|
||||
// Set up the mode and other settings, clear the PWM registers,
|
||||
// then disable software shutdown.
|
||||
|
||||
// Unlock the command register.
|
||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
||||
|
||||
// Select PG0
|
||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL );
|
||||
// Turn off all LEDs.
|
||||
for ( int i = 0x00; i <= 0x17; i++ )
|
||||
{
|
||||
IS31FL3737_write_register( addr, i, 0x00 );
|
||||
}
|
||||
|
||||
// Unlock the command register.
|
||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
||||
|
||||
// Select PG1
|
||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM );
|
||||
// Set PWM on all LEDs to 0
|
||||
// No need to setup Breath registers to PWM as that is the default.
|
||||
for ( int i = 0x00; i <= 0xBF; i++ )
|
||||
{
|
||||
IS31FL3737_write_register( addr, i, 0x00 );
|
||||
}
|
||||
|
||||
// Unlock the command register.
|
||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
||||
|
||||
// Select PG3
|
||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION );
|
||||
// Set global current to maximum.
|
||||
IS31FL3737_write_register( addr, ISSI_REG_GLOBALCURRENT, 0xFF );
|
||||
// Disable software shutdown.
|
||||
IS31FL3737_write_register( addr, ISSI_REG_CONFIGURATION, 0x01 );
|
||||
|
||||
// Wait 10ms to ensure the device has woken up.
|
||||
#ifdef __AVR__
|
||||
_delay_ms( 10 );
|
||||
#else
|
||||
wait_ms(10);
|
||||
#endif
|
||||
}
|
||||
|
||||
void IS31FL3737_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
||||
{
|
||||
if ( index >= 0 && index < DRIVER_LED_TOTAL ) {
|
||||
is31_led led = g_is31_leds[index];
|
||||
|
||||
g_pwm_buffer[led.driver][led.r] = red;
|
||||
g_pwm_buffer[led.driver][led.g] = green;
|
||||
g_pwm_buffer[led.driver][led.b] = blue;
|
||||
g_pwm_buffer_update_required = true;
|
||||
}
|
||||
}
|
||||
|
||||
void IS31FL3737_set_color_all( uint8_t red, uint8_t green, uint8_t blue )
|
||||
{
|
||||
for ( int i = 0; i < DRIVER_LED_TOTAL; i++ )
|
||||
{
|
||||
IS31FL3737_set_color( i, red, green, blue );
|
||||
}
|
||||
}
|
||||
|
||||
void IS31FL3737_set_led_control_register( uint8_t index, bool red, bool green, bool blue )
|
||||
{
|
||||
is31_led led = g_is31_leds[index];
|
||||
|
||||
uint8_t control_register_r = led.r / 8;
|
||||
uint8_t control_register_g = led.g / 8;
|
||||
uint8_t control_register_b = led.b / 8;
|
||||
uint8_t bit_r = led.r % 8;
|
||||
uint8_t bit_g = led.g % 8;
|
||||
uint8_t bit_b = led.b % 8;
|
||||
|
||||
if ( red ) {
|
||||
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
|
||||
} else {
|
||||
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
|
||||
}
|
||||
if ( green ) {
|
||||
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
|
||||
} else {
|
||||
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
|
||||
}
|
||||
if ( blue ) {
|
||||
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
|
||||
} else {
|
||||
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
|
||||
}
|
||||
|
||||
g_led_control_registers_update_required = true;
|
||||
|
||||
}
|
||||
|
||||
void IS31FL3737_update_pwm_buffers( uint8_t addr1, uint8_t addr2 )
|
||||
{
|
||||
if ( g_pwm_buffer_update_required )
|
||||
{
|
||||
// Firstly we need to unlock the command register and select PG1
|
||||
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
||||
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM );
|
||||
|
||||
IS31FL3737_write_pwm_buffer( addr1, g_pwm_buffer[0] );
|
||||
//IS31FL3737_write_pwm_buffer( addr2, g_pwm_buffer[1] );
|
||||
}
|
||||
g_pwm_buffer_update_required = false;
|
||||
}
|
||||
|
||||
void IS31FL3737_update_led_control_registers( uint8_t addr1, uint8_t addr2 )
|
||||
{
|
||||
if ( g_led_control_registers_update_required )
|
||||
{
|
||||
// Firstly we need to unlock the command register and select PG0
|
||||
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
||||
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL );
|
||||
for ( int i=0; i<24; i++ )
|
||||
{
|
||||
IS31FL3737_write_register(addr1, i, g_led_control_registers[0][i] );
|
||||
//IS31FL3737_write_register(addr2, i, g_led_control_registers[1][i] );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,207 +0,0 @@
|
||||
/* Copyright 2017 Jason Williams
|
||||
* Copyright 2018 Jack Humbert
|
||||
* Copyright 2018 Yiancar
|
||||
*
|
||||
* 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 IS31FL3737_DRIVER_H
|
||||
#define IS31FL3737_DRIVER_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef struct is31_led {
|
||||
uint8_t driver:2;
|
||||
uint8_t r;
|
||||
uint8_t g;
|
||||
uint8_t b;
|
||||
} __attribute__((packed)) is31_led;
|
||||
|
||||
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
|
||||
|
||||
void IS31FL3737_init( uint8_t addr );
|
||||
void IS31FL3737_write_register( uint8_t addr, uint8_t reg, uint8_t data );
|
||||
void IS31FL3737_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer );
|
||||
|
||||
void IS31FL3737_set_color( int index, uint8_t red, uint8_t green, uint8_t blue );
|
||||
void IS31FL3737_set_color_all( uint8_t red, uint8_t green, uint8_t blue );
|
||||
|
||||
void IS31FL3737_set_led_control_register( uint8_t index, bool red, bool green, bool blue );
|
||||
|
||||
// This should not be called from an interrupt
|
||||
// (eg. from a timer interrupt).
|
||||
// Call this while idle (in between matrix scans).
|
||||
// If the buffer is dirty, it will update the driver with the buffer.
|
||||
void IS31FL3737_update_pwm_buffers( uint8_t addr1, uint8_t addr2 );
|
||||
void IS31FL3737_update_led_control_registers( uint8_t addr1, uint8_t addr2 );
|
||||
|
||||
#define A_1 0x00
|
||||
#define A_2 0x01
|
||||
#define A_3 0x02
|
||||
#define A_4 0x03
|
||||
#define A_5 0x04
|
||||
#define A_6 0x05
|
||||
#define A_7 0x08
|
||||
#define A_8 0x09
|
||||
#define A_9 0x0A
|
||||
#define A_10 0x0B
|
||||
#define A_11 0x0C
|
||||
#define A_12 0x0D
|
||||
|
||||
#define B_1 0x10
|
||||
#define B_2 0x11
|
||||
#define B_3 0x12
|
||||
#define B_4 0x13
|
||||
#define B_5 0x14
|
||||
#define B_6 0x15
|
||||
#define B_7 0x18
|
||||
#define B_8 0x19
|
||||
#define B_9 0x1A
|
||||
#define B_10 0x1B
|
||||
#define B_11 0x1C
|
||||
#define B_12 0x1D
|
||||
|
||||
#define C_1 0x20
|
||||
#define C_2 0x21
|
||||
#define C_3 0x22
|
||||
#define C_4 0x23
|
||||
#define C_5 0x24
|
||||
#define C_6 0x25
|
||||
#define C_7 0x28
|
||||
#define C_8 0x29
|
||||
#define C_9 0x2A
|
||||
#define C_10 0x2B
|
||||
#define C_11 0x2C
|
||||
#define C_12 0x2D
|
||||
|
||||
#define D_1 0x30
|
||||
#define D_2 0x31
|
||||
#define D_3 0x32
|
||||
#define D_4 0x33
|
||||
#define D_5 0x34
|
||||
#define D_6 0x35
|
||||
#define D_7 0x38
|
||||
#define D_8 0x39
|
||||
#define D_9 0x3A
|
||||
#define D_10 0x3B
|
||||
#define D_11 0x3C
|
||||
#define D_12 0x3D
|
||||
|
||||
#define E_1 0x40
|
||||
#define E_2 0x41
|
||||
#define E_3 0x42
|
||||
#define E_4 0x43
|
||||
#define E_5 0x44
|
||||
#define E_6 0x45
|
||||
#define E_7 0x48
|
||||
#define E_8 0x49
|
||||
#define E_9 0x4A
|
||||
#define E_10 0x4B
|
||||
#define E_11 0x4C
|
||||
#define E_12 0x4D
|
||||
|
||||
#define F_1 0x50
|
||||
#define F_2 0x51
|
||||
#define F_3 0x52
|
||||
#define F_4 0x53
|
||||
#define F_5 0x54
|
||||
#define F_6 0x55
|
||||
#define F_7 0x58
|
||||
#define F_8 0x59
|
||||
#define F_9 0x5A
|
||||
#define F_10 0x5B
|
||||
#define F_11 0x5C
|
||||
#define F_12 0x5D
|
||||
|
||||
#define G_1 0x60
|
||||
#define G_2 0x61
|
||||
#define G_3 0x62
|
||||
#define G_4 0x63
|
||||
#define G_5 0x64
|
||||
#define G_6 0x65
|
||||
#define G_7 0x68
|
||||
#define G_8 0x69
|
||||
#define G_9 0x6A
|
||||
#define G_10 0x6B
|
||||
#define G_11 0x6C
|
||||
#define G_12 0x6D
|
||||
|
||||
#define H_1 0x70
|
||||
#define H_2 0x71
|
||||
#define H_3 0x72
|
||||
#define H_4 0x73
|
||||
#define H_5 0x74
|
||||
#define H_6 0x75
|
||||
#define H_7 0x78
|
||||
#define H_8 0x79
|
||||
#define H_9 0x7A
|
||||
#define H_10 0x7B
|
||||
#define H_11 0x7C
|
||||
#define H_12 0x7D
|
||||
|
||||
#define I_1 0x80
|
||||
#define I_2 0x81
|
||||
#define I_3 0x82
|
||||
#define I_4 0x83
|
||||
#define I_5 0x84
|
||||
#define I_6 0x85
|
||||
#define I_7 0x88
|
||||
#define I_8 0x89
|
||||
#define I_9 0x8A
|
||||
#define I_10 0x8B
|
||||
#define I_11 0x8C
|
||||
#define I_12 0x8D
|
||||
|
||||
#define J_1 0x90
|
||||
#define J_2 0x91
|
||||
#define J_3 0x92
|
||||
#define J_4 0x93
|
||||
#define J_5 0x94
|
||||
#define J_6 0x95
|
||||
#define J_7 0x98
|
||||
#define J_8 0x99
|
||||
#define J_9 0x9A
|
||||
#define J_10 0x9B
|
||||
#define J_11 0x9C
|
||||
#define J_12 0x9D
|
||||
|
||||
#define K_1 0xA0
|
||||
#define K_2 0xA1
|
||||
#define K_3 0xA2
|
||||
#define K_4 0xA3
|
||||
#define K_5 0xA4
|
||||
#define K_6 0xA5
|
||||
#define K_7 0xA8
|
||||
#define K_8 0xA9
|
||||
#define K_9 0xAA
|
||||
#define K_10 0xAB
|
||||
#define K_11 0xAC
|
||||
#define K_12 0xAD
|
||||
|
||||
#define L_1 0xB0
|
||||
#define L_2 0xB1
|
||||
#define L_3 0xB2
|
||||
#define L_4 0xB3
|
||||
#define L_5 0xB4
|
||||
#define L_6 0xB5
|
||||
#define L_7 0xB8
|
||||
#define L_8 0xB9
|
||||
#define L_9 0xBA
|
||||
#define L_10 0xBB
|
||||
#define L_11 0xBC
|
||||
#define L_12 0xBD
|
||||
|
||||
#endif // IS31FL3737_DRIVER_H
|
||||
31
keyboards/1upkeyboards/sweet16/keymaps/switchtester/keymap.c
Normal file
31
keyboards/1upkeyboards/sweet16/keymaps/switchtester/keymap.c
Normal file
@@ -0,0 +1,31 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
#include "switches.h"
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
LAYOUT_ortho_4x4(
|
||||
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
|
||||
)
|
||||
};
|
||||
|
||||
struct mechswitch switches[MATRIX_ROWS][MATRIX_COLS] = {
|
||||
{CHERRY_MX_BLUE, CHERRY_MX_RED, CHERRY_MX_BLACK, CHERRY_MX_BROWN},
|
||||
{GATERON_BLUE, GATERON_RED, GATERON_BLACK, GATERON_BROWN},
|
||||
{KAILH_BLUE, KAILH_RED, KAILH_BLACK, KAILH_BROWN},
|
||||
{HAKO_CLEAR, HAKO_TRUE, HAKO_VIOLET, HAKO_ROYAL_TRUE}
|
||||
};
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
uint8_t col = record->event.key.col;
|
||||
uint8_t row = record->event.key.row;
|
||||
|
||||
if (record->event.pressed) {
|
||||
char name[MAX_SWITCH_NAME_LENGTH];
|
||||
switch_name(switches[row][col], name);
|
||||
send_string(name);
|
||||
SEND_STRING("\n");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
# Sweet16 as a switch tester
|
||||
|
||||
This keymap uses the Sweet16 as a switch tester. The functionality outputs the switch name of whatever key the user pressed.
|
||||
|
||||
the `switches` two-dimensional (4x4) array contains the switches attached to the macropad. The switches supported are defined as macros in the `switches.h` header file.
|
||||
12
keyboards/1upkeyboards/sweet16/keymaps/switchtester/rules.mk
Normal file
12
keyboards/1upkeyboards/sweet16/keymaps/switchtester/rules.mk
Normal file
@@ -0,0 +1,12 @@
|
||||
# Build Options
|
||||
# comment out to disable the options.
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = no # 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
|
||||
NKRO_ENABLE = no # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
RGBLIGHT_ENABLE = no
|
||||
|
||||
SRC += switches.c
|
||||
@@ -0,0 +1,99 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "switches.h"
|
||||
|
||||
static const char *BRAND_NAMES[] = {
|
||||
"Kailh",
|
||||
"Kailh Low Profile Choc",
|
||||
"Gateron",
|
||||
"Cherry MX",
|
||||
"Cherry ML",
|
||||
"Outemu",
|
||||
"Greetech",
|
||||
"Varmilo",
|
||||
"MOD",
|
||||
"Hako"
|
||||
};
|
||||
|
||||
static const char *COLOR_NAMES[] = {
|
||||
"",
|
||||
"White",
|
||||
"Black",
|
||||
"Blue",
|
||||
"Red",
|
||||
"Yellow",
|
||||
"Brown",
|
||||
"Green",
|
||||
"Clear",
|
||||
"Silver",
|
||||
"Nature White",
|
||||
"Grey",
|
||||
"Jade",
|
||||
"Navy",
|
||||
"Burnt Orange",
|
||||
"Pale Blue",
|
||||
"Dark Yellow",
|
||||
"Gold",
|
||||
"Chocolate White",
|
||||
"Burgundy",
|
||||
"Purple",
|
||||
"Light Green",
|
||||
"True",
|
||||
"Berry",
|
||||
"Plum",
|
||||
"Sage",
|
||||
"Violet",
|
||||
"L",
|
||||
"M",
|
||||
"H",
|
||||
"SH"
|
||||
};
|
||||
|
||||
static const char *VARIANT_NAMES[] = {
|
||||
"",
|
||||
"BOX",
|
||||
"BOX Thick",
|
||||
"BOX Heavy",
|
||||
"Silent",
|
||||
"Tactile",
|
||||
"Linear",
|
||||
"Speed",
|
||||
"Speed Heavy",
|
||||
"Speed Thick Click",
|
||||
"Pro",
|
||||
"Pro Heavy",
|
||||
"Royal",
|
||||
"Thick Click",
|
||||
"Heavy"
|
||||
};
|
||||
|
||||
const char *brand_name(struct mechswitch ms) {
|
||||
return BRAND_NAMES[ms.brand - 1];
|
||||
}
|
||||
|
||||
const char *variant_name(struct mechswitch ms) {
|
||||
return VARIANT_NAMES[ms.variant];
|
||||
}
|
||||
|
||||
const char *color_name(struct mechswitch ms) {
|
||||
return COLOR_NAMES[ms.color];
|
||||
}
|
||||
|
||||
void switch_name(struct mechswitch ms, char *buf) {
|
||||
const char *v_name = variant_name(ms);
|
||||
const char *c_name = color_name(ms);
|
||||
|
||||
snprintf(buf, MAX_SWITCH_NAME_LENGTH, "%s", brand_name(ms));
|
||||
strncat(buf, " ", MAX_SWITCH_NAME_LENGTH - strlen(buf));
|
||||
if (strlen(v_name) > 0) {
|
||||
strncat(buf, v_name, MAX_SWITCH_NAME_LENGTH - strlen(buf));
|
||||
strncat(buf, " ", MAX_SWITCH_NAME_LENGTH - strlen(buf));
|
||||
}
|
||||
if (strlen(c_name) > 0) {
|
||||
strncat(buf, c_name, MAX_SWITCH_NAME_LENGTH - strlen(buf));
|
||||
}
|
||||
}
|
||||
|
||||
int bitfieldtoi(struct mechswitch ms) {
|
||||
return ((ms.brand << 9) | (ms.variant << 5) | ms.color);
|
||||
}
|
||||
189
keyboards/1upkeyboards/sweet16/keymaps/switchtester/switches.h
Normal file
189
keyboards/1upkeyboards/sweet16/keymaps/switchtester/switches.h
Normal file
@@ -0,0 +1,189 @@
|
||||
#pragma once
|
||||
|
||||
struct mechswitch
|
||||
{
|
||||
unsigned int brand: 4;
|
||||
unsigned int variant: 4;
|
||||
unsigned int color: 5;
|
||||
};
|
||||
|
||||
#define MAX_SWITCH_NAME_LENGTH 256
|
||||
|
||||
#define BRAND_KAILH 1
|
||||
#define BRAND_KAILH_LOW 2
|
||||
#define BRAND_GATERON 3
|
||||
#define BRAND_CHERRY_MX 4
|
||||
#define BRAND_CHERRY_ML 5
|
||||
#define BRAND_OUTEMU 6
|
||||
#define BRAND_GREETECH 7
|
||||
#define BRAND_VARMILO 8
|
||||
#define BRAND_MOD 9
|
||||
#define BRAND_HAKO 10
|
||||
|
||||
#define COLOR_NO 0
|
||||
#define COLOR_WHITE 1
|
||||
#define COLOR_BLACK 2
|
||||
#define COLOR_BLUE 3
|
||||
#define COLOR_RED 4
|
||||
#define COLOR_YELLOW 5
|
||||
#define COLOR_BROWN 6
|
||||
#define COLOR_GREEN 7
|
||||
#define COLOR_CLEAR 8
|
||||
#define COLOR_SILVER 9
|
||||
#define COLOR_NATURE_WHITE 10
|
||||
#define COLOR_GREY 11
|
||||
#define COLOR_JADE 12
|
||||
#define COLOR_NAVY 13
|
||||
#define COLOR_BURNT_ORANGE 14
|
||||
#define COLOR_PALE_BLUE 15
|
||||
#define COLOR_DARK_YELLOW 16
|
||||
#define COLOR_GOLD 17
|
||||
#define COLOR_CHOCOLATE_WHITE 18
|
||||
#define COLOR_BURGUNDY 19
|
||||
#define COLOR_PURPLE 20
|
||||
#define COLOR_LIGHT_GREEN 21
|
||||
#define COLOR_TRUE 22
|
||||
#define COLOR_BERRY 23
|
||||
#define COLOR_PLUM 24
|
||||
#define COLOR_SAGE 25
|
||||
#define COLOR_VIOLET 26
|
||||
#define COLOR_L 27
|
||||
#define COLOR_M 28
|
||||
#define COLOR_H 29
|
||||
#define COLOR_SH 30
|
||||
|
||||
#define VARIANT_NO 0
|
||||
#define VARIANT_BOX 1
|
||||
#define VARIANT_BOX_THICK 2
|
||||
#define VARIANT_BOX_HEAVY 3
|
||||
#define VARIANT_SILENT 4
|
||||
#define VARIANT_TACTILE 5
|
||||
#define VARIANT_LINEAR 6
|
||||
#define VARIANT_SPEED 7
|
||||
#define VARIANT_SPEED_HEAVY 8
|
||||
#define VARIANT_SPEED_CLICK_THICK 9
|
||||
#define VARIANT_PRO 10
|
||||
#define VARIANT_PRO_HEAVY 11
|
||||
#define VARIANT_ROYAL 12
|
||||
#define VARIANT_CLICK_THICK 13
|
||||
|
||||
#define CHERRY_MX_BLUE {BRAND_CHERRY_MX, VARIANT_NO, COLOR_BLUE}
|
||||
#define CHERRY_MX_RED {BRAND_CHERRY_MX, VARIANT_NO, COLOR_RED}
|
||||
#define CHERRY_MX_BROWN {BRAND_CHERRY_MX, VARIANT_NO, COLOR_BROWN}
|
||||
#define CHERRY_MX_BLACK {BRAND_CHERRY_MX, VARIANT_NO, COLOR_BLACK}
|
||||
#define CHERRY_MX_GREEN {BRAND_CHERRY_MX, VARIANT_NO, COLOR_GREEN}
|
||||
#define CHERRY_MX_CLEAR {BRAND_CHERRY_MX, VARIANT_NO, COLOR_CLEAR}
|
||||
#define CHERRY_MX_WHITE {BRAND_CHERRY_MX, VARIANT_NO, COLOR_WHITE}
|
||||
#define CHERRY_MX_SILVER {BRAND_CHERRY_MX, VARIANT_NO, COLOR_SILVER}
|
||||
#define CHERRY_MX_NATURE_WHITE {BRAND_CHERRY_MX, VARIANT_NO, COLOR_NATURE_WHITE}
|
||||
#define CHERRY_MX_SILENT_BLACK {BRAND_CHERRY_MX, VARIANT_SILENT, COLOR_BLACK}
|
||||
#define CHERRY_MX_SILENT_RED {BRAND_CHERRY_MX, VARIANT_SILENT, COLOR_RED}
|
||||
#define CHERRY_MX_TACTILE_BLACK {BRAND_CHERRY_MX, VARIANT_SILENT, COLOR_GREY}
|
||||
#define CHERRY_MX_LINEAR_BLACK {BRAND_CHERRY_MX, VARIANT_LINEAR, COLOR_GREY}
|
||||
|
||||
#define CHERRY_ML {BRAND_CHERRY_ML, VARIANT_NO, COLOR_NO}
|
||||
|
||||
#define GATERON_BLUE {BRAND_GATERON, VARIANT_NO, COLOR_BLUE}
|
||||
#define GATERON_BROWN {BRAND_GATERON, VARIANT_NO, COLOR_BROWN}
|
||||
#define GATERON_BLACK {BRAND_GATERON, VARIANT_NO, COLOR_BLACK}
|
||||
#define GATERON_RED {BRAND_GATERON, VARIANT_NO, COLOR_RED}
|
||||
#define GATERON_CLEAR {BRAND_GATERON, VARIANT_NO, COLOR_CLEAR}
|
||||
#define GATERON_GREEN {BRAND_GATERON, VARIANT_NO, COLOR_GREEN}
|
||||
#define GATERON_YELLOW {BRAND_GATERON, VARIANT_NO, COLOR_YELLOW}
|
||||
|
||||
#define GATERON_SILENT_CLEAR {BRAND_GATERON, VARIANT_SILENT, COLOR_CLEAR}
|
||||
#define GATERON_SILENT_RED {BRAND_GATERON, VARIANT_SILENT, COLOR_RED}
|
||||
#define GATERON_SILENT_YELLOW {BRAND_GATERON, VARIANT_SILENT, COLOR_YELLOW}
|
||||
#define GATERON_SILENT_BLACK {BRAND_GATERON, VARIANT_SILENT, COLOR_BLACK}
|
||||
#define GATERON_SILENT_BROWN {BRAND_GATERON, VARIANT_SILENT, COLOR_BROWN}
|
||||
|
||||
#define GREETECH_BLUE {BRAND_GREETECH, VARIANT_NO, COLOR_BLUE}
|
||||
#define GREETECH_BROWN {BRAND_GREETECH, VARIANT_NO, COLOR_BROWN}
|
||||
#define GREETECH_BLACK {BRAND_GREETECH, VARIANT_NO, COLOR_BLACK}
|
||||
#define GREETECH_RED {BRAND_GREETECH, VARIANT_NO, COLOR_RED}
|
||||
|
||||
#define OUTEMU_BLUE {BRAND_OUTEMU, VARIANT_NO, COLOR_BLUE}
|
||||
#define OUTEMU_BROWN {BRAND_OUTEMU, VARIANT_NO, COLOR_BROWN}
|
||||
#define OUTEMU_BLACK {BRAND_OUTEMU, VARIANT_NO, COLOR_BLACK}
|
||||
#define OUTEMU_RED {BRAND_OUTEMU, VARIANT_NO, COLOR_RED}
|
||||
|
||||
#define KAILH_BLUE {BRAND_KAILH, VARIANT_NO, COLOR_BLUE}
|
||||
#define KAILH_BROWN {BRAND_KAILH, VARIANT_NO, COLOR_BROWN}
|
||||
#define KAILH_BLACK {BRAND_KAILH, VARIANT_NO, COLOR_BLACK}
|
||||
#define KAILH_RED {BRAND_KAILH, VARIANT_NO, COLOR_RED}
|
||||
#define KAILH_GREEN {BRAND_KAILH, VARIANT_NO, COLOR_GREEN}
|
||||
|
||||
#define KAILH_BOX_WHITE {BRAND_KAILH, VARIANT_BOX, COLOR_WHITE}
|
||||
#define KAILH_BOX_RED {BRAND_KAILH, VARIANT_BOX, COLOR_RED}
|
||||
#define KAILH_BOX_BLACK {BRAND_KAILH, VARIANT_BOX, COLOR_BLACK}
|
||||
#define KAILH_BOX_BROWN {BRAND_KAILH, VARIANT_BOX, COLOR_BROWN}
|
||||
#define KAILH_BOX_ROYAL {BRAND_KAILH, VARIANT_BOX, COLOR_ROYAL}
|
||||
|
||||
#define KAILH_BOX_THICK_JADE {BRAND_KAILH, VARIANT_BOX_THICK, COLOR_JADE}
|
||||
#define KAILH_BOX_THICK_NAVY {BRAND_KAILH, VARIANT_BOX_THICK, COLOR_NAVY}
|
||||
#define KAILH_BOX_HEAVY_BURNT_ORANGE {BRAND_KAILH, VARIANT_BOX_HEAVY, COLOR_BURNT_ORANGE}
|
||||
#define KAILH_BOX_HEAVY_PALE_BLUE {BRAND_KAILH, VARIANT_BOX_HEAVY, COLOR_PALE_BLUE}
|
||||
#define KAILH_BOX_HEAVY_DARK_YELLOW {BRAND_KAILH, VARIANT_BOX_HEAVY, COLOR_DARK_YELLOW}
|
||||
|
||||
#define KAILH_SPEED_BRONZE {BRAND_KAILH, VARIANT_SPEED, COLOR_BRONZE}
|
||||
#define KAILH_SPEED_COPPER {BRAND_KAILH, VARIANT_SPEED, COLOR_COPPER}
|
||||
#define KAILH_SPEED_GOLD {BRAND_KAILH, VARIANT_SPEED, COLOR_GOLD}
|
||||
#define KAILH_SPEED_SILVER {BRAND_KAILH, VARIANT_SPEED, COLOR_SILVER}
|
||||
|
||||
#define KAILH_SPEED_HEAVY_BURNT_ORANGE {BRAND_KAILH, VARIANT_SPEED_HEAVY, COLOR_BURNT_ORANGE}
|
||||
#define KAILH_SPEED_HEAVY_PALE_BLUE {BRAND_KAILH, VARIANT_SPEED_HEAVY, COLOR_PALE_BLUE}
|
||||
#define KAILH_SPEED_HEAVY_DARK_YELLOW {BRAND_KAILH, VARIANT_SPEED_HEAVY, COLOR_DARK_YELLOW}
|
||||
|
||||
#define KAILH_SPEED_THICK_CLICK_NAVY {BRAND_KAILH, VARIANT_SPEED_CLICK_THICK, COLOR_NAVY}
|
||||
|
||||
#define KAILH_PRO_BURGUNDY {BRAND_KAILH, VARIANT_PRO, COLOR_BURGUNDY}
|
||||
#define KAILH_PRO_PURPLE {BRAND_KAILH, VARIANT_PRO, COLOR_PURPLE}
|
||||
#define KAILH_PRO_LIGHT_GREEN {BRAND_KAILH, VARIANT_PRO, COLOR_LIGHT_GREEN}
|
||||
|
||||
#define KAILH_PRO_HEAVY_BERRY {BRAND_KAILH, VARIANT_PRO_HEAVY, COLOR_BERRY}
|
||||
#define KAILH_PRO_HEAVY_PLUM {BRAND_KAILH, VARIANT_PRO_HEAVY, COLOR_PLUM}
|
||||
#define KAILH_PRO_GEAVY_SAGE {BRAND_KAILH, VARIANT_PRO_HEAVY, COLOR_SAGE}
|
||||
|
||||
#define KAILH_LOW_WHITE {BRAND_KAILH_LOW, VARIANT_NO, COLOR_WHITE}
|
||||
#define KAILH_LOW_BROWN {BRAND_KAILH_LOW, VARIANT_NO, COLOR_BROWN}
|
||||
#define KAILH_LOW_RED {BRAND_KAILH_LOW, VARIANT_NO, COLOR_RED}
|
||||
#define KAILH_LOW_CHOCOLATE_WHITE {BRAND_KAILH_LOW, VARIANT_NO, COLOR_CHOCOLATE_WHITE}
|
||||
#define KAILH_LOW_THICK_CLICK_NAVY {BRAND_KAILH_LOW, VARIANT_THICK_CLICK, COLOR_NAVY}
|
||||
#define KAILH_LOW_THICK_CLICK_JADE {BRAND_KAILH_LOW, VARIANT_THICK_CLICK, COLOR_JADE}
|
||||
#define KAILH_LOW_HEAVY_DARK_YELLOW {BRAND_KAILH_LOW, VARIANT_HEAVY, COLOR_DARK_YELLOW}
|
||||
#define KAILH_LOW_HEAVY_BURNT_ORANGE {BRAND_KAILH_LOW, VARIANT_HEAVY, COLOR_BURNT_ORANGE}
|
||||
#define KAILH_LOW_HEAVY_PALE_BLUE {BRAND_KAILH_LOW, VARIANT_HEAVY, COLOR_PALE_BLUE}
|
||||
|
||||
#define HAKO_ROYAL_CLEAR {BRAND_HAKO, VARIANT_ROYAL, COLOR_CLEAR}
|
||||
#define HAKO_ROYAL_TRUE {BRAND_HAKO, VARIANT_ROYAL, COLOR_TRUE}
|
||||
|
||||
#define HAKO_CLEAR {BRAND_HAKO, VARIANT_NO, COLOR_CLEAR}
|
||||
#define HAKO_TRUE {BRAND_HAKO, VARIANT_NO, COLOR_TRUE}
|
||||
#define HAKO_VIOLET {BRAND_HAKO, VARIANT_NO, COLOR_VIOLET}
|
||||
|
||||
#define MOD_L_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_L}
|
||||
#define MOD_M_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_M}
|
||||
#define MOD_H_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_H}
|
||||
#define MOD_SH_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_SH}
|
||||
|
||||
#define MOD_L_LINEAR {BRAND_MOD, VARIANT_LINEAR, COLOR_L}
|
||||
#define MOD_M_LINEAR {BRAND_MOD, VARIANT_LINEAR, COLOR_M}
|
||||
#define MOD_H_LINEAR {BRAND_MOD, VARIANT_LINEAR, COLOR_H}
|
||||
|
||||
#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
|
||||
#define BYTE_TO_BINARY(byte) \
|
||||
(byte & 0x80 ? '1' : '0'), \
|
||||
(byte & 0x40 ? '1' : '0'), \
|
||||
(byte & 0x20 ? '1' : '0'), \
|
||||
(byte & 0x10 ? '1' : '0'), \
|
||||
(byte & 0x08 ? '1' : '0'), \
|
||||
(byte & 0x04 ? '1' : '0'), \
|
||||
(byte & 0x02 ? '1' : '0'), \
|
||||
(byte & 0x01 ? '1' : '0')
|
||||
|
||||
|
||||
const char *brand_name(struct mechswitch ms);
|
||||
const char *variant_name(struct mechswitch ms);
|
||||
const char *color_name(struct mechswitch ms);
|
||||
void switch_name(struct mechswitch ms, char *buf);
|
||||
int bitfieldtoi(struct mechswitch ms);
|
||||
@@ -71,12 +71,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
};
|
||||
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
keyevent_t event = record->event;
|
||||
(void)event;
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -15,10 +15,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_TRNS, KC_RGUI, KC_RCTRL, BL_TOGG, BL_DEC, BL_INC, KC_P0, KC_PDOT ),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
// MACRODOWN only works in this function
|
||||
|
||||
@@ -33,10 +33,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
// MACRODOWN only works in this function
|
||||
|
||||
35
keyboards/alpha/keymaps/vderm/README.md
Normal file
35
keyboards/alpha/keymaps/vderm/README.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# Alpha 28-Key Keyboard Alternate Keymap
|
||||
Alternate keymap for [Alpha 28-key keyboard](https://github.com/qmk/qmk_firmware/tree/master/keyboards/alpha).
|
||||
|
||||
## How-to
|
||||
Assuming you've followed all the instructions from the original post, put my "keymap.c" file in "$qmk-firmware-folder$/keyboards/alpha/keymaps/vderm/" and then run your make command ("make alpha:vderm" while in $qmk-firmware-folder$ where this folder is what you've downloaded from the official github page) to compile the hex file to upload to your microcontroller. I've also uploaded my hex file.
|
||||
|
||||
## Description
|
||||
Instead of going up and down layers like in the original Alpha keyboard, I've made the bottom row keys all have alternate functions:
|
||||
+ Like in the original Alpha28 keymap, the 2U spacebar is a shift key when held down and space when tapped
|
||||
+ Z and M are Ctrl keys when held down or Z and M when tapped
|
||||
+ X and N are Alt keys
|
||||
+ C activates the function keys layer (arrows, page up/dn, esc, tab, etc.)
|
||||
+ V activates the characters and numbers layer
|
||||
+ C and V combined activated the F-keys layer (F1, F2, F3, etc.)
|
||||
+ The enter key is an enter key in the home layer, backspace in the function keys and characters/numbers layer and a delete in the F-keys layer
|
||||
+ While in the other layers, the bottom row acts like a "regular" bottom modified row: ctrl, alt, winkey
|
||||
|
||||
## Keymap
|
||||

|
||||
|
||||
## Build Images
|
||||
Here is my keyboard.
|
||||
+ Switches: Aliaz Silent Switches (Tactile), PCB mount, 80g from [KBDfans](https://kbdfans.cn/collections/aliaz-switches/products/pre-orderaliaz-silent-switch-tactile?variant=2519899832333)
|
||||
+ PCB board: ordered from JLCPCB, in white
|
||||
+ Keycaps: ebay, can't find link :S
|
||||
+ Bottom plate: I cut a piece of canary wood that was laying around, needs to be varnished; I also need to actually screw the pcb to the wood instead of relying on double-sided tape
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
Good luck on your build!
|
||||
//vderm
|
||||
1422
keyboards/alpha/keymaps/vderm/alpha_vderm.hex
Normal file
1422
keyboards/alpha/keymaps/vderm/alpha_vderm.hex
Normal file
File diff suppressed because it is too large
Load Diff
34
keyboards/alpha/keymaps/vderm/keymap.c
Normal file
34
keyboards/alpha/keymaps/vderm/keymap.c
Normal file
@@ -0,0 +1,34 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
#define HOME 0
|
||||
#define FN 1
|
||||
#define FNCHAR 2
|
||||
#define FKEYS 3
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[HOME] = LAYOUT(
|
||||
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
|
||||
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
|
||||
MT(MOD_LCTL, KC_Z), MT(MOD_LALT, KC_X), LT(1, KC_C), LT(2, KC_V), MT(MOD_LSFT, KC_SPC), MT(MOD_RGUI,KC_B), MT(MOD_RALT, KC_N), MT(MOD_RCTL, KC_M)),
|
||||
|
||||
[FN] = LAYOUT(
|
||||
KC_ESC, KC__MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_NO,
|
||||
KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_BSPC,
|
||||
KC_LCTL, KC_LALT, KC_TRNS, MO(3), MT(MOD_LSFT, KC_SPC), KC_RGUI, KC_RALT, KC_RCTL),
|
||||
|
||||
[FNCHAR] = LAYOUT(
|
||||
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
|
||||
KC_GRV,KC_NO,KC_MINS,KC_EQL,KC_BSLS,KC_LBRC,KC_RBRC,KC_SCLN,KC_QUOT,KC_BSPC,
|
||||
KC_LCTL, KC_LALT, MO(3), KC_TRNS, MT(MOD_LSFT, KC_SPC), KC_COMM, KC_DOT, KC_SLSH),
|
||||
|
||||
[FKEYS] = LAYOUT(
|
||||
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
|
||||
KC_F11,KC_F12,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_DEL,
|
||||
KC_LCTL, KC_LALT, KC_TRNS, KC_TRNS, MT(MOD_LSFT, KC_SPC), KC_RGUI, KC_RALT, KC_RCTL),
|
||||
};
|
||||
|
||||
void matrix_init_user(void) {
|
||||
}
|
||||
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
@@ -28,5 +28,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
_______, _______, _______, _______, _______, _______, _______
|
||||
)
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {};
|
||||
|
||||
@@ -10,4 +10,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_APP, KC_RALT, KC_RGUI, KC_RCTL
|
||||
),
|
||||
};
|
||||
const uint16_t PROGMEM fn_actions[] = {};
|
||||
|
||||
26
keyboards/alps64/keymaps/mechmerlin/keymap.c
Normal file
26
keyboards/alps64/keymaps/mechmerlin/keymap.c
Normal file
@@ -0,0 +1,26 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
#include "mechmerlin.h"
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* 0: qwerty */
|
||||
[_BL] = LAYOUT_infinity( \
|
||||
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_BSPC, \
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
|
||||
KC_CTCP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, TG(_AL), \
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FL), KC_RALT, KC_RGUI, KC_RCTL),
|
||||
|
||||
[_FL] = LAYOUT_infinity( \
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_DEL, \
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
|
||||
|
||||
[_AL] = LAYOUT_infinity( \
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), KC_TRNS, \
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT),
|
||||
};
|
||||
10
keyboards/alps64/keymaps/mechmerlin/readme.md
Normal file
10
keyboards/alps64/keymaps/mechmerlin/readme.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# MechMerlin Alps64 Infinity Keymap
|
||||
|
||||
This is the 60% infinity layout used by u/merlin36, host of the [MechMerlin](www.youtube.com/mechmerlin)
|
||||
YouTube channel.
|
||||
|
||||
## Keymap Notes
|
||||
- `Caps Lock` can be held to act as a `Left Control`
|
||||
|
||||
### Build
|
||||
To build the firmware file associated with this keymap, simply run `make alps64:mechmerlin`.
|
||||
@@ -1,14 +1,15 @@
|
||||
Alps64
|
||||
===
|
||||
# Alps64
|
||||
|
||||
An Alps-only 60% board designed by Hasu.
|
||||
An Alps only 60% board designed by Hasu.
|
||||
|
||||
Keyboard Maintainer: QMK Community
|
||||
Hardware Supported: Alps64 PCB
|
||||
Hardware Availability: https://geekhack.org/index.php?topic=69666.0
|
||||
|
||||
QMK is not the Alps64 official firmware. To use the official tools, refer to [TMK Keymap Editor](http://www.tmk-kbd.com/tmk_keyboard/editor/unimap/?alps64) or [TMK Keyboard Firmware on Github](https://github.com/tmk/tmk_keyboard).
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make alps64: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.
|
||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
||||
|
||||
@@ -10,6 +10,3 @@ AUDIO_ENABLE ?= no
|
||||
RGBLIGHT_ENABLE ?= yes
|
||||
UNICODE_ENABLE ?= yes
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -18,7 +18,3 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -18,6 +18,3 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -36,10 +36,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
)
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
// MACRODOWN only works in this function
|
||||
|
||||
@@ -61,7 +61,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#define RGB_DI_PIN F5 // The pin the LED strip is connected to
|
||||
#define RGBLED_NUM 6 // Number of LEDs in your strip
|
||||
|
||||
#define RGBLIGHT_ANIMATIONS
|
||||
#define QMK_ESC_OUTPUT B7 // usually COL
|
||||
#define QMK_ESC_INPUT B3 // usually ROW
|
||||
#define QMK_LED E6
|
||||
|
||||
@@ -211,10 +211,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
// MACRODOWN only works in this function
|
||||
switch(id) {
|
||||
|
||||
@@ -168,9 +168,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
// MACRODOWN only works in this function
|
||||
switch(id) {
|
||||
|
||||
@@ -31,10 +31,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
switch(id) {
|
||||
case TEENSY:
|
||||
|
||||
@@ -31,10 +31,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
// MACRODOWN only works in this function
|
||||
|
||||
@@ -43,10 +43,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_NO, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, TO(_QW), KC_PSCR, KC_SLCK, KC_PAUS )
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
// MACRODOWN only works in this function
|
||||
switch(id) {
|
||||
|
||||
@@ -65,10 +65,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if(record->event.pressed) {
|
||||
switch (keycode) {
|
||||
|
||||
@@ -46,10 +46,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
// MACRODOWN only works in this function
|
||||
switch(id) {
|
||||
|
||||
@@ -55,10 +55,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
switch(id) {}
|
||||
|
||||
|
||||
@@ -41,10 +41,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_NO, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, TO(_QW), KC_PSCR, KC_SLCK, KC_PAUS )
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
// MACRODOWN only works in this function
|
||||
|
||||
@@ -13,6 +13,3 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -163,10 +163,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
void persistent_default_layer_set(uint16_t default_layer) {
|
||||
eeconfig_update_default_layer(default_layer);
|
||||
default_layer_set(default_layer);
|
||||
|
||||
@@ -47,12 +47,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
// MACRODOWN only works in this function
|
||||
switch (id) {
|
||||
|
||||
@@ -38,12 +38,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
// MACRODOWN only works in this function
|
||||
switch (id) {
|
||||
|
||||
@@ -171,9 +171,6 @@ static void m_handle_kf (keyrecord_t *record, uint8_t id) {
|
||||
}
|
||||
}
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
switch (id) {
|
||||
|
||||
@@ -76,10 +76,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
*/
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
// MACRODOWN only works in this function
|
||||
|
||||
@@ -137,9 +137,6 @@ void matrix_init_user(void) {
|
||||
#endif
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
};
|
||||
|
||||
void persistent_default_layer_set(uint16_t default_layer) {
|
||||
eeconfig_update_default_layer(default_layer);
|
||||
default_layer_set(default_layer);
|
||||
|
||||
@@ -24,9 +24,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
)
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // MACRODOWN only works in this function
|
||||
{
|
||||
return MACRO_NONE;
|
||||
|
||||
@@ -14,10 +14,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT, KC_P0,KC_PDOT)
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
// MACRODOWN only works in this function
|
||||
@@ -48,4 +44,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
|
||||
void led_set_user(uint8_t usb_led) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,3 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -16,6 +16,3 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -25,11 +25,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT )
|
||||
};
|
||||
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
// MACRODOWN only works in this function
|
||||
|
||||
@@ -25,11 +25,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT )
|
||||
};
|
||||
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
// MACRODOWN only works in this function
|
||||
|
||||
@@ -22,9 +22,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // MACRODOWN only works in this function
|
||||
{
|
||||
return MACRO_NONE;
|
||||
|
||||
111
keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.c
Normal file
111
keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.c
Normal file
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file has been automatically generated using ChibiStudio board
|
||||
* generator plugin. Do not edit manually.
|
||||
*/
|
||||
|
||||
#include "hal.h"
|
||||
|
||||
#if HAL_USE_PAL || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief PAL setup.
|
||||
* @details Digital I/O ports static configuration as defined in @p board.h.
|
||||
* This variable is used by the HAL when initializing the PAL driver.
|
||||
*/
|
||||
const PALConfig pal_default_config = {
|
||||
#if STM32_HAS_GPIOA
|
||||
{VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR,
|
||||
VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH},
|
||||
#endif
|
||||
#if STM32_HAS_GPIOB
|
||||
{VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR,
|
||||
VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH},
|
||||
#endif
|
||||
#if STM32_HAS_GPIOC
|
||||
{VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR,
|
||||
VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH},
|
||||
#endif
|
||||
#if STM32_HAS_GPIOD
|
||||
{VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR,
|
||||
VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH},
|
||||
#endif
|
||||
#if STM32_HAS_GPIOE
|
||||
{VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR,
|
||||
VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH},
|
||||
#endif
|
||||
#if STM32_HAS_GPIOF
|
||||
{VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR,
|
||||
VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH},
|
||||
#endif
|
||||
#if STM32_HAS_GPIOG
|
||||
{VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR,
|
||||
VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH},
|
||||
#endif
|
||||
#if STM32_HAS_GPIOH
|
||||
{VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR,
|
||||
VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH},
|
||||
#endif
|
||||
#if STM32_HAS_GPIOI
|
||||
{VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR,
|
||||
VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
void enter_bootloader_mode_if_requested(void);
|
||||
|
||||
/**
|
||||
* @brief Early initialization code.
|
||||
* @details This initialization must be performed just after stack setup
|
||||
* and before any other initialization.
|
||||
*/
|
||||
void __early_init(void) {
|
||||
enter_bootloader_mode_if_requested();
|
||||
stm32_clock_init();
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if HAL_USE_MMC_SPI || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief MMC_SPI card detection.
|
||||
*/
|
||||
bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
|
||||
|
||||
(void)mmcp;
|
||||
/* TODO: Fill the implementation.*/
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief MMC_SPI card write protection detection.
|
||||
*/
|
||||
bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
|
||||
|
||||
(void)mmcp;
|
||||
/* TODO: Fill the implementation.*/
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Board-specific initialization code.
|
||||
* @todo Add your board-specific code, if any.
|
||||
*/
|
||||
void boardInit(void) {
|
||||
}
|
||||
923
keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.h
Normal file
923
keyboards/chibios_test/boards/ST_STM32F072B_DISCOVERY/board.h
Normal file
@@ -0,0 +1,923 @@
|
||||
/*
|
||||
ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file has been automatically generated using ChibiStudio board
|
||||
* generator plugin. Do not edit manually.
|
||||
*/
|
||||
|
||||
#ifndef BOARD_H
|
||||
#define BOARD_H
|
||||
|
||||
/*
|
||||
* Setup for ST STM32F072B-Discovery board.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Board identifier.
|
||||
*/
|
||||
#define BOARD_ST_STM32F072B_DISCOVERY
|
||||
#define BOARD_NAME "ST STM32F072B-Discovery"
|
||||
|
||||
/*
|
||||
* Board oscillators-related settings.
|
||||
* NOTE: LSE not fitted.
|
||||
* NOTE: HSE not fitted.
|
||||
*/
|
||||
#if !defined(STM32_LSECLK)
|
||||
#define STM32_LSECLK 0U
|
||||
#endif
|
||||
|
||||
#define STM32_LSEDRV (3U << 3U)
|
||||
|
||||
#if !defined(STM32_HSECLK)
|
||||
#define STM32_HSECLK 0U
|
||||
#endif
|
||||
|
||||
#define STM32_HSE_BYPASS
|
||||
|
||||
/*
|
||||
* MCU type as defined in the ST header.
|
||||
*/
|
||||
#define STM32F072xB
|
||||
|
||||
/*
|
||||
* IO pins assignments.
|
||||
*/
|
||||
#define GPIOA_BUTTON 0U
|
||||
#define GPIOA_PIN1 1U
|
||||
#define GPIOA_PIN2 2U
|
||||
#define GPIOA_PIN3 3U
|
||||
#define GPIOA_PIN4 4U
|
||||
#define GPIOA_PIN5 5U
|
||||
#define GPIOA_PIN6 6U
|
||||
#define GPIOA_PIN7 7U
|
||||
#define GPIOA_PIN8 8U
|
||||
#define GPIOA_PIN9 9U
|
||||
#define GPIOA_PIN10 10U
|
||||
#define GPIOA_USB_DM 11U
|
||||
#define GPIOA_USB_DP 12U
|
||||
#define GPIOA_SWDIO 13U
|
||||
#define GPIOA_SWCLK 14U
|
||||
#define GPIOA_PIN15 15U
|
||||
|
||||
#define GPIOB_PIN0 0U
|
||||
#define GPIOB_PIN1 1U
|
||||
#define GPIOB_PIN2 2U
|
||||
#define GPIOB_PIN3 3U
|
||||
#define GPIOB_PIN4 4U
|
||||
#define GPIOB_PIN5 5U
|
||||
#define GPIOB_PIN6 6U
|
||||
#define GPIOB_PIN7 7U
|
||||
#define GPIOB_PIN8 8U
|
||||
#define GPIOB_PIN9 9U
|
||||
#define GPIOB_PIN10 10U
|
||||
#define GPIOB_PIN11 11U
|
||||
#define GPIOB_PIN12 12U
|
||||
#define GPIOB_SPI2_SCK 13U
|
||||
#define GPIOB_SPI2_MISO 14U
|
||||
#define GPIOB_SPI2_MOSI 15U
|
||||
|
||||
#define GPIOC_MEMS_CS 0U
|
||||
#define GPIOC_PIN1 1U
|
||||
#define GPIOC_PIN2 2U
|
||||
#define GPIOC_PIN3 3U
|
||||
#define GPIOC_PIN4 4U
|
||||
#define GPIOC_PIN5 5U
|
||||
#define GPIOC_LED_RED 6U
|
||||
#define GPIOC_LED_BLUE 7U
|
||||
#define GPIOC_LED_ORANGE 8U
|
||||
#define GPIOC_LED_GREEN 9U
|
||||
#define GPIOC_PIN10 10U
|
||||
#define GPIOC_PIN11 11U
|
||||
#define GPIOC_PIN12 12U
|
||||
#define GPIOC_PIN13 13U
|
||||
#define GPIOC_OSC32_IN 14U
|
||||
#define GPIOC_OSC32_OUT 15U
|
||||
|
||||
#define GPIOD_PIN0 0U
|
||||
#define GPIOD_PIN1 1U
|
||||
#define GPIOD_PIN2 2U
|
||||
#define GPIOD_PIN3 3U
|
||||
#define GPIOD_PIN4 4U
|
||||
#define GPIOD_PIN5 5U
|
||||
#define GPIOD_PIN6 6U
|
||||
#define GPIOD_PIN7 7U
|
||||
#define GPIOD_PIN8 8U
|
||||
#define GPIOD_PIN9 9U
|
||||
#define GPIOD_PIN10 10U
|
||||
#define GPIOD_PIN11 11U
|
||||
#define GPIOD_PIN12 12U
|
||||
#define GPIOD_PIN13 13U
|
||||
#define GPIOD_PIN14 14U
|
||||
#define GPIOD_PIN15 15U
|
||||
|
||||
#define GPIOE_PIN0 0U
|
||||
#define GPIOE_PIN1 1U
|
||||
#define GPIOE_PIN2 2U
|
||||
#define GPIOE_PIN3 3U
|
||||
#define GPIOE_PIN4 4U
|
||||
#define GPIOE_PIN5 5U
|
||||
#define GPIOE_PIN6 6U
|
||||
#define GPIOE_PIN7 7U
|
||||
#define GPIOE_PIN8 8U
|
||||
#define GPIOE_PIN9 9U
|
||||
#define GPIOE_PIN10 10U
|
||||
#define GPIOE_PIN11 11U
|
||||
#define GPIOE_PIN12 12U
|
||||
#define GPIOE_PIN13 13U
|
||||
#define GPIOE_PIN14 14U
|
||||
#define GPIOE_PIN15 15U
|
||||
|
||||
#define GPIOF_OSC_IN 0U
|
||||
#define GPIOF_OSC_OUT 1U
|
||||
#define GPIOF_PIN2 2U
|
||||
#define GPIOF_PIN3 3U
|
||||
#define GPIOF_PIN4 4U
|
||||
#define GPIOF_PIN5 5U
|
||||
#define GPIOF_PIN6 6U
|
||||
#define GPIOF_PIN7 7U
|
||||
#define GPIOF_PIN8 8U
|
||||
#define GPIOF_PIN9 9U
|
||||
#define GPIOF_PIN10 10U
|
||||
#define GPIOF_PIN11 11U
|
||||
#define GPIOF_PIN12 12U
|
||||
#define GPIOF_PIN13 13U
|
||||
#define GPIOF_PIN14 14U
|
||||
#define GPIOF_PIN15 15U
|
||||
|
||||
/*
|
||||
* IO lines assignments.
|
||||
*/
|
||||
#define LINE_BUTTON PAL_LINE(GPIOA, 0U)
|
||||
#define LINE_USB_DM PAL_LINE(GPIOA, 11U)
|
||||
#define LINE_USB_DP PAL_LINE(GPIOA, 12U)
|
||||
#define LINE_SWDIO PAL_LINE(GPIOA, 13U)
|
||||
#define LINE_SWCLK PAL_LINE(GPIOA, 14U)
|
||||
|
||||
#define LINE_SPI2_SCK PAL_LINE(GPIOB, 13U)
|
||||
#define LINE_SPI2_MISO PAL_LINE(GPIOB, 14U)
|
||||
#define LINE_SPI2_MOSI PAL_LINE(GPIOB, 15U)
|
||||
|
||||
#define LINE_MEMS_CS PAL_LINE(GPIOC, 0U)
|
||||
#define LINE_LED_RED PAL_LINE(GPIOC, 6U)
|
||||
#define LINE_LED_BLUE PAL_LINE(GPIOC, 7U)
|
||||
#define LINE_LED_ORANGE PAL_LINE(GPIOC, 8U)
|
||||
#define LINE_LED_GREEN PAL_LINE(GPIOC, 9U)
|
||||
#define LINE_OSC32_IN PAL_LINE(GPIOC, 14U)
|
||||
#define LINE_OSC32_OUT PAL_LINE(GPIOC, 15U)
|
||||
|
||||
|
||||
|
||||
#define LINE_OSC_IN PAL_LINE(GPIOF, 0U)
|
||||
#define LINE_OSC_OUT PAL_LINE(GPIOF, 1U)
|
||||
|
||||
/*
|
||||
* I/O ports initial setup, this configuration is established soon after reset
|
||||
* in the initialization code.
|
||||
* Please refer to the STM32 Reference Manual for details.
|
||||
*/
|
||||
#define PIN_MODE_INPUT(n) (0U << ((n) * 2U))
|
||||
#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U))
|
||||
#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U))
|
||||
#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U))
|
||||
#define PIN_ODR_LOW(n) (0U << (n))
|
||||
#define PIN_ODR_HIGH(n) (1U << (n))
|
||||
#define PIN_OTYPE_PUSHPULL(n) (0U << (n))
|
||||
#define PIN_OTYPE_OPENDRAIN(n) (1U << (n))
|
||||
#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U))
|
||||
#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U))
|
||||
#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U))
|
||||
#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U))
|
||||
#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U))
|
||||
#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U))
|
||||
#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U))
|
||||
#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U))
|
||||
|
||||
/*
|
||||
* GPIOA setup:
|
||||
*
|
||||
* PA0 - BUTTON (input floating).
|
||||
* PA1 - PIN1 (input pullup).
|
||||
* PA2 - PIN2 (input pullup).
|
||||
* PA3 - PIN3 (input pullup).
|
||||
* PA4 - PIN4 (input pullup).
|
||||
* PA5 - PIN5 (input pullup).
|
||||
* PA6 - PIN6 (input pullup).
|
||||
* PA7 - PIN7 (input pullup).
|
||||
* PA8 - PIN8 (input pullup).
|
||||
* PA9 - PIN9 (input pullup).
|
||||
* PA10 - PIN10 (input pullup).
|
||||
* PA11 - USB_DM (input floating).
|
||||
* PA12 - USB_DP (input floating).
|
||||
* PA13 - SWDIO (alternate 0).
|
||||
* PA14 - SWCLK (alternate 0).
|
||||
* PA15 - PIN15 (input pullup).
|
||||
*/
|
||||
#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \
|
||||
PIN_MODE_INPUT(GPIOA_PIN1) | \
|
||||
PIN_MODE_INPUT(GPIOA_PIN2) | \
|
||||
PIN_MODE_INPUT(GPIOA_PIN3) | \
|
||||
PIN_MODE_INPUT(GPIOA_PIN4) | \
|
||||
PIN_MODE_INPUT(GPIOA_PIN5) | \
|
||||
PIN_MODE_INPUT(GPIOA_PIN6) | \
|
||||
PIN_MODE_INPUT(GPIOA_PIN7) | \
|
||||
PIN_MODE_INPUT(GPIOA_PIN8) | \
|
||||
PIN_MODE_INPUT(GPIOA_PIN9) | \
|
||||
PIN_MODE_INPUT(GPIOA_PIN10) | \
|
||||
PIN_MODE_INPUT(GPIOA_USB_DM) | \
|
||||
PIN_MODE_INPUT(GPIOA_USB_DP) | \
|
||||
PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \
|
||||
PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \
|
||||
PIN_MODE_INPUT(GPIOA_PIN15))
|
||||
#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
|
||||
#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_BUTTON) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_PIN1) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_USB_DM) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \
|
||||
PIN_OSPEED_HIGH(GPIOA_SWDIO) | \
|
||||
PIN_OSPEED_HIGH(GPIOA_SWCLK) | \
|
||||
PIN_OSPEED_HIGH(GPIOA_PIN15))
|
||||
#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_PIN1) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_PIN2) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_PIN3) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_PIN4) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_PIN5) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_PIN6) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_PIN7) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_PIN8) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_PIN9) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_PIN10) | \
|
||||
PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \
|
||||
PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \
|
||||
PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \
|
||||
PIN_PUPDR_PULLUP(GPIOA_PIN15))
|
||||
#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON) | \
|
||||
PIN_ODR_HIGH(GPIOA_PIN1) | \
|
||||
PIN_ODR_HIGH(GPIOA_PIN2) | \
|
||||
PIN_ODR_HIGH(GPIOA_PIN3) | \
|
||||
PIN_ODR_HIGH(GPIOA_PIN4) | \
|
||||
PIN_ODR_HIGH(GPIOA_PIN5) | \
|
||||
PIN_ODR_HIGH(GPIOA_PIN6) | \
|
||||
PIN_ODR_HIGH(GPIOA_PIN7) | \
|
||||
PIN_ODR_HIGH(GPIOA_PIN8) | \
|
||||
PIN_ODR_HIGH(GPIOA_PIN9) | \
|
||||
PIN_ODR_HIGH(GPIOA_PIN10) | \
|
||||
PIN_ODR_HIGH(GPIOA_USB_DM) | \
|
||||
PIN_ODR_HIGH(GPIOA_USB_DP) | \
|
||||
PIN_ODR_HIGH(GPIOA_SWDIO) | \
|
||||
PIN_ODR_HIGH(GPIOA_SWCLK) | \
|
||||
PIN_ODR_HIGH(GPIOA_PIN15))
|
||||
#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_PIN1, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_PIN2, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_PIN3, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_PIN4, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_PIN5, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_PIN6, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_PIN7, 0U))
|
||||
#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_PIN9, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_PIN10, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_USB_DM, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_USB_DP, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \
|
||||
PIN_AFIO_AF(GPIOA_PIN15, 0U))
|
||||
|
||||
/*
|
||||
* GPIOB setup:
|
||||
*
|
||||
* PB0 - PIN0 (input pullup).
|
||||
* PB1 - PIN1 (input pullup).
|
||||
* PB2 - PIN2 (input pullup).
|
||||
* PB3 - PIN3 (input pullup).
|
||||
* PB4 - PIN4 (input pullup).
|
||||
* PB5 - PIN5 (input pullup).
|
||||
* PB6 - PIN6 (input pullup).
|
||||
* PB7 - PIN7 (input pullup).
|
||||
* PB8 - PIN8 (input pullup).
|
||||
* PB9 - PIN9 (input pullup).
|
||||
* PB10 - PIN10 (input pullup).
|
||||
* PB11 - PIN11 (input pullup).
|
||||
* PB12 - PIN12 (input pullup).
|
||||
* PB13 - SPI2_SCK (alternate 0).
|
||||
* PB14 - SPI2_MISO (alternate 0).
|
||||
* PB15 - SPI2_MOSI (alternate 0).
|
||||
*/
|
||||
#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN1) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN2) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN3) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN4) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN5) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN6) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN7) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN8) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN9) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN10) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN11) | \
|
||||
PIN_MODE_INPUT(GPIOB_PIN12) | \
|
||||
PIN_MODE_ALTERNATE(GPIOB_SPI2_SCK) | \
|
||||
PIN_MODE_ALTERNATE(GPIOB_SPI2_MISO) | \
|
||||
PIN_MODE_ALTERNATE(GPIOB_SPI2_MOSI))
|
||||
#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_SPI2_SCK) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MISO) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MOSI))
|
||||
#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \
|
||||
PIN_OSPEED_HIGH(GPIOB_PIN2) | \
|
||||
PIN_OSPEED_HIGH(GPIOB_PIN3) | \
|
||||
PIN_OSPEED_HIGH(GPIOB_PIN4) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_PIN6) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_SPI2_SCK) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_SPI2_MISO) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOB_SPI2_MOSI))
|
||||
#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN1) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN2) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN3) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN4) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN5) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN6) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN7) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN8) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN9) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN10) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN11) | \
|
||||
PIN_PUPDR_PULLUP(GPIOB_PIN12) | \
|
||||
PIN_PUPDR_FLOATING(GPIOB_SPI2_SCK) | \
|
||||
PIN_PUPDR_FLOATING(GPIOB_SPI2_MISO) | \
|
||||
PIN_PUPDR_FLOATING(GPIOB_SPI2_MOSI))
|
||||
#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN1) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN2) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN3) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN4) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN5) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN6) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN7) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN8) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN9) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN10) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN11) | \
|
||||
PIN_ODR_HIGH(GPIOB_PIN12) | \
|
||||
PIN_ODR_HIGH(GPIOB_SPI2_SCK) | \
|
||||
PIN_ODR_HIGH(GPIOB_SPI2_MISO) | \
|
||||
PIN_ODR_HIGH(GPIOB_SPI2_MOSI))
|
||||
#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_PIN1, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_PIN2, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_PIN3, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_PIN4, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_PIN5, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_PIN6, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_PIN7, 0U))
|
||||
#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_PIN9, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_PIN10, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_PIN11, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_PIN12, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_SPI2_SCK, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_SPI2_MISO, 0U) | \
|
||||
PIN_AFIO_AF(GPIOB_SPI2_MOSI, 0U))
|
||||
|
||||
/*
|
||||
* GPIOC setup:
|
||||
*
|
||||
* PC0 - MEMS_CS (output pushpull maximum).
|
||||
* PC1 - PIN1 (input pullup).
|
||||
* PC2 - PIN2 (input pullup).
|
||||
* PC3 - PIN3 (input pullup).
|
||||
* PC4 - PIN4 (input pullup).
|
||||
* PC5 - PIN5 (input pullup).
|
||||
* PC6 - LED_RED (output pushpull maximum).
|
||||
* PC7 - LED_BLUE (output pushpull maximum).
|
||||
* PC8 - LED_ORANGE (output pushpull maximum).
|
||||
* PC9 - LED_GREEN (output pushpull maximum).
|
||||
* PC10 - PIN10 (input pullup).
|
||||
* PC11 - PIN11 (input pullup).
|
||||
* PC12 - PIN12 (input pullup).
|
||||
* PC13 - PIN13 (input pullup).
|
||||
* PC14 - OSC32_IN (input floating).
|
||||
* PC15 - OSC32_OUT (input floating).
|
||||
*/
|
||||
#define VAL_GPIOC_MODER (PIN_MODE_OUTPUT(GPIOC_MEMS_CS) | \
|
||||
PIN_MODE_INPUT(GPIOC_PIN1) | \
|
||||
PIN_MODE_INPUT(GPIOC_PIN2) | \
|
||||
PIN_MODE_INPUT(GPIOC_PIN3) | \
|
||||
PIN_MODE_INPUT(GPIOC_PIN4) | \
|
||||
PIN_MODE_INPUT(GPIOC_PIN5) | \
|
||||
PIN_MODE_OUTPUT(GPIOC_LED_RED) | \
|
||||
PIN_MODE_OUTPUT(GPIOC_LED_BLUE) | \
|
||||
PIN_MODE_OUTPUT(GPIOC_LED_ORANGE) | \
|
||||
PIN_MODE_OUTPUT(GPIOC_LED_GREEN) | \
|
||||
PIN_MODE_INPUT(GPIOC_PIN10) | \
|
||||
PIN_MODE_INPUT(GPIOC_PIN11) | \
|
||||
PIN_MODE_INPUT(GPIOC_PIN12) | \
|
||||
PIN_MODE_INPUT(GPIOC_PIN13) | \
|
||||
PIN_MODE_INPUT(GPIOC_OSC32_IN) | \
|
||||
PIN_MODE_INPUT(GPIOC_OSC32_OUT))
|
||||
#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_MEMS_CS) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_LED_RED) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_LED_BLUE) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_LED_ORANGE) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_LED_GREEN) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT))
|
||||
#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_MEMS_CS) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \
|
||||
PIN_OSPEED_HIGH(GPIOC_LED_RED) | \
|
||||
PIN_OSPEED_HIGH(GPIOC_LED_BLUE) | \
|
||||
PIN_OSPEED_HIGH(GPIOC_LED_ORANGE) | \
|
||||
PIN_OSPEED_HIGH(GPIOC_LED_GREEN) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \
|
||||
PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \
|
||||
PIN_OSPEED_HIGH(GPIOC_OSC32_OUT))
|
||||
#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_MEMS_CS) | \
|
||||
PIN_PUPDR_PULLUP(GPIOC_PIN1) | \
|
||||
PIN_PUPDR_PULLUP(GPIOC_PIN2) | \
|
||||
PIN_PUPDR_PULLUP(GPIOC_PIN3) | \
|
||||
PIN_PUPDR_PULLUP(GPIOC_PIN4) | \
|
||||
PIN_PUPDR_PULLUP(GPIOC_PIN5) | \
|
||||
PIN_PUPDR_FLOATING(GPIOC_LED_RED) | \
|
||||
PIN_PUPDR_FLOATING(GPIOC_LED_BLUE) | \
|
||||
PIN_PUPDR_FLOATING(GPIOC_LED_ORANGE) | \
|
||||
PIN_PUPDR_FLOATING(GPIOC_LED_GREEN) | \
|
||||
PIN_PUPDR_PULLUP(GPIOC_PIN10) | \
|
||||
PIN_PUPDR_PULLUP(GPIOC_PIN11) | \
|
||||
PIN_PUPDR_PULLUP(GPIOC_PIN12) | \
|
||||
PIN_PUPDR_PULLUP(GPIOC_PIN13) | \
|
||||
PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \
|
||||
PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT))
|
||||
#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_MEMS_CS) | \
|
||||
PIN_ODR_HIGH(GPIOC_PIN1) | \
|
||||
PIN_ODR_HIGH(GPIOC_PIN2) | \
|
||||
PIN_ODR_HIGH(GPIOC_PIN3) | \
|
||||
PIN_ODR_HIGH(GPIOC_PIN4) | \
|
||||
PIN_ODR_HIGH(GPIOC_PIN5) | \
|
||||
PIN_ODR_LOW(GPIOC_LED_RED) | \
|
||||
PIN_ODR_LOW(GPIOC_LED_BLUE) | \
|
||||
PIN_ODR_LOW(GPIOC_LED_ORANGE) | \
|
||||
PIN_ODR_LOW(GPIOC_LED_GREEN) | \
|
||||
PIN_ODR_HIGH(GPIOC_PIN10) | \
|
||||
PIN_ODR_HIGH(GPIOC_PIN11) | \
|
||||
PIN_ODR_HIGH(GPIOC_PIN12) | \
|
||||
PIN_ODR_HIGH(GPIOC_PIN13) | \
|
||||
PIN_ODR_HIGH(GPIOC_OSC32_IN) | \
|
||||
PIN_ODR_HIGH(GPIOC_OSC32_OUT))
|
||||
#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_MEMS_CS, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_PIN1, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_PIN2, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_PIN3, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_PIN4, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_PIN5, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_LED_RED, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_LED_BLUE, 0U))
|
||||
#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_LED_ORANGE, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_LED_GREEN, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_PIN10, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_PIN11, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_PIN12, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_PIN13, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \
|
||||
PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U))
|
||||
|
||||
/*
|
||||
* GPIOD setup:
|
||||
*
|
||||
* PD0 - PIN0 (input pullup).
|
||||
* PD1 - PIN1 (input pullup).
|
||||
* PD2 - PIN2 (input pullup).
|
||||
* PD3 - PIN3 (input pullup).
|
||||
* PD4 - PIN4 (input pullup).
|
||||
* PD5 - PIN5 (input pullup).
|
||||
* PD6 - PIN6 (input pullup).
|
||||
* PD7 - PIN7 (input pullup).
|
||||
* PD8 - PIN8 (input pullup).
|
||||
* PD9 - PIN9 (input pullup).
|
||||
* PD10 - PIN10 (input pullup).
|
||||
* PD11 - PIN11 (input pullup).
|
||||
* PD12 - PIN12 (input pullup).
|
||||
* PD13 - PIN13 (input pullup).
|
||||
* PD14 - PIN14 (input pullup).
|
||||
* PD15 - PIN15 (input pullup).
|
||||
*/
|
||||
#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN1) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN2) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN3) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN4) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN5) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN6) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN7) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN8) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN9) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN10) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN11) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN12) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN13) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN14) | \
|
||||
PIN_MODE_INPUT(GPIOD_PIN15))
|
||||
#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
|
||||
#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOD_PIN15))
|
||||
#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN1) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN2) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN3) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN4) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN5) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN6) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN7) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN8) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN9) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN10) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN11) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN12) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN13) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN14) | \
|
||||
PIN_PUPDR_PULLUP(GPIOD_PIN15))
|
||||
#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN1) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN2) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN3) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN4) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN5) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN6) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN7) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN8) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN9) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN10) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN11) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN12) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN13) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN14) | \
|
||||
PIN_ODR_HIGH(GPIOD_PIN15))
|
||||
#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN1, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN2, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN3, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN4, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN5, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN6, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN7, 0U))
|
||||
#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN9, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN10, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN11, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN12, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN13, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN14, 0U) | \
|
||||
PIN_AFIO_AF(GPIOD_PIN15, 0U))
|
||||
|
||||
/*
|
||||
* GPIOE setup:
|
||||
*
|
||||
* PE0 - PIN0 (input pullup).
|
||||
* PE1 - PIN1 (input pullup).
|
||||
* PE2 - PIN2 (input pullup).
|
||||
* PE3 - PIN3 (input pullup).
|
||||
* PE4 - PIN4 (input pullup).
|
||||
* PE5 - PIN5 (input pullup).
|
||||
* PE6 - PIN6 (input pullup).
|
||||
* PE7 - PIN7 (input pullup).
|
||||
* PE8 - PIN8 (input pullup).
|
||||
* PE9 - PIN9 (input pullup).
|
||||
* PE10 - PIN10 (input pullup).
|
||||
* PE11 - PIN11 (input pullup).
|
||||
* PE12 - PIN12 (input pullup).
|
||||
* PE13 - PIN13 (input pullup).
|
||||
* PE14 - PIN14 (input pullup).
|
||||
* PE15 - PIN15 (input pullup).
|
||||
*/
|
||||
#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN1) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN2) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN3) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN4) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN5) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN6) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN7) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN8) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN9) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN10) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN11) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN12) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN13) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN14) | \
|
||||
PIN_MODE_INPUT(GPIOE_PIN15))
|
||||
#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN15))
|
||||
#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN1) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN2) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN3) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN4) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN5) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN8) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN9) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN10) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN11) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN12) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN13) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN14) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOE_PIN15))
|
||||
#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN1) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN2) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN3) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN4) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN5) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN6) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN7) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN8) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN9) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN10) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN11) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN12) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN13) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN14) | \
|
||||
PIN_PUPDR_PULLUP(GPIOE_PIN15))
|
||||
#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN1) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN2) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN3) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN4) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN5) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN6) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN7) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN8) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN9) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN10) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN11) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN12) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN13) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN14) | \
|
||||
PIN_ODR_HIGH(GPIOE_PIN15))
|
||||
#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN1, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN2, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN3, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN4, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN5, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN6, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN7, 0U))
|
||||
#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN9, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN10, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN11, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN12, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN13, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN14, 0U) | \
|
||||
PIN_AFIO_AF(GPIOE_PIN15, 0U))
|
||||
|
||||
/*
|
||||
* GPIOF setup:
|
||||
*
|
||||
* PF0 - OSC_IN (input floating).
|
||||
* PF1 - OSC_OUT (input floating).
|
||||
* PF2 - PIN2 (input pullup).
|
||||
* PF3 - PIN3 (input pullup).
|
||||
* PF4 - PIN4 (input pullup).
|
||||
* PF5 - PIN5 (input pullup).
|
||||
* PF6 - PIN6 (input pullup).
|
||||
* PF7 - PIN7 (input pullup).
|
||||
* PF8 - PIN8 (input pullup).
|
||||
* PF9 - PIN9 (input pullup).
|
||||
* PF10 - PIN10 (input pullup).
|
||||
* PF11 - PIN11 (input pullup).
|
||||
* PF12 - PIN12 (input pullup).
|
||||
* PF13 - PIN13 (input pullup).
|
||||
* PF14 - PIN14 (input pullup).
|
||||
* PF15 - PIN15 (input pullup).
|
||||
*/
|
||||
#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \
|
||||
PIN_MODE_INPUT(GPIOF_OSC_OUT) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN2) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN3) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN4) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN5) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN6) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN7) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN8) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN9) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN10) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN11) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN12) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN13) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN14) | \
|
||||
PIN_MODE_INPUT(GPIOF_PIN15))
|
||||
#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \
|
||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
|
||||
#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOF_OSC_IN) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_OSC_OUT) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \
|
||||
PIN_OSPEED_VERYLOW(GPIOF_PIN15))
|
||||
#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \
|
||||
PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN2) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN3) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN4) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN5) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN6) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN7) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN8) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN9) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN10) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN11) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN12) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN13) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN14) | \
|
||||
PIN_PUPDR_PULLUP(GPIOF_PIN15))
|
||||
#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \
|
||||
PIN_ODR_HIGH(GPIOF_OSC_OUT) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN2) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN3) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN4) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN5) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN6) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN7) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN8) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN9) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN10) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN11) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN12) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN13) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN14) | \
|
||||
PIN_ODR_HIGH(GPIOF_PIN15))
|
||||
#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN2, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN3, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN4, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN5, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN6, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN7, 0U))
|
||||
#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN9, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN10, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN11, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN12, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN13, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN14, 0U) | \
|
||||
PIN_AFIO_AF(GPIOF_PIN15, 0U))
|
||||
|
||||
|
||||
#if !defined(_FROM_ASM_)
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void boardInit(void);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* _FROM_ASM_ */
|
||||
|
||||
#endif /* BOARD_H */
|
||||
@@ -0,0 +1,5 @@
|
||||
# List of all the board related files.
|
||||
BOARDSRC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY/board.c
|
||||
|
||||
# Required include directories
|
||||
BOARDINC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY
|
||||
@@ -20,6 +20,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
{{KC_CAPS}}, // test with KC_CAPS, KC_A, RESET
|
||||
};
|
||||
|
||||
const uint16_t fn_actions[] = {
|
||||
};
|
||||
|
||||
@@ -92,11 +92,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
};
|
||||
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
switch(id) {
|
||||
|
||||
@@ -301,11 +301,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
};
|
||||
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
switch(id) {
|
||||
|
||||
@@ -1,5 +1,2 @@
|
||||
RGBLIGHT_ENABLE = yes
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -1,5 +1,2 @@
|
||||
RGBLIGHT_ENABLE = yes
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -25,10 +25,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
// MACRODOWN only works in this function
|
||||
switch(id) {
|
||||
|
||||
@@ -51,15 +51,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_TRNS, RGB_SAD, KC_TRNS, RGB_VAD, \
|
||||
RGB_MOD, KC_TRNS)
|
||||
};
|
||||
|
||||
/*enum function_id {
|
||||
};*/
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
};
|
||||
|
||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
switch (id) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "60.h"
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
#define _______ KC_TRNS
|
||||
|
||||
@@ -32,7 +32,7 @@ enum custom_keycodes {
|
||||
float song_zelda_puzzle[][2] = SONG(ZELDA_PUZZLE);
|
||||
#endif
|
||||
|
||||
const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* Layer 0: Default Layer
|
||||
* ,-----------------------------------------------------------.
|
||||
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| `|BSp|
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "60.h"
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
#define _______ KC_TRNS
|
||||
|
||||
@@ -8,7 +8,7 @@ enum keyboard_layers {
|
||||
_CL
|
||||
};
|
||||
|
||||
const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* Layer 0: Default Layer
|
||||
* ,-----------------------------------------------------------.
|
||||
* |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BkSp|
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "60.h"
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
#define _______ KC_TRNS
|
||||
|
||||
@@ -33,7 +33,7 @@ enum custom_keycodes {
|
||||
float song_zelda_puzzle[][2] = SONG(ZELDA_PUZZLE);
|
||||
#endif
|
||||
|
||||
const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* Layer 0: Default Layer
|
||||
* ,-----------------------------------------------------------------.
|
||||
* |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| `|BSp|
|
||||
|
||||
@@ -44,6 +44,3 @@
|
||||
#
|
||||
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
@@ -16,6 +16,3 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -16,6 +16,3 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
@@ -26,10 +26,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
||||
};
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
// MACRODOWN only works in this function
|
||||
|
||||
@@ -4,19 +4,11 @@ void uart_init(void) {
|
||||
SERIAL_UART_INIT();
|
||||
}
|
||||
|
||||
void led_init(void) {
|
||||
DDRD |= (1<<1);
|
||||
PORTD |= (1<<1);
|
||||
DDRF |= (1<<4) | (1<<5);
|
||||
PORTF |= (1<<4) | (1<<5);
|
||||
}
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
// put your keyboard start-up code here
|
||||
// runs once when the firmware starts up
|
||||
matrix_init_user();
|
||||
uart_init();
|
||||
led_init();
|
||||
}
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
|
||||
@@ -6,46 +6,6 @@
|
||||
#include "backlight.h"
|
||||
#include <stddef.h>
|
||||
|
||||
#define red_led_off PORTF |= (1<<5)
|
||||
#define red_led_on PORTF &= ~(1<<5)
|
||||
#define blu_led_off PORTF |= (1<<4)
|
||||
#define blu_led_on PORTF &= ~(1<<4)
|
||||
#define grn_led_off PORTD |= (1<<1)
|
||||
#define grn_led_on PORTD &= ~(1<<1)
|
||||
|
||||
#define set_led_off red_led_off; grn_led_off; blu_led_off
|
||||
#define set_led_red red_led_on; grn_led_off; blu_led_off
|
||||
#define set_led_blue red_led_off; grn_led_off; blu_led_on
|
||||
#define set_led_green red_led_off; grn_led_on; blu_led_off
|
||||
#define set_led_yellow red_led_on; grn_led_on; blu_led_off
|
||||
#define set_led_magenta red_led_on; grn_led_off; blu_led_on
|
||||
#define set_led_cyan red_led_off; grn_led_on; blu_led_on
|
||||
#define set_led_white red_led_on; grn_led_on; blu_led_on
|
||||
|
||||
/*
|
||||
#define LED_B 5
|
||||
#define LED_R 6
|
||||
#define LED_G 7
|
||||
|
||||
#define all_leds_off PORTF &= ~(1<<LED_B) & ~(1<<LED_R) & ~(1<<LED_G)
|
||||
|
||||
#define red_led_on PORTF |= (1<<LED_R)
|
||||
#define red_led_off PORTF &= ~(1<<LED_R)
|
||||
#define grn_led_on PORTF |= (1<<LED_G)
|
||||
#define grn_led_off PORTF &= ~(1<<LED_G)
|
||||
#define blu_led_on PORTF |= (1<<LED_B)
|
||||
#define blu_led_off PORTF &= ~(1<<LED_B)
|
||||
|
||||
#define set_led_off PORTF &= ~(1<<LED_B) & ~(1<<LED_R) & ~(1<<LED_G)
|
||||
#define set_led_red PORTF = PORTF & ~(1<<LED_B) & ~(1<<LED_G) | (1<<LED_R)
|
||||
#define set_led_blue PORTF = PORTF & ~(1<<LED_G) & ~(1<<LED_R) | (1<<LED_B)
|
||||
#define set_led_green PORTF = PORTF & ~(1<<LED_B) & ~(1<<LED_R) | (1<<LED_G)
|
||||
#define set_led_yellow PORTF = PORTF & ~(1<<LED_B) | (1<<LED_R) | (1<<LED_G)
|
||||
#define set_led_magenta PORTF = PORTF & ~(1<<LED_G) | (1<<LED_R) | (1<<LED_B)
|
||||
#define set_led_cyan PORTF = PORTF & ~(1<<LED_R) | (1<<LED_B) | (1<<LED_G)
|
||||
#define set_led_white PORTF |= (1<<LED_B) | (1<<LED_R) | (1<<LED_G)
|
||||
*/
|
||||
|
||||
// This a shortcut to help you visually see your layout.
|
||||
// The first section contains all of the arguements
|
||||
// The second converts the arguments into a two-dimensional array
|
||||
|
||||
@@ -41,12 +41,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#define ONESHOT_TIMEOUT 500
|
||||
|
||||
|
||||
/* 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.
|
||||
@@ -65,6 +59,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
//#define NO_ACTION_MACRO
|
||||
//#define NO_ACTION_FUNCTION
|
||||
|
||||
// Define masks for modifiers
|
||||
#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
|
||||
#define MODS_CTRL_MASK (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL))
|
||||
#define MODS_ALT_MASK (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT))
|
||||
#define MODS_GUI_MASK (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI))
|
||||
|
||||
//UART settings for communication with the RF microcontroller
|
||||
#define SERIAL_UART_BAUD 1000000
|
||||
#define SERIAL_UART_DATA UDR1
|
||||
|
||||
162
keyboards/comet46/i2c.c
Normal file
162
keyboards/comet46/i2c.c
Normal file
@@ -0,0 +1,162 @@
|
||||
#include <util/twi.h>
|
||||
#include <avr/io.h>
|
||||
#include <stdlib.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include <util/twi.h>
|
||||
#include <stdbool.h>
|
||||
#include "i2c.h"
|
||||
|
||||
#ifdef USE_I2C
|
||||
|
||||
// Limits the amount of we wait for any one i2c transaction.
|
||||
// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is
|
||||
// 9 bits, a single transaction will take around 90μs to complete.
|
||||
//
|
||||
// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit
|
||||
// poll loop takes at least 8 clock cycles to execute
|
||||
#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8
|
||||
|
||||
#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE)
|
||||
|
||||
volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE];
|
||||
|
||||
static volatile uint8_t slave_buffer_pos;
|
||||
static volatile bool slave_has_register_set = false;
|
||||
|
||||
// Wait for an i2c operation to finish
|
||||
inline static
|
||||
void i2c_delay(void) {
|
||||
uint16_t lim = 0;
|
||||
while(!(TWCR & (1<<TWINT)) && lim < I2C_LOOP_TIMEOUT)
|
||||
lim++;
|
||||
|
||||
// easier way, but will wait slightly longer
|
||||
// _delay_us(100);
|
||||
}
|
||||
|
||||
// Setup twi to run at 100kHz or 400kHz (see ./i2c.h SCL_CLOCK)
|
||||
void i2c_master_init(void) {
|
||||
// no prescaler
|
||||
TWSR = 0;
|
||||
// Set TWI clock frequency to SCL_CLOCK. Need TWBR>10.
|
||||
// Check datasheets for more info.
|
||||
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
|
||||
}
|
||||
|
||||
// Start a transaction with the given i2c slave address. The direction of the
|
||||
// transfer is set with I2C_READ and I2C_WRITE.
|
||||
// returns: 0 => success
|
||||
// 1 => error
|
||||
uint8_t i2c_master_start(uint8_t address) {
|
||||
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);
|
||||
|
||||
i2c_delay();
|
||||
|
||||
// check that we started successfully
|
||||
if ( (TW_STATUS != TW_START) && (TW_STATUS != TW_REP_START))
|
||||
return 1;
|
||||
|
||||
TWDR = address;
|
||||
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||
|
||||
i2c_delay();
|
||||
|
||||
if ( (TW_STATUS != TW_MT_SLA_ACK) && (TW_STATUS != TW_MR_SLA_ACK) )
|
||||
return 1; // slave did not acknowledge
|
||||
else
|
||||
return 0; // success
|
||||
}
|
||||
|
||||
|
||||
// Finish the i2c transaction.
|
||||
void i2c_master_stop(void) {
|
||||
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
||||
|
||||
uint16_t lim = 0;
|
||||
while(!(TWCR & (1<<TWSTO)) && lim < I2C_LOOP_TIMEOUT)
|
||||
lim++;
|
||||
}
|
||||
|
||||
// Write one byte to the i2c slave.
|
||||
// returns 0 => slave ACK
|
||||
// 1 => slave NACK
|
||||
uint8_t i2c_master_write(uint8_t data) {
|
||||
TWDR = data;
|
||||
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||
|
||||
i2c_delay();
|
||||
|
||||
// check if the slave acknowledged us
|
||||
return (TW_STATUS == TW_MT_DATA_ACK) ? 0 : 1;
|
||||
}
|
||||
|
||||
// Read one byte from the i2c slave. If ack=1 the slave is acknowledged,
|
||||
// if ack=0 the acknowledge bit is not set.
|
||||
// returns: byte read from i2c device
|
||||
uint8_t i2c_master_read(int ack) {
|
||||
TWCR = (1<<TWINT) | (1<<TWEN) | (ack<<TWEA);
|
||||
|
||||
i2c_delay();
|
||||
return TWDR;
|
||||
}
|
||||
|
||||
void i2c_reset_state(void) {
|
||||
TWCR = 0;
|
||||
}
|
||||
|
||||
void i2c_slave_init(uint8_t address) {
|
||||
TWAR = address << 0; // slave i2c address
|
||||
// TWEN - twi enable
|
||||
// TWEA - enable address acknowledgement
|
||||
// TWINT - twi interrupt flag
|
||||
// TWIE - enable the twi interrupt
|
||||
TWCR = (1<<TWIE) | (1<<TWEA) | (1<<TWINT) | (1<<TWEN);
|
||||
}
|
||||
|
||||
ISR(TWI_vect);
|
||||
|
||||
ISR(TWI_vect) {
|
||||
uint8_t ack = 1;
|
||||
switch(TW_STATUS) {
|
||||
case TW_SR_SLA_ACK:
|
||||
// this device has been addressed as a slave receiver
|
||||
slave_has_register_set = false;
|
||||
break;
|
||||
|
||||
case TW_SR_DATA_ACK:
|
||||
// this device has received data as a slave receiver
|
||||
// The first byte that we receive in this transaction sets the location
|
||||
// of the read/write location of the slaves memory that it exposes over
|
||||
// i2c. After that, bytes will be written at slave_buffer_pos, incrementing
|
||||
// slave_buffer_pos after each write.
|
||||
if(!slave_has_register_set) {
|
||||
slave_buffer_pos = TWDR;
|
||||
// don't acknowledge the master if this memory loctaion is out of bounds
|
||||
if ( slave_buffer_pos >= SLAVE_BUFFER_SIZE ) {
|
||||
ack = 0;
|
||||
slave_buffer_pos = 0;
|
||||
}
|
||||
slave_has_register_set = true;
|
||||
} else {
|
||||
i2c_slave_buffer[slave_buffer_pos] = TWDR;
|
||||
BUFFER_POS_INC();
|
||||
}
|
||||
break;
|
||||
|
||||
case TW_ST_SLA_ACK:
|
||||
case TW_ST_DATA_ACK:
|
||||
// master has addressed this device as a slave transmitter and is
|
||||
// requesting data.
|
||||
TWDR = i2c_slave_buffer[slave_buffer_pos];
|
||||
BUFFER_POS_INC();
|
||||
break;
|
||||
|
||||
case TW_BUS_ERROR: // something went wrong, reset twi state
|
||||
TWCR = 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// Reset everything, so we are ready for the next TWI interrupt
|
||||
TWCR |= (1<<TWIE) | (1<<TWINT) | (ack<<TWEA) | (1<<TWEN);
|
||||
}
|
||||
#endif
|
||||
49
keyboards/comet46/i2c.h
Normal file
49
keyboards/comet46/i2c.h
Normal file
@@ -0,0 +1,49 @@
|
||||
#ifndef I2C_H
|
||||
#define I2C_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef F_CPU
|
||||
#define F_CPU 16000000UL
|
||||
#endif
|
||||
|
||||
#define I2C_READ 1
|
||||
#define I2C_WRITE 0
|
||||
|
||||
#define I2C_ACK 1
|
||||
#define I2C_NACK 0
|
||||
|
||||
#define SLAVE_BUFFER_SIZE 0x10
|
||||
|
||||
// i2c SCL clock frequency 400kHz
|
||||
#define SCL_CLOCK 400000L
|
||||
|
||||
extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE];
|
||||
|
||||
void i2c_master_init(void);
|
||||
uint8_t i2c_master_start(uint8_t address);
|
||||
void i2c_master_stop(void);
|
||||
uint8_t i2c_master_write(uint8_t data);
|
||||
uint8_t i2c_master_read(int);
|
||||
void i2c_reset_state(void);
|
||||
void i2c_slave_init(uint8_t address);
|
||||
|
||||
|
||||
static inline unsigned char i2c_start_read(unsigned char addr) {
|
||||
return i2c_master_start((addr << 1) | I2C_READ);
|
||||
}
|
||||
|
||||
static inline unsigned char i2c_start_write(unsigned char addr) {
|
||||
return i2c_master_start((addr << 1) | I2C_WRITE);
|
||||
}
|
||||
|
||||
// from SSD1306 scrips
|
||||
extern unsigned char i2c_rep_start(unsigned char addr);
|
||||
extern void i2c_start_wait(unsigned char addr);
|
||||
extern unsigned char i2c_readAck(void);
|
||||
extern unsigned char i2c_readNak(void);
|
||||
extern unsigned char i2c_read(unsigned char ack);
|
||||
|
||||
#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak();
|
||||
|
||||
#endif
|
||||
226
keyboards/comet46/keymaps/default-rgbled/keymap.c
Normal file
226
keyboards/comet46/keymaps/default-rgbled/keymap.c
Normal file
@@ -0,0 +1,226 @@
|
||||
// this is the style you want to emulate.
|
||||
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
||||
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
||||
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||
// entirely and just use numbers.
|
||||
enum comet46_layers
|
||||
{
|
||||
_QWERTY,
|
||||
_COLEMAK,
|
||||
_DVORAK,
|
||||
_LOWER,
|
||||
_RAISE,
|
||||
_ADJUST,
|
||||
};
|
||||
|
||||
enum custom_keycodes {
|
||||
QWERTY = SAFE_RANGE,
|
||||
COLEMAK,
|
||||
DVORAK,
|
||||
LOWER,
|
||||
RAISE,
|
||||
};
|
||||
|
||||
// Fillers to make layering more clear
|
||||
#define _______ KC_TRNS
|
||||
#define XXXXXXX KC_NO
|
||||
#define LOWER MO(_LOWER)
|
||||
#define RAISE MO(_RAISE)
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
/* Qwerty
|
||||
* ,-----------------------------------------+ +-----------------------------------------.
|
||||
* | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | Ctl | A | S | D | F | G | Esc | | Del | H | J | K | L | ; | " |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | Shift| Z | X | C | V | B | { | | } | N | M | , | . | / | Shift|
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------|
|
||||
* | GUI | Lower| Space| | Enter| Raise| Alt |
|
||||
* +--------------------/ \--------------------+
|
||||
*/
|
||||
[_QWERTY] = LAYOUT(
|
||||
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_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_ESC, KC_DEL, 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_LCBR, KC_RCBR, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
|
||||
KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT
|
||||
),
|
||||
|
||||
/* Colemak
|
||||
* ,-----------------------------------------+ +-----------------------------------------.
|
||||
* | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | Ctl | A | R | S | T | D | Esc | | Del | H | N | E | I | O | " |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | Shift| Z | X | C | V | B | { | | } | K | M | , | . | / | Shift|
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------|
|
||||
* | GUI | Lower| Space| | Enter| Raise| Alt |
|
||||
* +--------------------/ \--------------------+
|
||||
*/
|
||||
[_COLEMAK] = LAYOUT(
|
||||
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_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_ESC, KC_DEL, 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_LCBR, KC_RCBR, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
|
||||
KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT
|
||||
),
|
||||
|
||||
/* Dvorak
|
||||
* ,-----------------------------------------+ +-----------------------------------------.
|
||||
* | Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | Ctl | A | O | E | U | I | Esc | | Del | D | H | T | N | S | / |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | Shift| ; | Q | J | K | X | { | | } | B | M | W | V | Z | Shift|
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------|
|
||||
* | GUI | Lower| Space| | Enter| Raise| Alt |
|
||||
* +--------------------/ \--------------------+
|
||||
*/
|
||||
[_DVORAK] = LAYOUT(
|
||||
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC,
|
||||
KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_ESC, KC_DEL, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH,
|
||||
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LCBR, KC_RCBR, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT,
|
||||
KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT
|
||||
),
|
||||
|
||||
/* Lower
|
||||
* ,-----------------------------------------+ +-----------------------------------------.
|
||||
* | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | | | | | | | | | ` | \ | - | = | [ | ] | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | | | | | | | | | ~ | | | _ | + | { | } | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------|
|
||||
* | | | | | | | |
|
||||
* +--------------------/ \--------------------+
|
||||
*/
|
||||
[_LOWER] = LAYOUT(
|
||||
_______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, KC_GRV, KC_BSLS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, KC_TILD, KC_PIPE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______,
|
||||
_______, _______, _______, _______, _______, _______
|
||||
),
|
||||
|
||||
/* Raise
|
||||
* ,-----------------------------------------+ +-----------------------------------------.
|
||||
* | | 1 | 2 | 3 | 4 | 5 | | | | | | | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | | F1 | F2 | F3 | F4 | F5 | F6 | | | Left | Down | Up |Right | End | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | | F7 | F8 | F9 | F10 | F11 | F12 | | Home | | PgDn | PgUp | | | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------|
|
||||
* | | | | | | | |
|
||||
* +--------------------/ \--------------------+
|
||||
*/
|
||||
[_RAISE] = LAYOUT(
|
||||
_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
|
||||
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, _______,
|
||||
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_HOME, XXXXXXX, KC_PGDN, KC_PGUP, XXXXXXX, XXXXXXX, _______,
|
||||
_______, _______, _______, _______, _______, _______
|
||||
),
|
||||
|
||||
/* Adjust
|
||||
* ,-----------------------------------------+ +-----------------------------------------.
|
||||
* | | | | | | | | | | | | | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | | | | | | |Qwerty| |Colemk| | | | | | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | | | | | | |Reset | |Dvorak| | | | | | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------|
|
||||
* | | | | | | | |
|
||||
* +--------------------/ \--------------------+
|
||||
*/
|
||||
[_ADJUST] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, RESET, DVORAK, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
uint32_t layer_state_set_user(uint32_t state) {
|
||||
return update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
|
||||
}
|
||||
|
||||
// settings for LED on receiver
|
||||
void led_init(void) {
|
||||
DDRD |= (1<<1);
|
||||
PORTD |= (1<<1);
|
||||
DDRF |= (1<<4) | (1<<5);
|
||||
PORTF |= (1<<4) | (1<<5);
|
||||
}
|
||||
|
||||
#define red_led_off PORTF |= (1<<5)
|
||||
#define red_led_on PORTF &= ~(1<<5)
|
||||
#define blu_led_off PORTF |= (1<<4)
|
||||
#define blu_led_on PORTF &= ~(1<<4)
|
||||
#define grn_led_off PORTD |= (1<<1)
|
||||
#define grn_led_on PORTD &= ~(1<<1)
|
||||
|
||||
#define set_led_off red_led_off; grn_led_off; blu_led_off
|
||||
#define set_led_red red_led_on; grn_led_off; blu_led_off
|
||||
#define set_led_blue red_led_off; grn_led_off; blu_led_on
|
||||
#define set_led_green red_led_off; grn_led_on; blu_led_off
|
||||
#define set_led_yellow red_led_on; grn_led_on; blu_led_off
|
||||
#define set_led_magenta red_led_on; grn_led_off; blu_led_on
|
||||
#define set_led_cyan red_led_off; grn_led_on; blu_led_on
|
||||
#define set_led_white red_led_on; grn_led_on; blu_led_on
|
||||
|
||||
void matrix_init_user(void) {
|
||||
led_init();
|
||||
}
|
||||
|
||||
void matrix_scan_user(void) {
|
||||
uint8_t layer = biton32(layer_state);
|
||||
uint8_t default_layer = biton32(eeconfig_read_default_layer());
|
||||
switch (layer) {
|
||||
case _LOWER:
|
||||
set_led_red;
|
||||
break;
|
||||
case _RAISE:
|
||||
set_led_blue;
|
||||
break;
|
||||
case _ADJUST:
|
||||
set_led_magenta;
|
||||
break;
|
||||
default:
|
||||
switch (default_layer) {
|
||||
case _COLEMAK:
|
||||
set_led_white;
|
||||
break;
|
||||
case _DVORAK:
|
||||
set_led_yellow;
|
||||
break;
|
||||
default:
|
||||
set_led_green;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case QWERTY:
|
||||
if (record->event.pressed) {
|
||||
set_single_persistent_default_layer(_QWERTY);
|
||||
}
|
||||
break;
|
||||
case COLEMAK:
|
||||
if (record->event.pressed) {
|
||||
set_single_persistent_default_layer(_COLEMAK);
|
||||
}
|
||||
break;
|
||||
case DVORAK:
|
||||
if (record->event.pressed) {
|
||||
set_single_persistent_default_layer(_DVORAK);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
3
keyboards/comet46/keymaps/default-rgbled/readme.md
Normal file
3
keyboards/comet46/keymaps/default-rgbled/readme.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## default-led
|
||||
|
||||
A keymap that is compatible with mitosis-type receivers, which use RGB LED for layer indication.
|
||||
@@ -18,8 +18,14 @@ You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef CONFIG_USER_H
|
||||
#define CONFIG_USER_H
|
||||
|
||||
// #include "../../config.h"
|
||||
|
||||
// place overrides here
|
||||
/* Use I2C or Serial */
|
||||
|
||||
#define USE_I2C
|
||||
#define SSD1306OLED
|
||||
|
||||
#endif
|
||||
@@ -2,6 +2,10 @@
|
||||
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
#ifdef SSD1306OLED
|
||||
#include "ssd1306.h"
|
||||
#endif
|
||||
|
||||
|
||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
||||
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
||||
@@ -9,13 +13,18 @@
|
||||
// entirely and just use numbers.
|
||||
enum comet46_layers
|
||||
{
|
||||
_QWERTY,
|
||||
_LOWER,
|
||||
_RAISE,
|
||||
_QWERTY,
|
||||
_COLEMAK,
|
||||
_DVORAK,
|
||||
_LOWER,
|
||||
_RAISE,
|
||||
_ADJUST,
|
||||
};
|
||||
|
||||
enum custom_keycodes {
|
||||
QWERTY = SAFE_RANGE,
|
||||
COLEMAK,
|
||||
DVORAK,
|
||||
LOWER,
|
||||
RAISE,
|
||||
};
|
||||
@@ -46,6 +55,42 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT
|
||||
),
|
||||
|
||||
/* Colemak
|
||||
* ,-----------------------------------------+ +-----------------------------------------.
|
||||
* | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | Ctl | A | R | S | T | D | Esc | | Del | H | N | E | I | O | " |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | Shift| Z | X | C | V | B | { | | } | K | M | , | . | / | Shift|
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------|
|
||||
* | GUI | Lower| Space| | Enter| Raise| Alt |
|
||||
* +--------------------/ \--------------------+
|
||||
*/
|
||||
[_COLEMAK] = LAYOUT(
|
||||
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_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_ESC, KC_DEL, 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_LCBR, KC_RCBR, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
|
||||
KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT
|
||||
),
|
||||
|
||||
/* Dvorak
|
||||
* ,-----------------------------------------+ +-----------------------------------------.
|
||||
* | Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | Ctl | A | O | E | U | I | Esc | | Del | D | H | T | N | S | / |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | Shift| ; | Q | J | K | X | { | | } | B | M | W | V | Z | Shift|
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------|
|
||||
* | GUI | Lower| Space| | Enter| Raise| Alt |
|
||||
* +--------------------/ \--------------------+
|
||||
*/
|
||||
[_DVORAK] = LAYOUT(
|
||||
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC,
|
||||
KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_ESC, KC_DEL, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH,
|
||||
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LCBR, KC_RCBR, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT,
|
||||
KC_LGUI, LOWER, KC_SPC, KC_ENT, RAISE, KC_LALT
|
||||
),
|
||||
|
||||
/* Lower
|
||||
* ,-----------------------------------------+ +-----------------------------------------.
|
||||
* | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
|
||||
@@ -70,7 +115,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | | F1 | F2 | F3 | F4 | F5 | F6 | | | Left | Down | Up |Right | End | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | | F7 | F8 | F9 | F10 | F11 | F12 | | Home | | | | | | |
|
||||
* | | F7 | F8 | F9 | F10 | F11 | F12 | | Home | | PgDn | PgUp | | | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------|
|
||||
* | | | | | | | |
|
||||
* +--------------------/ \--------------------+
|
||||
@@ -78,26 +123,134 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[_RAISE] = LAYOUT(
|
||||
_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
|
||||
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, _______,
|
||||
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
|
||||
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_HOME, XXXXXXX, KC_PGDN, KC_PGUP, XXXXXXX, XXXXXXX, _______,
|
||||
_______, _______, _______, _______, _______, _______
|
||||
),
|
||||
|
||||
/* Adjust
|
||||
* ,-----------------------------------------+ +-----------------------------------------.
|
||||
* | | | | | | | | | | | | | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | | | | | | |Qwerty| |Colemk| | | | | | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+------+------|
|
||||
* | | | | | | |Reset | |Dvorak| | | | | | |
|
||||
* |------+------+------+------+------+------+------+ +------+------+------+------+------+-------------|
|
||||
* | | | | | | | |
|
||||
* +--------------------/ \--------------------+
|
||||
*/
|
||||
[_ADJUST] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, RESET, DVORAK, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
void matrix_scan_user(void) {
|
||||
uint8_t layer = biton32(layer_state);
|
||||
switch (layer) {
|
||||
case _QWERTY:
|
||||
set_led_green;
|
||||
break;
|
||||
case _RAISE:
|
||||
set_led_blue;
|
||||
break;
|
||||
case _LOWER:
|
||||
set_led_red;
|
||||
break;
|
||||
default:
|
||||
set_led_green;
|
||||
break;
|
||||
}
|
||||
uint32_t layer_state_set_user(uint32_t state) {
|
||||
return update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
|
||||
}
|
||||
|
||||
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
|
||||
#ifdef SSD1306OLED
|
||||
|
||||
// You need to add source files to SRC in rules.mk when using OLED display functions
|
||||
void set_keylog(uint16_t keycode);
|
||||
const char *read_keylog(void);
|
||||
const char *read_modifier_state(void);
|
||||
const char *read_host_led_state(void);
|
||||
|
||||
void matrix_init_user(void) {
|
||||
iota_gfx_init(false); // turns on the display
|
||||
}
|
||||
|
||||
void matrix_scan_user(void) {
|
||||
iota_gfx_task(); // this is what updates the display continuously
|
||||
}
|
||||
|
||||
void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
|
||||
if (memcmp(dest->display, source->display, sizeof(dest->display))) {
|
||||
memcpy(dest->display, source->display, sizeof(dest->display));
|
||||
dest->dirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
void render_status(struct CharacterMatrix *matrix) {
|
||||
// Layer state
|
||||
char layer_str[22];
|
||||
matrix_write(matrix, "Layer: ");
|
||||
uint8_t layer = biton32(layer_state);
|
||||
uint8_t default_layer = biton32(eeconfig_read_default_layer());
|
||||
switch (layer) {
|
||||
case _QWERTY:
|
||||
switch (default_layer) {
|
||||
case _QWERTY:
|
||||
snprintf(layer_str, sizeof(layer_str), "Qwerty");
|
||||
break;
|
||||
case _COLEMAK:
|
||||
snprintf(layer_str, sizeof(layer_str), "Colemak");
|
||||
break;
|
||||
case _DVORAK:
|
||||
snprintf(layer_str, sizeof(layer_str), "Dvorak");
|
||||
break;
|
||||
default:
|
||||
snprintf(layer_str, sizeof(layer_str), "Undef-%d", default_layer);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case _RAISE:
|
||||
snprintf(layer_str, sizeof(layer_str), "Raise");
|
||||
break;
|
||||
case _LOWER:
|
||||
snprintf(layer_str, sizeof(layer_str), "Lower");
|
||||
break;
|
||||
case _ADJUST:
|
||||
snprintf(layer_str, sizeof(layer_str), "Adjust");
|
||||
break;
|
||||
default:
|
||||
snprintf(layer_str, sizeof(layer_str), "Undef-%d", layer);
|
||||
}
|
||||
matrix_write_ln(matrix, layer_str);
|
||||
// Last entered keycode
|
||||
matrix_write_ln(matrix, read_keylog());
|
||||
// Modifier state
|
||||
matrix_write_ln(matrix, read_modifier_state());
|
||||
// Host Keyboard LED Status
|
||||
matrix_write(matrix, read_host_led_state());
|
||||
}
|
||||
|
||||
|
||||
void iota_gfx_task_user(void) {
|
||||
struct CharacterMatrix matrix;
|
||||
matrix_clear(&matrix);
|
||||
render_status(&matrix);
|
||||
matrix_update(&display, &matrix);
|
||||
}
|
||||
|
||||
#endif//SSD1306OLED
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
#ifdef SSD1306OLED
|
||||
if (record->event.pressed) {
|
||||
set_keylog(keycode);
|
||||
}
|
||||
#endif
|
||||
switch (keycode) {
|
||||
case QWERTY:
|
||||
if (record->event.pressed) {
|
||||
set_single_persistent_default_layer(_QWERTY);
|
||||
}
|
||||
break;
|
||||
case COLEMAK:
|
||||
if (record->event.pressed) {
|
||||
set_single_persistent_default_layer(_COLEMAK);
|
||||
}
|
||||
break;
|
||||
case DVORAK:
|
||||
if (record->event.pressed) {
|
||||
set_single_persistent_default_layer(_DVORAK);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
3
keyboards/comet46/keymaps/default/readme.md
Normal file
3
keyboards/comet46/keymaps/default/readme.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## default-oled-display
|
||||
|
||||
A keymap that is compatible with receivers with an OLED display.
|
||||
5
keyboards/comet46/keymaps/default/rules.mk
Normal file
5
keyboards/comet46/keymaps/default/rules.mk
Normal file
@@ -0,0 +1,5 @@
|
||||
# If you want to change display settings of the OLED, you need to change the following lines
|
||||
SRC += ./lib/glcdfont.c \
|
||||
./lib/keylogger.c \
|
||||
./lib/modifier_state_reader.c \
|
||||
./lib/host_led_state_reader.c
|
||||
@@ -10,133 +10,133 @@ static uint8_t send_key_shift_bit[SHIFT_BIT_SIZE];
|
||||
* Memo: Using other layer keymap to get keycode
|
||||
*/
|
||||
void action_pseudo_lut(keyrecord_t *record, uint8_t base_keymap_id, const uint16_t (*keymap)[2]) {
|
||||
uint8_t prev_shift;
|
||||
uint16_t keycode;
|
||||
uint16_t pseudo_keycode;
|
||||
uint8_t prev_shift;
|
||||
uint16_t keycode;
|
||||
uint16_t pseudo_keycode;
|
||||
|
||||
/* get keycode from keymap you specified */
|
||||
keycode = keymap_key_to_keycode(base_keymap_id, record->event.key);
|
||||
/* get keycode from keymap you specified */
|
||||
keycode = keymap_key_to_keycode(base_keymap_id, record->event.key);
|
||||
|
||||
prev_shift = keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT));
|
||||
prev_shift = keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT));
|
||||
|
||||
if (record->event.pressed) {
|
||||
/* when magic commands entered, keycode does not converted */
|
||||
if (IS_COMMAND()) {
|
||||
if (prev_shift) {
|
||||
add_shift_bit(keycode);
|
||||
}
|
||||
register_code(keycode);
|
||||
return;
|
||||
}
|
||||
|
||||
if (prev_shift) {
|
||||
pseudo_keycode = convert_keycode(keymap, keycode, true);
|
||||
dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode);
|
||||
add_shift_bit(keycode);
|
||||
|
||||
if (IS_LSFT(pseudo_keycode)) {
|
||||
register_code(QK_LSFT ^ pseudo_keycode);
|
||||
} else {
|
||||
/* delete shift mod temporarily */
|
||||
del_mods(prev_shift);
|
||||
send_keyboard_report();
|
||||
register_code(pseudo_keycode);
|
||||
add_mods(prev_shift);
|
||||
send_keyboard_report();
|
||||
}
|
||||
} else {
|
||||
pseudo_keycode = convert_keycode(keymap, keycode, false);
|
||||
dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode);
|
||||
|
||||
if (IS_LSFT(pseudo_keycode)) {
|
||||
add_weak_mods(MOD_BIT(KC_LSFT));
|
||||
send_keyboard_report();
|
||||
register_code(QK_LSFT ^ pseudo_keycode);
|
||||
/* on Windows, prevent key repeat to avoid unintended output */
|
||||
unregister_code(QK_LSFT ^ pseudo_keycode);
|
||||
del_weak_mods(MOD_BIT(KC_LSFT));
|
||||
send_keyboard_report();
|
||||
} else {
|
||||
register_code(pseudo_keycode);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (get_shift_bit(keycode)) {
|
||||
del_shift_bit(keycode);
|
||||
pseudo_keycode = convert_keycode(keymap, keycode, true);
|
||||
} else {
|
||||
pseudo_keycode = convert_keycode(keymap, keycode, false);
|
||||
}
|
||||
dprintf("released: %02X, converted: %04X\n", keycode, pseudo_keycode);
|
||||
|
||||
if (IS_LSFT(pseudo_keycode)) {
|
||||
unregister_code(QK_LSFT ^ pseudo_keycode);
|
||||
} else {
|
||||
unregister_code(pseudo_keycode);
|
||||
}
|
||||
if (record->event.pressed) {
|
||||
/* when magic commands entered, keycode does not converted */
|
||||
if (IS_COMMAND()) {
|
||||
if (prev_shift) {
|
||||
add_shift_bit(keycode);
|
||||
}
|
||||
register_code(keycode);
|
||||
return;
|
||||
}
|
||||
|
||||
if (prev_shift) {
|
||||
pseudo_keycode = convert_keycode(keymap, keycode, true);
|
||||
dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode);
|
||||
add_shift_bit(keycode);
|
||||
|
||||
if (IS_LSFT(pseudo_keycode)) {
|
||||
register_code(QK_LSFT ^ pseudo_keycode);
|
||||
} else {
|
||||
/* delete shift mod temporarily */
|
||||
del_mods(prev_shift);
|
||||
send_keyboard_report();
|
||||
register_code(pseudo_keycode);
|
||||
add_mods(prev_shift);
|
||||
send_keyboard_report();
|
||||
}
|
||||
} else {
|
||||
pseudo_keycode = convert_keycode(keymap, keycode, false);
|
||||
dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode);
|
||||
|
||||
if (IS_LSFT(pseudo_keycode)) {
|
||||
add_weak_mods(MOD_BIT(KC_LSFT));
|
||||
send_keyboard_report();
|
||||
register_code(QK_LSFT ^ pseudo_keycode);
|
||||
/* on Windows, prevent key repeat to avoid unintended output */
|
||||
unregister_code(QK_LSFT ^ pseudo_keycode);
|
||||
del_weak_mods(MOD_BIT(KC_LSFT));
|
||||
send_keyboard_report();
|
||||
} else {
|
||||
register_code(pseudo_keycode);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (get_shift_bit(keycode)) {
|
||||
del_shift_bit(keycode);
|
||||
pseudo_keycode = convert_keycode(keymap, keycode, true);
|
||||
} else {
|
||||
pseudo_keycode = convert_keycode(keymap, keycode, false);
|
||||
}
|
||||
dprintf("released: %02X, converted: %04X\n", keycode, pseudo_keycode);
|
||||
|
||||
if (IS_LSFT(pseudo_keycode)) {
|
||||
unregister_code(QK_LSFT ^ pseudo_keycode);
|
||||
} else {
|
||||
unregister_code(pseudo_keycode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t convert_keycode(const uint16_t (*keymap)[2], uint16_t keycode, bool shift_modded)
|
||||
{
|
||||
uint16_t pseudo_keycode;
|
||||
uint16_t pseudo_keycode;
|
||||
|
||||
switch (keycode) {
|
||||
case KC_A ... KC_CAPSLOCK:
|
||||
#if defined(__AVR__)
|
||||
if (shift_modded) {
|
||||
pseudo_keycode = pgm_read_word(&keymap[keycode][1]);
|
||||
} else {
|
||||
pseudo_keycode = pgm_read_word(&keymap[keycode][0]);
|
||||
}
|
||||
#else
|
||||
if (shift_modded) {
|
||||
pseudo_keycode = keymap[keycode][1];
|
||||
} else {
|
||||
pseudo_keycode = keymap[keycode][0];
|
||||
}
|
||||
#endif
|
||||
/* if undefined, use got keycode as it is */
|
||||
if (pseudo_keycode == 0x00) {
|
||||
if (shift_modded) {
|
||||
pseudo_keycode = S(keycode);
|
||||
} else {
|
||||
pseudo_keycode = keycode;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (shift_modded) {
|
||||
pseudo_keycode = S(keycode);
|
||||
} else {
|
||||
pseudo_keycode = keycode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return pseudo_keycode;
|
||||
switch (keycode) {
|
||||
case KC_A ... KC_CAPSLOCK:
|
||||
#if defined(__AVR__)
|
||||
if (shift_modded) {
|
||||
pseudo_keycode = pgm_read_word(&keymap[keycode][1]);
|
||||
} else {
|
||||
pseudo_keycode = pgm_read_word(&keymap[keycode][0]);
|
||||
}
|
||||
#else
|
||||
if (shift_modded) {
|
||||
pseudo_keycode = keymap[keycode][1];
|
||||
} else {
|
||||
pseudo_keycode = keymap[keycode][0];
|
||||
}
|
||||
#endif
|
||||
/* if undefined, use got keycode as it is */
|
||||
if (pseudo_keycode == 0x00) {
|
||||
if (shift_modded) {
|
||||
pseudo_keycode = S(keycode);
|
||||
} else {
|
||||
pseudo_keycode = keycode;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (shift_modded) {
|
||||
pseudo_keycode = S(keycode);
|
||||
} else {
|
||||
pseudo_keycode = keycode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return pseudo_keycode;
|
||||
}
|
||||
|
||||
uint8_t get_shift_bit(uint16_t keycode) {
|
||||
if ((keycode >> 3) < SHIFT_BIT_SIZE) {
|
||||
return send_key_shift_bit[keycode >> 3] & (1 << (keycode & 7));
|
||||
} else {
|
||||
dprintf("get_shift_bit: Can't get shift bit. keycode: %02X\n", keycode);
|
||||
return 0;
|
||||
}
|
||||
if ((keycode >> 3) < SHIFT_BIT_SIZE) {
|
||||
return send_key_shift_bit[keycode >> 3] & (1 << (keycode & 7));
|
||||
} else {
|
||||
dprintf("get_shift_bit: Can't get shift bit. keycode: %02X\n", keycode);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void add_shift_bit(uint16_t keycode) {
|
||||
if ((keycode >> 3) < SHIFT_BIT_SIZE) {
|
||||
send_key_shift_bit[keycode >> 3] |= (1 << (keycode & 7));
|
||||
} else {
|
||||
dprintf("add_shift_bit: Can't add shift bit. keycode: %02X\n", keycode);
|
||||
}
|
||||
if ((keycode >> 3) < SHIFT_BIT_SIZE) {
|
||||
send_key_shift_bit[keycode >> 3] |= (1 << (keycode & 7));
|
||||
} else {
|
||||
dprintf("add_shift_bit: Can't add shift bit. keycode: %02X\n", keycode);
|
||||
}
|
||||
}
|
||||
|
||||
void del_shift_bit(uint16_t keycode) {
|
||||
if ((keycode >> 3) < SHIFT_BIT_SIZE) {
|
||||
send_key_shift_bit[keycode >> 3] &= ~(1 << (keycode & 7));
|
||||
} else {
|
||||
dprintf("del_shift_bit: Can't delete shift bit. keycode: %02X\n", keycode);
|
||||
}
|
||||
if ((keycode >> 3) < SHIFT_BIT_SIZE) {
|
||||
send_key_shift_bit[keycode >> 3] &= ~(1 << (keycode & 7));
|
||||
} else {
|
||||
dprintf("del_shift_bit: Can't delete shift bit. keycode: %02X\n", keycode);
|
||||
}
|
||||
}
|
||||
|
||||
34
keyboards/comet46/keymaps/satt/config.h
Normal file
34
keyboards/comet46/keymaps/satt/config.h
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
This is the c configuration file for the keymap
|
||||
|
||||
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||
Copyright 2015 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/>.
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_USER_H
|
||||
#define CONFIG_USER_H
|
||||
|
||||
/* key combination for command */
|
||||
#define IS_COMMAND() ( \
|
||||
keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \
|
||||
)
|
||||
|
||||
/* Use I2C or Serial */
|
||||
|
||||
#define USE_I2C
|
||||
#define SSD1306OLED
|
||||
|
||||
#endif
|
||||
@@ -4,64 +4,96 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
#include "keymap_jis2us.h"
|
||||
#include "action_pseudo_lut.h"
|
||||
#include "keymap_jp.h"
|
||||
#ifdef SSD1306OLED
|
||||
#include "ssd1306.h"
|
||||
#endif
|
||||
|
||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
||||
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
||||
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||
// entirely and just use numbers.
|
||||
enum comet46_layers {
|
||||
_QWERTY,
|
||||
_LOWER,
|
||||
_RAISE,
|
||||
_PSEUDO_US,
|
||||
_PSEUDO_US_LOWER,
|
||||
_PSEUDO_US_RAISE,
|
||||
_ADJUST
|
||||
_QWERTY,
|
||||
_LOWER,
|
||||
_RAISE,
|
||||
_PSEUDO_US,
|
||||
_PSEUDO_US_LOWER,
|
||||
_PSEUDO_US_RAISE,
|
||||
_ADJUST
|
||||
};
|
||||
|
||||
enum custom_keycodes {
|
||||
QWERTY = SAFE_RANGE,
|
||||
PSEUDO_US,
|
||||
JIS2US,
|
||||
};
|
||||
|
||||
#define KC_LWR MO(_LOWER)
|
||||
#define KC_RSE MO(_RAISE)
|
||||
// JIS keycodes
|
||||
#define KC_JZHT JP_ZHTG // hankaku/zenkaku|kanzi
|
||||
#define KC_JCIR JP_CIRC // ^, ~
|
||||
#define KC_JAT JP_AT // @, `
|
||||
#define KC_JLBR JP_LBRC // [, {
|
||||
#define KC_JCOL JP_COLN // :, *
|
||||
#define KC_JRBR JP_RBRC // ], }
|
||||
#define KC_JBSL JP_BSLS // \, _
|
||||
#define KC_JMHE JP_MHEN // muhenkan
|
||||
#define KC_JHEN JP_HENK // henkan
|
||||
#define KC_JKAN JP_KANA // katakana/hiragana|ro-mazi
|
||||
#define KC_JMKA JP_MKANA //kana on MacOSX
|
||||
#define KC_JMEI JP_MEISU //eisu on MacOSX
|
||||
#define KC_JAMP JP_AMPR // &
|
||||
#define KC_JQUO JP_QUOT // '
|
||||
#define KC_JLPR JP_LPRN // (
|
||||
#define KC_JRPR JP_RPRN // )
|
||||
#define KC_JEQL JP_EQL // =
|
||||
#define KC_JTIL JP_TILD // ~
|
||||
#define KC_JPIP JP_PIPE // |
|
||||
#define KC_JGRV JP_GRV // `
|
||||
#define KC_JLCB JP_LCBR // {
|
||||
#define KC_JPLU JP_PLUS // +
|
||||
#define KC_JAST JP_ASTR // *
|
||||
#define KC_JRCB JP_RCBR // }
|
||||
#define KC_JUND JP_UNDS // _
|
||||
|
||||
// Layer related keycodes
|
||||
#define KC_LWR MO(_LOWER)
|
||||
#define KC_RSE MO(_RAISE)
|
||||
#define KC_P_LW MO(_PSEUDO_US_LOWER)
|
||||
#define KC_P_RS MO(_PSEUDO_US_RAISE)
|
||||
#define KC_QWRT QWERTY
|
||||
#define KC_P_US PSEUDO_US
|
||||
#define KC_J2US JIS2US
|
||||
|
||||
// Special keycodes
|
||||
#define KC_SPCT CTL_T(KC_SPC)
|
||||
#define KC_ENSF SFT_T(KC_ENT)
|
||||
#define KC_SFTA SFT_T(KC_A)
|
||||
#define KC_CTSF S(KC_LCTL)
|
||||
#define KC_CAEC MT(MOD_LCTL | MOD_LALT, KC_ESC)
|
||||
#define KC_CSTB C_S_T(KC_TAB)
|
||||
#define KC_IMON ALT_T(KC_F13)
|
||||
#define KC_IMOF GUI_T(KC_F14)
|
||||
#define KC_SRO S(KC_RO)
|
||||
#define KC_SYEN S(KC_JYEN)
|
||||
#define KC_CAD LCA(KC_DEL)
|
||||
#define KC_RST RESET
|
||||
|
||||
#define LONGPRESS_DELAY 150
|
||||
|
||||
// Fillers to make layering more clear
|
||||
#define KC_ KC_TRNS
|
||||
#define KC_ KC_TRNS
|
||||
#define KC_XXXX KC_NO
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
[_QWERTY] = LAYOUT_kc(
|
||||
[_QWERTY] = LAYOUT_kc(
|
||||
//,----+----+----+----+----+----+ +----+----+----+----+----+----.
|
||||
ESC , Q , W , E , R , T , Y , U , I , O , P ,DEL ,
|
||||
CAEC, Q , W , E , R , T , Y , U , I , O , P ,DEL ,
|
||||
//|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
|
||||
TAB ,SFTA, S , D , F , G ,LPRN, RPRN, H , J , K , L ,SCLN,BSPC,
|
||||
CSTB, A , S , D , F , G ,LPRN, RPRN, H , J , K , L ,SCLN,BSPC,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
CTSF, Z , X , C , V , B ,LBRC, RBRC, N , M ,COMM,DOT ,SLSH,QUOT,
|
||||
LSFT, Z , X , C , V , B ,LBRC, RBRC, N , M ,COMM,DOT ,SLSH,QUOT,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
IMOF,LWR ,SPCT, ENSF,RSE ,IMON
|
||||
// +----+----+---/ \---+----+----+
|
||||
),
|
||||
|
||||
[_LOWER] = LAYOUT_kc(
|
||||
[_LOWER] = LAYOUT_kc(
|
||||
//,----+----+----+----+----+----+ +----+----+----+----+----+----.
|
||||
,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, ,
|
||||
//|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
|
||||
@@ -69,60 +101,60 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
, F7 , F8 , F9 , F10, F11, F12, TILD,PIPE,UNDS,PLUS,LCBR,RCBR, ,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
, , , , ,
|
||||
, , , , ,
|
||||
// +----+----+---/ \---+----+----+
|
||||
),
|
||||
|
||||
[_RAISE] = LAYOUT_kc(
|
||||
[_RAISE] = LAYOUT_kc(
|
||||
//,----+----+----+----+----+----+ +----+----+----+----+----+----.
|
||||
, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , ,
|
||||
//|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
|
||||
, , , , , , , XXXX,LEFT,DOWN, UP ,RGHT,END , ,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
, , , , , , , HOME,XXXX,XXXX,XXXX,XXXX,XXXX, ,
|
||||
, , , , , , , HOME,XXXX,PGDN,PGUP,XXXX,XXXX, ,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
, , , , ,
|
||||
, , , , ,
|
||||
// +----+----+---/ \---+----+----+
|
||||
),
|
||||
|
||||
[_PSEUDO_US] = LAYOUT_kc(
|
||||
[_PSEUDO_US] = LAYOUT_kc(
|
||||
//,----+----+----+----+----+----+ +----+----+----+----+----+----.
|
||||
ESC , Q , W , E , R , T , Y , U , I , O , P ,DEL ,
|
||||
CAEC, Q , W , E , R , T , Y , U , I , O , P ,DEL ,
|
||||
//|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
|
||||
TAB ,SFTA, S , D , F , G ,ASTR, LPRN, H , J , K , L ,FN0 ,BSPC,
|
||||
CSTB, A , S , D , F , G ,JLPR, JRPR, H , J , K , L ,J2US,BSPC,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
CTSF, Z , X , C , V , B ,FN0 , FN0 , N , M ,COMM,DOT ,SLSH,FN0 ,
|
||||
LSFT, Z , X , C , V , B ,J2US, J2US, N , M ,COMM,DOT ,SLSH,J2US,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
IMOF,P_LW,SPCT, ENSF,P_RS,IMON
|
||||
// +----+----+---/ \---+----+----+
|
||||
),
|
||||
|
||||
|
||||
[_PSEUDO_US_LOWER] = LAYOUT_kc(
|
||||
[_PSEUDO_US_LOWER] = LAYOUT_kc(
|
||||
//,----+----+----+----+----+----+ +----+----+----+----+----+----.
|
||||
,EXLM,LBRC,HASH,DLR ,PERC, EQL ,CIRC, DQT,ASTR,LPRN, ,
|
||||
,EXLM,JAT ,HASH,DLR ,PERC, JCIR,JAMP,JAST,JLPR,JRPR, ,
|
||||
//|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
|
||||
, F1 , F2 , F3 , F4 , F5 , F6 , LCBR,JYEN,MINS,UNDS,RBRC,BSLS, ,
|
||||
, F1 , F2 , F3 , F4 , F5 , F6 , JGRV,JBSL,MINS,JEQL,JLBR,JRBR, ,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
, F7 , F8 , F9 , F10, F11, F12, PLUS,SYEN,SRO ,COLN,RCBR,PIPE, ,
|
||||
, F7 , F8 , F9 , F10, F11, F12, JTIL,JPIP,JUND,JPLU,JLCB,JRCB, ,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
, , , , ,
|
||||
, , , , ,
|
||||
// +----+----+---/ \---+----+----+
|
||||
),
|
||||
|
||||
[_PSEUDO_US_RAISE] = LAYOUT_kc(
|
||||
[_PSEUDO_US_RAISE] = LAYOUT_kc(
|
||||
//,----+----+----+----+----+----+ +----+----+----+----+----+----.
|
||||
, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , ,
|
||||
//|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
|
||||
, , , , , , GRV, XXXX,LEFT,DOWN, UP ,RGHT,END , ,
|
||||
, , , , , ,JZHT, XXXX,LEFT,DOWN, UP ,RGHT,END , ,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
, , , , , , , HOME,XXXX,XXXX,XXXX,XXXX,XXXX, ,
|
||||
, , , , , , , HOME,XXXX,PGDN,PGUP,XXXX,XXXX, ,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
, , , , ,
|
||||
, , , , ,
|
||||
// +----+----+---/ \---+----+----+
|
||||
),
|
||||
|
||||
[_ADJUST] = LAYOUT_kc(
|
||||
[_ADJUST] = LAYOUT_kc(
|
||||
//,----+----+----+----+----+----+ +----+----+----+----+----+----.
|
||||
, , , , , , , , , , , ,
|
||||
//|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----|
|
||||
@@ -130,69 +162,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
, , , , , ,RST , P_US, , , , , , ,
|
||||
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
|
||||
, , , , ,
|
||||
, , , , ,
|
||||
// +----+----+---/ \---+----+----+
|
||||
)
|
||||
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* user defined action function
|
||||
*/
|
||||
enum function_id {
|
||||
PSEUDO_US_FUNCTION,
|
||||
};
|
||||
|
||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
switch (id)
|
||||
{
|
||||
case PSEUDO_US_FUNCTION:
|
||||
action_pseudo_lut(record, _QWERTY, keymap_jis2us);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Fn action definition
|
||||
*/
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
[0] = ACTION_FUNCTION(PSEUDO_US_FUNCTION),
|
||||
};
|
||||
|
||||
void matrix_scan_user(void) {
|
||||
uint8_t layer = biton32(layer_state);
|
||||
switch (layer) {
|
||||
case _LOWER:
|
||||
set_led_red;
|
||||
break;
|
||||
case _RAISE:
|
||||
set_led_blue;
|
||||
break;
|
||||
case _PSEUDO_US_LOWER:
|
||||
set_led_yellow;
|
||||
break;
|
||||
case _PSEUDO_US_RAISE:
|
||||
set_led_cyan;
|
||||
break;
|
||||
case _ADJUST:
|
||||
set_led_magenta;
|
||||
break;
|
||||
default:
|
||||
set_led_green;
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
uint32_t layer_state_set_user(uint32_t state) {
|
||||
switch (biton32(state)) {
|
||||
case _PSEUDO_US:
|
||||
return update_tri_layer_state(state, _PSEUDO_US_RAISE, _PSEUDO_US_LOWER, _ADJUST);
|
||||
break;
|
||||
case _PSEUDO_US_LOWER:
|
||||
return update_tri_layer_state(state, _PSEUDO_US_RAISE, _PSEUDO_US_LOWER, _ADJUST);
|
||||
break;
|
||||
case _PSEUDO_US_RAISE:
|
||||
case _PSEUDO_US_RAISE:
|
||||
return update_tri_layer_state(state, _PSEUDO_US_RAISE, _PSEUDO_US_LOWER, _ADJUST);
|
||||
break;
|
||||
default:
|
||||
@@ -201,19 +180,112 @@ uint32_t layer_state_set_user(uint32_t state) {
|
||||
}
|
||||
}
|
||||
|
||||
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
|
||||
#ifdef SSD1306OLED
|
||||
|
||||
// You need to add source files to SRC in rules.mk when using OLED display functions
|
||||
void set_keylog(uint16_t keycode);
|
||||
const char *read_keylog(void);
|
||||
const char *read_modifier_state(void);
|
||||
const char *read_host_led_state(void);
|
||||
|
||||
void matrix_init_user(void) {
|
||||
iota_gfx_init(false); // turns on the display
|
||||
}
|
||||
|
||||
void matrix_scan_user(void) {
|
||||
iota_gfx_task(); // this is what updates the display continuously
|
||||
}
|
||||
|
||||
void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
|
||||
if (memcmp(dest->display, source->display, sizeof(dest->display))) {
|
||||
memcpy(dest->display, source->display, sizeof(dest->display));
|
||||
dest->dirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
void render_status(struct CharacterMatrix *matrix) {
|
||||
// Layer state
|
||||
char layer_str[22];
|
||||
matrix_write(matrix, "Layer: ");
|
||||
uint8_t layer = biton32(layer_state);
|
||||
uint8_t default_layer = biton32(eeconfig_read_default_layer());
|
||||
switch (layer) {
|
||||
case _QWERTY:
|
||||
switch (default_layer) {
|
||||
case _QWERTY:
|
||||
snprintf(layer_str, sizeof(layer_str), "Qwerty");
|
||||
break;
|
||||
case _PSEUDO_US:
|
||||
snprintf(layer_str, sizeof(layer_str), "Psuedo_US");
|
||||
break;
|
||||
default:
|
||||
snprintf(layer_str, sizeof(layer_str), "Undef-%d", default_layer);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case _RAISE:
|
||||
snprintf(layer_str, sizeof(layer_str), "Raise");
|
||||
break;
|
||||
case _LOWER:
|
||||
snprintf(layer_str, sizeof(layer_str), "Lower");
|
||||
break;
|
||||
case _PSEUDO_US_RAISE:
|
||||
snprintf(layer_str, sizeof(layer_str), "P_US_Raise");
|
||||
break;
|
||||
case _PSEUDO_US_LOWER:
|
||||
snprintf(layer_str, sizeof(layer_str), "P_US_Lower");
|
||||
break;
|
||||
case _ADJUST:
|
||||
snprintf(layer_str, sizeof(layer_str), "Adjust");
|
||||
break;
|
||||
default:
|
||||
snprintf(layer_str, sizeof(layer_str), "Undef-%d", layer);
|
||||
}
|
||||
matrix_write_ln(matrix, layer_str);
|
||||
// Last entered keycode
|
||||
matrix_write_ln(matrix, read_keylog());
|
||||
// Modifier state
|
||||
matrix_write_ln(matrix, read_modifier_state());
|
||||
// Host Keyboard LED Status
|
||||
matrix_write(matrix, read_host_led_state());
|
||||
}
|
||||
|
||||
void iota_gfx_task_user(void) {
|
||||
struct CharacterMatrix matrix;
|
||||
|
||||
#if DEBUG_TO_SCREEN
|
||||
if (debug_enable) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
matrix_clear(&matrix);
|
||||
render_status(&matrix);
|
||||
matrix_update(&display, &matrix);
|
||||
}
|
||||
|
||||
#endif//SSD1306OLED
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
#ifdef SSD1306OLED
|
||||
if (record->event.pressed) {
|
||||
set_keylog(keycode);
|
||||
}
|
||||
#endif
|
||||
switch (keycode) {
|
||||
case QWERTY:
|
||||
if (record->event.pressed) {
|
||||
set_single_persistent_default_layer(_QWERTY);
|
||||
}
|
||||
return false;
|
||||
break;
|
||||
case PSEUDO_US:
|
||||
if (record->event.pressed) {
|
||||
set_single_persistent_default_layer(_PSEUDO_US);
|
||||
}
|
||||
return false;
|
||||
break;
|
||||
case JIS2US:
|
||||
action_pseudo_lut(record, _QWERTY, keymap_jis2us);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -3,30 +3,30 @@
|
||||
|
||||
/* keymap for convert from JIS to US */
|
||||
const uint16_t PROGMEM keymap_jis2us[][2] = {
|
||||
[KC_A ... KC_CAPS] = { 0x00, 0x00 }, /* default value */
|
||||
[KC_A ... KC_CAPS] = { 0x00, 0x00 }, /* default value */
|
||||
|
||||
[KC_1] = { KC_1, KC_EXLM }, /* 1 and ! -> 1 and ! */
|
||||
[KC_2] = { KC_2, KC_LBRC }, /* 2 and " -> 2 and @ */
|
||||
[KC_3] = { KC_3, KC_HASH }, /* 3 and # -> 3 and # */
|
||||
[KC_4] = { KC_4, KC_DLR }, /* 4 and $ -> 4 and $ */
|
||||
[KC_5] = { KC_5, KC_PERC }, /* 5 and % -> 5 and % */
|
||||
[KC_6] = { KC_6, KC_EQL }, /* 6 and & -> 6 and ^ */
|
||||
[KC_7] = { KC_7, KC_CIRC }, /* 7 and ' -> 7 and & */
|
||||
[KC_8] = { KC_8, KC_DQT }, /* 8 and ( -> 8 and * */
|
||||
[KC_9] = { KC_9, KC_ASTR }, /* 9 and ) -> 9 and ( */
|
||||
[KC_0] = { KC_0, KC_LPRN }, /* 0 and (no assign) -> 0 and ) */
|
||||
[KC_MINS] = { KC_MINS, S(KC_RO) }, /* - and = -> - and _ */
|
||||
[KC_EQL] = { KC_UNDS, KC_COLN }, /* ^ and ~ -> = and + */
|
||||
[KC_LBRC] = { KC_RBRC, KC_RCBR }, /* @ and ` -> [ and { */
|
||||
[KC_RBRC] = { KC_BSLS, KC_PIPE }, /* [ and { -> ] and } */
|
||||
[KC_BSLS] = { KC_JYEN, S(KC_JYEN) }, /* ] and } -> / and | */
|
||||
[KC_NUHS] = { KC_NUHS, S(KC_NUHS) }, /* (no assign) */
|
||||
[KC_SCLN] = { KC_SCLN, KC_QUOT }, /* ; and + -> ; and : */
|
||||
[KC_QUOT] = { KC_AMPR, KC_AT }, /* : and * -> ' and " */
|
||||
[KC_GRV] = { KC_LCBR, KC_PLUS }, /* (no assign) -> ` and ~ */
|
||||
[KC_COMM] = { KC_COMM, KC_LT }, /* , and < -> , and < */
|
||||
[KC_DOT] = { KC_DOT, KC_GT }, /* . and > -> . and > */
|
||||
[KC_SLSH] = { KC_SLSH, KC_QUES }, /* / and ? -> / and ? */
|
||||
[KC_1] = { KC_1, KC_EXLM }, /* 1 and ! -> 1 and ! */
|
||||
[KC_2] = { KC_2, KC_LBRC }, /* 2 and " -> 2 and @ */
|
||||
[KC_3] = { KC_3, KC_HASH }, /* 3 and # -> 3 and # */
|
||||
[KC_4] = { KC_4, KC_DLR }, /* 4 and $ -> 4 and $ */
|
||||
[KC_5] = { KC_5, KC_PERC }, /* 5 and % -> 5 and % */
|
||||
[KC_6] = { KC_6, KC_EQL }, /* 6 and & -> 6 and ^ */
|
||||
[KC_7] = { KC_7, KC_CIRC }, /* 7 and ' -> 7 and & */
|
||||
[KC_8] = { KC_8, KC_DQT }, /* 8 and ( -> 8 and * */
|
||||
[KC_9] = { KC_9, KC_ASTR }, /* 9 and ) -> 9 and ( */
|
||||
[KC_0] = { KC_0, KC_LPRN }, /* 0 and (no assign) -> 0 and ) */
|
||||
[KC_MINS] = { KC_MINS, S(KC_RO) }, /* - and = -> - and _ */
|
||||
[KC_EQL] = { KC_UNDS, KC_COLN }, /* ^ and ~ -> = and + */
|
||||
[KC_LBRC] = { KC_RBRC, KC_RCBR }, /* @ and ` -> [ and { */
|
||||
[KC_RBRC] = { KC_BSLS, KC_PIPE }, /* [ and { -> ] and } */
|
||||
[KC_BSLS] = { KC_JYEN, S(KC_JYEN) }, /* ] and } -> / and | */
|
||||
[KC_NUHS] = { KC_NUHS, S(KC_NUHS) }, /* (no assign) */
|
||||
[KC_SCLN] = { KC_SCLN, KC_QUOT }, /* ; and + -> ; and : */
|
||||
[KC_QUOT] = { KC_AMPR, KC_AT }, /* : and * -> ' and " */
|
||||
[KC_GRV] = { KC_LCBR, KC_PLUS }, /* (no assign) -> ` and ~ */
|
||||
[KC_COMM] = { KC_COMM, KC_LT }, /* , and < -> , and < */
|
||||
[KC_DOT] = { KC_DOT, KC_GT }, /* . and > -> . and > */
|
||||
[KC_SLSH] = { KC_SLSH, KC_QUES }, /* / and ? -> / and ? */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,26 +1,8 @@
|
||||
SRC += action_pseudo_lut.c
|
||||
|
||||
# Build Options
|
||||
# change to "no" to disable the options, or define them in the Makefile in
|
||||
# the appropriate keymap folder that will get included automatically
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = no # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
MIDI_ENABLE = no # MIDI controls
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
|
||||
ONEHAND_ENABLE = no # Enable one-hand typing
|
||||
# If you want to change display settings of the OLED, you need to change the following lines
|
||||
SRC += ./lib/glcdfont.c \
|
||||
./lib/keylogger.c \
|
||||
./lib/modifier_state_reader.c \
|
||||
./lib/host_led_state_reader.c
|
||||
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../../Makefile
|
||||
endif
|
||||
|
||||
148
keyboards/comet46/lib/glcdfont.c
Normal file
148
keyboards/comet46/lib/glcdfont.c
Normal file
@@ -0,0 +1,148 @@
|
||||
// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
|
||||
// See gfxfont.h for newer custom bitmap font info.
|
||||
|
||||
#ifndef FONT5X7_H
|
||||
#define FONT5X7_H
|
||||
|
||||
#ifdef __AVR__
|
||||
#include <avr/io.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#elif defined(ESP8266)
|
||||
#include <pgmspace.h>
|
||||
#else
|
||||
#define PROGMEM
|
||||
#endif
|
||||
|
||||
// Standard ASCII 5x7 font
|
||||
|
||||
const unsigned char font[] PROGMEM = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
|
||||
0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
|
||||
0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
|
||||
0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
|
||||
0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
|
||||
0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
|
||||
0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
|
||||
0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
|
||||
0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
|
||||
0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
|
||||
0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
|
||||
0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
|
||||
0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
|
||||
0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
|
||||
0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
|
||||
0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
|
||||
0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
|
||||
0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
|
||||
0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
|
||||
0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
|
||||
0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
|
||||
0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
|
||||
0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
|
||||
0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
|
||||
0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
|
||||
0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
|
||||
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
|
||||
0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
|
||||
0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
|
||||
0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
|
||||
0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
|
||||
0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
|
||||
0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
|
||||
0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
|
||||
0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
|
||||
0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
|
||||
0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
|
||||
0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
|
||||
0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
|
||||
0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
|
||||
0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
|
||||
0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
|
||||
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
|
||||
0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
|
||||
0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
|
||||
0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
|
||||
0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
|
||||
0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
|
||||
0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
|
||||
0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
|
||||
0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
|
||||
0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
|
||||
0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
|
||||
0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
|
||||
0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
|
||||
0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
|
||||
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
|
||||
0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
|
||||
0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
|
||||
0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
|
||||
0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
|
||||
0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
|
||||
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
|
||||
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
|
||||
0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
|
||||
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
|
||||
0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
|
||||
0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
|
||||
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
|
||||
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
|
||||
0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
|
||||
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
|
||||
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
|
||||
0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
|
||||
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
|
||||
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
|
||||
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
|
||||
0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
|
||||
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
|
||||
0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
|
||||
0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
|
||||
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
|
||||
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
|
||||
0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
|
||||
0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
|
||||
0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
|
||||
0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
|
||||
0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
|
||||
0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
|
||||
0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
|
||||
0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
|
||||
0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
|
||||
0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
|
||||
0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
|
||||
0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
|
||||
0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
|
||||
0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
|
||||
0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
|
||||
0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
|
||||
0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00,
|
||||
0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
|
||||
0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
|
||||
0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
|
||||
0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
|
||||
0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
|
||||
0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
|
||||
0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
|
||||
0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
|
||||
0xFC, 0x18, 0x24, 0x24, 0x18, 0x00,
|
||||
0x18, 0x24, 0x24, 0x18, 0xFC, 0x00,
|
||||
0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
|
||||
0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
|
||||
0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
|
||||
0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
|
||||
0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
|
||||
0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
|
||||
0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
|
||||
0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
|
||||
0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
|
||||
0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
|
||||
0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
|
||||
0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
|
||||
0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
|
||||
0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00
|
||||
};
|
||||
#endif // FONT5X7_H
|
||||
15
keyboards/comet46/lib/host_led_state_reader.c
Normal file
15
keyboards/comet46/lib/host_led_state_reader.c
Normal file
@@ -0,0 +1,15 @@
|
||||
#include <stdio.h>
|
||||
#include "comet46.h"
|
||||
|
||||
char host_led_state_str[22];
|
||||
|
||||
const char *read_host_led_state(void) {
|
||||
uint8_t leds = host_keyboard_leds();
|
||||
|
||||
snprintf(host_led_state_str, sizeof(host_led_state_str), "Lock: %s%s%s",
|
||||
(leds & (1 << USB_LED_CAPS_LOCK)) ? "CAPL " : "",
|
||||
(leds & (1 << USB_LED_SCROLL_LOCK)) ? "SCRL " : "",
|
||||
(leds & (1 << USB_LED_NUM_LOCK)) ? "NUML" : "");
|
||||
|
||||
return host_led_state_str;
|
||||
}
|
||||
294
keyboards/comet46/lib/keylogger.c
Normal file
294
keyboards/comet46/lib/keylogger.c
Normal file
@@ -0,0 +1,294 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __AVR__
|
||||
#include <avr/io.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#else
|
||||
#define PROGMEM
|
||||
#endif
|
||||
|
||||
#define NUM_USB_HID_KEYCODES 255
|
||||
#define LEN_KEYCODE_STR 4
|
||||
|
||||
char keylog[22] = {"KC: ID: "};
|
||||
|
||||
// Quick and dirty way to display USB HID keycodes used in QMK
|
||||
// USB HID keycodes from 0x0000 to 0x00FF are stored in a 4x256+1 length char
|
||||
const char code_to_name[] PROGMEM = {
|
||||
"NO " //0x00
|
||||
"TRNS"
|
||||
"? "
|
||||
"? "
|
||||
"A "
|
||||
"B "
|
||||
"C "
|
||||
"D "
|
||||
"E "
|
||||
"F "
|
||||
"G "
|
||||
"H "
|
||||
"I "
|
||||
"J "
|
||||
"K "
|
||||
"L "
|
||||
"M " //0x10
|
||||
"N "
|
||||
"O "
|
||||
"P "
|
||||
"Q "
|
||||
"R "
|
||||
"S "
|
||||
"T "
|
||||
"U "
|
||||
"V "
|
||||
"W "
|
||||
"X "
|
||||
"Y "
|
||||
"Z "
|
||||
"1 "
|
||||
"2 "
|
||||
"3 " //0x20
|
||||
"4 "
|
||||
"5 "
|
||||
"6 "
|
||||
"7 "
|
||||
"8 "
|
||||
"9 "
|
||||
"0 "
|
||||
"ENT "
|
||||
"ESC "
|
||||
"BSPC"
|
||||
"TAB "
|
||||
"SPC "
|
||||
"MINS"
|
||||
"EQL "
|
||||
"LBRC"
|
||||
"RBRC" //0x30
|
||||
"BSLS"
|
||||
"NUHS"
|
||||
"SCLN"
|
||||
"QUOT"
|
||||
"GRV "
|
||||
"COMM"
|
||||
"DOT "
|
||||
"SLSH"
|
||||
"CAPS"
|
||||
"F1 "
|
||||
"F2 "
|
||||
"F3 "
|
||||
"F4 "
|
||||
"F5 "
|
||||
"F6 "
|
||||
"F7 " //0x40
|
||||
"F8 "
|
||||
"F9 "
|
||||
"F10 "
|
||||
"F11 "
|
||||
"F12 "
|
||||
"PSCR"
|
||||
"SLCK"
|
||||
"PAUS"
|
||||
"INS "
|
||||
"HOME"
|
||||
"PGUP"
|
||||
"DEL "
|
||||
"END "
|
||||
"PGDN"
|
||||
"RGHT"
|
||||
"LEFT" //0x50
|
||||
"DOWN"
|
||||
"UP "
|
||||
"NLCK"
|
||||
"PSLS"
|
||||
"PAST"
|
||||
"PMNS"
|
||||
"PPLS"
|
||||
"PENT"
|
||||
"P1 "
|
||||
"P2 "
|
||||
"P3 "
|
||||
"P4 "
|
||||
"P5 "
|
||||
"P6 "
|
||||
"P7 "
|
||||
"P8 " //0x60
|
||||
"P9 "
|
||||
"P0 "
|
||||
"PDOT"
|
||||
"NUBS"
|
||||
"APP "
|
||||
"POW "
|
||||
"PEQL"
|
||||
"F13 "
|
||||
"F14 "
|
||||
"F15 "
|
||||
"F16 "
|
||||
"F17 "
|
||||
"F18 "
|
||||
"F19 "
|
||||
"F20 "
|
||||
"F21 " //0x70
|
||||
"F22 "
|
||||
"F23 "
|
||||
"F24 "
|
||||
"EXEC"
|
||||
"HELP"
|
||||
"MENU"
|
||||
"SLCT"
|
||||
"STOP"
|
||||
"AGIN"
|
||||
"UNDO"
|
||||
"CUT "
|
||||
"COPY"
|
||||
"PSTE"
|
||||
"FIND"
|
||||
"_MUT"
|
||||
"_VUP" //0x80
|
||||
"_VDN"
|
||||
"LCAP"
|
||||
"LNUM"
|
||||
"LSCR"
|
||||
"PCMM"
|
||||
"PEQA"
|
||||
"INT1"
|
||||
"INT2"
|
||||
"INT3"
|
||||
"INT4"
|
||||
"INT5"
|
||||
"INT6"
|
||||
"INT7"
|
||||
"INT8"
|
||||
"INT9"
|
||||
"LAN1" //0x90
|
||||
"LAN2"
|
||||
"LAN3"
|
||||
"LAN4"
|
||||
"LAN5"
|
||||
"LAN6"
|
||||
"LAN7"
|
||||
"LAN8"
|
||||
"LAN9"
|
||||
"ERAS"
|
||||
"SYSR"
|
||||
"CNCL"
|
||||
"CLR "
|
||||
"PRIR"
|
||||
"RTRN"
|
||||
"SEP "
|
||||
"OUT " //0xA0
|
||||
"OPER"
|
||||
"CLRA"
|
||||
"CSEL"
|
||||
"ESEL"
|
||||
"PWR " //0xA5
|
||||
"SLEP"
|
||||
"WAKE"
|
||||
"MUTE"
|
||||
"VOLU"
|
||||
"VOLD"
|
||||
"MNXT"
|
||||
"MPRV"
|
||||
"MSTP"
|
||||
"MPLY"
|
||||
"MSEL"
|
||||
"EJCT" //0xB0
|
||||
"MAIL"
|
||||
"CALC"
|
||||
"MYCM"
|
||||
"WSCH"
|
||||
"WHOM"
|
||||
"WBAK"
|
||||
"WFWD"
|
||||
"WSTP"
|
||||
"WREF"
|
||||
"WFAV"
|
||||
"MFFD"
|
||||
"MRWD"
|
||||
"BRIU"
|
||||
"BRID"
|
||||
"? "
|
||||
"FN0 " //0xC0
|
||||
"FN1 "
|
||||
"FN2 "
|
||||
"FN3 "
|
||||
"FN4 "
|
||||
"FN5 "
|
||||
"FN6 "
|
||||
"FN7 "
|
||||
"FN8 "
|
||||
"FN9 "
|
||||
"FN10"
|
||||
"FN11"
|
||||
"FN12"
|
||||
"FN13"
|
||||
"FN14"
|
||||
"FN15"
|
||||
"FN16" //0xD0
|
||||
"FN17"
|
||||
"FN18"
|
||||
"FN19"
|
||||
"FN20"
|
||||
"FN21"
|
||||
"FN22"
|
||||
"FN23"
|
||||
"FN24"
|
||||
"FN25"
|
||||
"FN26"
|
||||
"FN27"
|
||||
"FN28"
|
||||
"FN29"
|
||||
"FN30"
|
||||
"FN31"
|
||||
"LCTL" //0xE0
|
||||
"LSFT"
|
||||
"LALT"
|
||||
"LGUI"
|
||||
"RCTL"
|
||||
"RSFT"
|
||||
"RALT"
|
||||
"RGUI"
|
||||
"? "
|
||||
"? "
|
||||
"? "
|
||||
"? "
|
||||
"? "
|
||||
"? "
|
||||
"? "
|
||||
"? "
|
||||
"MS_U" //0xF0
|
||||
"MS_D"
|
||||
"MS_L"
|
||||
"MS_R"
|
||||
"BTN1"
|
||||
"BTN2"
|
||||
"BTN3"
|
||||
"BTN4"
|
||||
"BTN5"
|
||||
"WH_U"
|
||||
"WH_D"
|
||||
"WH_L"
|
||||
"WH_R"
|
||||
"ACL0"
|
||||
"ACL1"
|
||||
"ACL2"
|
||||
};
|
||||
|
||||
void set_keylog(uint16_t keycode)
|
||||
{
|
||||
char name[LEN_KEYCODE_STR+1] = "? ";
|
||||
|
||||
if (keycode <= NUM_USB_HID_KEYCODES) {
|
||||
for (uint8_t k = 0; k < LEN_KEYCODE_STR; k++) {
|
||||
name[k] = pgm_read_byte_near(code_to_name + keycode * LEN_KEYCODE_STR + k);
|
||||
}
|
||||
} else if (keycode > NUM_USB_HID_KEYCODES) {
|
||||
snprintf(name, sizeof(name), "QMK ");
|
||||
}
|
||||
|
||||
// update keylog
|
||||
snprintf(keylog, sizeof(keylog), "KC: %s ID: %d", name, keycode);
|
||||
}
|
||||
|
||||
const char *read_keylog(void) {
|
||||
return keylog;
|
||||
}
|
||||
18
keyboards/comet46/lib/modifier_state_reader.c
Normal file
18
keyboards/comet46/lib/modifier_state_reader.c
Normal file
@@ -0,0 +1,18 @@
|
||||
#include <stdio.h>
|
||||
#include "comet46.h"
|
||||
|
||||
char modifier_state_str[22];
|
||||
|
||||
const char *read_modifier_state(void) {
|
||||
uint8_t modifiers = get_mods();
|
||||
uint8_t one_shot = get_oneshot_mods();
|
||||
|
||||
snprintf(modifier_state_str, sizeof(modifier_state_str), "Mod: %s%s%s%s",
|
||||
(modifiers & MODS_CTRL_MASK || one_shot & MODS_CTRL_MASK) ? "CTL " : "",
|
||||
(modifiers & MODS_GUI_MASK || one_shot & MODS_GUI_MASK) ? "GUI " : "",
|
||||
(modifiers & MODS_ALT_MASK || one_shot & MODS_ALT_MASK) ? "ALT " : "",
|
||||
(modifiers & MODS_SHIFT_MASK || one_shot & MODS_SHIFT_MASK) ? "SFT" : ""
|
||||
);
|
||||
|
||||
return modifier_state_str;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user