Compare commits

...

78 Commits

Author SHA1 Message Date
Taro Hayashi
c70ebd4a0e Fix pointing_device_set_cpi_on_side() (#23391)
Co-authored-by: Less/Rikki <86894501+lesshonor@users.noreply.github.com>
2024-04-03 20:39:02 -07:00
Ryan
2a4c746718 handwired/technicpad: fix keyboard in keymaps (#23408) 2024-04-04 10:11:45 +11:00
Ryan
b108524314 merge/um80: remove pointless empty layers (#23398) 2024-04-02 16:05:32 +01:00
Cipulot
d4d8b0c6d3 Add EC Type-K (#23193) 2024-04-01 17:49:46 -04:00
Cipulot
8757a19375 Fix in 60_iso_wkl_split_bs_rshift diagram (#22654) 2024-04-01 22:45:09 +01:00
Cipulot
5fc4e331bd Add MNK 65 EC (#23168) 2024-04-01 17:44:16 -04:00
Cipulot
81b5ae9bdd Add MNK 60 EC (#23167)
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
2024-04-01 17:42:21 -04:00
SmollChungus
73e3053e25 [Keyboard] Add rose75 (#22968)
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2024-04-01 13:32:21 -06:00
Joel Challis
319d9aa7b9 Fix 'qmk compile' mass_compile execution (#23296) 2024-03-31 12:23:40 +01:00
Joy Lee
e9f187f612 [Keyboard] Add skiller_skg50_s2 (#23364)
Co-authored-by: wb <wb@westberrytech.com>
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
Co-authored-by: jack <0x6a73@protonmail.com>
2024-03-30 19:07:03 -06:00
c0ldbru
72ec742d2c [Keyboard] Add rot13labs hackboard (#23218)
Co-authored-by: c0ldbru <c0ldbrusec@gmail.com>
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
2024-03-30 11:52:40 -06:00
Filip Strzałka
6dbc1b800f [Keyboard] add arrowmechanics/wings (#23328)
Co-authored-by: Arrow Mechanics <filip@arrowmechanics.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2024-03-30 11:48:50 -06:00
takashicompany
54593975bf Add new keyboard "Rookey" (#22483)
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2024-03-29 20:46:15 -07:00
takashicompany
abc101c122 [Keyboard] Add miniDivide MAX (#22804)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
Co-authored-by: jack <0x6a73@protonmail.com>
2024-03-29 19:03:17 -07:00
yulei
ac74d106d6 [Keyboard] add neson design 810e keyboard (#22883)
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: jack <0x6a73@protonmail.com>
2024-03-29 19:00:51 -07:00
khchen2004
93737eccc9 [Keyboard] Add scorpio rev2 (#22906) 2024-03-29 18:57:29 -07:00
Duncan Sutherland
7bff385840 Update serial_driver.md (#23035)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2024-03-29 19:04:23 -06:00
Victor Camargo
696bf80375 Clearer text about double tapping reset only working for boot after already having QMK running in board (#23042)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2024-03-29 19:00:41 -06:00
Duncan Sutherland
c52ad5c38e tidy keymap of 60_ansi_arrow Community Layout (#23301) 2024-03-29 17:16:17 -07:00
joliverMI
041f60f9a9 [Keyboard] Add recore keyboard (#23320)
Co-authored-by: joliverMI <qmk@Desktop2023>
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
2024-03-28 22:19:14 -07:00
James Young
2d8902c884 Kalakos Bahrnob Layout Additions (#23300) 2024-03-28 22:06:38 -07:00
Archetype
742ff91cf8 [Keyboard] Add Minerva LX (#23291)
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Álvaro A. Volpato <alvaro.augusto.volpato@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2024-03-28 22:04:43 -07:00
Joel Challis
5ef5a79fd9 Remove IGNORE_MOD_TAP_INTERRUPT from keymaps (#23279) 2024-03-28 21:55:38 -07:00
DOIO2022
eac3809266 [Keyboard] Add kb3x keyboard (#23268)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Less/Rikki <86894501+lesshonor@users.noreply.github.com>
2024-03-28 21:53:11 -07:00
Veriyans
afafce0a5e [Keyboard] Add Macropad 15Pad (#23257)
Co-authored-by: Less/Rikki <86894501+lesshonor@users.noreply.github.com>
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2024-03-28 21:51:22 -07:00
Freather
06cb283604 [Keyboard] Add haven60 (#23062)
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
2024-03-28 20:33:00 -07:00
Kyrre Havik
e44cbf7556 [Keyboard] Bartlesplit (#23114)
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2024-03-28 20:22:41 -07:00
Less/Rikki
4cd92cac1c [Keyboard] mechwild/bb40 (#22958)
Co-authored-by: Kyle McCreery <mccreery.kyle@gmail.com>
2024-03-28 18:21:49 -07:00
dependabot[bot]
c035a37249 Bump tj-actions/changed-files from 43 to 44 (#23369)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-27 20:55:32 +00:00
Jacky
1d58530e79 [Keyboard] Add T75 (#23344)
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: jack <0x6a73@protonmail.com>
2024-03-26 17:30:58 -06:00
JuanoD
4afbade6d1 Add ES_GRV to latam language-specific keycodes (#23333) 2024-03-22 23:30:30 +00:00
Moritz Plattner
551489645a Add werk.technica werk.one keyboard (#23130)
* add wt one

* update readme for One

* Apply suggestions from code review

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

* remove redundant file

* reformatted info.json

* Update keyboards/werk_technica/one/keymaps/via/rules.mk

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

---------

Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Danny <nooges@users.noreply.github.com>
2024-03-22 08:13:07 -04:00
jotix
f95f93b0fc handwired/jotlily60 via keymap (#23325) 2024-03-21 22:30:14 +00:00
Benjamin Božič
8a429fce33 [Keyboard] Add marshkeys flowerpad (#23240) 2024-03-21 05:06:38 +00:00
NW
5d6b291845 Add TechnicPad macropad (#23238) 2024-03-21 05:05:18 +00:00
jotix
4bc57c8d46 Add handwired/Jotlily60 (#23212) 2024-03-21 05:04:25 +00:00
Ramon Imbao
18ae0f61ab Add the EQUATOR keyboard (#23237) 2024-03-21 05:03:42 +00:00
Chad Skeeters
a1b16b8227 Support for slice65 from PizzaKeyboards (#23148) 2024-03-21 04:54:02 +00:00
Bregoliii
d5374b7e01 Add Swiss support (#23272) 2024-03-21 04:04:14 +00:00
Joel Challis
34374d2e2e Assume only 32u4 boards can run 'promicro' converters (#23312) 2024-03-20 22:23:58 +00:00
zlabkeeb
977f667da9 Add Macropad 6Pad (#23099) 2024-03-20 20:32:04 +00:00
Joel Challis
a9e9c9acc5 Fix invalid use of stemcell converter (#23317) 2024-03-20 19:51:01 +00:00
jack
53f46893ce Updates to PR Checklist (#23318) 2024-03-20 09:09:29 -06:00
joliverMI
b1235baf42 [Keyboard] Add posey_split v4/v5 (#23258)
* Created posey_split keyboards and included default keymaps.

* Update keyboards/pmk/posey_split/posey_split_v4/config.h

Co-authored-by: jack <0x6a73@protonmail.com>

* Update keyboards/pmk/posey_split/posey_split_v4/config.h

Co-authored-by: jack <0x6a73@protonmail.com>

* Update keyboards/pmk/posey_split/posey_split_v4/info.json

Co-authored-by: jack <0x6a73@protonmail.com>

* Update keyboards/pmk/posey_split/posey_split_v4/info.json

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

* Update keyboards/pmk/posey_split/posey_split_v4/info.json

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

* Update keyboards/pmk/posey_split/posey_split_v4/readme.md

Co-authored-by: jack <0x6a73@protonmail.com>

* Various cleanup updates per QMK maintainers on PR #23258

* removed config files from via keymaps

* removed additional keyboard for PR.

* changed folder structure per PR suggestion

* Update keyboards/pmk/posey_split/v5/info.json

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

* Update keyboards/pmk/posey_split/v5/rules.mk

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

* Update keyboards/pmk/posey_split/v4/rules.mk

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

* Update keyboards/pmk/posey_split/v5/keymaps/VIA/keymap.c

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

* Update keyboards/pmk/posey_split/v5/keymaps/default/keymap.c

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

* Update keyboards/pmk/posey_split/v4/keymaps/default/keymap.c

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

* Update keyboards/pmk/posey_split/v4/keymaps/VIA/keymap.c

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

* Update keyboards/pmk/posey_split/v5/readme.md

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

* Update keyboards/pmk/posey_split/v4/readme.md

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

* Update keyboards/pmk/posey_split/v4/info.json

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

* changed via folders to lowercase

* cleaned up extra via files in wrong folder

* Added better descriptions to keyboard projects and added hardware listing to v5

* Cleaned up keymap format

* removed extra rules

* Update keyboards/pmk/posey_split/v4/keymaps/via/keymap.c

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

* Update keyboards/pmk/posey_split/v5/readme.md

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

* removed "about" from readme on v4

* Removed title from readme

---------

Co-authored-by: joliverMI <qmk@Desktop2023>
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2024-03-20 08:52:20 -06:00
Wilba
c5f544cd96 Added WT65-H3 (HIBI HIBIKI) (#22886) 2024-03-14 22:10:17 -07:00
Wilba
cba2b5645f Added WT65-G3 (HIBI HIBIKI) (#22888) 2024-03-14 22:09:20 -07:00
AlanLiu
f0e219a1c8 Modify wording in 'getting_started_introduction.md' (#23232)
Co-authored-by: Joel Challis <git@zvecr.com>
2024-03-14 19:00:03 -07:00
dependabot[bot]
0d9399234d Bump tj-actions/changed-files from 42 to 43 (#23282)
Bumps [tj-actions/changed-files](https://github.com/tj-actions/changed-files) from 42 to 43.
- [Release notes](https://github.com/tj-actions/changed-files/releases)
- [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md)
- [Commits](https://github.com/tj-actions/changed-files/compare/v42...v43)

---
updated-dependencies:
- dependency-name: tj-actions/changed-files
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-15 01:44:32 +00:00
James Young
7d417b78eb AMJKeyboard AMJ96 Layout Additions (#23267) 2024-03-14 18:32:17 -07:00
Nick Brassel
67df06eb44 Fixup cipulot eeprom. (#23280) 2024-03-14 17:52:30 +00:00
achim-t
1080025973 Update feature_tri_layer.md - typo (#23275) 2024-03-14 14:28:54 +11:00
galile0
aa73362674 [Keyboard] add glyphkbd_v2 (#23131)
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2024-03-13 00:24:21 -07:00
elmo
8c9dea0d0a Add support new kb_elmo PCBs (#23138)
Co-authored-by: Ryan <fauxpark@gmail.com>
2024-03-13 00:23:30 -07:00
era
be9fcbd503 Add SIRIND Brick65 (#23245) 2024-03-13 03:21:06 +00:00
wind
49596b0692 Add KM113 keyboard (#22669) 2024-03-13 03:20:46 +00:00
Joel Challis
fb11330eab Absolute paths for -kb argument should error consistently (#23262) 2024-03-13 00:28:08 +00:00
LLLKST
6788a5eb27 [Keyboard] Add PetruziaMini (#23201)
* Uploading the PetruziaMini

My first try on uploading somethings on github. Hoping it works, this is my handwired PetruziaMini. I don't know if it will be visible on qmk configurator now

* 36 key hhbk inspired kb

* Required changes done

I compiled it locally and works

* Last changes requested

Added a imgur image (first time using, hoping i did it right) and summarized the description as requeste

* Fixed imegur link

* Ops, i've lost this. Here it comes

Thanks for helping! I'll take notes for next time :)
2024-03-12 16:51:42 -06:00
James Young
3a3b4d155e Ares Layout Additions (#23254) 2024-03-12 15:18:19 -07:00
James Young
2121931e34 Aero 75 Hotswap: correct layout data (#23253) 2024-03-12 15:16:22 -07:00
James Young
7cbbcdc5d4 KBDfans KBD75 Layout Additions (#23234) 2024-03-12 15:13:37 -07:00
Allie
654dc267db Fix Magicforce MF17 RGB matrix (#23263) 2024-03-12 11:28:20 -06:00
Joel Challis
ae38bdd5dc Flag LAYOUT macros still defined in .h files (#23260) 2024-03-12 15:28:02 +11:00
James Young
abf6504903 kb-elmo AEK II USB: correct Configurator data (#23252)
Correct the QMK Configurator / `qmk info -m` data.

[chore]
2024-03-10 17:40:11 +00:00
Nick Brassel
3e1ac7a38f Fixes for encoder abstraction. (#23195) 2024-03-10 22:24:17 +11:00
James Young
be42ea306b KBDfans KBD19x Layout Additions (#23230)
* Add layout/matrix diagram

[docs]

* Re-sort JSON `layouts` object

Moves the `LAYOUT_all` object to be first in sequence.

[refactor]

* Add `LAYOUT_ansi_split_bs`

[enhancement]

* Add `LAYOUT_iso_split_bs`

[enhancement]

* Add `LAYOUT_ansi_wkl_split_bs`

[enhancement]

* Add `LAYOUT_ansi_wkl`

[enhancement]

* Add `LAYOUT_iso_wkl_split_bs`

[enhancement]

* Add `LAYOUT_iso_wkl`

[enhancement]
2024-03-09 23:04:00 -08:00
Nick Brassel
900e79febe Attempt to deal with GCC 13+ and rv32 arch extensions. (#23086) 2024-03-09 21:40:19 +11:00
James Young
fec2323089 Orthograph: correct layout data (#23213)
* correct layout data

Correct the key sizes and positions in the layout data.

[chore]

* remove layout offset

Remove the dead space from the layout data.

[chore]
2024-03-09 01:26:33 +00:00
James Young
a8991722bc Xiudi XD96 Layout Bugfixes and Touch-Up (#23242)
* Correct AliExpress Hardware Availability link in readme

Previous URL linked to a Cospad listing.

[chore]
[docs]

* Convert `info.json` to four-space indent

[style]

* Correct `LAYOUT_all` matrix data

The right half of split Backspace is actually located at [5, 9], not
[5, 3].

[bugfix]

* Correct `LAYOUT_96_iso` matrix data

Corrects the matrix positions of the ISO Hash/Tilde and ISO Enter keys
to [3, 12] and [3, 13], respectively.

[bugfix]

* Add layout/matrix diagram

[docs]

* Refactor keymaps

- remove "inline block" comments
- grid-align keycodes
- use four-space indent

[style]
2024-03-09 01:24:31 +00:00
strayfade
62e2cb9286 [Keyboard] Add sf2040 (#23211)
Co-authored-by: jack <0x6a73@protonmail.com>
2024-03-08 11:44:32 -08:00
David Hoelscher
113d3d6001 [Keyboard] Add CMK11 (#23239)
* adding cmk11

* correcting default keymap

* removing rules.mk

* removing unnecessary comment
2024-03-08 08:40:32 -07:00
Nick Brassel
8946aace5b Add instructions for debugging ARM with VSCode+BMP. (#11217) 2024-03-08 22:24:11 +11:00
takashicompany
0a03fc512c [Keyboard] Add Ejectix (#23204)
Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2024-03-08 02:51:37 -08:00
Cipulot
30b0600ea2 [Keyboard] Add 60XT (#23210)
Co-authored-by: jack <0x6a73@protonmail.com>
2024-03-08 02:51:00 -08:00
Joel Challis
4443fa8a32 Attempt to fix changed files on CI workflow (#23205) 2024-03-05 16:59:09 +00:00
dependabot[bot]
7836906f3e Bump peter-evans/create-pull-request from 5 to 6 (#22995)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-05 22:48:25 +11:00
James Young
9ae4d01e33 Iron180 V2 H: correct key sizes (#23214) 2024-03-04 19:42:37 +00:00
James Young
73bddf0ea6 mntre_v3: correct layout data (#23216) 2024-03-04 19:41:55 +00:00
James Young
1919644934 Iron180 V2 S: correct ANSI Enter key sizes (#23215) 2024-03-04 19:40:16 +00:00
393 changed files with 19872 additions and 1399 deletions

View File

@@ -35,7 +35,9 @@ jobs:
- name: Get changed files
id: file_changes
uses: tj-actions/changed-files@v42
uses: tj-actions/changed-files@v44
with:
use_rest_api: true
- name: Run qmk formatters
shell: 'bash {0}'

View File

@@ -47,7 +47,7 @@ jobs:
git config user.email 'hello@qmk.fm'
- name: Create Pull Request
uses: peter-evans/create-pull-request@v5
uses: peter-evans/create-pull-request@v6
if: ${{ github.repository == 'qmk/qmk_firmware'}}
with:
token: ${{ secrets.QMK_BOT_TOKEN }}

View File

@@ -27,7 +27,9 @@ jobs:
- name: Get changed files
id: file_changes
uses: tj-actions/changed-files@v42
uses: tj-actions/changed-files@v44
with:
use_rest_api: true
- name: Print info
run: |
@@ -62,10 +64,12 @@ jobs:
qmk format-text ${{ steps.file_changes.outputs.all_changed_files}} || true
for file in ${{ steps.file_changes.outputs.all_changed_files}}; do
if ! git diff --quiet $file; then
echo "File '${file}' Requires Formatting"
echo "::error file=${file}::Requires Formatting"
exit_code=$(($exit_code + 1))
if [[ -f $file ]]; then
if ! git diff --quiet $file; then
echo "File '${file}' Requires Formatting"
echo "::error file=${file}::Requires Formatting"
exit_code=$(($exit_code + 1))
fi
fi
done

View File

@@ -34,7 +34,7 @@ jobs:
git config user.email 'hello@qmk.fm'
- name: Create Pull Request
uses: peter-evans/create-pull-request@v5
uses: peter-evans/create-pull-request@v6
if: ${{ github.repository == 'qmk/qmk_firmware'}}
with:
token: ${{ secrets.QMK_BOT_TOKEN }}

View File

@@ -5,8 +5,10 @@ ifneq ($(findstring yes, $(CTPC)$(CONVERT_TO_PROTON_C)),)
$(call CATASTROPHIC_ERROR,The `CONVERT_TO_PROTON_C` and `CTPC` options are now deprecated. `CONVERT_TO=proton_c` should be used instead.)
endif
# TODO: opt in rather than assume everything uses a pro micro
PIN_COMPATIBLE ?= promicro
ifneq (,$(filter $(MCU),atmega32u4))
# TODO: opt in rather than assume everything uses a pro micro
PIN_COMPATIBLE ?= promicro
endif
# Remove whitespace from any rule.mk provided vars
# - env cannot be overwritten but cannot have whitespace anyway
@@ -16,6 +18,10 @@ ifneq ($(CONVERT_TO),)
# stash so we can overwrite env provided vars if needed
ACTIVE_CONVERTER=$(CONVERT_TO)
ifeq ($(PIN_COMPATIBLE),)
$(call CATASTROPHIC_ERROR,Converting to '$(CONVERT_TO)' not possible!)
endif
# glob to search each platfrorm and/or check for valid converter
CONVERTER := $(wildcard $(PLATFORM_PATH)/*/converters/$(PIN_COMPATIBLE)_to_$(CONVERT_TO)/)
ifeq ($(CONVERTER),)

View File

@@ -335,5 +335,9 @@
"key": "ES_CIRC",
"label": "^",
}
"ALGR(KC_NUHS)": {
"key": "ES_GRV",
"label": "`",
}
}
}

View File

@@ -45,4 +45,4 @@ Eg, if you wanted to set the "Adjust" layer to be layer 5, you'd add this to you
| `get_tri_layer_upper_layer()` | Gets the current "upper" layer. |
| `get_tri_layer_adjust_layer()` | Gets the current "adjust" layer. |
!> Note: these settings are not persisent, and will be reset to the default on power loss or power cycling of the controller.
!> Note: these settings are not persistent, and will be reset to the default on power loss or power cycling of the controller.

View File

@@ -464,4 +464,4 @@ CLI Flashing sequence:
3. Flash via QMK CLI eg. `qmk flash --keyboard handwired/onekey/rpi_pico --keymap default`
4. Wait for the keyboard to become available
<sup>1</sup>: This works only if QMK was compiled with `RP2040_BOOTLOADER_DOUBLE_TAP_RESET` defined.
<sup>1</sup>: This works only if the controller has been flashed with QMK Firmware with `RP2040_BOOTLOADER_DOUBLE_TAP_RESET` defined.

View File

@@ -4,7 +4,7 @@ This page attempts to explain the basic information you need to know to work wit
## Basic QMK Structure
QMK is a fork of [Jun Wako](https://github.com/tmk)'s [tmk_keyboard](https://github.com/tmk/tmk_keyboard) project. The original TMK code, with modifications, can be found in the `tmk_core` folder. The QMK additions to the project may be found in the `quantum` folder. Keyboard projects may be found in the `handwired` and `keyboard` folders.
QMK is a fork of [Jun Wako](https://github.com/tmk)'s [tmk_keyboard](https://github.com/tmk/tmk_keyboard) project. The original TMK code, with modifications, can be found in the `tmk_core` folder. The QMK additions to the project may be found in the `quantum` folder. Keyboard projects may be found in the `keyboards` folder.
### Userspace Structure

View File

@@ -117,3 +117,77 @@ Using the [standard `compile_commands.json` database](https://clang.llvm.org/doc
1. Start typing `clangd: Restart Language Server` and select it when it appears.
Now you're ready to code QMK Firmware in VS Code!
# Debugging ARM MCUs with Visual Studio Code
**...and a Black Magic Probe.**
Visual Studio Code has the ability to debug applications, but requires some configuration in order to get it to be able to do so for ARM targets.
This documentation describes a known-working configuration for setting up the use of a Black Magic Probe to debug using VS Code.
It is assumed that you've correctly set up the electrical connectivity of the Black Magic Probe with your MCU. Wiring up `NRST`, `SWDIO`, `SWCLK`, and `GND` should be enough.
Install the following plugin into VS Code:
* [Cortex-Debug](https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug) -
This adds debugger support for ARM Cortex targets to VS Code.
A debugging target for the MCU for your board needs to be defined, and can be done so by adding the following to a `.vscode/launch.json` file:
```json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Black Magic Probe (OneKey Proton-C)",
"type": "cortex-debug",
"request": "launch",
"cwd": "${workspaceRoot}",
"executable": "${workspaceRoot}/.build/handwired_onekey_proton_c_default.elf",
"servertype": "bmp",
"BMPGDBSerialPort": "COM4",
"svdFile": "Q:\\svd\\STM32F303.svd",
"device": "STM32F303",
"v1": false,
"windows": {
"armToolchainPath": "C:\\QMK_MSYS\\mingw64\\bin"
}
}
]
}
```
You'll need to perform some modifications to the file above in order to target your specific device:
* `"name"`: Can be anything, but if you're debugging multiple targets you'll want something descriptive here.
* `"cwd"`: The path to the QMK Firmware repository root directory -- _if using the `.vscode` directory existing in the `qmk_firmware` git repository, the default above should be correct_
* `"executable"`: The path to the `elf` file generated as part of the build for your keyboard -- _exists in `<qmk_firmware>/.build`_
* `"BMPGDBSerialPort"`: The `COM` port under Windows, or the `/dev/...` path for Linux/macOS. Two serial port devices will be created -- the Black Magic Probe debug port is *usually* the first. If it doesn't work, try the second.
* `"svdFile"`: _[Optional]_ The path to the SVD file that defines the register layout for the MCU -- the appropriate file can be downloaded from the [cmsis-svd repository](https://github.com/posborne/cmsis-svd/tree/master/data/STMicro)
* `"device"`: The name of the MCU, which matches the `<name>` tag at the top of the downloaded `svd` file.
* `"armToolchainPath"`: _[Optional]_ The path to the ARM toolchain installation location on Windows -- under normal circumstances Linux/macOS will auto-detect this correctly and will not need to be specified.
!> Windows builds of QMK Firmware are generally compiled using QMK MSYS, and the path to gdb's location (`C:\\QMK_MSYS\\mingw64\\bin`) needs to be specified under `armToolchainPath` for it to be detected. You may also need to change the GDB path to point at `C:\\QMK_MSYS\\mingw64\\bin\\gdb-multiarch.exe` in the VSCode Cortex-Debug user settings: ![VSCode Settings](https://i.imgur.com/EGrPM1L.png)
Optionally, the following modifications should also be made to the keyboard's `rules.mk` file to disable optimisations -- not strictly required but will ensure breakpoints and variable viewing works correctly:
```makefile
# Disable optimisations for debugging purposes
LTO_ENABLE = no
OPT = g
DEBUG = 3
```
At this point, you should build and flash your firmware through normal methods (`qmk compile ...` and `qmk flash ...`).
Once completed, you can:
* Switch to the debug view in VS Code (in the sidebar, the Play button with a bug next to it)
* Select the newly-created debug target in the dropdown at the top of the sidebar
* Click the green play button next to the dropdown
VS Code's debugger will then start executing the compiled firmware on the MCU.
At this stage, you should have full debugging set up, with breakpoints and variable listings working!

View File

@@ -9,6 +9,7 @@ If there are any inconsistencies with these recommendations, you're best off [cr
- PR should be submitted using a non-`master` branch on the source repository
- this does not mean you target a different branch for your PR, rather that you're not working out of your own master branch
- if submitter _does_ use their own `master` branch, they'll be given a link to the ["how to git"](newbs_git_using_your_master_branch.md) page after merging -- (end of this document will contain the contents of the message)
- Note, frequently merging upstream with your branch is not needed and is discouraged. Valid reason for updating your branch may be resolving merge conflicts and pulling in new changes relevant to your PR.
- PRs should contain the smallest amount of modifications required for a single change to the codebase
- multiple keyboards at the same time is not acceptable
- **the smaller the PR, the higher likelihood of a quicker review, higher likelihood of quicker merge, and less chance of conflicts**
@@ -43,10 +44,10 @@ If there are any inconsistencies with these recommendations, you're best off [cr
- PRs for vendor specific keymaps will be permitted. The naming convention for these should be `default_${vendor}`, `via_${vendor}` i.e. `via_clueboard`.
- vendor specific keymaps do not necessarily need to be "vanilla" and can be more richly featured than `default` or `via` stock keymaps.
- #include QMK_KEYBOARD_H preferred to including specific board files
- `#include QMK_KEYBOARD_H` preferred to including specific board files
- prefer layer enums to #defines
- custom keycode enums must have first entry = SAFE_RANGE
- some care with spacing (e.g., alignment on commas or first char of keycodes) makes for a much nicer-looking keymap
- custom keycode enums must have first entry = `QK_USER`
- some care with spacing (e.g., alignment on commas or first char of keycodes) makes for a much nicer-looking keymap. Spaces are preferred to tabs
## Keyboard PRs
@@ -81,6 +82,8 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- Encoder Configuration
- Bootmagic Configuration
- LED Indicator Configuration
- RGB Light Configuration
- RGB Matrix Configuration
- Run `qmk format-json` on this file before submitting your PR. Be sure to append the `-i` flag to directly modify the file, or paste the outputted code into the file.
- `readme.md`
- must follow the [template](https://github.com/qmk/qmk_firmware/blob/master/data/templates/keyboard/readme.md)
@@ -90,8 +93,7 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- a picture about the keyboard and preferably about the PCB, too
- images are not to be placed in the `qmk_firmware` repository
- images should be uploaded to an external image hosting service, such as [imgur](https://imgur.com/).
- if imgur is used, images should be resized appropriately: append "h" to the image url i.e. [https://i.imgur.com/vqgE7Ok.jpg](https://i.imgur.com/vqgE7Ok.jpg) becomes [https://i.imgur.com/vqgE7Ok**h**.jpg](https://i.imgur.com/vqgE7Okh.jpg)
- image links should link directly to the image, not a "preview" -- i.e. [https://imgur.com/vqgE7Ok](https://imgur.com/vqgE7Ok) should be [https://i.imgur.com/vqgE7Okh.jpg](https://i.imgur.com/vqgE7Okh.jpg) when using imgur
- image links should link directly to the image, not a "preview" -- i.e. [https://imgur.com/vqgE7Ok](https://imgur.com/vqgE7Ok) should be [https://i.imgur.com/vqgE7Ok.jpg](https://i.imgur.com/vqgE7Ok.jpg) when using imgur
- `rules.mk`
- removed `MIDI_ENABLE`, `FAUXCLICKY_ENABLE` and `HD44780_ENABLE`
- modified `# Enable Bluetooth with the Adafruit EZ-Key HID` -> `# Enable Bluetooth`
@@ -204,7 +206,7 @@ Additionally, PR reviews are something that is done in our free time. We are not
## Example GPLv2 Header
```
/* Copyright 2021 Your Name (@yourgithub)
/* Copyright 2024 Your Name (@yourgithub)
*
* 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
@@ -224,6 +226,6 @@ Additionally, PR reviews are something that is done in our free time. We are not
Or, optionally, using [SPDX identifier](https://spdx.org/licenses/) instead:
```
// Copyright 2021 Your Name (@yourgithub)
// Copyright 2024 Your Name (@yourgithub)
// SPDX-License-Identifier: GPL-2.0-or-later
```

View File

@@ -1,6 +1,6 @@
# 'serial' Driver
The serial driver powers the [Split Keyboard](feature_split_keyboard.md) feature. Several implementations are available, depending on the platform of your split keyboard. Note that none of the drivers support split keyboards with more than two halves.
The Serial driver powers the [Split Keyboard](feature_split_keyboard.md) feature. Several implementations are available that cater to the platform and capabilites of MCU in use. Note that none of the drivers support split keyboards with more than two halves.
| Driver | AVR | ARM | Connection between halves |
| --------------------------------------- | ------------------ | ------------------ | --------------------------------------------------------------------------------------------- |
@@ -14,7 +14,7 @@ The serial driver powers the [Split Keyboard](feature_split_keyboard.md) feature
## Bitbang
This is the Default driver, the absence of configuration assumes this driver. It works by [bit banging](https://en.wikipedia.org/wiki/Bit_banging) a GPIO pin using the CPU. It is therefore not as efficient as a dedicated hardware peripheral, which the Half-duplex and Full-duplex drivers use.
This is the Default driver, absence of configuration assumes this driver. It works by [bit banging](https://en.wikipedia.org/wiki/Bit_banging) a GPIO pin using the CPU. It is therefore not as efficient as a dedicated hardware peripheral, which the Half-duplex and Full-duplex drivers use.
!> On ARM platforms the bitbang driver causes connection issues when using it together with the bitbang WS2812 driver. Choosing alternate drivers for both serial and WS2812 (instead of bitbang) is strongly recommended.
@@ -31,7 +31,7 @@ This is the Default driver, the absence of configuration assumes this driver. It
+-------+ +-------+
```
One GPIO pin is needed for the bitbang driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SOFT_SERIAL_PIN` (SSP) in the configuration. A simple TRS or USB cable provides enough conductors for this driver to work.
One GPIO pin is needed for the bitbang driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SOFT_SERIAL_PIN` (SSP) in the configuration. A TRS or USB cable provides enough conductors for this driver to function.
### Setup
@@ -57,7 +57,7 @@ SERIAL_DRIVER = bitbang
## USART Half-duplex
Targeting ARM boards based on ChibiOS, where communication is offloaded to a USART hardware device that supports Half-duplex operation. The advantages over bitbanging are fast, accurate timings and reduced CPU usage. Therefore it is advised to choose this driver or the Full-duplex driver whenever possible.
Targeting ARM boards based on ChibiOS, where communication is offloaded to a USART hardware device that supports Half-duplex operation. The advantages over bitbanging are fast, accurate timings and reduced CPU usage. Therefore it is advised to choose Half-duplex over Bitbang if MCU is capable of utilising Half-duplex, and Full-duplex can't be used instead (e.g. lack of available GPIO pins, or imcompatible PCB design).
### Pin configuration
@@ -74,11 +74,13 @@ Targeting ARM boards based on ChibiOS, where communication is offloaded to a USA
+-------+ +-------+
```
Only one GPIO pin is needed for the Half-duplex driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SERIAL_USART_TX_PIN` in the configuration. Take care that the pin you chose can act as the TX pin of the USART peripheral. A simple TRS or USB cable provides enough conductors for this driver to work. As the split connection is configured to work in open-drain mode, an **external pull-up resistor is needed to keep the line high**. Resistor values of 1.5kΩ to 8.2kΩ are known to work.
Only one GPIO pin is needed for the Half-duplex driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SERIAL_USART_TX_PIN` in the configuration. Ensure that the pin chosen for split communication can operate as the TX pin of the contoller's USART peripheral. A TRS or USB cable provides enough conductors for this driver to function. As the split connection is configured to operate in open-drain mode, an **external pull-up resistor is needed to keep the line high**. Resistor values of 1.5kΩ to 8.2kΩ are known to work.
!> ***Note:*** A pull-up resistor isn't required for RP2040 controllers configured with PIO subsystem.
### Setup
To use the Half-duplex driver follow these steps to activate it. If you target the Raspberry Pi RP2040 PIO implementation skip step 1.
To use the Half-duplex driver follow these steps to activate it. If you target the Raspberry Pi RP2040 PIO implementation, start at step 2.
1. Change the `SERIAL_DRIVER` to `usart` in your keyboards `rules.mk` file:
@@ -86,7 +88,9 @@ To use the Half-duplex driver follow these steps to activate it. If you target t
SERIAL_DRIVER = usart
```
2. (RP2040 PIO only!) Change the `SERIAL_DRIVER` to `vendor` in your keyboards `rules.mk` file:
Skip to step 3.
2. (RP2040 + PIO only!) Change the `SERIAL_DRIVER` to `vendor` in your keyboards `rules.mk` file:
```make
SERIAL_DRIVER = vendor
@@ -105,13 +109,13 @@ For STM32 MCUs several GPIO configuration options can be changed as well. See th
#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
```
4. Decide either for `SERIAL`, `SIO` or `PIO` subsystem, see the section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem).
4. Decide either for `SERIAL`, `SIO`, or `PIO` subsystem. See section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem).
<hr>
## USART Full-duplex
Targeting ARM boards based on ChibiOS where communication is offloaded to an USART hardware device. The advantages over bitbanging are fast, accurate timings and reduced CPU usage. Therefore it is advised to choose this driver or the Full-duplex driver whenever possible. Due to its internal design it is slightly more efficient then the Half-duplex driver, but it should be primarily chosen if Half-duplex operation is not supported by the USART peripheral.
Targeting ARM boards based on ChibiOS where communication is offloaded to an USART hardware device. The advantages over bitbanging are fast, accurate timings and reduced CPU usage; therefore it is advised to choose this driver over all others where possible. Due to its internal design Full-duplex is slightly more efficient than the Half-duplex driver, but Full-duplex should be primarily chosen if Half-duplex operation is not supported by the controller's USART peripheral.
### Pin configuration
@@ -129,13 +133,13 @@ Targeting ARM boards based on ChibiOS where communication is offloaded to an USA
+-------+ +-------+
```
Two GPIO pins are needed for the Full-duplex driver, as two distinct wires are used for receiving and transmitting data. The pin transmitting data is the `TX` pin and refereed to as the `SERIAL_USART_TX_PIN`, the pin receiving data is the `RX` pin and refereed to as the `SERIAL_USART_RX_PIN` in this configuration. Please note that `TX` pin of the master half has to be connected with the `RX` pin of the slave half and the `RX` pin of the master half has to be connected with the `TX` pin of the slave half! Usually this pin swap has to be done outside of the MCU e.g. with cables or on the PCB. Some MCUs like the STM32F303 used on the Proton-C allow this pin swap directly inside the MCU. A simple TRRS or USB cable provides enough conductors for this driver to work.
Two GPIO pins are needed for the Full-duplex driver, as two distinct wires are used for receiving and transmitting data. The pin transmitting data is the `TX` pin and refereed to as the `SERIAL_USART_TX_PIN`, the pin receiving data is the `RX` pin and refereed to as the `SERIAL_USART_RX_PIN` in this configuration. Please note that `TX` pin of the master half has to be connected with the `RX` pin of the slave half and the `RX` pin of the master half has to be connected with the `TX` pin of the slave half! Usually this pin swap has to be done outside of the MCU e.g. with cables or on the PCB. Some MCUs like the STM32F303 used on the Proton-C allow this pin swap directly inside the MCU. A TRRS or USB cable provides enough conductors for this driver to function.
To use this driver the usart peripherals `TX` and `RX` pins must be configured with the correct Alternate-functions. If you are using a Proton-C everything is already setup, same is true for STM32F103 MCUs. For MCUs which are using a modern flexible GPIO configuration you have to specify these by setting `SERIAL_USART_TX_PAL_MODE` and `SERIAL_USART_RX_PAL_MODE`. Refer to the corresponding datasheets of your MCU or find those settings in the section ["Alternate Functions for selected STM32 MCUs"](#alternate-functions-for-selected-stm32-mcus).
To use this driver the USART peripherals `TX` and `RX` pins must be configured with the correct Alternate-functions. If you are using a Proton-C development board everything is already setup, same is true for STM32F103 MCUs. For MCUs which are using a modern flexible GPIO configuration you have to specify these by setting `SERIAL_USART_TX_PAL_MODE` and `SERIAL_USART_RX_PAL_MODE`. Refer to the corresponding datasheets of your MCU or find those settings in the section ["Alternate Functions for selected STM32 MCUs"](#alternate-functions-for-selected-stm32-mcus).
### Setup
To use the Full-duplex driver follow these steps to activate it. If you target the Raspberry Pi RP2040 PIO implementation skip step 1.
To use the Full-duplex driver follow these steps to activate it. If you target the Raspberry Pi RP2040 PIO implementation, start at step 2
1. Change the `SERIAL_DRIVER` to `usart` in your keyboards `rules.mk` file:
@@ -143,7 +147,9 @@ To use the Full-duplex driver follow these steps to activate it. If you target t
SERIAL_DRIVER = usart
```
2. (RP2040 PIO only!) Change the `SERIAL_DRIVER` to `vendor` in your keyboards `rules.mk` file:
Skip to step 3
2. (RP2040 + PIO only!) Change the `SERIAL_DRIVER` to `vendor` in your keyboards `rules.mk` file:
```make
SERIAL_DRIVER = vendor
@@ -165,7 +171,7 @@ For STM32 MCUs several GPIO configuration options, including the ability for `TX
#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
```
1. Decide either for `SERIAL`, `SIO` or `PIO` subsystem, see the section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem).
4. Decide either for `SERIAL`, `SIO`, or `PIO` subsystem. See section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem).
<hr>
@@ -225,7 +231,7 @@ Just below `#include_next <mcuconf.h>` add:
Where 'n' matches the peripheral number of your selected USART on the MCU.
3. In you keyboards `config.h`: override the default USART `SIO` driver if you use a USART peripheral that does not belong to the default selected `SIOD1` driver. For instance, if you selected `STM32_SERIAL_USE_USART3` the matching driver would be `SIOD3`.
3. In the keyboard's `config.h` file: override the default USART `SIO` driver if you use a USART peripheral that does not belong to the default selected `SIOD1` driver. For instance, if you selected `STM32_SERIAL_USE_USART3` the matching driver would be `SIOD3`.
```c
#define SERIAL_USART_DRIVER SIOD3
@@ -233,9 +239,9 @@ Where 'n' matches the peripheral number of your selected USART on the MCU.
### The `PIO` driver
The `PIO` subsystem is a Raspberry Pi RP2040 specific implementation, using the integrated PIO peripheral and is therefore only available on this MCU. Because of the flexible nature of the PIO peripherals, **any** GPIO pin can be used as a `TX` or `RX` pin. Half-duplex and Full-duplex operation is fully supported. The Half-duplex operation mode uses the built-in pull-ups and GPIO manipulation on the RP2040 to drive the line high by default. An external pull-up is therefore not necessary.
The `PIO` subsystem is a Raspberry Pi RP2040 specific implementation, using an integrated PIO peripheral and is therefore only available on this MCU. Because of the flexible nature of PIO peripherals, **any** GPIO pin can be used as a `TX` or `RX` pin. Half-duplex and Full-duplex operation modes are fully supported with this driver. Half-duplex uses the built-in pull-ups and GPIO manipulation of the RP2040 to drive the line high by default, thus an external pull-up resistor **is not required**.
You may optionally switch the PIO peripheral used with the following define in config.h:
Optionally, the PIO peripheral utilized for split communication can be changed with the following define in config.h:
```c
#define SERIAL_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the Serial implementation uses the PIO0 peripheral
```

View File

@@ -0,0 +1,46 @@
/* Copyright 2023 CMM.S Freather
*
* 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 "quantum.h"
const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 13, HSV_WHITE}
);
const rgblight_segment_t PROGMEM my_capsoff_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 1, HSV_BLACK}
);
// Now define the array of layers. Later layers take precedence
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
my_capslock_layer,
my_capsoff_layer
);
void keyboard_post_init_kb(void){
rgblight_layers = my_rgb_layers;
keyboard_post_init_user();
}
bool led_update_kb(led_t led_state){
bool res = led_update_user(led_state);
if (res) {
rgblight_set_layer_state(0, led_state.caps_lock);
rgblight_set_layer_state(1, !led_state.caps_lock);
}
return res;
}

View File

@@ -0,0 +1,699 @@
{
"manufacturer": "Freather",
"keyboard_name": "Atelier_Haven Haven60",
"maintainer": "Freather",
"bootloader": "atmel-dfu",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgblight": true
},
"matrix_pins": {
"cols": ["C7", "D4", "D6", "D7", "B4", "B5", "B6", "D5", "D3", "D2", "D1", "D0", "B1", "B0"],
"rows": ["F0", "E6", "C6", "F4", "F1"]
},
"processor": "atmega32u4",
"url": "https://keyspensory.store/products",
"usb": {
"device_version": "1.0.0",
"pid": "0x4660",
"vid": "0x4446"
},
"ws2812": {
"pin": "F5"
},
"rgblight": {
"led_count": 13,
"saturation_steps": 8,
"brightness_steps": 8,
"sleep": true,
"max_brightness": 125,
"layers": {
"enabled": true
},
"animations": {
"alternating": true,
"breathing": true,
"christmas": true,
"knight": true,
"rainbow_mood": true,
"rainbow_swirl": true,
"snake": true,
"static_gradient": true,
"twinkle": true
}
},
"community_layouts": ["60_ansi_tsangan", "60_tsangan_hhkb", "60_ansi_wkl", "60_ansi_wkl_split_bs_rshift", "60_hhkb", "60_iso_tsangan", "60_iso_tsangan_split_bs_rshift", "60_iso_wkl", "60_iso_wkl_split_bs_rshift"],
"layouts": {
"LAYOUT_all": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 12], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_ansi_tsangan": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_tsangan_hhkb": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 12], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_ansi_wkl": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_ansi_wkl_split_bs_rshift": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 12], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_hhkb": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 12], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4}
]
},
"LAYOUT_60_iso_tsangan": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [1, 13], "x": 12.75, "y": 2},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_iso_tsangan_split_bs_rshift": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 12], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [1, 13], "x": 12.75, "y": 2},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_iso_wkl": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [1, 13], "x": 12.75, "y": 2},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_iso_wkl_split_bs_rshift": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 12], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [1, 13], "x": 12.75, "y": 2},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [3, 1], "x": 1.25, "y": 3},
{"matrix": [3, 2], "x": 2.25, "y": 3},
{"matrix": [3, 3], "x": 3.25, "y": 3},
{"matrix": [3, 4], "x": 4.25, "y": 3},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3},
{"matrix": [3, 7], "x": 7.25, "y": 3},
{"matrix": [3, 8], "x": 8.25, "y": 3},
{"matrix": [3, 9], "x": 9.25, "y": 3},
{"matrix": [3, 10], "x": 10.25, "y": 3},
{"matrix": [3, 11], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
}
}
}

View File

@@ -0,0 +1,21 @@
// Copyright 2023 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
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_CAPS, 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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL
),
[1] = LAYOUT_all(
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_UP, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_RGHT, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
};

View File

@@ -0,0 +1,21 @@
// Copyright 2023 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
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_CAPS, 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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL
),
[1] = LAYOUT_all(
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_UP, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_RGHT, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
};

View File

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

View File

@@ -0,0 +1,28 @@
# haven60
![haven60](https://i.imgur.com/Uja750Oh.png)
Haven60 PCB for Atelier Haven Haven60% keyboard
both hotswap and solder pcbs use same firmware
* Keyboard Maintainer: [Freather](https://github.com/Freather)
* Hardware Supported: atmega32u4-mu
* Hardware Availability: keyspensory.store
Make example for this keyboard (after setting up your build environment):
make ah/haven60:default
Flashing example for this keyboard:
make ah/haven60:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@@ -0,0 +1 @@
# This file intentionally left blank

View File

@@ -130,6 +130,227 @@
{"matrix": [0, 14], "x": 17, "y": 4},
{"matrix": [0, 7], "x": 18, "y": 4},
{"matrix": [6, 0], "x": 0, "y": 5, "w": 1.25},
{"matrix": [6, 1], "x": 1.25, "y": 5, "w": 1.25},
{"matrix": [6, 2], "x": 2.5, "y": 5, "w": 1.25},
{"matrix": [6, 3], "x": 3.75, "y": 5, "w": 6.25},
{"matrix": [6, 4], "x": 10, "y": 5, "w": 1.5},
{"matrix": [6, 5], "x": 11.5, "y": 5, "w": 1.5},
{"matrix": [6, 6], "x": 13, "y": 5},
{"matrix": [6, 8], "x": 14, "y": 5},
{"matrix": [6, 9], "x": 15, "y": 5},
{"matrix": [6, 10], "x": 16, "y": 5},
{"matrix": [6, 11], "x": 17, "y": 5},
{"matrix": [6, 12], "x": 18, "y": 5}
]
},
"LAYOUT_96_ansi_rwkl_split_num_plus_enter": {
"layout": [
{"matrix": [1, 0], "x": 0, "y": 0},
{"matrix": [1, 1], "x": 1, "y": 0},
{"matrix": [1, 2], "x": 2, "y": 0},
{"matrix": [1, 3], "x": 3, "y": 0},
{"matrix": [1, 4], "x": 4, "y": 0},
{"matrix": [1, 5], "x": 5, "y": 0},
{"matrix": [1, 6], "x": 6, "y": 0},
{"matrix": [1, 7], "x": 7, "y": 0},
{"matrix": [1, 8], "x": 8, "y": 0},
{"matrix": [1, 9], "x": 9, "y": 0},
{"matrix": [1, 10], "x": 10, "y": 0},
{"matrix": [1, 11], "x": 11, "y": 0},
{"matrix": [1, 12], "x": 12, "y": 0},
{"matrix": [1, 13], "x": 13, "y": 0},
{"matrix": [1, 14], "x": 14, "y": 0},
{"matrix": [1, 15], "x": 15, "y": 0},
{"matrix": [0, 9], "x": 16, "y": 0},
{"matrix": [0, 10], "x": 17, "y": 0},
{"matrix": [0, 12], "x": 18, "y": 0},
{"matrix": [2, 0], "x": 0, "y": 1},
{"matrix": [2, 1], "x": 1, "y": 1},
{"matrix": [2, 2], "x": 2, "y": 1},
{"matrix": [2, 3], "x": 3, "y": 1},
{"matrix": [2, 4], "x": 4, "y": 1},
{"matrix": [2, 5], "x": 5, "y": 1},
{"matrix": [2, 6], "x": 6, "y": 1},
{"matrix": [2, 7], "x": 7, "y": 1},
{"matrix": [2, 8], "x": 8, "y": 1},
{"matrix": [2, 9], "x": 9, "y": 1},
{"matrix": [2, 10], "x": 10, "y": 1},
{"matrix": [2, 11], "x": 11, "y": 1},
{"matrix": [2, 12], "x": 12, "y": 1},
{"matrix": [2, 13], "x": 13, "y": 1, "w": 2},
{"matrix": [2, 15], "x": 15, "y": 1},
{"matrix": [0, 11], "x": 16, "y": 1},
{"matrix": [0, 15], "x": 17, "y": 1},
{"matrix": [6, 15], "x": 18, "y": 1},
{"matrix": [3, 0], "x": 0, "y": 2, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 2},
{"matrix": [3, 2], "x": 2.5, "y": 2},
{"matrix": [3, 3], "x": 3.5, "y": 2},
{"matrix": [3, 4], "x": 4.5, "y": 2},
{"matrix": [3, 5], "x": 5.5, "y": 2},
{"matrix": [3, 6], "x": 6.5, "y": 2},
{"matrix": [3, 7], "x": 7.5, "y": 2},
{"matrix": [3, 8], "x": 8.5, "y": 2},
{"matrix": [3, 9], "x": 9.5, "y": 2},
{"matrix": [3, 10], "x": 10.5, "y": 2},
{"matrix": [3, 11], "x": 11.5, "y": 2},
{"matrix": [3, 12], "x": 12.5, "y": 2},
{"matrix": [3, 13], "x": 13.5, "y": 2, "w": 1.5},
{"matrix": [3, 14], "x": 15, "y": 2},
{"matrix": [3, 15], "x": 16, "y": 2},
{"matrix": [0, 13], "x": 17, "y": 2},
{"matrix": [6, 13], "x": 18, "y": 2},
{"matrix": [4, 0], "x": 0, "y": 3, "w": 1.75},
{"matrix": [4, 1], "x": 1.75, "y": 3},
{"matrix": [4, 2], "x": 2.75, "y": 3},
{"matrix": [4, 3], "x": 3.75, "y": 3},
{"matrix": [4, 4], "x": 4.75, "y": 3},
{"matrix": [4, 5], "x": 5.75, "y": 3},
{"matrix": [4, 6], "x": 6.75, "y": 3},
{"matrix": [4, 7], "x": 7.75, "y": 3},
{"matrix": [4, 8], "x": 8.75, "y": 3},
{"matrix": [4, 9], "x": 9.75, "y": 3},
{"matrix": [4, 10], "x": 10.75, "y": 3},
{"matrix": [4, 11], "x": 11.75, "y": 3},
{"matrix": [4, 12], "x": 12.75, "y": 3, "w": 2.25},
{"matrix": [4, 13], "x": 15, "y": 3},
{"matrix": [4, 14], "x": 16, "y": 3},
{"matrix": [4, 15], "x": 17, "y": 3},
{"matrix": [6, 14], "x": 18, "y": 3},
{"matrix": [5, 0], "x": 0, "y": 4, "w": 2.25},
{"matrix": [5, 2], "x": 2.25, "y": 4},
{"matrix": [5, 3], "x": 3.25, "y": 4},
{"matrix": [5, 4], "x": 4.25, "y": 4},
{"matrix": [5, 5], "x": 5.25, "y": 4},
{"matrix": [5, 6], "x": 6.25, "y": 4},
{"matrix": [5, 7], "x": 7.25, "y": 4},
{"matrix": [5, 8], "x": 8.25, "y": 4},
{"matrix": [5, 9], "x": 9.25, "y": 4},
{"matrix": [5, 10], "x": 10.25, "y": 4},
{"matrix": [5, 11], "x": 11.25, "y": 4},
{"matrix": [5, 12], "x": 12.25, "y": 4, "w": 1.75},
{"matrix": [5, 13], "x": 14, "y": 4},
{"matrix": [5, 14], "x": 15, "y": 4},
{"matrix": [5, 15], "x": 16, "y": 4},
{"matrix": [0, 14], "x": 17, "y": 4},
{"matrix": [0, 7], "x": 18, "y": 4},
{"matrix": [6, 0], "x": 0, "y": 5, "w": 1.25},
{"matrix": [6, 1], "x": 1.25, "y": 5, "w": 1.25},
{"matrix": [6, 2], "x": 2.5, "y": 5, "w": 1.25},
{"matrix": [6, 3], "x": 3.75, "y": 5, "w": 6.25},
{"matrix": [6, 4], "x": 10, "y": 5, "w": 1.5},
{"matrix": [6, 5], "x": 11.5, "y": 5, "w": 1.5},
{"matrix": [6, 6], "x": 13, "y": 5},
{"matrix": [6, 8], "x": 14, "y": 5},
{"matrix": [6, 9], "x": 15, "y": 5},
{"matrix": [6, 10], "x": 16, "y": 5},
{"matrix": [6, 11], "x": 17, "y": 5},
{"matrix": [6, 12], "x": 18, "y": 5}
]
},
"LAYOUT_96_ansi_rwkl_split_bs_num_plus_enter": {
"layout": [
{"matrix": [1, 0], "x": 0, "y": 0},
{"matrix": [1, 1], "x": 1, "y": 0},
{"matrix": [1, 2], "x": 2, "y": 0},
{"matrix": [1, 3], "x": 3, "y": 0},
{"matrix": [1, 4], "x": 4, "y": 0},
{"matrix": [1, 5], "x": 5, "y": 0},
{"matrix": [1, 6], "x": 6, "y": 0},
{"matrix": [1, 7], "x": 7, "y": 0},
{"matrix": [1, 8], "x": 8, "y": 0},
{"matrix": [1, 9], "x": 9, "y": 0},
{"matrix": [1, 10], "x": 10, "y": 0},
{"matrix": [1, 11], "x": 11, "y": 0},
{"matrix": [1, 12], "x": 12, "y": 0},
{"matrix": [1, 13], "x": 13, "y": 0},
{"matrix": [1, 14], "x": 14, "y": 0},
{"matrix": [1, 15], "x": 15, "y": 0},
{"matrix": [0, 9], "x": 16, "y": 0},
{"matrix": [0, 10], "x": 17, "y": 0},
{"matrix": [0, 12], "x": 18, "y": 0},
{"matrix": [2, 0], "x": 0, "y": 1},
{"matrix": [2, 1], "x": 1, "y": 1},
{"matrix": [2, 2], "x": 2, "y": 1},
{"matrix": [2, 3], "x": 3, "y": 1},
{"matrix": [2, 4], "x": 4, "y": 1},
{"matrix": [2, 5], "x": 5, "y": 1},
{"matrix": [2, 6], "x": 6, "y": 1},
{"matrix": [2, 7], "x": 7, "y": 1},
{"matrix": [2, 8], "x": 8, "y": 1},
{"matrix": [2, 9], "x": 9, "y": 1},
{"matrix": [2, 10], "x": 10, "y": 1},
{"matrix": [2, 11], "x": 11, "y": 1},
{"matrix": [2, 12], "x": 12, "y": 1},
{"matrix": [2, 13], "x": 13, "y": 1},
{"matrix": [2, 14], "x": 14, "y": 1},
{"matrix": [2, 15], "x": 15, "y": 1},
{"matrix": [0, 11], "x": 16, "y": 1},
{"matrix": [0, 15], "x": 17, "y": 1},
{"matrix": [6, 15], "x": 18, "y": 1},
{"matrix": [3, 0], "x": 0, "y": 2, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 2},
{"matrix": [3, 2], "x": 2.5, "y": 2},
{"matrix": [3, 3], "x": 3.5, "y": 2},
{"matrix": [3, 4], "x": 4.5, "y": 2},
{"matrix": [3, 5], "x": 5.5, "y": 2},
{"matrix": [3, 6], "x": 6.5, "y": 2},
{"matrix": [3, 7], "x": 7.5, "y": 2},
{"matrix": [3, 8], "x": 8.5, "y": 2},
{"matrix": [3, 9], "x": 9.5, "y": 2},
{"matrix": [3, 10], "x": 10.5, "y": 2},
{"matrix": [3, 11], "x": 11.5, "y": 2},
{"matrix": [3, 12], "x": 12.5, "y": 2},
{"matrix": [3, 13], "x": 13.5, "y": 2, "w": 1.5},
{"matrix": [3, 14], "x": 15, "y": 2},
{"matrix": [3, 15], "x": 16, "y": 2},
{"matrix": [0, 13], "x": 17, "y": 2},
{"matrix": [6, 13], "x": 18, "y": 2},
{"matrix": [4, 0], "x": 0, "y": 3, "w": 1.75},
{"matrix": [4, 1], "x": 1.75, "y": 3},
{"matrix": [4, 2], "x": 2.75, "y": 3},
{"matrix": [4, 3], "x": 3.75, "y": 3},
{"matrix": [4, 4], "x": 4.75, "y": 3},
{"matrix": [4, 5], "x": 5.75, "y": 3},
{"matrix": [4, 6], "x": 6.75, "y": 3},
{"matrix": [4, 7], "x": 7.75, "y": 3},
{"matrix": [4, 8], "x": 8.75, "y": 3},
{"matrix": [4, 9], "x": 9.75, "y": 3},
{"matrix": [4, 10], "x": 10.75, "y": 3},
{"matrix": [4, 11], "x": 11.75, "y": 3},
{"matrix": [4, 12], "x": 12.75, "y": 3, "w": 2.25},
{"matrix": [4, 13], "x": 15, "y": 3},
{"matrix": [4, 14], "x": 16, "y": 3},
{"matrix": [4, 15], "x": 17, "y": 3},
{"matrix": [6, 14], "x": 18, "y": 3},
{"matrix": [5, 0], "x": 0, "y": 4, "w": 2.25},
{"matrix": [5, 2], "x": 2.25, "y": 4},
{"matrix": [5, 3], "x": 3.25, "y": 4},
{"matrix": [5, 4], "x": 4.25, "y": 4},
{"matrix": [5, 5], "x": 5.25, "y": 4},
{"matrix": [5, 6], "x": 6.25, "y": 4},
{"matrix": [5, 7], "x": 7.25, "y": 4},
{"matrix": [5, 8], "x": 8.25, "y": 4},
{"matrix": [5, 9], "x": 9.25, "y": 4},
{"matrix": [5, 10], "x": 10.25, "y": 4},
{"matrix": [5, 11], "x": 11.25, "y": 4},
{"matrix": [5, 12], "x": 12.25, "y": 4, "w": 1.75},
{"matrix": [5, 13], "x": 14, "y": 4},
{"matrix": [5, 14], "x": 15, "y": 4},
{"matrix": [5, 15], "x": 16, "y": 4},
{"matrix": [0, 14], "x": 17, "y": 4},
{"matrix": [0, 7], "x": 18, "y": 4},
{"matrix": [6, 0], "x": 0, "y": 5, "w": 1.25},
{"matrix": [6, 1], "x": 1.25, "y": 5, "w": 1.25},
{"matrix": [6, 2], "x": 2.5, "y": 5, "w": 1.25},

View File

@@ -0,0 +1,25 @@
# Matrix Diagram for Han Chen AMJ96
There's a lot of options available on the PCB, including some on the
bottom row, but I haven't ever found high quality images of a bare PCB
with which to determine what's actually supported. :\\\
\- @noroadsleft, 19 January, 2024
```
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │1E │1F │09 │0A │0C │
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ ┌───────┐
│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2D │2E │2F │0B │0F │6F │ │2D │ 2u Backspace
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┼───┼───┼───┤ └─┬─────┤ ┌─────┐ ┌───┐
│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3D │3E │3F │0D │6D │ │ │ │3D │ │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┼───┼───┼───┤ ┌──┴┐?? │ ISO Enter ┌──┴┬────┤ Split Enter │?? │ 2u Numpad Plus
│40 │41 │42 │43 │44 │45 │46 │47 │48 │49 │4A │4B │4C │4D │4E │4F │6E │ │?? │ │ │?? │?? │ │ │
├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┼───┼───┼───┤ ┌─┴───┴────┤ └───┴────┘ ├───┤
│50 │51 │52 │53 │54 │55 │56 │57 │58 │59 │5A │5B │5C │5D │5E │5F │0E │07 │ │?? │ 2.75u │ │
├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┴┬──┴──┬───┼───┼───┼───┼───┼───┤ └──────────┘ RShift │?? │ 2u Numpad Enter
│60 │61 │62 │63 │64 │65 │66 │68 │69 │6A │6B │6C │ │ │
└────┴────┴────┴────────────────────────┴─────┴─────┴───┴───┴───┴───┴───┴───┘ └───┘
┌────────┐ ┌───────┐
│50 │ 2.25u LShift │?? │ 2u Numpad Zero
└────────┘ └───────┘
```

View File

@@ -0,0 +1,22 @@
/* Copyright 2024 Archetype Made, Inc.
*
* 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
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
#define BACKLIGHT_PWM_DRIVER PWMD5
#define BACKLIGHT_PWM_CHANNEL RP2040_PWM_CHANNEL_A

View File

@@ -0,0 +1,21 @@
/* Copyright 2024 Archetype Made, Inc.
*
* 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
#define HAL_USE_PWM TRUE
#include_next <halconf.h>

View File

@@ -0,0 +1,98 @@
{
"manufacturer": "Archetype",
"keyboard_name": "Minerva LX",
"maintainer": "Archetype",
"backlight": {
"pin": "GP7"
},
"bootloader": "rp2040",
"diode_direction": "COL2ROW",
"features": {
"backlight": true,
"bootmagic": true,
"extrakey": true,
"mousekey": true
},
"matrix_pins": {
"cols": ["GP0", "GP29", "GP28", "GP27", "GP26", "GP25", "GP24", "GP23", "GP22", "GP21", "GP20", "GP19", "GP18", "GP17", "GP16"],
"rows": ["GP11", "GP12", "GP13", "GP14", "GP15"]
},
"processor": "RP2040",
"url": "",
"usb": {
"device_version": "1.0.0",
"pid": "0x0100",
"vid": "0x5453"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [2, 12], "x": 13, "y": 0},
{"matrix": [0, 13], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 1], "x": 2.25, "y": 3},
{"matrix": [3, 2], "x": 3.25, "y": 3},
{"matrix": [3, 3], "x": 4.25, "y": 3},
{"matrix": [3, 4], "x": 5.25, "y": 3},
{"matrix": [3, 5], "x": 6.25, "y": 3},
{"matrix": [3, 6], "x": 7.25, "y": 3},
{"matrix": [3, 7], "x": 8.25, "y": 3},
{"matrix": [3, 8], "x": 9.25, "y": 3},
{"matrix": [3, 9], "x": 10.25, "y": 3},
{"matrix": [3, 10], "x": 11.25, "y": 3},
{"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 4], "x": 4, "y": 4, "w": 3},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 8], "x": 8, "y": 4, "w": 3},
{"matrix": [4, 9], "x": 10, "y": 5.25, "w": 1.25},
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
}
}
}

View File

@@ -0,0 +1,35 @@
/* Copyright 2024 Archetype Made, Inc.
*
* 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
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_BSPC, 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_CAPS, 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, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL
),
[1] = LAYOUT(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};

View File

@@ -0,0 +1,35 @@
/* Copyright 2024 Archetype Made, Inc.
*
* 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
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_BSPC, 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_CAPS, 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, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL
),
[1] = LAYOUT(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};

View File

@@ -0,0 +1,2 @@
VIA_ENABLE = yes
LTO_ENABLE = yes

View File

@@ -0,0 +1,22 @@
/* Copyright 2024 Archetype Made, Inc.
*
* 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_next <mcuconf.h>
#undef RP_PWM_USE_PWM5
#define RP_PWM_USE_PWM5 TRUE

View File

@@ -0,0 +1,24 @@
# Minerva LX
![Minerva LX](https://i.imgur.com/f97nsrx.jpg)
The following is the QMK Firmware for the Minerva LX PCB.
* Keyboard Maintainer: [Archetype](https://github.com/archetype-made)
* Hardware Supported: RP2040-based proprietary PCB.
* Hardware Availability: https://archetypemade.com/minerva-is-here/
Make example for this keyboard (after setting up your build environment):
make archetype/minervalx:default
Flashing example for this keyboard:
make archetype/minervalx:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the key ESC key and plug in the keyboard (Top Left most switch)
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if available
* **Physical Reset Button**: With the PCB unplugged, hold down the button labled `RESET` on the back of the PCB while pluggin in the USB.

View File

@@ -0,0 +1 @@
# This file intentionally left blank

View File

@@ -45,7 +45,7 @@
"layout_aliases": {
"LAYOUT": "LAYOUT_all"
},
"community_layouts": ["60_ansi_split_bs_rshift", "60_hhkb"],
"community_layouts": ["60_ansi", "60_ansi_split_bs_rshift", "60_ansi_tsangan", "60_tsangan_hhkb", "60_ansi_wkl", "60_ansi_wkl_split_bs_rshift", "60_hhkb", "60_iso", "60_iso_split_bs_rshift", "60_iso_tsangan", "60_iso_tsangan_split_bs_rshift", "60_iso_wkl", "60_iso_wkl_split_bs_rshift"],
"layouts": {
"LAYOUT_all": {
"layout": [
@@ -120,6 +120,75 @@
{"matrix": [0, 13], "x": 13.75, "y": 4, "w": 1.25}
]
},
"LAYOUT_60_ansi": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
{"matrix": [4, 1], "x": 1, "y": 0},
{"matrix": [4, 2], "x": 2, "y": 0},
{"matrix": [4, 3], "x": 3, "y": 0},
{"matrix": [4, 4], "x": 4, "y": 0},
{"matrix": [4, 5], "x": 5, "y": 0},
{"matrix": [4, 6], "x": 6, "y": 0},
{"matrix": [4, 7], "x": 7, "y": 0},
{"matrix": [4, 8], "x": 8, "y": 0},
{"matrix": [4, 9], "x": 9, "y": 0},
{"matrix": [4, 10], "x": 10, "y": 0},
{"matrix": [4, 11], "x": 11, "y": 0},
{"matrix": [4, 12], "x": 12, "y": 0},
{"matrix": [4, 14], "x": 13, "y": 0, "w": 2},
{"matrix": [3, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 1},
{"matrix": [3, 2], "x": 2.5, "y": 1},
{"matrix": [3, 3], "x": 3.5, "y": 1},
{"matrix": [3, 4], "x": 4.5, "y": 1},
{"matrix": [3, 5], "x": 5.5, "y": 1},
{"matrix": [3, 6], "x": 6.5, "y": 1},
{"matrix": [3, 7], "x": 7.5, "y": 1},
{"matrix": [3, 8], "x": 8.5, "y": 1},
{"matrix": [3, 9], "x": 9.5, "y": 1},
{"matrix": [3, 10], "x": 10.5, "y": 1},
{"matrix": [3, 11], "x": 11.5, "y": 1},
{"matrix": [3, 12], "x": 12.5, "y": 1},
{"matrix": [3, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [1, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [1, 2], "x": 2.25, "y": 3},
{"matrix": [1, 3], "x": 3.25, "y": 3},
{"matrix": [1, 4], "x": 4.25, "y": 3},
{"matrix": [1, 5], "x": 5.25, "y": 3},
{"matrix": [1, 6], "x": 6.25, "y": 3},
{"matrix": [1, 7], "x": 7.25, "y": 3},
{"matrix": [1, 8], "x": 8.25, "y": 3},
{"matrix": [1, 9], "x": 9.25, "y": 3},
{"matrix": [1, 10], "x": 10.25, "y": 3},
{"matrix": [1, 11], "x": 11.25, "y": 3},
{"matrix": [1, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [0, 0], "x": 0, "y": 4, "w": 1.25},
{"matrix": [0, 1], "x": 1.25, "y": 4, "w": 1.25},
{"matrix": [0, 2], "x": 2.5, "y": 4, "w": 1.25},
{"matrix": [0, 6], "x": 3.75, "y": 4, "w": 6.25},
{"matrix": [0, 10], "x": 10, "y": 4, "w": 1.25},
{"matrix": [0, 11], "x": 11.25, "y": 4, "w": 1.25},
{"matrix": [0, 12], "x": 12.5, "y": 4, "w": 1.25},
{"matrix": [0, 13], "x": 13.75, "y": 4, "w": 1.25}
]
},
"LAYOUT_60_ansi_split_bs_rshift": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
@@ -191,6 +260,278 @@
{"matrix": [0, 13], "x": 13.75, "y": 4, "w": 1.25}
]
},
"LAYOUT_60_ansi_tsangan": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
{"matrix": [4, 1], "x": 1, "y": 0},
{"matrix": [4, 2], "x": 2, "y": 0},
{"matrix": [4, 3], "x": 3, "y": 0},
{"matrix": [4, 4], "x": 4, "y": 0},
{"matrix": [4, 5], "x": 5, "y": 0},
{"matrix": [4, 6], "x": 6, "y": 0},
{"matrix": [4, 7], "x": 7, "y": 0},
{"matrix": [4, 8], "x": 8, "y": 0},
{"matrix": [4, 9], "x": 9, "y": 0},
{"matrix": [4, 10], "x": 10, "y": 0},
{"matrix": [4, 11], "x": 11, "y": 0},
{"matrix": [4, 12], "x": 12, "y": 0},
{"matrix": [4, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [3, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 1},
{"matrix": [3, 2], "x": 2.5, "y": 1},
{"matrix": [3, 3], "x": 3.5, "y": 1},
{"matrix": [3, 4], "x": 4.5, "y": 1},
{"matrix": [3, 5], "x": 5.5, "y": 1},
{"matrix": [3, 6], "x": 6.5, "y": 1},
{"matrix": [3, 7], "x": 7.5, "y": 1},
{"matrix": [3, 8], "x": 8.5, "y": 1},
{"matrix": [3, 9], "x": 9.5, "y": 1},
{"matrix": [3, 10], "x": 10.5, "y": 1},
{"matrix": [3, 11], "x": 11.5, "y": 1},
{"matrix": [3, 12], "x": 12.5, "y": 1},
{"matrix": [3, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [1, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [1, 2], "x": 2.25, "y": 3},
{"matrix": [1, 3], "x": 3.25, "y": 3},
{"matrix": [1, 4], "x": 4.25, "y": 3},
{"matrix": [1, 5], "x": 5.25, "y": 3},
{"matrix": [1, 6], "x": 6.25, "y": 3},
{"matrix": [1, 7], "x": 7.25, "y": 3},
{"matrix": [1, 8], "x": 8.25, "y": 3},
{"matrix": [1, 9], "x": 9.25, "y": 3},
{"matrix": [1, 10], "x": 10.25, "y": 3},
{"matrix": [1, 11], "x": 11.25, "y": 3},
{"matrix": [1, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [0, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [0, 1], "x": 1.5, "y": 4},
{"matrix": [0, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [0, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [0, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [0, 12], "x": 12.5, "y": 4},
{"matrix": [0, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_tsangan_hhkb": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
{"matrix": [4, 1], "x": 1, "y": 0},
{"matrix": [4, 2], "x": 2, "y": 0},
{"matrix": [4, 3], "x": 3, "y": 0},
{"matrix": [4, 4], "x": 4, "y": 0},
{"matrix": [4, 5], "x": 5, "y": 0},
{"matrix": [4, 6], "x": 6, "y": 0},
{"matrix": [4, 7], "x": 7, "y": 0},
{"matrix": [4, 8], "x": 8, "y": 0},
{"matrix": [4, 9], "x": 9, "y": 0},
{"matrix": [4, 10], "x": 10, "y": 0},
{"matrix": [4, 11], "x": 11, "y": 0},
{"matrix": [4, 12], "x": 12, "y": 0},
{"matrix": [4, 13], "x": 13, "y": 0},
{"matrix": [4, 14], "x": 14, "y": 0},
{"matrix": [3, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 1},
{"matrix": [3, 2], "x": 2.5, "y": 1},
{"matrix": [3, 3], "x": 3.5, "y": 1},
{"matrix": [3, 4], "x": 4.5, "y": 1},
{"matrix": [3, 5], "x": 5.5, "y": 1},
{"matrix": [3, 6], "x": 6.5, "y": 1},
{"matrix": [3, 7], "x": 7.5, "y": 1},
{"matrix": [3, 8], "x": 8.5, "y": 1},
{"matrix": [3, 9], "x": 9.5, "y": 1},
{"matrix": [3, 10], "x": 10.5, "y": 1},
{"matrix": [3, 11], "x": 11.5, "y": 1},
{"matrix": [3, 12], "x": 12.5, "y": 1},
{"matrix": [3, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [1, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [1, 2], "x": 2.25, "y": 3},
{"matrix": [1, 3], "x": 3.25, "y": 3},
{"matrix": [1, 4], "x": 4.25, "y": 3},
{"matrix": [1, 5], "x": 5.25, "y": 3},
{"matrix": [1, 6], "x": 6.25, "y": 3},
{"matrix": [1, 7], "x": 7.25, "y": 3},
{"matrix": [1, 8], "x": 8.25, "y": 3},
{"matrix": [1, 9], "x": 9.25, "y": 3},
{"matrix": [1, 10], "x": 10.25, "y": 3},
{"matrix": [1, 11], "x": 11.25, "y": 3},
{"matrix": [1, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [1, 13], "x": 14, "y": 3},
{"matrix": [0, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [0, 1], "x": 1.5, "y": 4},
{"matrix": [0, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [0, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [0, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [0, 12], "x": 12.5, "y": 4},
{"matrix": [0, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_ansi_wkl": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
{"matrix": [4, 1], "x": 1, "y": 0},
{"matrix": [4, 2], "x": 2, "y": 0},
{"matrix": [4, 3], "x": 3, "y": 0},
{"matrix": [4, 4], "x": 4, "y": 0},
{"matrix": [4, 5], "x": 5, "y": 0},
{"matrix": [4, 6], "x": 6, "y": 0},
{"matrix": [4, 7], "x": 7, "y": 0},
{"matrix": [4, 8], "x": 8, "y": 0},
{"matrix": [4, 9], "x": 9, "y": 0},
{"matrix": [4, 10], "x": 10, "y": 0},
{"matrix": [4, 11], "x": 11, "y": 0},
{"matrix": [4, 12], "x": 12, "y": 0},
{"matrix": [4, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [3, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 1},
{"matrix": [3, 2], "x": 2.5, "y": 1},
{"matrix": [3, 3], "x": 3.5, "y": 1},
{"matrix": [3, 4], "x": 4.5, "y": 1},
{"matrix": [3, 5], "x": 5.5, "y": 1},
{"matrix": [3, 6], "x": 6.5, "y": 1},
{"matrix": [3, 7], "x": 7.5, "y": 1},
{"matrix": [3, 8], "x": 8.5, "y": 1},
{"matrix": [3, 9], "x": 9.5, "y": 1},
{"matrix": [3, 10], "x": 10.5, "y": 1},
{"matrix": [3, 11], "x": 11.5, "y": 1},
{"matrix": [3, 12], "x": 12.5, "y": 1},
{"matrix": [3, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [1, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [1, 2], "x": 2.25, "y": 3},
{"matrix": [1, 3], "x": 3.25, "y": 3},
{"matrix": [1, 4], "x": 4.25, "y": 3},
{"matrix": [1, 5], "x": 5.25, "y": 3},
{"matrix": [1, 6], "x": 6.25, "y": 3},
{"matrix": [1, 7], "x": 7.25, "y": 3},
{"matrix": [1, 8], "x": 8.25, "y": 3},
{"matrix": [1, 9], "x": 9.25, "y": 3},
{"matrix": [1, 10], "x": 10.25, "y": 3},
{"matrix": [1, 11], "x": 11.25, "y": 3},
{"matrix": [1, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [0, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [0, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [0, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [0, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [0, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_ansi_wkl_split_bs_rshift": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
{"matrix": [4, 1], "x": 1, "y": 0},
{"matrix": [4, 2], "x": 2, "y": 0},
{"matrix": [4, 3], "x": 3, "y": 0},
{"matrix": [4, 4], "x": 4, "y": 0},
{"matrix": [4, 5], "x": 5, "y": 0},
{"matrix": [4, 6], "x": 6, "y": 0},
{"matrix": [4, 7], "x": 7, "y": 0},
{"matrix": [4, 8], "x": 8, "y": 0},
{"matrix": [4, 9], "x": 9, "y": 0},
{"matrix": [4, 10], "x": 10, "y": 0},
{"matrix": [4, 11], "x": 11, "y": 0},
{"matrix": [4, 12], "x": 12, "y": 0},
{"matrix": [4, 13], "x": 13, "y": 0},
{"matrix": [4, 14], "x": 14, "y": 0},
{"matrix": [3, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 1},
{"matrix": [3, 2], "x": 2.5, "y": 1},
{"matrix": [3, 3], "x": 3.5, "y": 1},
{"matrix": [3, 4], "x": 4.5, "y": 1},
{"matrix": [3, 5], "x": 5.5, "y": 1},
{"matrix": [3, 6], "x": 6.5, "y": 1},
{"matrix": [3, 7], "x": 7.5, "y": 1},
{"matrix": [3, 8], "x": 8.5, "y": 1},
{"matrix": [3, 9], "x": 9.5, "y": 1},
{"matrix": [3, 10], "x": 10.5, "y": 1},
{"matrix": [3, 11], "x": 11.5, "y": 1},
{"matrix": [3, 12], "x": 12.5, "y": 1},
{"matrix": [3, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [1, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [1, 2], "x": 2.25, "y": 3},
{"matrix": [1, 3], "x": 3.25, "y": 3},
{"matrix": [1, 4], "x": 4.25, "y": 3},
{"matrix": [1, 5], "x": 5.25, "y": 3},
{"matrix": [1, 6], "x": 6.25, "y": 3},
{"matrix": [1, 7], "x": 7.25, "y": 3},
{"matrix": [1, 8], "x": 8.25, "y": 3},
{"matrix": [1, 9], "x": 9.25, "y": 3},
{"matrix": [1, 10], "x": 10.25, "y": 3},
{"matrix": [1, 11], "x": 11.25, "y": 3},
{"matrix": [1, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [1, 13], "x": 14, "y": 3},
{"matrix": [0, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [0, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [0, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [0, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [0, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_hhkb": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
@@ -258,6 +599,424 @@
{"matrix": [0, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [0, 12], "x": 12.5, "y": 4}
]
},
"LAYOUT_60_iso": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
{"matrix": [4, 1], "x": 1, "y": 0},
{"matrix": [4, 2], "x": 2, "y": 0},
{"matrix": [4, 3], "x": 3, "y": 0},
{"matrix": [4, 4], "x": 4, "y": 0},
{"matrix": [4, 5], "x": 5, "y": 0},
{"matrix": [4, 6], "x": 6, "y": 0},
{"matrix": [4, 7], "x": 7, "y": 0},
{"matrix": [4, 8], "x": 8, "y": 0},
{"matrix": [4, 9], "x": 9, "y": 0},
{"matrix": [4, 10], "x": 10, "y": 0},
{"matrix": [4, 11], "x": 11, "y": 0},
{"matrix": [4, 12], "x": 12, "y": 0},
{"matrix": [4, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [3, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 1},
{"matrix": [3, 2], "x": 2.5, "y": 1},
{"matrix": [3, 3], "x": 3.5, "y": 1},
{"matrix": [3, 4], "x": 4.5, "y": 1},
{"matrix": [3, 5], "x": 5.5, "y": 1},
{"matrix": [3, 6], "x": 6.5, "y": 1},
{"matrix": [3, 7], "x": 7.5, "y": 1},
{"matrix": [3, 8], "x": 8.5, "y": 1},
{"matrix": [3, 9], "x": 9.5, "y": 1},
{"matrix": [3, 10], "x": 10.5, "y": 1},
{"matrix": [3, 11], "x": 11.5, "y": 1},
{"matrix": [3, 12], "x": 12.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [1, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [1, 1], "x": 1.25, "y": 3},
{"matrix": [1, 2], "x": 2.25, "y": 3},
{"matrix": [1, 3], "x": 3.25, "y": 3},
{"matrix": [1, 4], "x": 4.25, "y": 3},
{"matrix": [1, 5], "x": 5.25, "y": 3},
{"matrix": [1, 6], "x": 6.25, "y": 3},
{"matrix": [1, 7], "x": 7.25, "y": 3},
{"matrix": [1, 8], "x": 8.25, "y": 3},
{"matrix": [1, 9], "x": 9.25, "y": 3},
{"matrix": [1, 10], "x": 10.25, "y": 3},
{"matrix": [1, 11], "x": 11.25, "y": 3},
{"matrix": [1, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [0, 0], "x": 0, "y": 4, "w": 1.25},
{"matrix": [0, 1], "x": 1.25, "y": 4, "w": 1.25},
{"matrix": [0, 2], "x": 2.5, "y": 4, "w": 1.25},
{"matrix": [0, 6], "x": 3.75, "y": 4, "w": 6.25},
{"matrix": [0, 10], "x": 10, "y": 4, "w": 1.25},
{"matrix": [0, 11], "x": 11.25, "y": 4, "w": 1.25},
{"matrix": [0, 12], "x": 12.5, "y": 4, "w": 1.25},
{"matrix": [0, 13], "x": 13.75, "y": 4, "w": 1.25}
]
},
"LAYOUT_60_iso_split_bs_rshift": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
{"matrix": [4, 1], "x": 1, "y": 0},
{"matrix": [4, 2], "x": 2, "y": 0},
{"matrix": [4, 3], "x": 3, "y": 0},
{"matrix": [4, 4], "x": 4, "y": 0},
{"matrix": [4, 5], "x": 5, "y": 0},
{"matrix": [4, 6], "x": 6, "y": 0},
{"matrix": [4, 7], "x": 7, "y": 0},
{"matrix": [4, 8], "x": 8, "y": 0},
{"matrix": [4, 9], "x": 9, "y": 0},
{"matrix": [4, 10], "x": 10, "y": 0},
{"matrix": [4, 11], "x": 11, "y": 0},
{"matrix": [4, 12], "x": 12, "y": 0},
{"matrix": [4, 13], "x": 13, "y": 0},
{"matrix": [4, 14], "x": 14, "y": 0},
{"matrix": [3, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 1},
{"matrix": [3, 2], "x": 2.5, "y": 1},
{"matrix": [3, 3], "x": 3.5, "y": 1},
{"matrix": [3, 4], "x": 4.5, "y": 1},
{"matrix": [3, 5], "x": 5.5, "y": 1},
{"matrix": [3, 6], "x": 6.5, "y": 1},
{"matrix": [3, 7], "x": 7.5, "y": 1},
{"matrix": [3, 8], "x": 8.5, "y": 1},
{"matrix": [3, 9], "x": 9.5, "y": 1},
{"matrix": [3, 10], "x": 10.5, "y": 1},
{"matrix": [3, 11], "x": 11.5, "y": 1},
{"matrix": [3, 12], "x": 12.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [1, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [1, 1], "x": 1.25, "y": 3},
{"matrix": [1, 2], "x": 2.25, "y": 3},
{"matrix": [1, 3], "x": 3.25, "y": 3},
{"matrix": [1, 4], "x": 4.25, "y": 3},
{"matrix": [1, 5], "x": 5.25, "y": 3},
{"matrix": [1, 6], "x": 6.25, "y": 3},
{"matrix": [1, 7], "x": 7.25, "y": 3},
{"matrix": [1, 8], "x": 8.25, "y": 3},
{"matrix": [1, 9], "x": 9.25, "y": 3},
{"matrix": [1, 10], "x": 10.25, "y": 3},
{"matrix": [1, 11], "x": 11.25, "y": 3},
{"matrix": [1, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [1, 13], "x": 14, "y": 3},
{"matrix": [0, 0], "x": 0, "y": 4, "w": 1.25},
{"matrix": [0, 1], "x": 1.25, "y": 4, "w": 1.25},
{"matrix": [0, 2], "x": 2.5, "y": 4, "w": 1.25},
{"matrix": [0, 6], "x": 3.75, "y": 4, "w": 6.25},
{"matrix": [0, 10], "x": 10, "y": 4, "w": 1.25},
{"matrix": [0, 11], "x": 11.25, "y": 4, "w": 1.25},
{"matrix": [0, 12], "x": 12.5, "y": 4, "w": 1.25},
{"matrix": [0, 13], "x": 13.75, "y": 4, "w": 1.25}
]
},
"LAYOUT_60_iso_tsangan": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
{"matrix": [4, 1], "x": 1, "y": 0},
{"matrix": [4, 2], "x": 2, "y": 0},
{"matrix": [4, 3], "x": 3, "y": 0},
{"matrix": [4, 4], "x": 4, "y": 0},
{"matrix": [4, 5], "x": 5, "y": 0},
{"matrix": [4, 6], "x": 6, "y": 0},
{"matrix": [4, 7], "x": 7, "y": 0},
{"matrix": [4, 8], "x": 8, "y": 0},
{"matrix": [4, 9], "x": 9, "y": 0},
{"matrix": [4, 10], "x": 10, "y": 0},
{"matrix": [4, 11], "x": 11, "y": 0},
{"matrix": [4, 12], "x": 12, "y": 0},
{"matrix": [4, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [3, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 1},
{"matrix": [3, 2], "x": 2.5, "y": 1},
{"matrix": [3, 3], "x": 3.5, "y": 1},
{"matrix": [3, 4], "x": 4.5, "y": 1},
{"matrix": [3, 5], "x": 5.5, "y": 1},
{"matrix": [3, 6], "x": 6.5, "y": 1},
{"matrix": [3, 7], "x": 7.5, "y": 1},
{"matrix": [3, 8], "x": 8.5, "y": 1},
{"matrix": [3, 9], "x": 9.5, "y": 1},
{"matrix": [3, 10], "x": 10.5, "y": 1},
{"matrix": [3, 11], "x": 11.5, "y": 1},
{"matrix": [3, 12], "x": 12.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [1, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [1, 1], "x": 1.25, "y": 3},
{"matrix": [1, 2], "x": 2.25, "y": 3},
{"matrix": [1, 3], "x": 3.25, "y": 3},
{"matrix": [1, 4], "x": 4.25, "y": 3},
{"matrix": [1, 5], "x": 5.25, "y": 3},
{"matrix": [1, 6], "x": 6.25, "y": 3},
{"matrix": [1, 7], "x": 7.25, "y": 3},
{"matrix": [1, 8], "x": 8.25, "y": 3},
{"matrix": [1, 9], "x": 9.25, "y": 3},
{"matrix": [1, 10], "x": 10.25, "y": 3},
{"matrix": [1, 11], "x": 11.25, "y": 3},
{"matrix": [1, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [0, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [0, 1], "x": 1.5, "y": 4},
{"matrix": [0, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [0, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [0, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [0, 12], "x": 12.5, "y": 4},
{"matrix": [0, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_iso_tsangan_split_bs_rshift": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
{"matrix": [4, 1], "x": 1, "y": 0},
{"matrix": [4, 2], "x": 2, "y": 0},
{"matrix": [4, 3], "x": 3, "y": 0},
{"matrix": [4, 4], "x": 4, "y": 0},
{"matrix": [4, 5], "x": 5, "y": 0},
{"matrix": [4, 6], "x": 6, "y": 0},
{"matrix": [4, 7], "x": 7, "y": 0},
{"matrix": [4, 8], "x": 8, "y": 0},
{"matrix": [4, 9], "x": 9, "y": 0},
{"matrix": [4, 10], "x": 10, "y": 0},
{"matrix": [4, 11], "x": 11, "y": 0},
{"matrix": [4, 12], "x": 12, "y": 0},
{"matrix": [4, 13], "x": 13, "y": 0},
{"matrix": [4, 14], "x": 14, "y": 0},
{"matrix": [3, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 1},
{"matrix": [3, 2], "x": 2.5, "y": 1},
{"matrix": [3, 3], "x": 3.5, "y": 1},
{"matrix": [3, 4], "x": 4.5, "y": 1},
{"matrix": [3, 5], "x": 5.5, "y": 1},
{"matrix": [3, 6], "x": 6.5, "y": 1},
{"matrix": [3, 7], "x": 7.5, "y": 1},
{"matrix": [3, 8], "x": 8.5, "y": 1},
{"matrix": [3, 9], "x": 9.5, "y": 1},
{"matrix": [3, 10], "x": 10.5, "y": 1},
{"matrix": [3, 11], "x": 11.5, "y": 1},
{"matrix": [3, 12], "x": 12.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [1, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [1, 1], "x": 1.25, "y": 3},
{"matrix": [1, 2], "x": 2.25, "y": 3},
{"matrix": [1, 3], "x": 3.25, "y": 3},
{"matrix": [1, 4], "x": 4.25, "y": 3},
{"matrix": [1, 5], "x": 5.25, "y": 3},
{"matrix": [1, 6], "x": 6.25, "y": 3},
{"matrix": [1, 7], "x": 7.25, "y": 3},
{"matrix": [1, 8], "x": 8.25, "y": 3},
{"matrix": [1, 9], "x": 9.25, "y": 3},
{"matrix": [1, 10], "x": 10.25, "y": 3},
{"matrix": [1, 11], "x": 11.25, "y": 3},
{"matrix": [1, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [1, 13], "x": 14, "y": 3},
{"matrix": [0, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [0, 1], "x": 1.5, "y": 4},
{"matrix": [0, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [0, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [0, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [0, 12], "x": 12.5, "y": 4},
{"matrix": [0, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_iso_wkl": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
{"matrix": [4, 1], "x": 1, "y": 0},
{"matrix": [4, 2], "x": 2, "y": 0},
{"matrix": [4, 3], "x": 3, "y": 0},
{"matrix": [4, 4], "x": 4, "y": 0},
{"matrix": [4, 5], "x": 5, "y": 0},
{"matrix": [4, 6], "x": 6, "y": 0},
{"matrix": [4, 7], "x": 7, "y": 0},
{"matrix": [4, 8], "x": 8, "y": 0},
{"matrix": [4, 9], "x": 9, "y": 0},
{"matrix": [4, 10], "x": 10, "y": 0},
{"matrix": [4, 11], "x": 11, "y": 0},
{"matrix": [4, 12], "x": 12, "y": 0},
{"matrix": [4, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [3, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 1},
{"matrix": [3, 2], "x": 2.5, "y": 1},
{"matrix": [3, 3], "x": 3.5, "y": 1},
{"matrix": [3, 4], "x": 4.5, "y": 1},
{"matrix": [3, 5], "x": 5.5, "y": 1},
{"matrix": [3, 6], "x": 6.5, "y": 1},
{"matrix": [3, 7], "x": 7.5, "y": 1},
{"matrix": [3, 8], "x": 8.5, "y": 1},
{"matrix": [3, 9], "x": 9.5, "y": 1},
{"matrix": [3, 10], "x": 10.5, "y": 1},
{"matrix": [3, 11], "x": 11.5, "y": 1},
{"matrix": [3, 12], "x": 12.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [1, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [1, 1], "x": 1.25, "y": 3},
{"matrix": [1, 2], "x": 2.25, "y": 3},
{"matrix": [1, 3], "x": 3.25, "y": 3},
{"matrix": [1, 4], "x": 4.25, "y": 3},
{"matrix": [1, 5], "x": 5.25, "y": 3},
{"matrix": [1, 6], "x": 6.25, "y": 3},
{"matrix": [1, 7], "x": 7.25, "y": 3},
{"matrix": [1, 8], "x": 8.25, "y": 3},
{"matrix": [1, 9], "x": 9.25, "y": 3},
{"matrix": [1, 10], "x": 10.25, "y": 3},
{"matrix": [1, 11], "x": 11.25, "y": 3},
{"matrix": [1, 12], "x": 12.25, "y": 3, "w": 2.75},
{"matrix": [0, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [0, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [0, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [0, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [0, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_iso_wkl_split_bs_rshift": {
"layout": [
{"matrix": [4, 0], "x": 0, "y": 0},
{"matrix": [4, 1], "x": 1, "y": 0},
{"matrix": [4, 2], "x": 2, "y": 0},
{"matrix": [4, 3], "x": 3, "y": 0},
{"matrix": [4, 4], "x": 4, "y": 0},
{"matrix": [4, 5], "x": 5, "y": 0},
{"matrix": [4, 6], "x": 6, "y": 0},
{"matrix": [4, 7], "x": 7, "y": 0},
{"matrix": [4, 8], "x": 8, "y": 0},
{"matrix": [4, 9], "x": 9, "y": 0},
{"matrix": [4, 10], "x": 10, "y": 0},
{"matrix": [4, 11], "x": 11, "y": 0},
{"matrix": [4, 12], "x": 12, "y": 0},
{"matrix": [4, 13], "x": 13, "y": 0},
{"matrix": [4, 14], "x": 14, "y": 0},
{"matrix": [3, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 1], "x": 1.5, "y": 1},
{"matrix": [3, 2], "x": 2.5, "y": 1},
{"matrix": [3, 3], "x": 3.5, "y": 1},
{"matrix": [3, 4], "x": 4.5, "y": 1},
{"matrix": [3, 5], "x": 5.5, "y": 1},
{"matrix": [3, 6], "x": 6.5, "y": 1},
{"matrix": [3, 7], "x": 7.5, "y": 1},
{"matrix": [3, 8], "x": 8.5, "y": 1},
{"matrix": [3, 9], "x": 9.5, "y": 1},
{"matrix": [3, 10], "x": 10.5, "y": 1},
{"matrix": [3, 11], "x": 11.5, "y": 1},
{"matrix": [3, 12], "x": 12.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2},
{"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [1, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [1, 1], "x": 1.25, "y": 3},
{"matrix": [1, 2], "x": 2.25, "y": 3},
{"matrix": [1, 3], "x": 3.25, "y": 3},
{"matrix": [1, 4], "x": 4.25, "y": 3},
{"matrix": [1, 5], "x": 5.25, "y": 3},
{"matrix": [1, 6], "x": 6.25, "y": 3},
{"matrix": [1, 7], "x": 7.25, "y": 3},
{"matrix": [1, 8], "x": 8.25, "y": 3},
{"matrix": [1, 9], "x": 9.25, "y": 3},
{"matrix": [1, 10], "x": 10.25, "y": 3},
{"matrix": [1, 11], "x": 11.25, "y": 3},
{"matrix": [1, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [1, 13], "x": 14, "y": 3},
{"matrix": [0, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [0, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [0, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [0, 11], "x": 11, "y": 4, "w": 1.5},
{"matrix": [0, 13], "x": 13.5, "y": 4, "w": 1.5}
]
}
}
}

View File

@@ -0,0 +1,27 @@
# Matrix Diagram for LSJ Ares
```
┌───────┐
2u Backspace │4E │
└───────┘
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│40 │41 │42 │43 │44 │45 │46 │47 │48 │49 │4A │4B │4C │4D │4E │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ┌─────┐
│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3D │ │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ ┌──┴┐2D │ ISO Enter
│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2D │ │2C │ │
├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ └───┴────┘
│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │
├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤
│00 │01 │02 │06 │0A │0B │0C │0D │
└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
┌────────┐ ┌──────────┐
│10 │ 2.25u LShift 2.75u RShift │1C │
└────────┘ └──────────┘
┌─────┬───┬─────┬───────────────────────────┬─────┬───┬─────┐
│00 │01 │02 │06 │0B │0C │0D │ Tsangan/WKL/HHKB
└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘
┌─────┬───┬─────┬───────────────────────┬─────┬───┬───┬─────┐
│00 │01 │02 │06 │0A │0B │0C │0D │ True HHKB
└─────┴───┴─────┴───────────────────────┴─────┴───┴───┴─────┘
```

View File

@@ -0,0 +1,11 @@
// Copyright 2024 Filip Strzałka (@philvec)
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#define SERIAL_USART_FULL_DUPLEX
#define AUDIO_PIN GP4
#define AUDIO_PWM_DRIVER PWMD2
#define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_A
#define AUDIO_INIT_DELAY

View File

@@ -0,0 +1,9 @@
// Copyright 2024 Filip Strzałka (@philvec)
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include_next <halconf.h>
#undef HAL_USE_PWM
#define HAL_USE_PWM TRUE

View File

@@ -0,0 +1,320 @@
{
"manufacturer": "Arrow Mechanics",
"keyboard_name": "WINGS Mark 1",
"maintainer": "arrowmechanics",
"bootloader": "rp2040",
"diode_direction": "ROW2COL",
"encoder": {
"rotary": [
{"pin_a": "GP6", "pin_b": "GP7", "resolution": 2}
]
},
"features": {
"audio": true,
"bootmagic": true,
"encoder": true,
"extrakey": true,
"mousekey": true,
"rgb_matrix": true
},
"matrix_pins": {
"cols": ["GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP14", "GP15", "GP16"],
"rows": ["GP22", "GP21", "GP20", "GP19", "GP18", "GP17"]
},
"processor": "RP2040",
"rgb_matrix": {
"animations": {
"alphas_mods": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_sat": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"band_val": true,
"breathing": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"cycle_up_down": true,
"digital_rain": true,
"dual_beacon": true,
"gradient_left_right": true,
"gradient_up_down": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"jellybean_raindrops": true,
"multisplash": true,
"pixel_flow": true,
"pixel_fractal": true,
"pixel_rain": true,
"rainbow_beacon": true,
"rainbow_moving_chevron": true,
"rainbow_pinwheels": true,
"raindrops": true,
"solid_multisplash": true,
"solid_reactive": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_multinexus": true,
"solid_reactive_multiwide": true,
"solid_reactive_nexus": true,
"solid_reactive_simple": true,
"solid_reactive_wide": true,
"solid_splash": true,
"splash": true,
"typing_heatmap": true
},
"default": {
"animation": "breathing",
"hue": 192
},
"driver": "ws2812",
"layout": [
{"matrix": [0, 7], "x": 93, "y": 2, "flags": 4},
{"matrix": [0, 6], "x": 80, "y": 1, "flags": 4},
{"matrix": [0, 5], "x": 67, "y": 0, "flags": 4},
{"matrix": [0, 4], "x": 54, "y": 1, "flags": 4},
{"matrix": [0, 3], "x": 42, "y": 3, "flags": 4},
{"matrix": [0, 2], "x": 29, "y": 5, "flags": 4},
{"matrix": [0, 1], "x": 16, "y": 5, "flags": 4},
{"matrix": [0, 0], "x": 3, "y": 5, "flags": 4},
{"matrix": [1, 0], "x": 3, "y": 17, "flags": 4},
{"matrix": [1, 1], "x": 16, "y": 17, "flags": 4},
{"matrix": [1, 2], "x": 29, "y": 17, "flags": 4},
{"matrix": [1, 3], "x": 42, "y": 15, "flags": 4},
{"matrix": [1, 4], "x": 54, "y": 13, "flags": 4},
{"matrix": [1, 5], "x": 67, "y": 12, "flags": 4},
{"matrix": [1, 6], "x": 80, "y": 13, "flags": 4},
{"matrix": [1, 7], "x": 93, "y": 14, "flags": 4},
{"matrix": [2, 8], "x": 106, "y": 25, "flags": 4},
{"matrix": [2, 7], "x": 93, "y": 25, "flags": 4},
{"matrix": [2, 6], "x": 80, "y": 25, "flags": 4},
{"matrix": [2, 5], "x": 67, "y": 24, "flags": 4},
{"matrix": [2, 4], "x": 54, "y": 25, "flags": 4},
{"matrix": [2, 3], "x": 42, "y": 27, "flags": 4},
{"matrix": [2, 2], "x": 26, "y": 29, "flags": 4},
{"matrix": [2, 0], "x": 6, "y": 29, "flags": 4},
{"matrix": [3, 0], "x": 3, "y": 40, "flags": 4},
{"matrix": [3, 2], "x": 22, "y": 40, "flags": 4},
{"matrix": [3, 3], "x": 42, "y": 38, "flags": 4},
{"matrix": [3, 4], "x": 54, "y": 36, "flags": 4},
{"matrix": [3, 5], "x": 67, "y": 35, "flags": 4},
{"matrix": [3, 6], "x": 80, "y": 36, "flags": 4},
{"matrix": [3, 7], "x": 93, "y": 37, "flags": 4},
{"matrix": [3, 8], "x": 106, "y": 37, "flags": 4},
{"matrix": [4, 8], "x": 106, "y": 49, "flags": 4},
{"matrix": [4, 7], "x": 93, "y": 49, "flags": 4},
{"matrix": [4, 6], "x": 80, "y": 48, "flags": 4},
{"matrix": [4, 5], "x": 67, "y": 47, "flags": 4},
{"matrix": [4, 4], "x": 54, "y": 48, "flags": 4},
{"matrix": [4, 3], "x": 42, "y": 50, "flags": 4},
{"matrix": [4, 1], "x": 21, "y": 52, "flags": 4},
{"matrix": [4, 0], "x": 0, "y": 52, "flags": 4},
{"matrix": [5, 0], "x": 0, "y": 64, "flags": 4},
{"matrix": [5, 1], "x": 13, "y": 64, "flags": 4},
{"matrix": [5, 2], "x": 26, "y": 64, "flags": 4},
{"matrix": [5, 3], "x": 43, "y": 62, "flags": 4},
{"matrix": [5, 4], "x": 59, "y": 60, "flags": 4},
{"matrix": [5, 6], "x": 75, "y": 60, "flags": 4},
{"matrix": [5, 7], "x": 98, "y": 61, "flags": 4},
{"matrix": [6, 1], "x": 131, "y": 2, "flags": 4},
{"matrix": [6, 2], "x": 144, "y": 1, "flags": 4},
{"matrix": [6, 3], "x": 157, "y": 0, "flags": 4},
{"matrix": [6, 4], "x": 170, "y": 1, "flags": 4},
{"matrix": [6, 5], "x": 182, "y": 3, "flags": 4},
{"matrix": [6, 6], "x": 195, "y": 5, "flags": 4},
{"matrix": [6, 7], "x": 208, "y": 5, "flags": 4},
{"matrix": [6, 8], "x": 221, "y": 5, "flags": 4},
{"matrix": [7, 8], "x": 214, "y": 17, "flags": 4},
{"matrix": [7, 6], "x": 195, "y": 17, "flags": 4},
{"matrix": [7, 5], "x": 182, "y": 15, "flags": 4},
{"matrix": [7, 4], "x": 170, "y": 13, "flags": 4},
{"matrix": [7, 3], "x": 157, "y": 12, "flags": 4},
{"matrix": [7, 2], "x": 144, "y": 13, "flags": 4},
{"matrix": [7, 1], "x": 131, "y": 14, "flags": 4},
{"matrix": [8, 0], "x": 118, "y": 25, "flags": 4},
{"matrix": [8, 1], "x": 131, "y": 25, "flags": 4},
{"matrix": [8, 2], "x": 144, "y": 25, "flags": 4},
{"matrix": [8, 3], "x": 157, "y": 24, "flags": 4},
{"matrix": [8, 4], "x": 170, "y": 25, "flags": 4},
{"matrix": [8, 5], "x": 182, "y": 27, "flags": 4},
{"matrix": [8, 6], "x": 195, "y": 29, "flags": 4},
{"matrix": [8, 7], "x": 208, "y": 29, "flags": 4},
{"matrix": [8, 8], "x": 221, "y": 29, "flags": 4},
{"matrix": [9, 8], "x": 216, "y": 40, "flags": 4},
{"matrix": [9, 6], "x": 195, "y": 40, "flags": 4},
{"matrix": [9, 5], "x": 182, "y": 38, "flags": 4},
{"matrix": [9, 4], "x": 170, "y": 36, "flags": 4},
{"matrix": [9, 3], "x": 157, "y": 35, "flags": 4},
{"matrix": [9, 2], "x": 144, "y": 36, "flags": 4},
{"matrix": [9, 1], "x": 131, "y": 37, "flags": 4},
{"matrix": [9, 0], "x": 118, "y": 37, "flags": 4},
{"matrix": [10, 0], "x": 118, "y": 49, "flags": 4},
{"matrix": [10, 1], "x": 131, "y": 49, "flags": 4},
{"matrix": [10, 2], "x": 144, "y": 48, "flags": 4},
{"matrix": [10, 3], "x": 157, "y": 47, "flags": 4},
{"matrix": [10, 4], "x": 170, "y": 48, "flags": 4},
{"matrix": [10, 5], "x": 182, "y": 50, "flags": 4},
{"matrix": [10, 6], "x": 197, "y": 52, "flags": 4},
{"matrix": [10, 7], "x": 211, "y": 52, "flags": 4},
{"matrix": [10, 8], "x": 224, "y": 52, "flags": 4},
{"matrix": [11, 8], "x": 224, "y": 64, "flags": 4},
{"matrix": [11, 7], "x": 211, "y": 64, "flags": 4},
{"matrix": [11, 6], "x": 198, "y": 64, "flags": 4},
{"matrix": [11, 5], "x": 181, "y": 62, "flags": 4},
{"matrix": [11, 4], "x": 165, "y": 60, "flags": 4},
{"matrix": [11, 2], "x": 149, "y": 60, "flags": 4},
{"matrix": [11, 1], "x": 126, "y": 61, "flags": 4}
],
"split_count": [47, 48]
},
"split": {
"enabled": true,
"transport": {
"sync": {
"layer_state": true,
"matrix_state": true
}
}
},
"tags": ["columnar", "split", "rgb", "hotswap", "encoder"],
"url": "https://arrowmechanics.com",
"usb": {
"device_version": "1.0.0",
"pid": "0x3134",
"vid": "0xA880"
},
"ws2812": {
"driver": "vendor",
"pin": "GP26"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0.25, "y": 0.43},
{"matrix": [0, 1], "x": 1.25, "y": 0.43},
{"matrix": [0, 2], "x": 2.25, "y": 0.43},
{"matrix": [0, 3], "x": 3.25, "y": 0.25},
{"matrix": [0, 4], "x": 4.25, "y": 0.08},
{"matrix": [0, 5], "x": 5.25, "y": 0},
{"matrix": [0, 6], "x": 6.25, "y": 0.08},
{"matrix": [0, 7], "x": 7.25, "y": 0.15},
{"matrix": [6, 1], "x": 10.45, "y": 0.15},
{"matrix": [6, 2], "x": 11.45, "y": 0.08},
{"matrix": [6, 3], "x": 12.45, "y": 0},
{"matrix": [6, 4], "x": 13.45, "y": 0.08},
{"matrix": [6, 5], "x": 14.45, "y": 0.25},
{"matrix": [6, 6], "x": 15.45, "y": 0.43},
{"matrix": [6, 7], "x": 16.45, "y": 0.43},
{"matrix": [6, 8], "x": 17.45, "y": 0.43},
{"matrix": [1, 0], "x": 0.25, "y": 1.43},
{"matrix": [1, 1], "x": 1.25, "y": 1.43},
{"matrix": [1, 2], "x": 2.25, "y": 1.43},
{"matrix": [1, 3], "x": 3.25, "y": 1.25},
{"matrix": [1, 4], "x": 4.25, "y": 1.08},
{"matrix": [1, 5], "x": 5.25, "y": 1},
{"matrix": [1, 6], "x": 6.25, "y": 1.08},
{"matrix": [1, 7], "x": 7.25, "y": 1.15},
{"matrix": [1, 8], "x": 8.25, "y": 1.15, "encoder": 0},
{"matrix": [7, 0], "x": 9.45, "y": 1.15},
{"matrix": [7, 1], "x": 10.45, "y": 1.15},
{"matrix": [7, 2], "x": 11.45, "y": 1.08},
{"matrix": [7, 3], "x": 12.45, "y": 1},
{"matrix": [7, 4], "x": 13.45, "y": 1.08},
{"matrix": [7, 5], "x": 14.45, "y": 1.25},
{"matrix": [7, 6], "x": 15.45, "y": 1.43},
{"matrix": [7, 8], "x": 16.45, "y": 1.43, "w": 2},
{"matrix": [2, 0], "x": 0.25, "y": 2.43, "w": 1.5},
{"matrix": [2, 2], "x": 1.75, "y": 2.43, "w": 1.5},
{"matrix": [2, 3], "x": 3.25, "y": 2.25},
{"matrix": [2, 4], "x": 4.25, "y": 2.08},
{"matrix": [2, 5], "x": 5.25, "y": 2},
{"matrix": [2, 6], "x": 6.25, "y": 2.08},
{"matrix": [2, 7], "x": 7.25, "y": 2.15},
{"matrix": [2, 8], "x": 8.25, "y": 2.15},
{"matrix": [8, 0], "x": 9.45, "y": 2.15},
{"matrix": [8, 1], "x": 10.45, "y": 2.15},
{"matrix": [8, 2], "x": 11.45, "y": 2.08},
{"matrix": [8, 3], "x": 12.45, "y": 2},
{"matrix": [8, 4], "x": 13.45, "y": 2.08},
{"matrix": [8, 5], "x": 14.45, "y": 2.25},
{"matrix": [8, 6], "x": 15.45, "y": 2.43},
{"matrix": [8, 7], "x": 16.45, "y": 2.43},
{"matrix": [8, 8], "x": 17.45, "y": 2.43},
{"matrix": [3, 0], "x": 0, "y": 3.43, "w": 1.5},
{"matrix": [3, 2], "x": 1.5, "y": 3.43, "w": 1.75},
{"matrix": [3, 3], "x": 3.25, "y": 3.25},
{"matrix": [3, 4], "x": 4.25, "y": 3.08},
{"matrix": [3, 5], "x": 5.25, "y": 3},
{"matrix": [3, 6], "x": 6.25, "y": 3.08},
{"matrix": [3, 7], "x": 7.25, "y": 3.15},
{"matrix": [3, 8], "x": 8.25, "y": 3.15},
{"matrix": [9, 0], "x": 9.45, "y": 3.15},
{"matrix": [9, 1], "x": 10.45, "y": 3.15},
{"matrix": [9, 2], "x": 11.45, "y": 3.08},
{"matrix": [9, 3], "x": 12.45, "y": 3},
{"matrix": [9, 4], "x": 13.45, "y": 3.08},
{"matrix": [9, 5], "x": 14.45, "y": 3.25},
{"matrix": [9, 6], "x": 15.45, "y": 3.43},
{"matrix": [9, 8], "x": 16.45, "y": 3.43, "w": 2.25},
{"matrix": [4, 0], "x": 0, "y": 4.43},
{"matrix": [4, 1], "x": 1, "y": 4.43, "w": 2.25},
{"matrix": [4, 3], "x": 3.25, "y": 4.25},
{"matrix": [4, 4], "x": 4.25, "y": 4.08},
{"matrix": [4, 5], "x": 5.25, "y": 4},
{"matrix": [4, 6], "x": 6.25, "y": 4.08},
{"matrix": [4, 7], "x": 7.25, "y": 4.15},
{"matrix": [4, 8], "x": 8.25, "y": 4.15},
{"matrix": [10, 0], "x": 9.45, "y": 4.15},
{"matrix": [10, 1], "x": 10.45, "y": 4.15},
{"matrix": [10, 2], "x": 11.45, "y": 4.08},
{"matrix": [10, 3], "x": 12.45, "y": 4},
{"matrix": [10, 4], "x": 13.45, "y": 4.08},
{"matrix": [10, 5], "x": 14.45, "y": 4.25},
{"matrix": [10, 6], "x": 15.45, "y": 4.43, "w": 1.25},
{"matrix": [10, 7], "x": 16.7, "y": 4.43},
{"matrix": [10, 8], "x": 17.7, "y": 4.43},
{"matrix": [5, 0], "x": 0, "y": 5.43},
{"matrix": [5, 1], "x": 1, "y": 5.43},
{"matrix": [5, 2], "x": 2, "y": 5.43},
{"matrix": [5, 3], "x": 3.25, "y": 5.25, "w": 1.25},
{"matrix": [5, 4], "x": 4.5, "y": 5.08, "w": 1.25},
{"matrix": [5, 6], "x": 5.75, "y": 5.08, "w": 1.25},
{"matrix": [5, 7], "x": 7, "y": 5.15, "w": 2.25},
{"matrix": [11, 1], "x": 9.45, "y": 5.15, "w": 2.25},
{"matrix": [11, 2], "x": 11.7, "y": 5.08, "w": 1.25},
{"matrix": [11, 4], "x": 12.95, "y": 5.08, "w": 1.25},
{"matrix": [11, 5], "x": 14.2, "y": 5.25, "w": 1.25},
{"matrix": [11, 6], "x": 15.7, "y": 5.43},
{"matrix": [11, 7], "x": 16.7, "y": 5.43},
{"matrix": [11, 8], "x": 17.7, "y": 5.43}
]
}
}
}

View File

@@ -0,0 +1,25 @@
// Copyright 2024 Filip Strzałka (@philvec)
// SPDX-License-Identifier: GPL-3.0-or-later
#include QMK_KEYBOARD_H
enum layers {
BASE,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = LAYOUT(
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_EQL, KC_PSCR, KC_DEL,
KC_VOLD, KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, RGB_MOD, KC_BTN1, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_BSPC,
KC_MPLY, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, C(KC_C), C(KC_V), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_MNXT, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, C(KC_Z), C(KC_Y), KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_MPRV, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_HOME,
KC_LCTL, KC_NO, KC_NO, KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, KC_SPC, KC_RALT, KC_RCMD, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[BASE] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD), ENCODER_CCW_CW(KC_WH_U, KC_WH_D) },
};
#endif

View File

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

View File

@@ -0,0 +1,9 @@
// Copyright 2024 Filip Strzałka (@philvec)
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include_next <mcuconf.h>
#undef RP_PWM_USE_PWM2
#define RP_PWM_USE_PWM2 TRUE

View File

@@ -0,0 +1,29 @@
# Arrow Mechanics WINGS Mark 1
![Arrow Mechanics WINGS Mark 1](https://i.imgur.com/oQkDmSu.png)
ErgoDox-inspired SPLIT keyboard by [Arrow Mechanics](https://www.arrowmechanics.com/)
* 94 GATERON Low Profile 2.0 hotswap sockets
* RGB diode under each key for WS2812-driven lighting with [RGB Matrix](https://docs.qmk.fm/#/feature_rgb_matrix)
* 2 rotary encoders, one per half, with push-switches
* Buzzers for sound effects and/or [Music Mode](https://docs.qmk.fm/#/feature_audio?id=music-mode)
* Handy magnetic connectors for joining the halves together or splitting with the use of dedicated cable
* Anti-slip pads with magnetic expanding-legs for conveniently adjusting height/lean
* RP2040 Chip + 16MB Flash memory - Dual-core Cortex M0+
---
* Keyboard Maintainer: [arrowmechanics](https://github.com/arrowmechanics/)
* Hardware Supported: [Arrow Mechanics WINGS Keyboard set](https://www.arrowmechanics.com/produkty?view=product&id=8)
* Hardware Availability: [Official Arrow Mechanics E-SHOP](https://www.arrowmechanics.com/produkty?view=product&id=8)
Flashing example for this keyboard:
qmk flash -kb arrowmechanics/wings -km 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).
## Bootloader
Enter the bootloader in 2 ways:
* **Bootmagic reset**: Hold down the top-left corner key on power-up.
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@@ -0,0 +1,2 @@
SERIAL_DRIVER = vendor
AUDIO_DRIVER = pwm_hardware

View File

@@ -39,15 +39,14 @@
/* SPI config for pmw3360 sensor. */
#define SPI_DRIVER SPID1
#define SPI_SCK_PIN B1
#define SPI_SCK_PIN A5
#define SPI_SCK_PAL_MODE 5
#define SPI_MOSI_PIN B2
#define SPI_MOSI_PIN A7
#define SPI_MOSI_PAL_MODE 5
#define SPI_MISO_PIN B3
#define SPI_MISO_PIN A6
#define SPI_MISO_PAL_MODE 5
/* PMW3360 settings. */
#define A1 PAL_LINE(GPIOA, 1)
#define POINTING_DEVICE_CS_PIN A1
#define PMW3360_CS_MODE 3
#define PMW3360_CS_DIVISOR 64

View File

@@ -7,20 +7,19 @@
"driver": "ws2812"
},
"ws2812": {
"pin": "D3",
"pin": "A2",
"driver": "pwm"
},
"build": {
"debounce_type": "asym_eager_defer_pk"
},
"matrix_pins": {
"cols": ["F5", "B6", "D7", "E6", "B4"],
"rows": ["F7", "C6", "D4", "B5"]
"cols": ["B2", "A4", "B4", "B5", "B8"],
"rows": ["B0", "B3", "A15", "B9"]
},
"diode_direction": "ROW2COL",
"split": {
"soft_serial_pin": "D2"
"soft_serial_pin": "A3"
},
"processor": "STM32F411",
"bootloader": "stm32-dfu"
"development_board": "stemcell"
}

View File

@@ -1,5 +1,3 @@
CONVERT_TO = stemcell
# Build Options
# change yes to no to disable
#

View File

@@ -39,15 +39,14 @@
/* SPI config for pmw3360 sensor. */
#define SPI_DRIVER SPID1
#define SPI_SCK_PIN B1
#define SPI_SCK_PIN A5
#define SPI_SCK_PAL_MODE 5
#define SPI_MOSI_PIN B2
#define SPI_MOSI_PIN A7
#define SPI_MOSI_PAL_MODE 5
#define SPI_MISO_PIN B3
#define SPI_MISO_PIN A6
#define SPI_MISO_PAL_MODE 5
/* PMW3360 settings. */
#define A1 PAL_LINE(GPIOA, 1)
#define POINTING_DEVICE_CS_PIN A1
#define PMW3360_CS_MODE 3
#define PMW3360_CS_DIVISOR 64

View File

@@ -7,20 +7,19 @@
"driver": "ws2812"
},
"ws2812": {
"pin": "D3",
"pin": "A2",
"driver": "pwm"
},
"build": {
"debounce_type": "asym_eager_defer_pk"
},
"matrix_pins": {
"cols": ["F6", "F5", "B6", "D7", "E6", "B4"],
"rows": ["F7", "C6", "D4", "B5"]
"cols": ["B1", "B2", "A4", "B4", "B5", "B8"],
"rows": ["B0", "B3", "A15", "B9"]
},
"diode_direction": "ROW2COL",
"split": {
"soft_serial_pin": "D2"
"soft_serial_pin": "A3"
},
"processor": "STM32F411",
"bootloader": "stm32-dfu"
"development_board": "stemcell"
}

View File

@@ -1,5 +1,3 @@
CONVERT_TO = stemcell
# Build Options
# change yes to no to disable
#

View File

@@ -39,15 +39,14 @@
/* SPI config for pmw3360 sensor. */
#define SPI_DRIVER SPID1
#define SPI_SCK_PIN B1
#define SPI_SCK_PIN A5
#define SPI_SCK_PAL_MODE 5
#define SPI_MOSI_PIN B2
#define SPI_MOSI_PIN A7
#define SPI_MOSI_PAL_MODE 5
#define SPI_MISO_PIN B3
#define SPI_MISO_PIN A6
#define SPI_MISO_PAL_MODE 5
/* PMW3360 settings. */
#define A1 PAL_LINE(GPIOA, 1)
#define POINTING_DEVICE_CS_PIN A1
#define PMW3360_CS_MODE 3
#define PMW3360_CS_DIVISOR 64

View File

@@ -7,20 +7,19 @@
"driver": "ws2812"
},
"ws2812": {
"pin": "D3",
"pin": "A2",
"driver": "pwm"
},
"build": {
"debounce_type": "asym_eager_defer_pk"
},
"matrix_pins": {
"cols": ["F6", "F5", "B6", "D7", "E6", "B4"],
"rows": ["F4", "F7", "C6", "D4", "B5"]
"cols": ["B1", "B2", "A4", "B4", "B5", "B8"],
"rows": ["B10", "B0", "B3", "A15", "B9"]
},
"diode_direction": "ROW2COL",
"split": {
"soft_serial_pin": "D2"
"soft_serial_pin": "A3"
},
"processor": "STM32F411",
"bootloader": "stm32-dfu"
"development_board": "stemcell"
}

View File

@@ -1,5 +1,3 @@
CONVERT_TO = stemcell
# Build Options
# change yes to no to disable
#

View File

@@ -7,20 +7,19 @@
"driver": "ws2812"
},
"ws2812": {
"pin": "D3",
"pin": "A2",
"driver": "pwm"
},
"build": {
"debounce_type": "asym_eager_defer_pk"
},
"matrix_pins": {
"cols": ["F6", "F5", "B6", "D7", "E6", "B4"],
"rows": ["F4", "F7", "C6", "D4", "B5"]
"cols": ["B1", "B2", "A4", "B4", "B5", "B8"],
"rows": ["B10", "B0", "B3", "A15", "B9"]
},
"diode_direction": "ROW2COL",
"split": {
"soft_serial_pin": "D2"
"soft_serial_pin": "A3"
},
"processor": "STM32F411",
"bootloader": "stm32-dfu"
"development_board": "stemcell"
}

View File

@@ -1,5 +1,3 @@
CONVERT_TO = stemcell
# Build Options
# change yes to no to disable
#

View File

@@ -7,20 +7,19 @@
"driver": "ws2812"
},
"ws2812": {
"pin": "D3",
"pin": "A2",
"driver": "pwm"
},
"build": {
"debounce_type": "asym_eager_defer_pk"
},
"matrix_pins": {
"cols": ["F5", "B6", "D7", "E6", "B4"],
"rows": ["F7", "C6", "D4", "B5"]
"cols": ["B2", "A4", "B4", "B5", "B8"],
"rows": ["B0", "B3", "A15", "B9"]
},
"diode_direction": "ROW2COL",
"split": {
"soft_serial_pin": "D2"
"soft_serial_pin": "A3"
},
"processor": "STM32F411",
"bootloader": "stm32-dfu"
"development_board": "stemcell"
}

View File

@@ -1,5 +1,3 @@
CONVERT_TO = stemcell
# Build Options
# change yes to no to disable
#

View File

@@ -7,20 +7,19 @@
"driver": "ws2812"
},
"ws2812": {
"pin": "D3",
"pin": "A2",
"driver": "pwm"
},
"build": {
"debounce_type": "asym_eager_defer_pk"
},
"matrix_pins": {
"cols": ["F6", "F5", "B6", "D7", "E6", "B4"],
"rows": ["F7", "C6", "D4", "B5"]
"cols": ["B1", "B2", "A4", "B4", "B5", "B8"],
"rows": ["B0", "B3", "A15", "B9"]
},
"diode_direction": "ROW2COL",
"split": {
"soft_serial_pin": "D2"
"soft_serial_pin": "A3"
},
"processor": "STM32F411",
"bootloader": "stm32-dfu"
"development_board": "stemcell"
}

View File

@@ -1,5 +1,3 @@
CONVERT_TO = stemcell
# Build Options
# change yes to no to disable
#

View File

@@ -0,0 +1,118 @@
{
"manufacturer": "Cipulot",
"keyboard_name": "60XT",
"maintainer": "Cipulot",
"bootloader": "stm32-dfu",
"build": {
"lto": true
},
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"indicators": {
"caps_lock": "A1"
},
"matrix_pins": {
"cols": ["A5", "A2", "A0", "F1", "F0", "C15", "C14", "C13", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15"],
"rows": ["B1", "B2", "A6", "A7", "B0"]
},
"processor": "STM32F072",
"usb": {
"device_version": "0.0.1",
"pid": "0x6BC2",
"shared_endpoint": {
"keyboard": true
},
"vid": "0x6369"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1.25, "y": 0},
{"matrix": [0, 2], "x": 2.25, "y": 0},
{"matrix": [0, 3], "x": 3.25, "y": 0},
{"matrix": [0, 4], "x": 4.25, "y": 0},
{"matrix": [0, 5], "x": 5.25, "y": 0},
{"matrix": [0, 6], "x": 6.25, "y": 0},
{"matrix": [0, 7], "x": 7.25, "y": 0},
{"matrix": [0, 8], "x": 8.25, "y": 0},
{"matrix": [0, 9], "x": 9.25, "y": 0},
{"matrix": [0, 10], "x": 10.25, "y": 0},
{"matrix": [0, 11], "x": 11.25, "y": 0},
{"matrix": [0, 12], "x": 12.25, "y": 0},
{"matrix": [0, 13], "x": 13.25, "y": 0},
{"matrix": [0, 14], "x": 14.25, "y": 0},
{"matrix": [0, 15], "x": 15.25, "y": 0},
{"matrix": [1, 15], "x": 16.5, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1.25, "y": 1, "w": 1.5},
{"matrix": [1, 2], "x": 2.75, "y": 1},
{"matrix": [1, 3], "x": 3.75, "y": 1},
{"matrix": [1, 4], "x": 4.75, "y": 1},
{"matrix": [1, 5], "x": 5.75, "y": 1},
{"matrix": [1, 6], "x": 6.75, "y": 1},
{"matrix": [1, 7], "x": 7.75, "y": 1},
{"matrix": [1, 8], "x": 8.75, "y": 1},
{"matrix": [1, 9], "x": 9.75, "y": 1},
{"matrix": [1, 10], "x": 10.75, "y": 1},
{"matrix": [1, 11], "x": 11.75, "y": 1},
{"matrix": [1, 12], "x": 12.75, "y": 1},
{"matrix": [1, 13], "x": 13.75, "y": 1},
{"matrix": [1, 14], "x": 14.75, "y": 1, "w": 1.5},
{"matrix": [2, 15], "x": 16.5, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1.25, "y": 2, "w": 1.75},
{"matrix": [2, 2], "x": 3, "y": 2},
{"matrix": [2, 3], "x": 4, "y": 2},
{"matrix": [2, 4], "x": 5, "y": 2},
{"matrix": [2, 5], "x": 6, "y": 2},
{"matrix": [2, 6], "x": 7, "y": 2},
{"matrix": [2, 7], "x": 8, "y": 2},
{"matrix": [2, 8], "x": 9, "y": 2},
{"matrix": [2, 9], "x": 10, "y": 2},
{"matrix": [2, 10], "x": 11, "y": 2},
{"matrix": [2, 11], "x": 12, "y": 2},
{"matrix": [2, 12], "x": 13, "y": 2},
{"matrix": [2, 13], "x": 14, "y": 2},
{"matrix": [2, 14], "x": 15, "y": 2, "w": 1.25},
{"matrix": [3, 15], "x": 16.5, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3},
{"matrix": [3, 1], "x": 1.25, "y": 3, "w": 1.25},
{"matrix": [3, 2], "x": 2.5, "y": 3},
{"matrix": [3, 3], "x": 3.5, "y": 3},
{"matrix": [3, 4], "x": 4.5, "y": 3},
{"matrix": [3, 5], "x": 5.5, "y": 3},
{"matrix": [3, 6], "x": 6.5, "y": 3},
{"matrix": [3, 7], "x": 7.5, "y": 3},
{"matrix": [3, 8], "x": 8.5, "y": 3},
{"matrix": [3, 9], "x": 9.5, "y": 3},
{"matrix": [3, 10], "x": 10.5, "y": 3},
{"matrix": [3, 11], "x": 11.5, "y": 3},
{"matrix": [3, 12], "x": 12.5, "y": 3},
{"matrix": [3, 13], "x": 13.5, "y": 3, "w": 1.75},
{"matrix": [3, 14], "x": 15.25, "y": 3},
{"matrix": [4, 14], "x": 16.5, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4},
{"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 2.75, "y": 4},
{"matrix": [4, 3], "x": 3.75, "y": 4, "w": 1.5},
{"matrix": [4, 8], "x": 5.25, "y": 4, "w": 7},
{"matrix": [4, 11], "x": 12.25, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 13.75, "y": 4},
{"matrix": [4, 13], "x": 14.75, "y": 4, "w": 1.5},
{"matrix": [4, 15], "x": 16.5, "y": 4}
]
}
}
}

View File

@@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT(
KC_F1, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_F6,
KC_F2, 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_F7,
KC_F3, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_F8,
KC_F4, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), KC_F9,
KC_F5, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_F10
),
[1] = LAYOUT(
_______, 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_DEL, _______,
_______, _______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______, _______,
_______, _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, MO(2), _______
),
[2] = LAYOUT(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______
)
// clang-format on
};

View File

@@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT(
KC_F1, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_F6,
KC_F2, 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_F7,
KC_F3, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_F8,
KC_F4, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), KC_F9,
KC_F5, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_F10
),
[1] = LAYOUT(
_______, 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_DEL, _______,
_______, _______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______, _______,
_______, _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, MO(2), _______
),
[2] = LAYOUT(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______
)
// clang-format on
};

View File

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

View File

@@ -0,0 +1,27 @@
# 60XT
![60XT](https://i.imgur.com/7lAvjpmh.png)
A 60% XT solder and hot swap PCB.
* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
* Hardware Supported: 60XT
* Hardware Availability: [Eloquent Clicks](https://eloquentclicks.com/)
Make example for this keyboard (after setting up your build environment):
make cipulot/60xt:default
Flashing example for this keyboard:
make cipulot/60xt:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 3 ways:
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is configured.
* **Physical reset button**: Long press the reset button soldered on the PCB.
* **Bootmagic reset**: Hold down the top left key and plug in the controller.

View File

View File

@@ -20,6 +20,7 @@
#include <stdbool.h>
#include "matrix.h"
#include "eeconfig.h"
#include "util.h"
typedef struct PACKED {
uint8_t actuation_mode; // 0: normal board-wide APC, 1: Rapid trigger from specific board-wide actuation point, 2: Rapid trigger from resting point

View File

@@ -60,7 +60,7 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 58
#define EECONFIG_KB_DATA_SIZE 57
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

View File

@@ -63,7 +63,7 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 160
#define EECONFIG_KB_DATA_SIZE 159
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

View File

@@ -62,7 +62,7 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 170
#define EECONFIG_KB_DATA_SIZE 169
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

View File

@@ -62,7 +62,7 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 170
#define EECONFIG_KB_DATA_SIZE 169
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

View File

@@ -63,7 +63,7 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 160
#define EECONFIG_KB_DATA_SIZE 159
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

View File

@@ -63,7 +63,7 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 160
#define EECONFIG_KB_DATA_SIZE 159
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

View File

@@ -63,7 +63,7 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 150
#define EECONFIG_KB_DATA_SIZE 149
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

View File

@@ -62,7 +62,7 @@
// #define DEBUG_MATRIX_SCAN_RATE
#define DYNAMIC_KEYMAP_LAYER_COUNT 3
#define EECONFIG_KB_DATA_SIZE 202
#define EECONFIG_KB_DATA_SIZE 201
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

View File

@@ -0,0 +1,81 @@
/* Copyright 2023 Cipulot
*
* 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 3 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/>.
*/
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
#define MATRIX_ROW_PINS \
{ B14, B13, B12, A6, A7 }
#define AMUX_COUNT 2
#define AMUX_MAX_COLS_COUNT 8
#define AMUX_EN_PINS \
{ B9, B8 }
#define AMUX_SEL_PINS \
{ B7, B6, B5 }
#define AMUX_COL_CHANNELS_SIZES \
{ 7, 8 }
#define AMUX_0_COL_CHANNELS \
{ 3, 0, 1, 2, 4, 6, 7 }
#define AMUX_1_COL_CHANNELS \
{ 3, 0, 1, 2, 4, 6, 7, 5 }
#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS
#define DISCHARGE_PIN A1
#define ANALOG_PORT A2
#define DEFAULT_ACTUATION_MODE 0
#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
#define DEFAULT_MODE_0_RELEASE_LEVEL 500
#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
#define DEFAULT_MODE_1_RELEASE_OFFSET 70
#define DEFAULT_EXTREMUM 1023
#define EXPECTED_NOISE_FLOOR 0
#define NOISE_FLOOR_THRESHOLD 50
#define BOTTOMING_CALIBRATION_THRESHOLD 100
#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
#define DEFAULT_BOTTOMING_READING 1023
#define DEFAULT_CALIBRATION_STARTER true
#define DISCHARGE_TIME 10
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 171
// RGB & Indicators
// PWM driver with direct memory access (DMA) support
#define WS2812_PWM_COMPLEMENTARY_OUTPUT
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
#define WS2812_DMA_CHANNEL 6
#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM1_UP
#define RGBLIGHT_DEFAULT_VAL 200
#define RGBLIGHT_DEFAULT_MODE (RGBLIGHT_MODE_RAINBOW_SWIRL + 5)
#define NUM_INDICATOR_INDEX 2
#define CAPS_INDICATOR_INDEX 1
#define SCROLL_INDICATOR_INDEX 0

View File

@@ -0,0 +1,318 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 "ec_switch_matrix.h"
#include "analog.h"
#include "atomic_util.h"
#include "math.h"
#include "print.h"
#include "wait.h"
#if defined(__AVR__)
# error "AVR platforms not supported due to a variety of reasons. Among them there are limited memory, limited number of pins and ADC not being able to give satisfactory results."
#endif
#define OPEN_DRAIN_SUPPORT defined(PAL_MODE_OUTPUT_OPENDRAIN)
eeprom_ec_config_t eeprom_ec_config;
ec_config_t ec_config;
// Pin and port array
const pin_t row_pins[] = MATRIX_ROW_PINS;
const pin_t amux_sel_pins[] = AMUX_SEL_PINS;
const pin_t amux_en_pins[] = AMUX_EN_PINS;
const pin_t amux_n_col_sizes[] = AMUX_COL_CHANNELS_SIZES;
const pin_t amux_n_col_channels[][AMUX_MAX_COLS_COUNT] = {AMUX_COL_CHANNELS};
#define AMUX_SEL_PINS_COUNT ARRAY_SIZE(amux_sel_pins)
#define EXPECTED_AMUX_SEL_PINS_COUNT ceil(log2(AMUX_MAX_COLS_COUNT)
// Checks for the correctness of the configuration
_Static_assert(ARRAY_SIZE(amux_en_pins) == AMUX_COUNT, "AMUX_EN_PINS doesn't have the minimum number of bits required to enable all the multiplexers available");
// Check that number of select pins is enough to select all the channels
_Static_assert(AMUX_SEL_PINS_COUNT == EXPECTED_AMUX_SEL_PINS_COUNT), "AMUX_SEL_PINS doesn't have the minimum number of bits required address all the channels");
// Check that number of elements in AMUX_COL_CHANNELS_SIZES is enough to specify the number of channels for all the multiplexers available
_Static_assert(ARRAY_SIZE(amux_n_col_sizes) == AMUX_COUNT, "AMUX_COL_CHANNELS_SIZES doesn't have the minimum number of elements required to specify the number of channels for all the multiplexers available");
// static ec_config_t config;
static uint16_t sw_value[MATRIX_ROWS][MATRIX_COLS];
static adc_mux adcMux;
// Initialize the row pins
void init_row(void) {
// Set all row pins as output and low
for (uint8_t idx = 0; idx < MATRIX_ROWS; idx++) {
gpio_set_pin_output(row_pins[idx]);
gpio_write_pin_low(row_pins[idx]);
}
}
// Initialize the multiplexers
void init_amux(void) {
for (uint8_t idx = 0; idx < AMUX_COUNT; idx++) {
gpio_set_pin_output(amux_en_pins[idx]);
gpio_write_pin_low(amux_en_pins[idx]);
}
for (uint8_t idx = 0; idx < AMUX_SEL_PINS_COUNT; idx++) {
gpio_set_pin_output(amux_sel_pins[idx]);
}
}
// Select the multiplexer channel of the specified multiplexer
void select_amux_channel(uint8_t channel, uint8_t col) {
// Get the channel for the specified multiplexer
uint8_t ch = amux_n_col_channels[channel][col];
// momentarily disable specified multiplexer
gpio_write_pin_high(amux_en_pins[channel]);
// Select the multiplexer channel
for (uint8_t i = 0; i < AMUX_SEL_PINS_COUNT; i++) {
gpio_write_pin(amux_sel_pins[i], ch & (1 << i));
}
// re enable specified multiplexer
gpio_write_pin_low(amux_en_pins[channel]);
}
// Disable all the unused multiplexers
void disable_unused_amux(uint8_t channel) {
// disable all the other multiplexers apart from the current selected one
for (uint8_t idx = 0; idx < AMUX_COUNT; idx++) {
if (idx != channel) {
gpio_write_pin_high(amux_en_pins[idx]);
}
}
}
// Discharge the peak hold capacitor
void discharge_capacitor(void) {
#ifdef OPEN_DRAIN_SUPPORT
gpio_write_pin_low(DISCHARGE_PIN);
#else
gpio_write_pin_low(DISCHARGE_PIN);
gpio_set_pin_output(DISCHARGE_PIN);
#endif
}
// Charge the peak hold capacitor
void charge_capacitor(uint8_t row) {
#ifdef OPEN_DRAIN_SUPPORT
gpio_write_pin_high(DISCHARGE_PIN);
#else
gpio_set_pin_input(DISCHARGE_PIN);
#endif
gpio_write_pin_high(row_pins[row]);
}
// Initialize the peripherals pins
int ec_init(void) {
// Initialize ADC
palSetLineMode(ANALOG_PORT, PAL_MODE_INPUT_ANALOG);
adcMux = pinToMux(ANALOG_PORT);
// Dummy call to make sure that adcStart() has been called in the appropriate state
adc_read(adcMux);
// Initialize discharge pin as discharge mode
gpio_write_pin_low(DISCHARGE_PIN);
#ifdef OPEN_DRAIN_SUPPORT
gpio_set_pin_output_open_drain(DISCHARGE_PIN);
#else
gpio_set_pin_output(DISCHARGE_PIN);
#endif
// Initialize drive lines
init_row();
// Initialize AMUXs
init_amux();
return 0;
}
// Get the noise floor
void ec_noise_floor(void) {
// Initialize the noise floor
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.noise_floor[row][col] = 0;
}
}
// Sample the noise floor
for (uint8_t i = 0; i < DEFAULT_NOISE_FLOOR_SAMPLING_COUNT; i++) {
for (uint8_t amux = 0; amux < AMUX_COUNT; amux++) {
disable_unused_amux(amux);
for (uint8_t col = 0; col < amux_n_col_sizes[amux]; col++) {
uint8_t sum = 0;
for (uint8_t i = 0; i < (amux > 0 ? amux : 0); i++)
sum += amux_n_col_sizes[i];
uint8_t adjusted_col = col + sum;
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
ec_config.noise_floor[row][adjusted_col] += ec_readkey_raw(amux, row, col);
}
}
}
wait_ms(5);
}
// Average the noise floor
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.noise_floor[row][col] /= DEFAULT_NOISE_FLOOR_SAMPLING_COUNT;
}
}
}
// Scan key values and update matrix state
bool ec_matrix_scan(matrix_row_t current_matrix[]) {
bool updated = false;
for (uint8_t amux = 0; amux < AMUX_COUNT; amux++) {
disable_unused_amux(amux);
for (uint8_t col = 0; col < amux_n_col_sizes[amux]; col++) {
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
uint8_t sum = 0;
for (uint8_t i = 0; i < (amux > 0 ? amux : 0); i++)
sum += amux_n_col_sizes[i];
uint8_t adjusted_col = col + sum;
sw_value[row][adjusted_col] = ec_readkey_raw(amux, row, col);
if (ec_config.bottoming_calibration) {
if (ec_config.bottoming_calibration_starter[row][adjusted_col]) {
ec_config.bottoming_reading[row][adjusted_col] = sw_value[row][adjusted_col];
ec_config.bottoming_calibration_starter[row][adjusted_col] = false;
} else if (sw_value[row][adjusted_col] > ec_config.bottoming_reading[row][adjusted_col]) {
ec_config.bottoming_reading[row][adjusted_col] = sw_value[row][adjusted_col];
}
} else {
updated |= ec_update_key(&current_matrix[row], row, adjusted_col, sw_value[row][adjusted_col]);
}
}
}
}
return ec_config.bottoming_calibration ? false : updated;
}
// Read the capacitive sensor value
uint16_t ec_readkey_raw(uint8_t channel, uint8_t row, uint8_t col) {
uint16_t sw_value = 0;
// Select the multiplexer
select_amux_channel(channel, col);
// Set the row pin to low state to avoid ghosting
gpio_write_pin_low(row_pins[row]);
ATOMIC_BLOCK_FORCEON {
// Set the row pin to high state and have capacitor charge
charge_capacitor(row);
// Read the ADC value
sw_value = adc_read(adcMux);
}
// Discharge peak hold capacitor
discharge_capacitor();
// Waiting for the ghost capacitor to discharge fully
wait_us(DISCHARGE_TIME);
return sw_value;
}
// Update press/release state of key
bool ec_update_key(matrix_row_t* current_row, uint8_t row, uint8_t col, uint16_t sw_value) {
bool current_state = (*current_row >> col) & 1;
// Real Time Noise Floor Calibration
if (sw_value < (ec_config.noise_floor[row][col] - NOISE_FLOOR_THRESHOLD)) {
uprintf("Noise Floor Change: %d, %d, %d\n", row, col, sw_value);
ec_config.noise_floor[row][col] = sw_value;
ec_config.rescaled_mode_0_actuation_threshold[row][col] = rescale(ec_config.mode_0_actuation_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
ec_config.rescaled_mode_0_release_threshold[row][col] = rescale(ec_config.mode_0_release_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
ec_config.rescaled_mode_1_initial_deadzone_offset[row][col] = rescale(ec_config.mode_1_initial_deadzone_offset, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
}
// Normal board-wide APC
if (ec_config.actuation_mode == 0) {
if (current_state && sw_value < ec_config.rescaled_mode_0_release_threshold[row][col]) {
*current_row &= ~(1 << col);
uprintf("Key released: %d, %d, %d\n", row, col, sw_value);
return true;
}
if ((!current_state) && sw_value > ec_config.rescaled_mode_0_actuation_threshold[row][col]) {
*current_row |= (1 << col);
uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
return true;
}
}
// Rapid Trigger
else if (ec_config.actuation_mode == 1) {
// Is key in active zone?
if (sw_value > ec_config.rescaled_mode_1_initial_deadzone_offset[row][col]) {
// Is key pressed while in active zone?
if (current_state) {
// Is the key still moving down?
if (sw_value > ec_config.extremum[row][col]) {
ec_config.extremum[row][col] = sw_value;
uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
}
// Has key moved up enough to be released?
else if (sw_value < ec_config.extremum[row][col] - ec_config.mode_1_release_offset) {
ec_config.extremum[row][col] = sw_value;
*current_row &= ~(1 << col);
uprintf("Key released: %d, %d, %d\n", row, col, sw_value);
return true;
}
}
// Key is not pressed while in active zone
else {
// Is the key still moving up?
if (sw_value < ec_config.extremum[row][col]) {
ec_config.extremum[row][col] = sw_value;
}
// Has key moved down enough to be pressed?
else if (sw_value > ec_config.extremum[row][col] + ec_config.mode_1_actuation_offset) {
ec_config.extremum[row][col] = sw_value;
*current_row |= (1 << col);
uprintf("Key pressed: %d, %d, %d\n", row, col, sw_value);
return true;
}
}
}
// Key is not in active zone
else {
// Check to avoid key being stuck in pressed state near the active zone threshold
if (sw_value < ec_config.extremum[row][col]) {
ec_config.extremum[row][col] = sw_value;
*current_row &= ~(1 << col);
return true;
}
}
}
return false;
}
// Print the matrix values
void ec_print_matrix(void) {
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", sw_value[row][col]);
}
uprintf("%4d\n", sw_value[row][MATRIX_COLS - 1]);
}
print("\n");
}
// Rescale the value to a different range
uint16_t rescale(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

View File

@@ -0,0 +1,84 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 <stdint.h>
#include <stdbool.h>
#include "matrix.h"
#include "eeconfig.h"
#include "util.h"
typedef struct _indicator_config_t {
uint8_t h;
uint8_t s;
uint8_t v;
bool enabled;
} indicator_config;
typedef struct PACKED {
indicator_config num;
indicator_config caps;
indicator_config scroll;
uint8_t actuation_mode; // 0: normal board-wide APC, 1: Rapid trigger from specific board-wide actuation point, 2: Rapid trigger from resting point
uint16_t mode_0_actuation_threshold; // threshold for key press in mode 0
uint16_t mode_0_release_threshold; // threshold for key release in mode 0
uint16_t mode_1_initial_deadzone_offset; // threshold for key press in mode 1
uint8_t mode_1_actuation_offset; // offset for key press in mode 1 and 2 (1-255)
uint8_t mode_1_release_offset; // offset for key release in mode 1 and 2 (1-255)
uint16_t bottoming_reading[MATRIX_ROWS][MATRIX_COLS]; // bottoming reading
} eeprom_ec_config_t;
typedef struct {
uint8_t actuation_mode; // 0: normal board-wide APC, 1: Rapid trigger from specific board-wide actuation point (it can be very near that baseline noise and be "full travel")
uint16_t mode_0_actuation_threshold; // threshold for key press in mode 0
uint16_t mode_0_release_threshold; // threshold for key release in mode 0
uint16_t mode_1_initial_deadzone_offset; // threshold for key press in mode 1 (initial deadzone)
uint16_t rescaled_mode_0_actuation_threshold[MATRIX_ROWS][MATRIX_COLS]; // threshold for key press in mode 0 rescaled to actual scale
uint16_t rescaled_mode_0_release_threshold[MATRIX_ROWS][MATRIX_COLS]; // threshold for key release in mode 0 rescaled to actual scale
uint16_t rescaled_mode_1_initial_deadzone_offset[MATRIX_ROWS][MATRIX_COLS]; // threshold for key press in mode 1 (initial deadzone) rescaled to actual scale
uint8_t mode_1_actuation_offset; // offset for key press in mode 1 (1-255)
uint8_t mode_1_release_offset; // offset for key release in mode 1 (1-255)
uint16_t extremum[MATRIX_ROWS][MATRIX_COLS]; // extremum values for mode 1
uint16_t noise_floor[MATRIX_ROWS][MATRIX_COLS]; // noise floor detected during startup
bool bottoming_calibration; // calibration mode for bottoming out values (true: calibration mode, false: normal mode)
bool bottoming_calibration_starter[MATRIX_ROWS][MATRIX_COLS]; // calibration mode for bottoming out values (true: calibration mode, false: normal mode)
uint16_t bottoming_reading[MATRIX_ROWS][MATRIX_COLS]; // bottoming reading
} ec_config_t;
// Check if the size of the reserved persistent memory is the same as the size of struct eeprom_ec_config_t
_Static_assert(sizeof(eeprom_ec_config_t) == EECONFIG_KB_DATA_SIZE, "Mismatch in keyboard EECONFIG stored data");
extern eeprom_ec_config_t eeprom_ec_config;
extern ec_config_t ec_config;
void init_row(void);
void init_amux(void);
void select_amux_channel(uint8_t channel, uint8_t col);
void disable_unused_amux(uint8_t channel);
void discharge_capacitor(void);
void charge_capacitor(uint8_t row);
int ec_init(void);
void ec_noise_floor(void);
bool ec_matrix_scan(matrix_row_t current_matrix[]);
uint16_t ec_readkey_raw(uint8_t channel, uint8_t row, uint8_t col);
bool ec_update_key(matrix_row_t* current_row, uint8_t row, uint8_t col, uint16_t sw_value);
void ec_print_matrix(void);
uint16_t rescale(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max);
bool indicators_callback(void);

View File

@@ -0,0 +1,119 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 "ec_switch_matrix.h"
#include "quantum.h"
void eeconfig_init_kb(void) {
// Default values
eeprom_ec_config.num.h = 0;
eeprom_ec_config.num.s = 0;
eeprom_ec_config.num.v = 60;
eeprom_ec_config.num.enabled = true;
eeprom_ec_config.caps.h = 0;
eeprom_ec_config.caps.s = 0;
eeprom_ec_config.caps.v = 60;
eeprom_ec_config.caps.enabled = true;
eeprom_ec_config.scroll.h = 0;
eeprom_ec_config.scroll.s = 0;
eeprom_ec_config.scroll.v = 60;
eeprom_ec_config.scroll.enabled = true;
eeprom_ec_config.actuation_mode = DEFAULT_ACTUATION_MODE;
eeprom_ec_config.mode_0_actuation_threshold = DEFAULT_MODE_0_ACTUATION_LEVEL;
eeprom_ec_config.mode_0_release_threshold = DEFAULT_MODE_0_RELEASE_LEVEL;
eeprom_ec_config.mode_1_initial_deadzone_offset = DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET;
eeprom_ec_config.mode_1_actuation_offset = DEFAULT_MODE_1_ACTUATION_OFFSET;
eeprom_ec_config.mode_1_release_offset = DEFAULT_MODE_1_RELEASE_OFFSET;
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
eeprom_ec_config.bottoming_reading[row][col] = DEFAULT_BOTTOMING_READING;
}
}
// Write default value to EEPROM now
eeconfig_update_kb_datablock(&eeprom_ec_config);
eeconfig_init_user();
}
// On Keyboard startup
void keyboard_post_init_kb(void) {
// Read custom menu variables from memory
eeconfig_read_kb_datablock(&eeprom_ec_config);
// Set runtime values to EEPROM values
ec_config.actuation_mode = eeprom_ec_config.actuation_mode;
ec_config.mode_0_actuation_threshold = eeprom_ec_config.mode_0_actuation_threshold;
ec_config.mode_0_release_threshold = eeprom_ec_config.mode_0_release_threshold;
ec_config.mode_1_initial_deadzone_offset = eeprom_ec_config.mode_1_initial_deadzone_offset;
ec_config.mode_1_actuation_offset = eeprom_ec_config.mode_1_actuation_offset;
ec_config.mode_1_release_offset = eeprom_ec_config.mode_1_release_offset;
ec_config.bottoming_calibration = false;
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.bottoming_calibration_starter[row][col] = true;
ec_config.bottoming_reading[row][col] = eeprom_ec_config.bottoming_reading[row][col];
ec_config.rescaled_mode_0_actuation_threshold[row][col] = rescale(ec_config.mode_0_actuation_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
ec_config.rescaled_mode_0_release_threshold[row][col] = rescale(ec_config.mode_0_release_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
ec_config.rescaled_mode_1_initial_deadzone_offset[row][col] = rescale(ec_config.mode_1_initial_deadzone_offset, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
}
}
// Set the RGB LEDs range that will be used for the effects
rgblight_set_effect_range(3, 66);
// Call the indicator callback to set the indicator color
indicators_callback();
keyboard_post_init_user();
}
// This function gets called when caps, num, scroll change
bool led_update_kb(led_t led_state) {
indicators_callback();
return true;
}
// This function is called when layers change
layer_state_t layer_state_set_user(layer_state_t state) {
indicators_callback();
return state;
}
// INDICATOR CALLBACK ------------------------------------------------------------------------------
/* LED index to physical position
*
* LED2 | LED1 | LED0
* -----+------+--------
* Num | Caps | Scroll |
*/
bool indicators_callback(void) {
if ((eeprom_ec_config.num.enabled) && (host_keyboard_led_state().num_lock))
sethsv(eeprom_ec_config.num.h, eeprom_ec_config.num.s, eeprom_ec_config.num.v, (rgb_led_t *)&led[NUM_INDICATOR_INDEX]);
else
sethsv(0, 0, 0, (rgb_led_t *)&led[NUM_INDICATOR_INDEX]);
if ((eeprom_ec_config.caps.enabled) && (host_keyboard_led_state().caps_lock))
sethsv(eeprom_ec_config.caps.h, eeprom_ec_config.caps.s, eeprom_ec_config.caps.v, (rgb_led_t *)&led[CAPS_INDICATOR_INDEX]);
else
sethsv(0, 0, 0, (rgb_led_t *)&led[CAPS_INDICATOR_INDEX]);
if ((eeprom_ec_config.scroll.enabled) && (host_keyboard_led_state().scroll_lock))
sethsv(eeprom_ec_config.scroll.h, eeprom_ec_config.scroll.s, eeprom_ec_config.scroll.v, (rgb_led_t *)&led[SCROLL_INDICATOR_INDEX]);
else
sethsv(0, 0, 0, (rgb_led_t *)&led[SCROLL_INDICATOR_INDEX]);
return true;
}

View File

@@ -0,0 +1,23 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define HAL_USE_ADC TRUE
#define HAL_USE_PWM TRUE
#define HAL_USE_PAL TRUE
#include_next <halconf.h>

View File

@@ -0,0 +1,133 @@
{
"manufacturer": "Cipulot",
"keyboard_name": "EC Type-K",
"maintainer": "Cipulot",
"bootloader": "stm32-dfu",
"build": {
"lto": true
},
"diode_direction": "COL2ROW",
"eeprom": {
"wear_leveling": {
"backing_size": 4096
}
},
"features": {
"bootmagic": false,
"console": true,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgblight": true
},
"processor": "STM32F411",
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"rgblight": {
"animations": {
"alternating": true,
"breathing": true,
"christmas": true,
"knight": true,
"rainbow_mood": true,
"rainbow_swirl": true,
"rgb_test": true,
"snake": true,
"static_gradient": true,
"twinkle": true
},
"led_count": 69,
"led_map": [0, 1, 2, 3, 4, 5, 66, 67, 68, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65],
"max_brightness": 200
},
"usb": {
"device_version": "0.0.1",
"pid": "0x6BB4",
"shared_endpoint": {
"keyboard": true
},
"vid": "0x6369"
},
"ws2812": {
"driver": "pwm",
"pin": "B15"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [1, 0], "x": 0.75, "y": 0},
{"matrix": [0, 0], "x": 2.5, "y": 0},
{"matrix": [0, 1], "x": 3.5, "y": 0},
{"matrix": [0, 2], "x": 4.5, "y": 0},
{"matrix": [0, 3], "x": 5.5, "y": 0},
{"matrix": [0, 4], "x": 6.5, "y": 0},
{"matrix": [0, 5], "x": 7.5, "y": 0},
{"matrix": [0, 6], "x": 8.5, "y": 0},
{"matrix": [0, 7], "x": 10.5, "y": 0},
{"matrix": [0, 8], "x": 11.5, "y": 0},
{"matrix": [0, 9], "x": 12.5, "y": 0},
{"matrix": [0, 10], "x": 13.5, "y": 0},
{"matrix": [0, 11], "x": 14.5, "y": 0},
{"matrix": [0, 12], "x": 15.5, "y": 0},
{"matrix": [0, 13], "x": 16.5, "y": 0},
{"matrix": [0, 14], "x": 17.5, "y": 0},
{"matrix": [2, 0], "x": 0.5, "y": 1},
{"matrix": [1, 1], "x": 2.25, "y": 1, "w": 1.5},
{"matrix": [1, 2], "x": 3.75, "y": 1},
{"matrix": [1, 3], "x": 4.75, "y": 1},
{"matrix": [1, 4], "x": 5.75, "y": 1},
{"matrix": [1, 5], "x": 6.75, "y": 1},
{"matrix": [1, 6], "x": 7.75, "y": 1},
{"matrix": [1, 7], "x": 10.25, "y": 1},
{"matrix": [1, 8], "x": 11.25, "y": 1},
{"matrix": [1, 9], "x": 12.25, "y": 1},
{"matrix": [1, 10], "x": 13.25, "y": 1},
{"matrix": [1, 11], "x": 14.25, "y": 1},
{"matrix": [1, 12], "x": 15.25, "y": 1},
{"matrix": [1, 13], "x": 16.25, "y": 1},
{"matrix": [1, 14], "x": 17.25, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 0.25, "y": 2},
{"matrix": [2, 1], "x": 2, "y": 2, "w": 1.75},
{"matrix": [2, 2], "x": 3.75, "y": 2},
{"matrix": [2, 3], "x": 4.75, "y": 2},
{"matrix": [2, 4], "x": 5.75, "y": 2},
{"matrix": [2, 5], "x": 6.75, "y": 2},
{"matrix": [2, 6], "x": 7.75, "y": 2},
{"matrix": [2, 7], "x": 10.75, "y": 2},
{"matrix": [2, 8], "x": 11.75, "y": 2},
{"matrix": [2, 9], "x": 12.75, "y": 2},
{"matrix": [2, 10], "x": 13.75, "y": 2},
{"matrix": [2, 11], "x": 14.75, "y": 2},
{"matrix": [2, 12], "x": 15.75, "y": 2},
{"matrix": [2, 14], "x": 16.75, "y": 2, "w": 2.25},
{"matrix": [4, 0], "x": 0, "y": 3},
{"matrix": [3, 1], "x": 1.75, "y": 3, "w": 2.25},
{"matrix": [3, 2], "x": 4, "y": 3},
{"matrix": [3, 3], "x": 5, "y": 3},
{"matrix": [3, 4], "x": 6, "y": 3},
{"matrix": [3, 5], "x": 7, "y": 3},
{"matrix": [3, 6], "x": 8, "y": 3},
{"matrix": [3, 7], "x": 10.5, "y": 3},
{"matrix": [3, 8], "x": 11.5, "y": 3},
{"matrix": [3, 9], "x": 12.5, "y": 3},
{"matrix": [3, 10], "x": 13.5, "y": 3},
{"matrix": [3, 11], "x": 14.5, "y": 3},
{"matrix": [3, 12], "x": 15.5, "y": 3},
{"matrix": [3, 13], "x": 16.5, "y": 3, "w": 1.25},
{"matrix": [3, 14], "x": 17.75, "y": 3},
{"matrix": [4, 1], "x": 1.75, "y": 4, "w": 1.5},
{"matrix": [4, 3], "x": 5, "y": 4, "w": 1.5},
{"matrix": [4, 5], "x": 6.5, "y": 4, "w": 2},
{"matrix": [4, 6], "x": 8.5, "y": 4},
{"matrix": [4, 7], "x": 10, "y": 4},
{"matrix": [4, 8], "x": 11, "y": 4, "w": 2},
{"matrix": [4, 10], "x": 13, "y": 4, "w": 1.5},
{"matrix": [4, 13], "x": 16.75, "y": 4, "w": 1.5}
]
}
}
}

View File

@@ -0,0 +1,41 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT(
KC_ESC, 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_PGUP, 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_PGDN, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER,
KC_LGUI, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LALT, KC_SPC, KC_LGUI, KC_RGUI, KC_SPC, KC_RALT, MO(1)
),
[1] = 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_HOME, _______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
KC_END, _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, MO(2), _______
),
[2] = LAYOUT(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______)
};

View File

@@ -0,0 +1,41 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT(
KC_ESC, 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_PGUP, 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_PGDN, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER,
KC_LGUI, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LALT, KC_SPC, KC_LGUI, KC_RGUI, KC_SPC, KC_RALT, MO(1)
),
[1] = 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_HOME, _______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, _______, _______, _______,
KC_END, _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, MO(2), _______
),
[2] = LAYOUT(
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______)
};

View File

@@ -0,0 +1,3 @@
VIA_ENABLE = yes
SRC += via_ec_indicators.c

View File

@@ -0,0 +1,502 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 "keyboards/cipulot/common/eeprom_tools.h"
#include "ec_switch_matrix.h"
#include "action.h"
#include "print.h"
#include "via.h"
#ifdef VIA_ENABLE
void ec_rescale_values(uint8_t item);
void ec_save_threshold_data(uint8_t option);
void ec_save_bottoming_reading(void);
void ec_show_calibration_data(void);
void ec_clear_bottoming_calibration_data(void);
// Declaring enums for VIA config menu
enum via_enums {
// clang-format off
id_num_indicator_enabled = 1,
id_num_indicator_brightness = 2,
id_num_indicator_color = 3,
id_caps_indicator_enabled = 4,
id_caps_indicator_brightness = 5,
id_caps_indicator_color = 6,
id_scroll_indicator_enabled = 7,
id_scroll_indicator_brightness = 8,
id_scroll_indicator_color = 9,
id_actuation_mode = 10,
id_mode_0_actuation_threshold = 11,
id_mode_0_release_threshold = 12,
id_save_threshold_data = 13,
id_mode_1_initial_deadzone_offset = 14,
id_mode_1_actuation_offset = 15,
id_mode_1_release_offset = 16,
id_bottoming_calibration = 17,
id_noise_floor_calibration = 18,
id_show_calibration_data = 19,
id_clear_bottoming_calibration_data = 20
// clang-format on
};
// Handle the data received by the keyboard from the VIA menus
void via_config_set_value(uint8_t *data) {
// data = [ value_id, value_data ]
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
switch (*value_id) {
case id_num_indicator_enabled: {
if (value_data[0] == 1) {
eeprom_ec_config.num.enabled = true;
uprintf("#########################\n");
uprintf("# Num indicator enabled #\n");
uprintf("#########################\n");
} else {
eeprom_ec_config.num.enabled = false;
uprintf("##########################\n");
uprintf("# Num indicator disabled #\n");
uprintf("##########################\n");
}
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.enabled);
break;
}
case id_num_indicator_brightness: {
eeprom_ec_config.num.v = value_data[0];
uprintf("Num indicator brightness: %d\n", eeprom_ec_config.num.v);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.v);
break;
}
case id_num_indicator_color: {
eeprom_ec_config.num.h = value_data[0];
eeprom_ec_config.num.s = value_data[1];
uprintf("Num indicator color: %d, %d\n", eeprom_ec_config.num.h, eeprom_ec_config.num.s);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.h);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, num.s);
break;
}
case id_caps_indicator_enabled: {
if (value_data[0] == 1) {
eeprom_ec_config.caps.enabled = true;
uprintf("##########################\n");
uprintf("# Caps indicator enabled #\n");
uprintf("##########################\n");
} else {
eeprom_ec_config.caps.enabled = false;
uprintf("###########################\n");
uprintf("# Caps indicator disabled #\n");
uprintf("###########################\n");
}
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.enabled);
break;
}
case id_caps_indicator_brightness: {
eeprom_ec_config.caps.v = value_data[0];
uprintf("Caps indicator brightness: %d\n", eeprom_ec_config.caps.v);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.v);
break;
}
case id_caps_indicator_color: {
eeprom_ec_config.caps.h = value_data[0];
eeprom_ec_config.caps.s = value_data[1];
uprintf("Caps indicator color: %d, %d\n", eeprom_ec_config.caps.h, eeprom_ec_config.caps.s);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.h);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, caps.s);
break;
}
case id_scroll_indicator_enabled: {
if (value_data[0] == 1) {
eeprom_ec_config.scroll.enabled = true;
uprintf("############################\n");
uprintf("# Scroll indicator enabled #\n");
uprintf("############################\n");
} else {
eeprom_ec_config.scroll.enabled = false;
uprintf("#############################\n");
uprintf("# Scroll indicator disabled #\n");
uprintf("#############################\n");
}
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.enabled);
break;
}
case id_scroll_indicator_brightness: {
eeprom_ec_config.scroll.v = value_data[0];
uprintf("Scroll indicator brightness: %d\n", eeprom_ec_config.scroll.v);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.v);
break;
}
case id_scroll_indicator_color: {
eeprom_ec_config.scroll.h = value_data[0];
eeprom_ec_config.scroll.s = value_data[1];
uprintf("Scroll indicator color: %d, %d\n", eeprom_ec_config.scroll.h, eeprom_ec_config.scroll.s);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.h);
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, scroll.s);
break;
}
case id_actuation_mode: {
eeprom_ec_config.actuation_mode = value_data[0];
ec_config.actuation_mode = eeprom_ec_config.actuation_mode;
if (ec_config.actuation_mode == 0) {
uprintf("#########################\n");
uprintf("# Actuation Mode: APC #\n");
uprintf("#########################\n");
} else if (ec_config.actuation_mode == 1) {
uprintf("#################################\n");
uprintf("# Actuation Mode: Rapid Trigger #\n");
uprintf("#################################\n");
}
EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, actuation_mode);
break;
}
case id_mode_0_actuation_threshold: {
ec_config.mode_0_actuation_threshold = value_data[1] | (value_data[0] << 8);
uprintf("APC Mode Actuation Threshold: %d\n", ec_config.mode_0_actuation_threshold);
break;
}
case id_mode_0_release_threshold: {
eeprom_ec_config.mode_0_release_threshold = value_data[1] | (value_data[0] << 8);
ec_config.mode_0_release_threshold = eeprom_ec_config.mode_0_release_threshold;
uprintf("APC Mode Release Threshold: %d\n", ec_config.mode_0_release_threshold);
break;
}
case id_mode_1_initial_deadzone_offset: {
ec_config.mode_1_initial_deadzone_offset = value_data[1] | (value_data[0] << 8);
uprintf("Rapid Trigger Mode Initial Deadzone Offset: %d\n", ec_config.mode_1_initial_deadzone_offset);
break;
}
case id_mode_1_actuation_offset: {
ec_config.mode_1_actuation_offset = value_data[0];
uprintf("Rapid Trigger Mode Actuation Sensitivity: %d\n", ec_config.mode_1_actuation_offset);
break;
}
case id_mode_1_release_offset: {
ec_config.mode_1_release_offset = value_data[0];
uprintf("Rapid Trigger Mode Release Sensitivity: %d\n", ec_config.mode_1_release_offset);
break;
}
case id_bottoming_calibration: {
if (value_data[0] == 1) {
ec_config.bottoming_calibration = true;
uprintf("##############################\n");
uprintf("# Bottoming calibration mode #\n");
uprintf("##############################\n");
} else {
ec_config.bottoming_calibration = false;
ec_save_bottoming_reading();
uprintf("## Bottoming calibration done ##\n");
ec_show_calibration_data();
}
break;
}
case id_save_threshold_data: {
ec_save_threshold_data(value_data[0]);
break;
}
case id_noise_floor_calibration: {
if (value_data[0] == 0) {
ec_noise_floor();
ec_rescale_values(0);
ec_rescale_values(1);
ec_rescale_values(2);
uprintf("#############################\n");
uprintf("# Noise floor data acquired #\n");
uprintf("#############################\n");
break;
}
}
case id_show_calibration_data: {
// Show calibration data once if the user toggle the switch
if (value_data[0] == 0) {
ec_show_calibration_data();
break;
}
}
case id_clear_bottoming_calibration_data: {
if (value_data[0] == 0) {
ec_clear_bottoming_calibration_data();
}
}
default: {
// Unhandled value.
break;
}
}
// Call the indicator callback to set the indicator color
indicators_callback();
}
// Handle the data sent by the keyboard to the VIA menus
void via_config_get_value(uint8_t *data) {
// data = [ value_id, value_data ]
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
switch (*value_id) {
case id_num_indicator_enabled: {
value_data[0] = eeprom_ec_config.num.enabled;
break;
}
case id_num_indicator_brightness: {
value_data[0] = eeprom_ec_config.num.v;
break;
}
case id_num_indicator_color: {
value_data[0] = eeprom_ec_config.num.h;
value_data[1] = eeprom_ec_config.num.s;
break;
}
case id_caps_indicator_enabled: {
value_data[0] = eeprom_ec_config.caps.enabled;
break;
}
case id_caps_indicator_brightness: {
value_data[0] = eeprom_ec_config.caps.v;
break;
}
case id_caps_indicator_color: {
value_data[0] = eeprom_ec_config.caps.h;
value_data[1] = eeprom_ec_config.caps.s;
break;
}
case id_scroll_indicator_enabled: {
value_data[0] = eeprom_ec_config.scroll.enabled;
break;
}
case id_scroll_indicator_brightness: {
value_data[0] = eeprom_ec_config.scroll.v;
break;
}
case id_scroll_indicator_color: {
value_data[0] = eeprom_ec_config.scroll.h;
value_data[1] = eeprom_ec_config.scroll.s;
break;
}
case id_actuation_mode: {
value_data[0] = eeprom_ec_config.actuation_mode;
break;
}
case id_mode_0_actuation_threshold: {
value_data[0] = eeprom_ec_config.mode_0_actuation_threshold >> 8;
value_data[1] = eeprom_ec_config.mode_0_actuation_threshold & 0xFF;
break;
}
case id_mode_0_release_threshold: {
value_data[0] = eeprom_ec_config.mode_0_release_threshold >> 8;
value_data[1] = eeprom_ec_config.mode_0_release_threshold & 0xFF;
break;
}
case id_mode_1_initial_deadzone_offset: {
value_data[0] = eeprom_ec_config.mode_1_initial_deadzone_offset >> 8;
value_data[1] = eeprom_ec_config.mode_1_initial_deadzone_offset & 0xFF;
break;
}
case id_mode_1_actuation_offset: {
value_data[0] = eeprom_ec_config.mode_1_actuation_offset;
break;
}
case id_mode_1_release_offset: {
value_data[0] = eeprom_ec_config.mode_1_release_offset;
break;
}
default: {
// Unhandled value.
break;
}
}
}
// Handle the commands sent and received by the keyboard with VIA
void via_custom_value_command_kb(uint8_t *data, uint8_t length) {
// data = [ command_id, channel_id, value_id, value_data ]
uint8_t *command_id = &(data[0]);
uint8_t *channel_id = &(data[1]);
uint8_t *value_id_and_data = &(data[2]);
if (*channel_id == id_custom_channel) {
switch (*command_id) {
case id_custom_set_value: {
via_config_set_value(value_id_and_data);
break;
}
case id_custom_get_value: {
via_config_get_value(value_id_and_data);
break;
}
case id_custom_save: {
// Bypass the save function in favor of pinpointed saves
break;
}
default: {
// Unhandled message.
*command_id = id_unhandled;
break;
}
}
return;
}
*command_id = id_unhandled;
}
// Rescale the values received by VIA to fit the new range
void ec_rescale_values(uint8_t item) {
switch (item) {
// Rescale the APC mode actuation thresholds
case 0:
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.rescaled_mode_0_actuation_threshold[row][col] = rescale(ec_config.mode_0_actuation_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
}
}
break;
// Rescale the APC mode release thresholds
case 1:
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.rescaled_mode_0_release_threshold[row][col] = rescale(ec_config.mode_0_release_threshold, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
}
}
break;
// Rescale the Rapid Trigger mode initial deadzone offsets
case 2:
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
ec_config.rescaled_mode_1_initial_deadzone_offset[row][col] = rescale(ec_config.mode_1_initial_deadzone_offset, 0, 1023, ec_config.noise_floor[row][col], eeprom_ec_config.bottoming_reading[row][col]);
}
}
break;
default:
// Unhandled item.
break;
}
}
void ec_save_threshold_data(uint8_t option) {
// Save APC mode thresholds and rescale them for runtime usage
if (option == 0) {
eeprom_ec_config.mode_0_actuation_threshold = ec_config.mode_0_actuation_threshold;
eeprom_ec_config.mode_0_release_threshold = ec_config.mode_0_release_threshold;
ec_rescale_values(0);
ec_rescale_values(1);
}
// Save Rapid Trigger mode thresholds and rescale them for runtime usage
else if (option == 1) {
eeprom_ec_config.mode_1_initial_deadzone_offset = ec_config.mode_1_initial_deadzone_offset;
ec_rescale_values(2);
}
eeconfig_update_kb_datablock(&eeprom_ec_config);
uprintf("####################################\n");
uprintf("# New thresholds applied and saved #\n");
uprintf("####################################\n");
}
// Save the bottoming reading
void ec_save_bottoming_reading(void) {
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
// If the bottom reading doesn't go over the noise floor by 100, it is likely that:
// 1. The key is not actually in the matrix
// 2. The key is on an alternative layout, therefore not being pressed
// 3. The key in in the current layout but not being pressed
if (ec_config.bottoming_reading[row][col] < (ec_config.noise_floor[row][col] + 100)) {
eeprom_ec_config.bottoming_reading[row][col] = 1023;
} else {
eeprom_ec_config.bottoming_reading[row][col] = ec_config.bottoming_reading[row][col];
}
}
}
// Rescale the values to fit the new range for runtime usage
ec_rescale_values(0);
ec_rescale_values(1);
ec_rescale_values(2);
eeconfig_update_kb_datablock(&eeprom_ec_config);
}
// Show the calibration data
void ec_show_calibration_data(void) {
uprintf("\n###############\n");
uprintf("# Noise Floor #\n");
uprintf("###############\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", ec_config.noise_floor[row][col]);
}
uprintf("%4d\n", ec_config.noise_floor[row][MATRIX_COLS - 1]);
}
uprintf("\n######################\n");
uprintf("# Bottoming Readings #\n");
uprintf("######################\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", eeprom_ec_config.bottoming_reading[row][col]);
}
uprintf("%4d\n", eeprom_ec_config.bottoming_reading[row][MATRIX_COLS - 1]);
}
uprintf("\n######################################\n");
uprintf("# Rescaled APC Mode Actuation Points #\n");
uprintf("######################################\n");
uprintf("Original APC Mode Actuation Point: %4d\n", ec_config.mode_0_actuation_threshold);
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", ec_config.rescaled_mode_0_actuation_threshold[row][col]);
}
uprintf("%4d\n", ec_config.rescaled_mode_0_actuation_threshold[row][MATRIX_COLS - 1]);
}
uprintf("\n######################################\n");
uprintf("# Rescaled APC Mode Release Points #\n");
uprintf("######################################\n");
uprintf("Original APC Mode Release Point: %4d\n", ec_config.mode_0_release_threshold);
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", ec_config.rescaled_mode_0_release_threshold[row][col]);
}
uprintf("%4d\n", ec_config.rescaled_mode_0_release_threshold[row][MATRIX_COLS - 1]);
}
uprintf("\n#######################################################\n");
uprintf("# Rescaled Rapid Trigger Mode Initial Deadzone Offset #\n");
uprintf("#######################################################\n");
uprintf("Original Rapid Trigger Mode Initial Deadzone Offset: %4d\n", ec_config.mode_1_initial_deadzone_offset);
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
for (uint8_t col = 0; col < MATRIX_COLS - 1; col++) {
uprintf("%4d,", ec_config.rescaled_mode_1_initial_deadzone_offset[row][col]);
}
uprintf("%4d\n", ec_config.rescaled_mode_1_initial_deadzone_offset[row][MATRIX_COLS - 1]);
}
print("\n");
}
// Clear the calibration data
void ec_clear_bottoming_calibration_data(void) {
// Clear the EEPROM data
eeconfig_init_kb();
// Reset the runtime values to the EEPROM values
keyboard_post_init_kb();
uprintf("######################################\n");
uprintf("# Bottoming calibration data cleared #\n");
uprintf("######################################\n");
}
#endif // VIA_ENABLE

View File

@@ -0,0 +1,42 @@
/* Copyright 2023 Cipulot
*
* 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 3 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 "ec_switch_matrix.h"
#include "matrix.h"
extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values
extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values
// Custom matrix init function
void matrix_init_custom(void) {
// Initialize EC
ec_init();
// Get the noise floor at boot
ec_noise_floor();
}
// Custom matrix scan function
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
bool updated = ec_matrix_scan(current_matrix);
return updated;
}
// Bootmagic overriden to avoid conflicts with EC
void bootmagic_scan(void) {
;
}

View File

@@ -0,0 +1,28 @@
/* Copyright 2023 Cipulot
*
* 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 3 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_next <mcuconf.h>
#undef STM32_ADC_USE_ADC1
#define STM32_ADC_USE_ADC1 TRUE
#undef STM32_PWM_USE_ADVANCED
#define STM32_PWM_USE_ADVANCED TRUE
#undef STM32_PWM_USE_TIM1
#define STM32_PWM_USE_TIM1 TRUE

View File

@@ -0,0 +1,26 @@
# EC Type-K
![EC Type-K](https://i.imgur.com/hFQ0qCfh.png)
EC Type-K Keyboard by gok.
* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
* Hardware Supported: EC Type-K
* Hardware Availability: [gok](https://www.gok.design/)
Make example for this keyboard (after setting up your build environment):
make cipulot/ec_typek:default
Flashing example for this keyboard:
make cipulot/ec_typek:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 2 ways:
* **Physical Boot0 pins**: Short the Boot0 pins on the back of the PCB while plugging in the keyboard
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@@ -0,0 +1,4 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
SRC += matrix.c ec_switch_matrix.c
OPT = 2

View File

@@ -0,0 +1,66 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define MATRIX_ROWS 5
#define MATRIX_COLS 14
#define MATRIX_ROW_PINS \
{ B13, B14, B15, A8, A15 }
#define AMUX_COUNT 2
#define AMUX_MAX_COLS_COUNT 8
#define AMUX_EN_PINS \
{ B7, B3 }
#define AMUX_SEL_PINS \
{ B6, B5, B4 }
#define AMUX_COL_CHANNELS_SIZES \
{ 8, 6 }
#define AMUX_0_COL_CHANNELS \
{ 0, 3, 1, 2, 4, 5, 6, 7 }
#define AMUX_1_COL_CHANNELS \
{ 0, 3, 1, 2, 4, 5 }
#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS
#define DISCHARGE_PIN A3
#define ANALOG_PORT A2
#define DEFAULT_ACTUATION_MODE 0
#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
#define DEFAULT_MODE_0_RELEASE_LEVEL 500
#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
#define DEFAULT_MODE_1_RELEASE_OFFSET 70
#define DEFAULT_EXTREMUM 1023
#define EXPECTED_NOISE_FLOOR 0
#define NOISE_FLOOR_THRESHOLD 50
#define BOTTOMING_CALIBRATION_THRESHOLD 100
#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
#define DEFAULT_BOTTOMING_READING 1023
#define DEFAULT_CALIBRATION_STARTER true
#define DISCHARGE_TIME 10
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 149

View File

@@ -0,0 +1,21 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define HAL_USE_ADC TRUE
#include_next <halconf.h>

View File

@@ -0,0 +1,225 @@
{
"manufacturer": "Cipulot",
"keyboard_name": "MNK 60 EC",
"maintainer": "Cipulot",
"bootloader": "stm32-dfu",
"build": {
"lto": true
},
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"processor": "STM32F401",
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"usb": {
"device_version": "0.0.1",
"pid": "0x6BB6",
"vid": "0x6369"
},
"community_layouts": ["60_ansi_wkl_split_bs_rshift", "60_hhkb", "60_tsangan_hhkb"],
"layouts": {
"LAYOUT_60_ansi_wkl_split_bs_rshift": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 13], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 1], "x": 2.25, "y": 3},
{"matrix": [3, 2], "x": 3.25, "y": 3},
{"matrix": [3, 3], "x": 4.25, "y": 3},
{"matrix": [3, 4], "x": 5.25, "y": 3},
{"matrix": [3, 5], "x": 6.25, "y": 3},
{"matrix": [3, 6], "x": 7.25, "y": 3},
{"matrix": [3, 7], "x": 8.25, "y": 3},
{"matrix": [3, 8], "x": 9.25, "y": 3},
{"matrix": [3, 9], "x": 10.25, "y": 3},
{"matrix": [3, 10], "x": 11.25, "y": 3},
{"matrix": [3, 11], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 12], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 5], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_hhkb": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 13], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 1], "x": 2.25, "y": 3},
{"matrix": [3, 2], "x": 3.25, "y": 3},
{"matrix": [3, 3], "x": 4.25, "y": 3},
{"matrix": [3, 4], "x": 5.25, "y": 3},
{"matrix": [3, 5], "x": 6.25, "y": 3},
{"matrix": [3, 6], "x": 7.25, "y": 3},
{"matrix": [3, 7], "x": 8.25, "y": 3},
{"matrix": [3, 8], "x": 9.25, "y": 3},
{"matrix": [3, 9], "x": 10.25, "y": 3},
{"matrix": [3, 10], "x": 11.25, "y": 3},
{"matrix": [3, 11], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 12], "x": 14, "y": 3},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 5], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 11], "x": 12.5, "y": 4}
]
},
"LAYOUT_60_tsangan_hhkb": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 13], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 1], "x": 2.25, "y": 3},
{"matrix": [3, 2], "x": 3.25, "y": 3},
{"matrix": [3, 3], "x": 4.25, "y": 3},
{"matrix": [3, 4], "x": 5.25, "y": 3},
{"matrix": [3, 5], "x": 6.25, "y": 3},
{"matrix": [3, 6], "x": 7.25, "y": 3},
{"matrix": [3, 7], "x": 8.25, "y": 3},
{"matrix": [3, 8], "x": 9.25, "y": 3},
{"matrix": [3, 9], "x": 10.25, "y": 3},
{"matrix": [3, 10], "x": 11.25, "y": 3},
{"matrix": [3, 11], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 12], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 5], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 11], "x": 12.5, "y": 4},
{"matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5}
]
}
}
}

View File

@@ -0,0 +1,42 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_60_hhkb(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,
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_ENTER,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT),
[1] = LAYOUT_60_hhkb(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, KC_BSPC,
_______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, S(KC_8), KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, _______,
_______, _______, _______, _______, _______, _______, S(KC_EQL), KC_MINS, KC_END, KC_PGDN, KC_DOWN, _______, _______,
_______, _______, _______, _______, MO(2)),
[2] = LAYOUT_60_hhkb(
QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______)
// clang-format on
};

View File

@@ -0,0 +1,42 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_60_tsangan_hhkb(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, KC_RGUI, KC_RALT),
[1] = LAYOUT_60_tsangan_hhkb(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
_______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, _______,
_______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, S(KC_8), KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, _______,
_______, _______, _______, _______, _______, _______, S(KC_EQL), KC_MINS, KC_END, KC_PGDN, KC_DOWN, _______, _______,
_______, _______, _______, _______, _______, MO(2), _______),
[2] = LAYOUT_60_tsangan_hhkb(
QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______)
// clang-format on
};

View File

@@ -0,0 +1,42 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_60_tsangan_hhkb(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, KC_RGUI, KC_RALT),
[1] = LAYOUT_60_tsangan_hhkb(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
_______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, _______,
_______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, S(KC_8), KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, _______,
_______, _______, _______, _______, _______, _______, S(KC_EQL), KC_MINS, KC_END, KC_PGDN, KC_DOWN, _______, _______,
_______, _______, _______, _______, _______, MO(2), _______),
[2] = LAYOUT_60_tsangan_hhkb(
QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______)
// clang-format on
};

View File

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

View File

@@ -0,0 +1,22 @@
/* Copyright 2023 Cipulot
*
* 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 3 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_next <mcuconf.h>
#undef STM32_ADC_USE_ADC1
#define STM32_ADC_USE_ADC1 TRUE

View File

@@ -0,0 +1,3 @@
ifeq ($(strip $(VIA_ENABLE)), yes)
SRC += keyboards/cipulot/common/via_ec.c
endif

View File

@@ -0,0 +1,26 @@
# MNK 60 EC
![MNK 60 EC PCB](https://i.imgur.com/UpkCUKFh.jpeg)
EC version of the Monokei MNK 66.
* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
* Hardware Supported: MNK 60 EC PCB
* Hardware Availability: [Monokei](https://monokei.co/)
Make example for this keyboard (after setting up your build environment):
make cipulot/mnk_60_ec:default
Flashing example for this keyboard:
make cipulot/mnk_60_ec:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 2 ways:
* **Physical reset**: Long short the exposed pads on the top of the PCB
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@@ -0,0 +1,5 @@
CUSTOM_MATRIX = lite
ANALOG_DRIVER_REQUIRED = yes
VPATH += keyboards/cipulot/common
SRC += matrix.c ec_board.c ec_switch_matrix.c
OPT = 3

View File

@@ -0,0 +1,66 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
#define MATRIX_ROW_PINS \
{ B14, B15, A8, B12, A15 }
#define AMUX_COUNT 2
#define AMUX_MAX_COLS_COUNT 8
#define AMUX_EN_PINS \
{ B7, B3 }
#define AMUX_SEL_PINS \
{ B6, B5, B4 }
#define AMUX_COL_CHANNELS_SIZES \
{ 8, 7 }
#define AMUX_0_COL_CHANNELS \
{ 0, 3, 1, 2, 4, 5, 6, 7 }
#define AMUX_1_COL_CHANNELS \
{ 0, 3, 1, 2, 4, 5, 6 }
#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS
#define DISCHARGE_PIN A3
#define ANALOG_PORT A2
#define DEFAULT_ACTUATION_MODE 0
#define DEFAULT_MODE_0_ACTUATION_LEVEL 550
#define DEFAULT_MODE_0_RELEASE_LEVEL 500
#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL
#define DEFAULT_MODE_1_ACTUATION_OFFSET 70
#define DEFAULT_MODE_1_RELEASE_OFFSET 70
#define DEFAULT_EXTREMUM 1023
#define EXPECTED_NOISE_FLOOR 0
#define NOISE_FLOOR_THRESHOLD 50
#define BOTTOMING_CALIBRATION_THRESHOLD 100
#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30
#define DEFAULT_BOTTOMING_READING 1023
#define DEFAULT_CALIBRATION_STARTER true
#define DISCHARGE_TIME 10
// #define DEBUG_MATRIX_SCAN_RATE
#define EECONFIG_KB_DATA_SIZE 159

View File

@@ -0,0 +1,21 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
#define HAL_USE_ADC TRUE
#include_next <halconf.h>

View File

@@ -0,0 +1,100 @@
{
"manufacturer": "Cipulot",
"keyboard_name": "MNK 65 EC",
"maintainer": "Cipulot",
"bootloader": "stm32-dfu",
"build": {
"lto": true
},
"diode_direction": "COL2ROW",
"features": {
"bootmagic": false,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"processor": "STM32F401",
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"usb": {
"device_version": "0.0.1",
"pid": "0x6BB5",
"vid": "0x6369"
},
"layouts": {
"LAYOUT_65_ansi_blocker_tsangan": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [0, 14], "x": 15, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [1, 14], "x": 15, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [2, 14], "x": 15, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 1], "x": 2.25, "y": 3},
{"matrix": [3, 2], "x": 3.25, "y": 3},
{"matrix": [3, 3], "x": 4.25, "y": 3},
{"matrix": [3, 4], "x": 5.25, "y": 3},
{"matrix": [3, 5], "x": 6.25, "y": 3},
{"matrix": [3, 6], "x": 7.25, "y": 3},
{"matrix": [3, 7], "x": 8.25, "y": 3},
{"matrix": [3, 8], "x": 9.25, "y": 3},
{"matrix": [3, 9], "x": 10.25, "y": 3},
{"matrix": [3, 10], "x": 11.25, "y": 3},
{"matrix": [3, 11], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 12], "x": 14, "y": 3},
{"matrix": [3, 14], "x": 15, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 5], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 9], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 11], "x": 13, "y": 4},
{"matrix": [4, 12], "x": 14, "y": 4},
{"matrix": [4, 14], "x": 15, "y": 4}
]
}
}
}

View File

@@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_65_ansi_blocker_tsangan(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, 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_BSLS, KC_PGUP,
KC_CAPS, 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_END,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT_65_ansi_blocker_tsangan(
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_DEL, _______,
_______, _______, _______, _______, _______, _______, KC_INS, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),
[2] = LAYOUT_65_ansi_blocker_tsangan(
QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
)
// clang-format on
};

View File

@@ -0,0 +1,43 @@
/* Copyright 2023 Cipulot
*
* 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 3 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
[0] = LAYOUT_65_ansi_blocker_tsangan(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, 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_BSLS, KC_PGUP,
KC_CAPS, 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_END,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT_65_ansi_blocker_tsangan(
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_DEL, _______,
_______, _______, _______, _______, _______, _______, KC_INS, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),
[2] = LAYOUT_65_ansi_blocker_tsangan(
QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
)
// clang-format on
};

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