Compare commits

..

22 Commits

Author SHA1 Message Date
1778858e24 format code according to conventions [skip ci] 2020-07-21 00:09:52 +00:00
19006c9753 Implemented New MK_COMBINED Functionality (#9557)
* implemented new mousekey_combined functionality

* minor formatting change to documentation

* Update tmk_core/common/mousekey.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update tmk_core/common/mousekey.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update tmk_core/common/mousekey.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update tmk_core/common/mousekey.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update docs/feature_mouse_keys.md

Co-authored-by: Nick Brassel <nick@tzarc.org>

* Update docs/feature_mouse_keys.md

Co-authored-by: Nick Brassel <nick@tzarc.org>

* Update docs/feature_mouse_keys.md

Co-authored-by: Nick Brassel <nick@tzarc.org>

* Update docs/feature_mouse_keys.md

Co-authored-by: Nick Brassel <nick@tzarc.org>

Co-authored-by: Nathan Vercaemert <nathan.vercaemert@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Nick Brassel <nick@tzarc.org>
2020-07-21 09:28:38 +10:00
2e08c72e95 Update onekey proton_c readme (#9758)
A3 won't work. The code says A1 and A2 and it works. prints out an "a"
2020-07-20 15:41:21 +01:00
57f408cff5 ensure hhkb runs matrix_init_quantum (#9629) 2020-07-19 19:25:30 -07:00
c4d778a302 [Docs] Update ISP Guide (#9748)
* [Doc] Update ISP Guide

Correct the fuses for Caterina, and make the `:production` command more obvious.

* fix casing before fauxpark catches it
2020-07-18 21:24:23 +01:00
umi
82dcb17338 [Docs] Japanese translation of docs/feature_debounce_type.md (#9524)
* add feature_debounce_type.md translation

* update based on comment

* update based on comment
2020-07-18 01:47:12 -07:00
a8c230743a Write firmware for the Ferris keyboard (#9634)
* Write firmware for the Ferris keyboard

Took inspiration from the gergoplex and the ergodox_ez firmware for the
split matrix with io_expander on the right hand.
Cleaned up a lot of bit fiddling on the mcu side by taking inspiration
from the `split_custom` in quantum.
Still bit fiddling on the mcp side as it is particularly natural to do
so with the abstractions provided by the i2c protocol. Would be good to
clean that up and abstract away the wiring from the generic i2c code in
a similar fashion as quantum and the mcp side behave.

One improvement over the ergodox_ez and the gergoplex firmwares is that
the wiring is straight forward as opposed to swapping rows and columns
in two different places that end up cancelling out for some reason.

At this stage, I have flashed this firmware to a board and have verified
that all keys are behaving as intended by shorting pins.
I still have to solder in some switches and test that everything works
correctly at normal typing speeds, but I don't expect any major issues
given I'm building up on previous effort, including the debouncing code
from the ergodox_ez.

* Remove rotation from info.json and label the keys as per default keymap

* Comply with minor review feedback points

* Use CUSTOM_MATRIX=lite to remove boilerplate

* Update keyboards/handwired/ferris/info.json

Didn't play nicely in the configurator

Co-authored-by: Ryan <fauxpark@gmail.com>

* Remove MIDI_ENABLE from rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Remove FAUXCLICKY_ENABLE from rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Prefer wait_ms over _delay_ms

Co-authored-by: Ryan <fauxpark@gmail.com>

* Remove unused include

Co-authored-by: Ryan <fauxpark@gmail.com>

* Remove unused include

Co-authored-by: Ryan <fauxpark@gmail.com>

* Remove unused include

Co-authored-by: Ryan <fauxpark@gmail.com>

* Remove unused includeh

Co-authored-by: Ryan <fauxpark@gmail.com>

* Use dprint over print and remove include for print.h

* Remove all unused includes

* Remove unused code

* Cleanups thanks to code review

* Move more personal settings from the ferris config to the default keymap config

These setting happen to be unused in the default keymap at the moment,
as it has only one layer with no homerow modifiers and no mouse key; but
I would like to keep it there for two reasons:
* It can serve as an example to people creating their own keymap
* I plan to design a more usable default keymap that uses these features
  once this PR which adds the Ferris keyboard is merged.

* Consolidate mcp logic inside matrix.c

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-07-18 13:57:33 +10:00
3c84157d83 Add timber wolf keyboard (#9353)
* added timber wolf keyboard

* removed subfolders

* fixed keymap names

* fixed layout macro references

* swapped c6 and c7 functions

* Update keyboards/metamechs/timberwolf/config.h

Co-authored-by: Erovia <Erovia@users.noreply.github.com>

* Update readme.md

* re-updating readme

Co-authored-by: Erovia <Erovia@users.noreply.github.com>
2020-07-17 19:04:44 +01:00
4989af356e [keyboard] added Adelheid (#9734)
* readded adelheid files

* reworked keymaps

- moved my personal keymap to a new folder
- added a new default keymap

* removed unnecessary backslash

* reenabled command rule

* bumped device number

* fixed layout for configurator

* applied suggestions from code review

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-07-17 18:51:56 +01:00
a2fa12d631 [keyboard] Add x16 (#9709)
* [keyboard] Add x16

* update x16

* Update keyboards/x16/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/x16/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/x16/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/x16/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/x16/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-07-17 18:46:05 +01:00
412c6bf447 Add Alter Keyboard (#9579)
* Create Alter folder

* Revert "Create Alter folder"

This reverts commit 361103b821dbb22957b66cdedb0d11f996def71c.

* Add Alter keyboard

* Fixed keymap.c

* Fixed another issue on the keymap.c

* Updated the files based on the comments

* Edited default keymap and enabled rgbanimations on config.h

* Updated the info.json
2020-07-17 16:46:11 +01:00
9aa953ecb4 [Keyboard] add rart75 (#9649)
* Create config.h

* Create info.json

* Create rart75.c

* Create rart75.h

* Create readme.md

* Create rules.mk

* Create keymap.c

* Create keymap.c

* Update keymap.c

* Update info.json

* Update info.json

* Update info.json

* Update readme.md

* Update config.h

* Update rules.mk

* Update readme.md

* Update readme.md
2020-07-17 16:39:55 +01:00
9fddb1b5fa VIA Support: Skog Lite (#9686)
* via support for the skog lite

* some code cleanup before submission

* Update keyboards/percent/skog_lite/keymaps/via/config.h

Co-authored-by: Joel Challis <git@zvecr.com>

* Update keyboards/percent/skog_lite/keymaps/via/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-07-17 15:41:30 +01:00
07a817d3e5 [keymap] Add VIA support for Hub16 (#9638)
* fix encoder switch not staying depressed

* add via support

* change default keymap

* change VID-PID

* remove LTO

* fix hold bug keeping debouncing
2020-07-17 13:35:44 +01:00
56beaf7d3f Update MAJA info.json (#9674)
* Update info.json

* Update keyboards/kbdfans/maja/info.json

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kbdfans/maja/info.json

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-07-17 13:26:50 +01:00
3f11f41ec7 Keymap addition and updates (Prime_e, ProjectKB PCB, WT60-D) (#9701)
* update keymap

* update ilpse template as well

* fix some key items

* move quote the first layer

* figure out brackets

* update ilpse keymap

* update arrow keys on alice

* change layers

* update layers again

* switch to vim keys

* add mouse keys

Co-authored-by: Khader Syed <khader.syed@aicure.com>
2020-07-17 13:16:09 +01:00
4e02253aaf [Keyboard] Add PocketType (#9728)
* Add PocketType

* Add info.json, changes readmes and other stuff

* More changes

Co-authored-by: Maarten Dekkers <maartenn2001@gmail.com>
2020-07-17 12:53:37 +01:00
2773082d9d add default Rebound lighting settings (#9740)
* cleaning up

* deleting to undelete

* add rebound lighting settings
2020-07-17 06:20:02 +10:00
19b70b2737 MSYS2: Switch to bootloadHID package and bring back avrdude package (#9736)
* MSYS2: Switch to bootloadHID package and bring back avrdude package

* Update Zadig docs as well
2020-07-16 18:01:34 +01:00
61b64bb82a Redefine IS_LAYER_ON/OFF() as aliases for existing layer functions (#6352)
* Add IS_LAYER_ON_STATE()/IS_LAYER_OFF_STATE() macros

* Add docs for IS_LAYER_ON/OFF(_STATE) macros

* Remove IS_LAYER_ON/OFF_STATE redefinition in userspace

* Run clang-format on quantum/quantum.h

* Redefine IS_LAYER_ON/OFF(_STATE) as aliases of existing layer functions

Also update relevant doc entries.

Needs testing to check if this breaks existing IS_LAYER_ON/OFF usage in certain
edge cases (namely calling the macros with 0).

* Reformat layer check function docs
2020-07-16 22:27:55 +10:00
f11437aef3 Allow for user song list (#9281) 2020-07-16 16:45:50 +10:00
fc13315300 Fixed CA_DOTA key code (#9722) 2020-07-16 15:50:51 +10:00
97 changed files with 4071 additions and 153 deletions

3
.gitignore vendored
View File

@ -73,3 +73,6 @@ __pycache__
# prerequisites for updating ChibiOS
/util/fmpp*
# Allow to exist but don't include it in the repo
user_song_list.h

View File

@ -319,7 +319,7 @@ This runs code every time that the layers get changed. This can be useful for l
### Example `layer_state_set_*` Implementation
This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example
This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example.
```c
layer_state_t layer_state_set_user(layer_state_t state) {
@ -343,6 +343,11 @@ layer_state_t layer_state_set_user(layer_state_t state) {
return state;
}
```
Use the `IS_LAYER_ON_STATE(state, layer)` and `IS_LAYER_OFF_STATE(state, layer)` macros to check the status of a particular layer.
Outside of `layer_state_set_*` functions, you can use the `IS_LAYER_ON(layer)` and `IS_LAYER_OFF(layer)` macros to check global layer state.
### `layer_state_set_*` Function Documentation
* Keyboard/Revision: `layer_state_t layer_state_set_kb(layer_state_t state)`

View File

@ -23,7 +23,7 @@ Zadig will automatically detect the bootloader device. You may sometimes need to
!> If Zadig lists one or more devices with the `HidUsb` driver, your keyboard is probably not in bootloader mode. The arrow will be colored orange and you will be asked to confirm modifying a system driver. **Do not** proceed if this is the case!
If the arrow appears green, select the driver, and click **Install Driver**. The `libusb-win32` driver will usually work for AVR, and `WinUSB` for ARM, but if you still cannot flash the board, try installing a different driver from the list. For flashing a USBaspLoader device via command line with msys2, the `libusbk` driver is recommended, otherwise `libusb-win32` will work fine if you are using QMK Toolbox for flashing.
If the arrow appears green, select the driver, and click **Install Driver**. The `libusb-win32` driver will usually work for AVR, and `WinUSB` for ARM, but if you still cannot flash the board, try installing a different driver from the list. USBAspLoader devices must use the `libusbK` driver.
![Zadig with a bootloader driver correctly installed](https://i.imgur.com/b8VgXzx.png)

View File

@ -74,10 +74,9 @@ There are a number of functions (and variables) related to how you can use or ma
| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). |
| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
In addition to the functions that you can call, there are a number of callback functions that get called every time the layer changes. This passes the layer state to the function, where it can be read or modified.
In additional to the functions that you can call, there are a number of callback functions that get called every time the layer changes. This passed the layer state to the function, which can be read or modified.
|Callbacks |Description |
|Callback |Description |
|-----------------------------------------------------|----------------------------------------------------------------------------------------|
| `layer_state_set_kb(layer_state_t state)` | Callback for layer functions, for keyboard. |
| `layer_state_set_user(layer_state_t state)` | Callback for layer functions, for users. |
@ -86,9 +85,9 @@ In additional to the functions that you can call, there are a number of callback
?> For additional details on how you can use these callbacks, check out the [Layer Change Code](custom_quantum_functions.md#layer-change-code) document.
|Check functions |Description |
|-------------------------------------------|------------------------------------------------------------------------------|
| `layer_state_cmp(cmp_layer_state, layer)` | This checks the `cmp_layer_state` to see if the specific `layer` is enabled. This is meant for use with the layer callbacks. |
| `layer_state_is(layer)` | This checks the layer state to see if the specific `layer` is enabled. (calls `layer_state_cmp` for the global layer state). |
It is also possible to check the state of a particular layer using the following functions and macros.
!> There is `IS_LAYER_ON(layer)` as well, however the `layer_state_cmp` function has some additional handling to ensure that on layer 0 that it returns the correct value. Otherwise, if you check to see if layer 0 is on, you may get an incorrect value returned.
|Function |Description |Aliases
|---------------------------------|-------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------|
| `layer_state_is(layer)` | Checks if the specified `layer` is enabled globally. | `IS_LAYER_ON(layer)`, `IS_LAYER_OFF(layer)` |
| `layer_state_cmp(state, layer)` | Checks `state` to see if the specified `layer` is enabled. Intended for use in layer callbacks. | `IS_LAYER_ON_STATE(state, layer)`, `IS_LAYER_OFF_STATE(state, layer)` |

View File

@ -39,10 +39,11 @@ In your keymap you can use the following keycodes to map key presses to mouse ac
## Configuring mouse keys
Mouse keys supports two different modes to move the cursor:
Mouse keys supports three different modes to move the cursor:
* **Accelerated (default):** Holding movement keys accelerates the cursor until it reaches its maximum speed.
* **Constant:** Holding movement keys moves the cursor at constant speeds.
* **Combined:** Holding movement keys accelerates the cursor until it reaches its maximum speed, but holding acceleration and movement keys simultaneously moves the cursor at constant speeds.
The same principle applies to scrolling.
@ -120,3 +121,22 @@ Use the following settings if you want to adjust cursor movement or scrolling:
|`MK_W_INTERVAL_1` |120 |Time between scroll steps (`KC_ACL1`) |
|`MK_W_OFFSET_2` |1 |Scroll steps per scroll action (`KC_ACL2`) |
|`MK_W_INTERVAL_2` |20 |Time between scroll steps (`KC_ACL2`) |
### Combined mode
This mode functions like **Accelerated** mode, however, you can hold `KC_ACL0`, `KC_ACL1` and `KC_ACL2`
to momentarily (while held) set the cursor and scroll speeds to constant speeds. When no acceleration
keys are held, this mode is identical to **Accelerated** mode, and can be modified using all of the
relevant settings.
* **KC_ACL0:** This acceleration sets your cursor to the slowest possible speed. This is useful for very
small and detailed movements of the cursor.
* **KC_ACL1:** This acceleration sets your cursor to half the maximum (user defined) speed.
* **KC_ACL2:** This acceleration sets your cursor to the maximum (computer defined) speed. This is
useful for moving the cursor large distances without much accuracy.
To use constant speed mode, you must at least define `MK_COMBINED` in your keymaps `config.h` file:
```c
#define MK_COMBINED
```

View File

@ -141,7 +141,9 @@ To do this manually:
?> It's possible to use other bootloaders here in the same way, but __you need a bootloader__, otherwise you'll have to use ISP again to write new firmware to your keyboard.
To do this the easy way, you can flash the board using the `:production` target when compiling. This compiles the firmware, then compiles the QMK DFU bootloader, and then creates a combined image. Once this is done, you'll see three files:
#### Create QMK DFU Bootloader and Production images
You can create the firmware, the QMK DFU Bootloader and the production firmware images for the board using the `:production` target when compiling. Once this is done, you'll see three files:
* `<keyboard>_<keymap>.hex`
* `<keyboard>_<keymap>_bootloader.hex`
* `<keyboard>_<keymap>_production.hex`
@ -236,12 +238,12 @@ For Caterina on the `atmega32u4`, these are the fuse settings that you want:
| Fuse | Setting|
|----------|--------|
| Low | `0xFF` |
| High | `0xD9` |
| Extended | `0xC3` |
| High | `0xD8` |
| Extended | `0xCB` |
To set this add `-U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xC3:m` to your command. So the final command should look something like:
To set this add `-U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xCB:m` to your command. So the final command should look something like:
avrdude -c avrisp -P COM3 -p atmega32u4 -U flash:w:main.hex:i -U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xC3:m
avrdude -c avrisp -P COM3 -p atmega32u4 -U flash:w:main.hex:i -U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xCB:m
If you are using a different controller or want different configuration, you can use [this AVR Fuse Calculator](http://www.engbedded.com/fusecalc/) to find a better value for you.

View File

@ -0,0 +1,47 @@
# デバウンスアルゴリズム
<!---
original document: 0.9.19:docs/feature_debounce_type.md
git diff 0.9.19 HEAD -- docs/feature_debounce_type.md | cat
-->
QMK はデバウンス API を介して複数のデバウンスアルゴリズムをサポートします。
どのデバウンスメソッドが呼ばれるかのロジックは下記のとおりです。rules.mk で設定された様々な定義をチェックします。
```
DEBOUNCE_DIR:= $(QUANTUM_DIR)/debounce
DEBOUNCE_TYPE?= sym_g
ifneq ($(strip $(DEBOUNCE_TYPE)), custom)
QUANTUM_SRC += $(DEBOUNCE_DIR)/$(strip $(DEBOUNCE_TYPE)).c
endif
```
# デバウンスの選択
| DEBOUNCE_TYPE | 説明 | 他に必要なもの |
| ------------- | --------------------------------------------------- | ----------------------------- |
| 未定義 | デフォルトのアルゴリズム、現在のところ sym_g を使います | 無し |
| custom | 独自のデバウンスコードを使います | ```SRC += debounce.c``` で独自の debounce.c を追加し、必要な関数を実装します |
| anything_else | quantum/debounce/* から他のアルゴリズムを使います | 無し |
**分割キーボードについて**:
デバウンスコードは分割キーボードと互換性があります。
# 独自のデバウンスコードの使用
* ```DEBOUNCE_TYPE = custom``` を設定します。
* ```SRC += debounce.c``` を追加します。
* 独自の ```debounce.c``` を追加します。例については、```quantum/debounce``` にある現在の実装をみてください。
* 毎回のマトリクススキャンの結果はその度デバウンスによって処理されます。
* MATRIX_ROWS ではなく num_rows を使って、分割キーボードが正しくサポートされるようにします。
# インクルードされているデバウンスメソッド間での切り替え
独自の debounce.c をインクルードすることで独自のコードを使うか、またはインクルードされている他のコードに切り替えることができます。
含まれるデバウンスメソッドは以下の通りです:
* eager_pr - 行ごとにデバウンスします。状態が変化すると、応答は即座に行われ、その後その行は ```DEBOUNCE``` ミリ秒の間入力されません。
```NUM_KEYS``` の 8ビットカウンタの更新に高い計算コストがかかる、もしくは低スキャンレートのキーボード用で、各指は通常一度に1行しか叩かないようになっています。これは ErgoDox モデルに適しています; マトリックスは90度回転しているため、その「行」は実際には「列」であり、通常の使用では各指は一度に1つの「行」にしか当たりません。
* eager_pk - キーごとにデバウンスします。状態が変化すると、応答は即座に行われ、その後そのキーは ```DEBOUNCE``` ミリ秒の間入力されません。
* sym_g - キーボードごとにデバウンスします。状態が変化すると、グローバルタイマが設定されます。```DEBOUNCE``` ミリ秒の間何も変化がなければ、全ての入力の変更がプッシュされます。
* sym_pk - キーごとにデバウンスします。状態が変化すると、キーごとのタイマーが設定されます。```DEBOUNCE``` ミリ秒の間そのキーに変化がなければ、キーの状態の変更がプッシュされます。

View File

@ -0,0 +1,16 @@
/* Copyright 2020 floookay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "adelheid.h"

View File

@ -0,0 +1,45 @@
/* Copyright 2020 floookay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "quantum.h"
/* This a shortcut to help you visually see your layout.
*
* The first section contains all of the arguments representing the physical
* layout of the board and position of the keys.
*
* The second converts the arguments into a two-dimensional array which
* represents the switch matrix.
*/
#define LAYOUT( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, \
\
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, k2E, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k3E, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k4E, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4D, \
k50, k52, k54, k55, k57, k59, k5C, k5D, k5E \
) \
{ \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E }, \
{ 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 }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, KC_NO, k3E }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, KC_NO, k4D, k4E }, \
{ k50, KC_NO, k52, KC_NO, k54, k55, KC_NO, k57, KC_NO, k59, KC_NO, KC_NO, k5C, k5D, k5E } \
}

208
keyboards/adelheid/config.h Normal file
View File

@ -0,0 +1,208 @@
/*
Copyright 2020 floookay
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xF100
#define PRODUCT_ID 0xAD78
#define DEVICE_VER 0x0002
#define MANUFACTURER floookay
#define PRODUCT adelheid
#define DESCRIPTION 75% alice-like keyboard based on the arisu
/* key matrix size */
#define MATRIX_ROWS 7
#define MATRIX_COLS 15
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define MATRIX_ROW_PINS { D0, F4, D1, D2, D3, D5, F7 }
#define MATRIX_COL_PINS { F0, F1, E6, C7, F6, B6, D4, B1, B0, B7, B5, B4, D7, D6, B3 }
#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
#define BACKLIGHT_PIN C6
// #define BACKLIGHT_BREATHING
#define BACKLIGHT_LEVELS 3
// #define RGB_DI_PIN E2
// #ifdef RGB_DI_PIN
// #define RGBLED_NUM 16
// #define RGBLIGHT_HUE_STEP 8
// #define RGBLIGHT_SAT_STEP 8
// #define RGBLIGHT_VAL_STEP 8
// #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
// #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
// /*== all animations enable ==*/
// #define RGBLIGHT_ANIMATIONS
// /*== or choose animations ==*/
// #define RGBLIGHT_EFFECT_BREATHING
// #define RGBLIGHT_EFFECT_RAINBOW_MOOD
// #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
// #define RGBLIGHT_EFFECT_SNAKE
// #define RGBLIGHT_EFFECT_KNIGHT
// #define RGBLIGHT_EFFECT_CHRISTMAS
// #define RGBLIGHT_EFFECT_STATIC_GRADIENT
// #define RGBLIGHT_EFFECT_RGB_TEST
// #define RGBLIGHT_EFFECT_ALTERNATING
// #endif
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
* This is userful for the Windows task manager shortcut (ctrl+shift+esc).
*/
// #define GRAVE_ESC_CTRL_OVERRIDE
/*
* Force NKRO
*
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.)
*
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset.
*
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage.
*
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
* power-up.
*
*/
//#define FORCE_NKRO
/*
* Magic Key Options
*
* Magic keys are hotkey commands that allow control over firmware functions of
* the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html
*
* The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support.
*
*/
/* key combination for magic key command */
/* defined by default; to change, uncomment and set to the combination you want */
// #define IS_COMMAND() (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))
/* control how magic key switches layers */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
/* override magic key keymap */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
//#define MAGIC_KEY_HELP H
//#define MAGIC_KEY_HELP_ALT SLASH
//#define MAGIC_KEY_DEBUG D
//#define MAGIC_KEY_DEBUG_MATRIX X
//#define MAGIC_KEY_DEBUG_KBD K
//#define MAGIC_KEY_DEBUG_MOUSE M
//#define MAGIC_KEY_VERSION V
//#define MAGIC_KEY_STATUS S
//#define MAGIC_KEY_CONSOLE C
//#define MAGIC_KEY_LAYER0 0
//#define MAGIC_KEY_LAYER0_ALT GRAVE
//#define MAGIC_KEY_LAYER1 1
//#define MAGIC_KEY_LAYER2 2
//#define MAGIC_KEY_LAYER3 3
//#define MAGIC_KEY_LAYER4 4
//#define MAGIC_KEY_LAYER5 5
//#define MAGIC_KEY_LAYER6 6
//#define MAGIC_KEY_LAYER7 7
//#define MAGIC_KEY_LAYER8 8
//#define MAGIC_KEY_LAYER9 9
//#define MAGIC_KEY_BOOTLOADER B
//#define MAGIC_KEY_BOOTLOADER_ALT ESC
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
//#define MAGIC_KEY_NKRO N
//#define MAGIC_KEY_SLEEP_LED Z
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
/*
* MIDI options
*/
/* Prevent use of disabled MIDI features in the keymap */
//#define MIDI_ENABLE_STRICT 1
/* enable basic MIDI features:
- MIDI notes can be sent when in Music mode is on
*/
//#define MIDI_BASIC
/* enable advanced MIDI features:
- MIDI notes can be added to the keymap
- Octave shift and transpose
- Virtual sustain, portamento, and modulation wheel
- etc.
*/
//#define MIDI_ADVANCED
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
//#define MIDI_TONE_KEYCODE_OCTAVES 1

View File

@ -0,0 +1,100 @@
{
"keyboard_name": "Adelheid",
"url": "https://github.com/floookay/adelheid",
"maintainer": "floookay",
"width": 19.5,
"height": 6.5,
"layouts": {
"LAYOUT": {
"layout": [
{ "label": "k00", "x": 0, "y": 0 },
{ "label": "k01", "x": 1.25, "y": 0 },
{ "label": "k02", "x": 2.25, "y": 0 },
{ "label": "k03", "x": 3.5, "y": 0 },
{ "label": "k04", "x": 4.5, "y": 0 },
{ "label": "k05", "x": 5.75, "y": 0 },
{ "label": "k06", "x": 6.75, "y": 0 },
{ "label": "k07", "x": 9.75, "y": 0 },
{ "label": "k08", "x": 10.75, "y": 0 },
{ "label": "k09", "x": 12, "y": 0 },
{ "label": "k0A", "x": 13, "y": 0 },
{ "label": "k0B", "x": 14.25, "y": 0 },
{ "label": "k0C", "x": 15.25, "y": 0 },
{ "label": "k0D", "x": 16.5, "y": 0 },
{ "label": "k0E", "x": 17.75, "y": 0 },
{ "label": "k10", "x": 0.75, "y": 1.25 },
{ "label": "k11", "x": 1.75, "y": 1.25 },
{ "label": "k12", "x": 2.75, "y": 1.25 },
{ "label": "k13", "x": 4, "y": 1.25 },
{ "label": "k14", "x": 5, "y": 1.25 },
{ "label": "k15", "x": 6, "y": 1.25 },
{ "label": "k16", "x": 7, "y": 1.25 },
{ "label": "k17", "x": 9.5, "y": 1.25 },
{ "label": "k18", "x": 10.5, "y": 1.25 },
{ "label": "k19", "x": 11.5, "y": 1.25 },
{ "label": "k1A", "x": 12.5, "y": 1.25 },
{ "label": "k1B", "x": 13.75, "y": 1.25 },
{ "label": "k1C", "x": 14.75, "y": 1.25 },
{ "label": "k1D", "x": 15.75, "y": 1.25 },
{ "label": "k1E", "x": 16.75, "y": 1.25 },
{ "label": "k2E", "x": 18, "y": 1 },
{ "label": "k20", "x": 0.5, "y": 2.25, "w": 1.5 },
{ "label": "k21", "x": 2, "y": 2.25 },
{ "label": "k22", "x": 3.5, "y": 2.25 },
{ "label": "k23", "x": 4.5, "y": 2.25 },
{ "label": "k24", "x": 5.5, "y": 2.25 },
{ "label": "k25", "x": 6.5, "y": 2.25 },
{ "label": "k26", "x": 9, "y": 2.25 },
{ "label": "k27", "x": 10, "y": 2.25 },
{ "label": "k28", "x": 11, "y": 2.25 },
{ "label": "k29", "x": 12, "y": 2.25 },
{ "label": "k2A", "x": 13, "y": 2.25 },
{ "label": "k2B", "x": 14.5, "y": 2.25 },
{ "label": "k2C", "x": 15.5, "y": 2.25 },
{ "label": "k2D", "x": 16.5, "y": 2.25, "w": 1.5 },
{ "label": "k3E", "x": 18.25, "y": 2 },
{ "label": "k30", "x": 0.25, "y": 3.25, "w": 1.75 },
{ "label": "k31", "x": 2, "y": 3.25 },
{ "label": "k32", "x": 3.75, "y": 3.25 },
{ "label": "k33", "x": 4.75, "y": 3.25 },
{ "label": "k34", "x": 5.75, "y": 3.25 },
{ "label": "k35", "x": 6.75, "y": 3.25 },
{ "label": "k36", "x": 9.25, "y": 3.25 },
{ "label": "k37", "x": 10.25, "y": 3.25 },
{ "label": "k38", "x": 11.25, "y": 3.25 },
{ "label": "k39", "x": 12.25, "y": 3.25 },
{ "label": "k3A", "x": 14, "y": 3.25 },
{ "label": "k3B", "x": 15, "y": 3.25 },
{ "label": "k3C", "x": 16, "y": 3.25, "w": 2.25 },
{ "label": "k4E", "x": 18.5, "y": 3 },
{ "label": "k40", "x": 0, "y": 4.25, "w": 2.25 },
{ "label": "k41", "x": 2.25, "y": 4.25 },
{ "label": "k42", "x": 4.25, "y": 4.25 },
{ "label": "k43", "x": 5.25, "y": 4.25 },
{ "label": "k44", "x": 6.25, "y": 4.25 },
{ "label": "k45", "x": 7.25, "y": 4.25 },
{ "label": "k46", "x": 9.5, "y": 4.25 },
{ "label": "k47", "x": 10.5, "y": 4.25 },
{ "label": "k48", "x": 11.5, "y": 4.25 },
{ "label": "k49", "x": 12.5, "y": 4.25 },
{ "label": "k4A", "x": 14.5, "y": 4.25 },
{ "label": "k4B", "x": 15.5, "y": 4.25, "w": 1.75 },
{ "label": "k4D", "x": 17.5, "y": 4.5 },
{ "label": "k50", "x": 0, "y": 5.25, "w": 1.5 },
{ "label": "k52", "x": 4.25, "y": 5.25, "w": 1.5 },
{ "label": "k54", "x": 5.75, "y": 5.25, "w": 2 },
{ "label": "k55", "x": 7.75, "y": 5.25 },
{ "label": "k57", "x": 9, "y": 5.25, "w": 2.75 },
{ "label": "k59", "x": 11.75, "y": 5.25, "w": 1.5 },
{ "label": "k5C", "x": 16.5, "y": 5.5 },
{ "label": "k5D", "x": 17.5, "y": 5.5 },
{ "label": "k5E", "x": 18.5, "y": 5.5 }
]
}
}
}

View File

@ -0,0 +1,45 @@
/* Copyright 2020 floookay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum adelheid_layers {
_BASE,
_SECONDARY
};
#define MO_SEC MO(_SECONDARY)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT(
KC_ESC, 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_PGUP,
KC_GRV, 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_DEL, KC_HOME,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_END,
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
KC_LCTL, KC_LALT, KC_SPC, MO_SEC, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT
),
[_SECONDARY] = LAYOUT(
KC_SLEP, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PSCR, KC_VOLU,
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_INS, BL_STEP,
_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, _______, _______, KC_DEL, KC_MUTE,
KC_LGUI, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, KC_MPLY, KC_VOLD,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY,
_______, _______, _______, _______, _______, _______, KC_MPRV, KC_MSTP, KC_MNXT
)
};

View File

@ -0,0 +1,9 @@
# Default keymap for the Adelheid
- ANSI QWERTY
- split backspace
- ctrl instead of caps lock
- lgui on fn+caps
![adelheid_layout](https://gist.githubusercontent.com/floookay/7bf6511a8d84804d32de4d7bbe3bd0fb/raw/dffd622a762463f341466ffecefad3b31ad3ee4f/layout.png)
View in [Keyboard-Layout-Editor](http://www.keyboard-layout-editor.com/#/gists/4262535adb5ac81a913edbebc4de8226).

View File

@ -0,0 +1,76 @@
/* Copyright 2020 floookay
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum adelheid_layers {
_BASE,
_SECONDARY
};
// tap dance declarations
enum {
_TD_CTGU = 0,
_TD_PGUP = 1,
_TD_PGDN = 2,
_TD_HOME = 3,
_TD_END = 4,
_TD_RSHC = 5,
_TD_PSCR = 6
};
#define MO_SEC MO(_SECONDARY)
#define TD_CTGU TD(_TD_CTGU)
#define TD_PGUP TD(_TD_PGUP)
#define TD_PGDN TD(_TD_PGDN)
#define TD_HOME TD(_TD_HOME)
#define TD_END TD(_TD_END)
#define TD_RSHC TD(_TD_RSHC)
#define TD_PSCR TD(_TD_PSCR)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT(
KC_ESC, 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, TD_PGUP,
KC_GRV, 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_DEL, TD_HOME,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, TD_END,
TD_CTGU, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, TD_PGDN,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
KC_LCTL, KC_LALT, KC_SPC, MO_SEC, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT
),
[_SECONDARY] = LAYOUT(
KC_SLEP, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, TD_PSCR, KC_VOLU,
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_INS, BL_STEP,
_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, _______, _______, KC_DEL, KC_MUTE,
_______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, KC_MPLY, KC_VOLD,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TD_RSHC, KC_MPLY,
_______, _______, _______, _______, _______, _______, KC_MPRV, KC_MSTP, KC_MNXT
)
};
// Tap Dance Definitions
qk_tap_dance_action_t tap_dance_actions[] = {
// Tap once for first parameter, twice for second
[_TD_CTGU] = ACTION_TAP_DANCE_DOUBLE(KC_LCTL, KC_LGUI),
[_TD_PGUP] = ACTION_TAP_DANCE_DOUBLE(KC_PGUP, LCTL(KC_PGUP)),
[_TD_PGDN] = ACTION_TAP_DANCE_DOUBLE(KC_PGDN, LCTL(KC_PGDN)),
[_TD_HOME] = ACTION_TAP_DANCE_DOUBLE(KC_HOME, LCTL(KC_HOME)),
[_TD_END] = ACTION_TAP_DANCE_DOUBLE(KC_END, LCTL(KC_END)),
[_TD_RSHC] = ACTION_TAP_DANCE_DOUBLE(KC_RSFT, KC_CAPS),
[_TD_PSCR] = ACTION_TAP_DANCE_DOUBLE(KC_PSCR, LSFT(LGUI(KC_S))) // screenshot tool tap dance
};

View File

@ -0,0 +1,9 @@
# The default keymap for the Adelheid
- ANSI QWERTY
- split backspace
- ctrl on caps lock with super on tap dance
- caps lock on fn + right shift tap dance
![adelheid_layout](https://gist.githubusercontent.com/floookay/7bf6511a8d84804d32de4d7bbe3bd0fb/raw/dffd622a762463f341466ffecefad3b31ad3ee4f/layout.png)
View in [Keyboard-Layout-Editor](http://www.keyboard-layout-editor.com/#/gists/4262535adb5ac81a913edbebc4de8226).

View File

@ -0,0 +1 @@
TAP_DANCE_ENABLE = yes

View File

@ -0,0 +1,15 @@
# 𝔄𝔡𝔢𝔩𝔥𝔢𝔦𝔡
![Adelheid](https://gist.githubusercontent.com/floookay/7bf6511a8d84804d32de4d7bbe3bd0fb/raw/559336bcb5f8c04bbea9ad8aab7397812ab72859/adelheid.jpg)
The Adelheid is a 75% Alice-like keyboard. It's a fork of the [Arisu](https://github.com/FateNozomi/arisu-pcb) by FateNozomi and is open-source as well.
* Keyboard Maintainer: [floookay](https://github.com/floookay)
* Hardware Supported: Adelheid PCB [Rev2.0]
* Hardware Availability: [PCB-, case- &amp; wrist rest files](https://github.com/floookay/adelheid)
Make example for this keyboard (after setting up your build environment):
make adelheid:default
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).

View File

@ -0,0 +1,22 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
BOOTLOADER = atmel-dfu
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no # Enable Bluetooth
AUDIO_ENABLE = no # Audio output

View File

@ -0,0 +1,60 @@
/*
Copyright 2020 Pierre Chevalier <pierrechevalier83@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
/* USB Device descriptor parameter */
#define VENDOR_ID 0xC2AB
#define PRODUCT_ID 0x0000
#define DEVICE_VER 0x0001
#define MANUFACTURER Pierre
#define PRODUCT Ferris the keeb
#define DESCRIPTION A minimalistic 34 - keys split keyboard
/* key matrix size */
#define MATRIX_ROWS 8
#define MATRIX_COLS 10
#define MATRIX_ROWS_PER_SIDE (MATRIX_ROWS / 2)
#define MATRIX_COLS_PER_SIDE (MATRIX_COLS / 2)
#define UNUSED_MCU 14
#define UNUSED_MCP 7
// wiring
#define MATRIX_ROW_PINS_MCU \
{ B3, B2, B1, F0 }
#define MATRIX_COL_PINS_MCU \
{ D6, D7, B4, B5, B6 }
#define UNUSED_PINS_MCU \
{ B0, B7, C6, C7, D2, D3, D4, D5, E6, F1, F4, F5, F6, F7 }
#define MATRIX_ROW_PINS_MCP \
{ B0, B1, B2, B3 }
#define MATRIX_COL_PINS_MCP \
{ A0, A1, A2, A3, A4 }
#define UNUSED_PINS_MCP \
{ B4, B5, B6, B7, A5, A6, A7 }
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5

View File

@ -0,0 +1,17 @@
/*
Copyright 2020 Pierre Chevalier <pierrechevalier83@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ferris.h"

View File

@ -0,0 +1,43 @@
/*
Copyright 2020 Pierre Chevalier <pierrechevalier83@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "quantum.h"
// clang-format off
/* left hand right hand */
#define LAYOUT(\
K0_0, K0_1, K0_2, K0_3, K0_4, K0_5, K0_6, K0_7, K0_8, K0_9,\
K1_0, K1_1, K1_2, K1_3, K1_4, K1_5, K1_6, K1_7, K1_8, K1_9,\
K2_0, K2_1, K2_2, K2_3, K2_4, K2_5, K2_6, K2_7, K2_8, K2_9,\
K3_3, K3_4, K3_5, K3_6)\
/* matrix positions */\
{\
{K0_0, K0_1, K0_2, K0_3, K0_4},\
{K1_0, K1_1, K1_2, K1_3, K1_4},\
{K2_0, K2_1, K2_2, K2_3, K2_4},\
{KC_NO, KC_NO, KC_NO, K3_3, K3_4},\
\
{K0_5, K0_6, K0_7, K0_8, K0_9},\
{K1_5, K1_6, K1_7, K1_8, K1_9},\
{K2_5, K2_6, K2_7, K2_8, K2_9},\
{K3_5, K3_6, KC_NO, KC_NO, KC_NO}\
}
// clang-format on

View File

@ -0,0 +1,54 @@
{
"keyboard_name": "Ferris",
"url": "https://github.com/pierrechevalier83/ferris/",
"maintainer": "@pierrec83",
"width": 12,
"height": 4.75,
"layouts": {
"LAYOUT": {
"layout": [
{"x": 0, "y": 0.93},
{"x": 1, "y": 0.31},
{"x": 2, "y": 0},
{"x": 3, "y": 0.28},
{"x": 4, "y": 0.42},
{"x": 7, "y": 0.42},
{"x": 8, "y": 0.28},
{"x": 9, "y": 0},
{"x": 10, "y": 0.31},
{"x": 11, "y": 0.93},
{"x": 0, "y": 1.93},
{"x": 1, "y": 1.31},
{"x": 2, "y": 1},
{"x": 3, "y": 1.28},
{"x": 4, "y": 1.42},
{"x": 7, "y": 1.42},
{"x": 8, "y": 1.28},
{"x": 9, "y": 1},
{"x": 10, "y": 1.31},
{"x": 11, "y": 1.93},
{"x": 0, "y": 2.93},
{"x": 1, "y": 2.31},
{"x": 2, "y": 2},
{"x": 3, "y": 2.28},
{"x": 4, "y": 2.42},
{"x": 7, "y": 2.42},
{"x": 8, "y": 2.28},
{"x": 9, "y": 2},
{"x": 10, "y": 2.31},
{"x": 11, "y": 2.93},
{"x": 3.5, "y": 3.75},
{"x": 4.5, "y": 4},
{"x": 6.5, "y": 4},
{"x": 7.5, "y": 3.75}
]
}
}
}

View File

@ -0,0 +1,39 @@
/*
Copyright 2020 Pierre Chevalier <pierrechevalier83@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
// Set the mouse settings to a comfortable speed/accuracy trade-off,
// assuming a screen refresh rate of 60 Htz or higher
// The default is 50. This makes the mouse ~3 times faster and more accurate
#define MOUSEKEY_INTERVAL 16
// The default is 20. Since we made the mouse about 3 times faster with the previous setting,
// give it more time to accelerate to max speed to retain precise control over short distances.
#define MOUSEKEY_TIME_TO_MAX 40
// The default is 300. Let's try and make this as low as possible while keeping the cursor responsive
#define MOUSEKEY_DELAY 100
// It makes sense to use the same delay for the mouseweel
#define MOUSEKEY_WHEEL_DELAY 100
// The default is 100
#define MOUSEKEY_WHEEL_INTERVAL 50
// The default is 40
#define MOUSEKEY_WHEEL_TIME_TO_MAX 100
// Pick good defaults for enabling homerow modifiers
#define TAPPING_TERM 200
#define PERMISSIVE_HOLD
#define IGNORE_MOD_TAP_INTERRUPT
#define TAPPING_FORCE_HOLD

View File

@ -0,0 +1,39 @@
/*
Copyright 2020 Pierre Chevalier <pierrechevalier83@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// Blank template at the bottom
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Qwerty
*
* ,-----------------------------. ,-----------------------------.
* | Q | W | E | R | T | | Y | U | I | O | P |
* |-----+-----+-----+-----+-----| |-----------------------------|
* | A | S | D | F | G | | H | J | K | L | ; |
* |-----+-----+-----+-----+-----+ |-----------------------------|
* | Z | X | C | V | B | | N | M | < | > | ? |
* `-----+-----+-----+-----+-----+--. ,-+-----------------------------'
* | BSPC | SPC | | SPC | ENT |
* '------------' '-----------'
*/
[0] = 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_SCLN,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,
KC_BSPC, KC_SPC, KC_SPC, KC_ENT)
};

View File

@ -0,0 +1,282 @@
/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
2020 Pierre Chevalier <pierrechevalier83@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* This code was heavily inspired by the ergodox_ez keymap, and modernized
* to take advantage of the quantum.h microcontroller agnostics gpio control
* abstractions and use the macros defined in config.h for the wiring as opposed
* to repeating that information all over the place.
*/
#include QMK_KEYBOARD_H
#include "i2c_master.h"
extern i2c_status_t mcp23017_status;
#define I2C_TIMEOUT 1000
// For a better understanding of the i2c protocol, this is a good read:
// https://www.robot-electronics.co.uk/i2c-tutorial
// I2C address:
// See the datasheet, section 3.3.1 on addressing I2C devices and figure 3-6 for an
// illustration
// http://ww1.microchip.com/downloads/en/devicedoc/20001952c.pdf
// All address pins of the mcp23017 are connected to the ground on the ferris
// | 0 | 1 | 0 | 0 | A2 | A1 | A0 |
// | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
#define I2C_ADDR 0b0100000
#define I2C_ADDR_WRITE ((I2C_ADDR << 1) | I2C_WRITE)
#define I2C_ADDR_READ ((I2C_ADDR << 1) | I2C_READ)
// Register addresses
// See https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library/blob/master/Adafruit_MCP23017.h
#define IODIRA 0x00 // i/o direction register
#define IODIRB 0x01
#define GPPUA 0x0C // GPIO pull-up resistor register
#define GPPUB 0x0D
#define GPIOA 0x12 // general purpose i/o port register (write modifies OLAT)
#define GPIOB 0x13
#define OLATA 0x14 // output latch register
#define OLATB 0x15
bool i2c_initialized = 0;
i2c_status_t mcp23017_status = I2C_ADDR;
uint8_t init_mcp23017(void) {
print("starting init");
mcp23017_status = I2C_ADDR;
// I2C subsystem
if (i2c_initialized == 0) {
i2c_init(); // on pins D(1,0)
i2c_initialized = true;
wait_ms(I2C_TIMEOUT);
}
// set pin direction
// - unused : input : 1
// - input : input : 1
// - driving : output : 0
mcp23017_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT);
if (mcp23017_status) goto out;
mcp23017_status = i2c_write(IODIRA, I2C_TIMEOUT);
if (mcp23017_status) goto out;
// This means: we will read all the bits on GPIOA
mcp23017_status = i2c_write(0b11111111, I2C_TIMEOUT);
if (mcp23017_status) goto out;
// This means: we will write to the pins 0-4 on GPIOB (in select_rows)
mcp23017_status = i2c_write(0b11110000, I2C_TIMEOUT);
if (mcp23017_status) goto out;
i2c_stop();
// set pull-up
// - unused : on : 1
// - input : on : 1
// - driving : off : 0
mcp23017_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT);
if (mcp23017_status) goto out;
mcp23017_status = i2c_write(GPPUA, I2C_TIMEOUT);
if (mcp23017_status) goto out;
// This means: we will read all the bits on GPIOA
mcp23017_status = i2c_write(0b11111111, I2C_TIMEOUT);
if (mcp23017_status) goto out;
// This means: we will write to the pins 0-4 on GPIOB (in select_rows)
mcp23017_status = i2c_write(0b11110000, I2C_TIMEOUT);
if (mcp23017_status) goto out;
out:
i2c_stop();
return mcp23017_status;
}
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS]; // debounced values
static matrix_row_t read_cols(uint8_t row);
static void init_cols(void);
static void unselect_rows(void);
static void select_row(uint8_t row);
static uint8_t mcp23017_reset_loop;
void matrix_init_custom(void) {
// initialize row and col
mcp23017_status = init_mcp23017();
unselect_rows();
init_cols();
// initialize matrix state: all keys off
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
matrix[i] = 0;
}
}
void matrix_power_up(void) {
mcp23017_status = init_mcp23017();
unselect_rows();
init_cols();
// initialize matrix state: all keys off
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
matrix[i] = 0;
}
}
// Reads and stores a row, returning
// whether a change occurred.
static inline bool store_matrix_row(matrix_row_t current_matrix[], uint8_t index) {
matrix_row_t temp = read_cols(index);
if (current_matrix[index] != temp) {
current_matrix[index] = temp;
return true;
}
return false;
}
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
if (mcp23017_status) { // if there was an error
if (++mcp23017_reset_loop == 0) {
// if (++mcp23017_reset_loop >= 1300) {
// since mcp23017_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
// this will be approx bit more frequent than once per second
dprint("trying to reset mcp23017\n");
mcp23017_status = init_mcp23017();
if (mcp23017_status) {
dprint("right side not responding\n");
} else {
dprint("right side attached\n");
}
}
}
bool changed = false;
for (uint8_t i = 0; i < MATRIX_ROWS_PER_SIDE; i++) {
// select rows from left and right hands
uint8_t left_index = i;
uint8_t right_index = i + MATRIX_ROWS_PER_SIDE;
select_row(left_index);
select_row(right_index);
// we don't need a 30us delay anymore, because selecting a
// left-hand row requires more than 30us for i2c.
changed |= store_matrix_row(current_matrix, left_index);
changed |= store_matrix_row(current_matrix, right_index);
unselect_rows();
}
return changed;
}
static void init_cols(void) {
// init on mcp23017
// not needed, already done as part of init_mcp23017()
// init on mcu
pin_t matrix_col_pins_mcu[MATRIX_COLS_PER_SIDE] = MATRIX_COL_PINS_MCU;
for (int pin_index = 0; pin_index < MATRIX_COLS_PER_SIDE; pin_index++) {
pin_t pin = matrix_col_pins_mcu[pin_index];
setPinInput(pin);
writePinHigh(pin);
}
}
static matrix_row_t read_cols(uint8_t row) {
if (row < MATRIX_ROWS_PER_SIDE) {
pin_t matrix_col_pins_mcu[MATRIX_COLS_PER_SIDE] = MATRIX_COL_PINS_MCU;
matrix_row_t current_row_value = 0;
// For each col...
for (uint8_t col_index = 0; col_index < MATRIX_COLS_PER_SIDE; col_index++) {
// Select the col pin to read (active low)
uint8_t pin_state = readPin(matrix_col_pins_mcu[col_index]);
// Populate the matrix row with the state of the col pin
current_row_value |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index);
}
return current_row_value;
} else {
if (mcp23017_status) { // if there was an error
return 0;
} else {
uint8_t data = 0;
mcp23017_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT);
if (mcp23017_status) goto out;
mcp23017_status = i2c_write(GPIOA, I2C_TIMEOUT);
if (mcp23017_status) goto out;
mcp23017_status = i2c_start(I2C_ADDR_READ, I2C_TIMEOUT);
if (mcp23017_status) goto out;
mcp23017_status = i2c_read_nack(I2C_TIMEOUT);
if (mcp23017_status < 0) goto out;
// We read all the pins on GPIOA.
// The initial state was all ones and any depressed key at a given column for the currently selected row will have its bit flipped to zero.
// The return value is a row as represented in the generic matrix code were the rightmost bits represent the lower columns and zeroes represent non-depressed keys while ones represent depressed keys.
// Since the pins connected to eact columns are sequential, and counting from zero up (col 5 -> GPIOA0, col 6 -> GPIOA1 and so on), the only transformation needed is a bitwise not to swap all zeroes and ones.
data = ~((uint8_t)mcp23017_status);
mcp23017_status = I2C_STATUS_SUCCESS;
out:
i2c_stop();
// return reverse_bits(data, MATRIX_COLS_PER_SIDE);
return data;
}
}
}
static void unselect_rows(void) {
// no need to unselect on mcp23017, because the select step sets all
// the other row bits high, and it's not changing to a different
// direction
// unselect rows on microcontroller
pin_t matrix_row_pins_mcu[MATRIX_ROWS_PER_SIDE] = MATRIX_ROW_PINS_MCU;
for (int pin_index = 0; pin_index < MATRIX_ROWS_PER_SIDE; pin_index++) {
pin_t pin = matrix_row_pins_mcu[pin_index];
setPinInput(pin);
writePinLow(pin);
}
}
static void select_row(uint8_t row) {
if (row < MATRIX_ROWS_PER_SIDE) {
// select on atmega32u4
pin_t matrix_row_pins_mcu[MATRIX_ROWS_PER_SIDE] = MATRIX_ROW_PINS_MCU;
pin_t pin = matrix_row_pins_mcu[row];
setPinOutput(pin);
writePinLow(pin);
} else {
// select on mcp23017
if (mcp23017_status) { // if there was an error
// do nothing
} else {
mcp23017_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT);
if (mcp23017_status) goto out;
mcp23017_status = i2c_write(GPIOB, I2C_TIMEOUT);
if (mcp23017_status) goto out;
// Select the desired row by writing a byte for the entire GPIOB bus where only the bit representing the row we want to select is a zero (write instruction) and every other bit is a one.
// Note that the row - MATRIX_ROWS_PER_SIDE reflects the fact that being on the right hand, the columns are numbered from MATRIX_ROWS_PER_SIDE to MATRIX_ROWS, but the pins we want to write to are indexed from zero up on the GPIOB bus.
mcp23017_status = i2c_write(0xFF & ~(1 << (row - MATRIX_ROWS_PER_SIDE)), I2C_TIMEOUT);
if (mcp23017_status) goto out;
out:
i2c_stop();
}
}
}

View File

@ -0,0 +1,16 @@
# Ferris
![Ferris, top view](https://imgur.com/V4QuaGs.jpg)
![Ferris, bottom view](https://i.imgur.com/7DJYME8.jpg)
A split 34 keys column staggered keyboard named and decorated after the rustlang mascott. All PCB files and some thoughts on the design are available on the [project's github page](https://github.com/pierrechevalier83/ferris)
* Keyboard Maintainer: [Pierre Chevalier](https://github.com/pierrechevalier83)
* Hardware Supported: Ferris PCB
* Hardware Availability: Still in prototype stage
Make example for this keyboard (after setting up your build environment):
make handwired/ferris:default
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).

View File

@ -0,0 +1,28 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
BOOTLOADER = atmel-dfu
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no # USB Nkey Rollover
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no # Enable Bluetooth
AUDIO_ENABLE = no # Audio output
UNICODE_ENABLE = yes
CUSTOM_MATRIX = lite
NO_USB_STARTUP_CHECK = yes
LTO_ENABLE = yes
SRC += matrix.c
QUANTUM_LIB_SRC += i2c_master.c

View File

@ -1,3 +1,3 @@
# Proton C onekey
To trigger keypress, short together pins *A3* and *A2*.
To trigger keypress, short together pins *A1* and *A2*.

View File

@ -69,15 +69,17 @@ void matrix_init(void)
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00;
matrix = _matrix0;
matrix_prev = _matrix1;
matrix_init_quantum();
}
__attribute__ ((weak))
void matrix_scan_user(void) {
}
__attribute__((weak)) void matrix_init_kb(void) { matrix_init_user(); }
void matrix_scan_kb(void) {
matrix_scan_user();
}
__attribute__((weak)) void matrix_scan_kb(void) { matrix_scan_user(); }
__attribute__((weak)) void matrix_init_user(void) {}
__attribute__((weak)) void matrix_scan_user(void) {}
uint8_t matrix_scan(void)
{

View File

@ -69,15 +69,17 @@ void matrix_init(void)
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00;
matrix = _matrix0;
matrix_prev = _matrix1;
matrix_init_quantum();
}
__attribute__ ((weak))
void matrix_scan_user(void) {
}
__attribute__((weak)) void matrix_init_kb(void) { matrix_init_user(); }
void matrix_scan_kb(void) {
matrix_scan_user();
}
__attribute__((weak)) void matrix_scan_kb(void) { matrix_scan_user(); }
__attribute__((weak)) void matrix_init_user(void) {}
__attribute__((weak)) void matrix_scan_user(void) {}
uint8_t matrix_scan(void)
{

Some files were not shown because too many files have changed in this diff Show More