Browse Source

Merge branch 'qmk:master' into add_ec_980c

pull/23172/head
Cipulot 1 month ago
committed by GitHub
parent
commit
e8595bee0d
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
270 changed files with 13119 additions and 258 deletions
  1. +1
    -1
      .github/workflows/format.yml
  2. +1
    -1
      .github/workflows/lint.yml
  3. +8
    -2
      builddefs/converters.mk
  4. +4
    -0
      data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson
  5. +1
    -1
      docs/flashing.md
  6. +1
    -1
      docs/getting_started_introduction.md
  7. +9
    -7
      docs/pr_checklist.md
  8. +23
    -17
      docs/serial_driver.md
  9. +46
    -0
      keyboards/ah/haven60/haven60.c
  10. +699
    -0
      keyboards/ah/haven60/info.json
  11. +21
    -0
      keyboards/ah/haven60/keymaps/default/keymap.c
  12. +21
    -0
      keyboards/ah/haven60/keymaps/via/keymap.c
  13. +1
    -0
      keyboards/ah/haven60/keymaps/via/rules.mk
  14. +28
    -0
      keyboards/ah/haven60/readme.md
  15. +1
    -0
      keyboards/ah/haven60/rules.mk
  16. +221
    -0
      keyboards/amjkeyboard/amj96/info.json
  17. +25
    -0
      keyboards/amjkeyboard/amj96/matrix_diagram.md
  18. +22
    -0
      keyboards/archetype/minervalx/config.h
  19. +21
    -0
      keyboards/archetype/minervalx/halconf.h
  20. +98
    -0
      keyboards/archetype/minervalx/info.json
  21. +35
    -0
      keyboards/archetype/minervalx/keymaps/default/keymap.c
  22. +35
    -0
      keyboards/archetype/minervalx/keymaps/via/keymap.c
  23. +2
    -0
      keyboards/archetype/minervalx/keymaps/via/rules.mk
  24. +22
    -0
      keyboards/archetype/minervalx/mcuconf.h
  25. +24
    -0
      keyboards/archetype/minervalx/readme.md
  26. +1
    -0
      keyboards/archetype/minervalx/rules.mk
  27. +11
    -0
      keyboards/arrowmechanics/wings/config.h
  28. +9
    -0
      keyboards/arrowmechanics/wings/halconf.h
  29. +320
    -0
      keyboards/arrowmechanics/wings/info.json
  30. +25
    -0
      keyboards/arrowmechanics/wings/keymaps/default/keymap.c
  31. +1
    -0
      keyboards/arrowmechanics/wings/keymaps/default/rules.mk
  32. +9
    -0
      keyboards/arrowmechanics/wings/mcuconf.h
  33. +29
    -0
      keyboards/arrowmechanics/wings/readme.md
  34. +2
    -0
      keyboards/arrowmechanics/wings/rules.mk
  35. +3
    -4
      keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h
  36. +5
    -6
      keyboards/bastardkb/charybdis/3x5/v2/stemcell/info.json
  37. +0
    -2
      keyboards/bastardkb/charybdis/3x5/v2/stemcell/rules.mk
  38. +3
    -4
      keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h
  39. +5
    -6
      keyboards/bastardkb/charybdis/3x6/v2/stemcell/info.json
  40. +0
    -2
      keyboards/bastardkb/charybdis/3x6/v2/stemcell/rules.mk
  41. +3
    -4
      keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h
  42. +5
    -6
      keyboards/bastardkb/charybdis/4x6/v2/stemcell/info.json
  43. +0
    -2
      keyboards/bastardkb/charybdis/4x6/v2/stemcell/rules.mk
  44. +5
    -6
      keyboards/bastardkb/scylla/v2/stemcell/info.json
  45. +0
    -2
      keyboards/bastardkb/scylla/v2/stemcell/rules.mk
  46. +5
    -6
      keyboards/bastardkb/skeletyl/v2/stemcell/info.json
  47. +0
    -2
      keyboards/bastardkb/skeletyl/v2/stemcell/rules.mk
  48. +5
    -6
      keyboards/bastardkb/tbkmini/v2/stemcell/info.json
  49. +0
    -2
      keyboards/bastardkb/tbkmini/v2/stemcell/rules.mk
  50. +81
    -0
      keyboards/cipulot/ec_typek/config.h
  51. +318
    -0
      keyboards/cipulot/ec_typek/ec_switch_matrix.c
  52. +84
    -0
      keyboards/cipulot/ec_typek/ec_switch_matrix.h
  53. +119
    -0
      keyboards/cipulot/ec_typek/ec_typek.c
  54. +23
    -0
      keyboards/cipulot/ec_typek/halconf.h
  55. +133
    -0
      keyboards/cipulot/ec_typek/info.json
  56. +41
    -0
      keyboards/cipulot/ec_typek/keymaps/default/keymap.c
  57. +41
    -0
      keyboards/cipulot/ec_typek/keymaps/via/keymap.c
  58. +3
    -0
      keyboards/cipulot/ec_typek/keymaps/via/rules.mk
  59. +502
    -0
      keyboards/cipulot/ec_typek/keymaps/via/via_ec_indicators.c
  60. +42
    -0
      keyboards/cipulot/ec_typek/matrix.c
  61. +28
    -0
      keyboards/cipulot/ec_typek/mcuconf.h
  62. +26
    -0
      keyboards/cipulot/ec_typek/readme.md
  63. +4
    -0
      keyboards/cipulot/ec_typek/rules.mk
  64. +66
    -0
      keyboards/cipulot/mnk_60_ec/config.h
  65. +21
    -0
      keyboards/cipulot/mnk_60_ec/halconf.h
  66. +225
    -0
      keyboards/cipulot/mnk_60_ec/info.json
  67. +42
    -0
      keyboards/cipulot/mnk_60_ec/keymaps/60_hhkb/keymap.c
  68. +42
    -0
      keyboards/cipulot/mnk_60_ec/keymaps/default/keymap.c
  69. +42
    -0
      keyboards/cipulot/mnk_60_ec/keymaps/via/keymap.c
  70. +1
    -0
      keyboards/cipulot/mnk_60_ec/keymaps/via/rules.mk
  71. +22
    -0
      keyboards/cipulot/mnk_60_ec/mcuconf.h
  72. +3
    -0
      keyboards/cipulot/mnk_60_ec/post_rules.mk
  73. +26
    -0
      keyboards/cipulot/mnk_60_ec/readme.md
  74. +5
    -0
      keyboards/cipulot/mnk_60_ec/rules.mk
  75. +66
    -0
      keyboards/cipulot/mnk_65_ec/config.h
  76. +21
    -0
      keyboards/cipulot/mnk_65_ec/halconf.h
  77. +100
    -0
      keyboards/cipulot/mnk_65_ec/info.json
  78. +43
    -0
      keyboards/cipulot/mnk_65_ec/keymaps/default/keymap.c
  79. +43
    -0
      keyboards/cipulot/mnk_65_ec/keymaps/via/keymap.c
  80. +1
    -0
      keyboards/cipulot/mnk_65_ec/keymaps/via/rules.mk
  81. +22
    -0
      keyboards/cipulot/mnk_65_ec/mcuconf.h
  82. +3
    -0
      keyboards/cipulot/mnk_65_ec/post_rules.mk
  83. +26
    -0
      keyboards/cipulot/mnk_65_ec/readme.md
  84. +5
    -0
      keyboards/cipulot/mnk_65_ec/rules.mk
  85. +125
    -0
      keyboards/doio/kb3x/info.json
  86. +51
    -0
      keyboards/doio/kb3x/keymaps/default/keymap.c
  87. +1
    -0
      keyboards/doio/kb3x/keymaps/default/rules.mk
  88. +73
    -0
      keyboards/doio/kb3x/keymaps/via/keymap.c
  89. +2
    -0
      keyboards/doio/kb3x/keymaps/via/rules.mk
  90. +26
    -0
      keyboards/doio/kb3x/readme.md
  91. +1
    -0
      keyboards/doio/kb3x/rules.mk
  92. +104
    -0
      keyboards/handwired/jotlily60/info.json
  93. +65
    -0
      keyboards/handwired/jotlily60/keymaps/default/keymap.c
  94. +31
    -0
      keyboards/handwired/jotlily60/keymaps/via/keymap.c
  95. +1
    -0
      keyboards/handwired/jotlily60/keymaps/via/rules.mk
  96. +55
    -0
      keyboards/handwired/jotlily60/readme.md
  97. +1
    -0
      keyboards/handwired/jotlily60/rules.mk
  98. +38
    -0
      keyboards/handwired/technicpad/info.json
  99. +8
    -0
      keyboards/handwired/technicpad/keymaps/default/keymap.json
  100. +13
    -0
      keyboards/handwired/technicpad/keymaps/via/keymap.json

+ 1
- 1
.github/workflows/format.yml View File

@ -35,7 +35,7 @@ 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


+ 1
- 1
.github/workflows/lint.yml View File

@ -27,7 +27,7 @@ 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


+ 8
- 2
builddefs/converters.mk 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),)


+ 4
- 0
data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson View File

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

+ 1
- 1
docs/flashing.md 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.

+ 1
- 1
docs/getting_started_introduction.md 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


+ 9
- 7
docs/pr_checklist.md 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
```

+ 23
- 17
docs/serial_driver.md 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
```


+ 46
- 0
keyboards/ah/haven60/haven60.c 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;
}

+ 699
- 0
keyboards/ah/haven60/info.json 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}
]
}
}
}

+ 21
- 0
keyboards/ah/haven60/keymaps/default/keymap.c 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, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
};

+ 21
- 0
keyboards/ah/haven60/keymaps/via/keymap.c 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, _______, _______,
_______, _______, _______, _______, _______, _______, _______
)
};

+ 1
- 0
keyboards/ah/haven60/keymaps/via/rules.mk View File

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

+ 28
- 0
keyboards/ah/haven60/readme.md 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

+ 1
- 0
keyboards/ah/haven60/rules.mk View File

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

+ 221
- 0
keyboards/amjkeyboard/amj96/info.json 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},


+ 25
- 0
keyboards/amjkeyboard/amj96/matrix_diagram.md 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
└────────┘ └───────┘
```

+ 22
- 0
keyboards/archetype/minervalx/config.h 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

+ 21
- 0
keyboards/archetype/minervalx/halconf.h 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>

+ 98
- 0
keyboards/archetype/minervalx/info.json 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}
]
}
}
}

+ 35
- 0
keyboards/archetype/minervalx/keymaps/default/keymap.c 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, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};

+ 35
- 0
keyboards/archetype/minervalx/keymaps/via/keymap.c 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, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};

+ 2
- 0
keyboards/archetype/minervalx/keymaps/via/rules.mk View File

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

+ 22
- 0
keyboards/archetype/minervalx/mcuconf.h 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

+ 24
- 0
keyboards/archetype/minervalx/readme.md 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.

+ 1
- 0
keyboards/archetype/minervalx/rules.mk View File

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

+ 11
- 0
keyboards/arrowmechanics/wings/config.h 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

+ 9
- 0
keyboards/arrowmechanics/wings/halconf.h 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

+ 320
- 0
keyboards/arrowmechanics/wings/info.json 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}
]
}
}
}

+ 25
- 0
keyboards/arrowmechanics/wings/keymaps/default/keymap.c 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

+ 1
- 0
keyboards/arrowmechanics/wings/keymaps/default/rules.mk View File

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

+ 9
- 0
keyboards/arrowmechanics/wings/mcuconf.h 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

+ 29
- 0
keyboards/arrowmechanics/wings/readme.md 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

+ 2
- 0
keyboards/arrowmechanics/wings/rules.mk View File

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

+ 3
- 4
keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h 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

+ 5
- 6
keyboards/bastardkb/charybdis/3x5/v2/stemcell/info.json 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"
}

+ 0
- 2
keyboards/bastardkb/charybdis/3x5/v2/stemcell/rules.mk View File

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


+ 3
- 4
keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h 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

+ 5
- 6
keyboards/bastardkb/charybdis/3x6/v2/stemcell/info.json 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"
}

+ 0
- 2
keyboards/bastardkb/charybdis/3x6/v2/stemcell/rules.mk View File

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


+ 3
- 4
keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h 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

+ 5
- 6
keyboards/bastardkb/charybdis/4x6/v2/stemcell/info.json 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"
}

+ 0
- 2
keyboards/bastardkb/charybdis/4x6/v2/stemcell/rules.mk View File

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


+ 5
- 6
keyboards/bastardkb/scylla/v2/stemcell/info.json 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"
}

+ 0
- 2
keyboards/bastardkb/scylla/v2/stemcell/rules.mk View File

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


+ 5
- 6
keyboards/bastardkb/skeletyl/v2/stemcell/info.json 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"
}

+ 0
- 2
keyboards/bastardkb/skeletyl/v2/stemcell/rules.mk View File

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


+ 5
- 6
keyboards/bastardkb/tbkmini/v2/stemcell/info.json 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"
}

+ 0
- 2
keyboards/bastardkb/tbkmini/v2/stemcell/rules.mk View File

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


+ 81
- 0
keyboards/cipulot/ec_typek/config.h 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

+ 318
- 0
keyboards/cipulot/ec_typek/ec_switch_matrix.c 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;
}

+ 84
- 0
keyboards/cipulot/ec_typek/ec_switch_matrix.h 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);

+ 119
- 0
keyboards/cipulot/ec_typek/ec_typek.c 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;
}

+ 23
- 0
keyboards/cipulot/ec_typek/halconf.h 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>

+ 133
- 0
keyboards/cipulot/ec_typek/info.json 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}
]
}
}
}

+ 41
- 0
keyboards/cipulot/ec_typek/keymaps/default/keymap.c 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, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______)
};

+ 41
- 0
keyboards/cipulot/ec_typek/keymaps/via/keymap.c 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, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______)
};

+ 3
- 0
keyboards/cipulot/ec_typek/keymaps/via/rules.mk View File

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

+ 502
- 0
keyboards/cipulot/ec_typek/keymaps/via/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

+ 42
- 0
keyboards/cipulot/ec_typek/matrix.c 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) {
;
}

+ 28
- 0
keyboards/cipulot/ec_typek/mcuconf.h 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

+ 26
- 0
keyboards/cipulot/ec_typek/readme.md 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

+ 4
- 0
keyboards/cipulot/ec_typek/rules.mk View File

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

+ 66
- 0
keyboards/cipulot/mnk_60_ec/config.h 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

+ 21
- 0
keyboards/cipulot/mnk_60_ec/halconf.h 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>

+ 225
- 0
keyboards/cipulot/mnk_60_ec/info.json 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}
]
}
}
}

+ 42
- 0
keyboards/cipulot/mnk_60_ec/keymaps/60_hhkb/keymap.c 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
};

+ 42
- 0
keyboards/cipulot/mnk_60_ec/keymaps/default/keymap.c 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
};

+ 42
- 0
keyboards/cipulot/mnk_60_ec/keymaps/via/keymap.c 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
};

+ 1
- 0
keyboards/cipulot/mnk_60_ec/keymaps/via/rules.mk View File

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

+ 22
- 0
keyboards/cipulot/mnk_60_ec/mcuconf.h 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

+ 3
- 0
keyboards/cipulot/mnk_60_ec/post_rules.mk View File

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

+ 26
- 0
keyboards/cipulot/mnk_60_ec/readme.md 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

+ 5
- 0
keyboards/cipulot/mnk_60_ec/rules.mk 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

+ 66
- 0
keyboards/cipulot/mnk_65_ec/config.h 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

+ 21
- 0
keyboards/cipulot/mnk_65_ec/halconf.h 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>

+ 100
- 0
keyboards/cipulot/mnk_65_ec/info.json 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}
]
}
}
}

+ 43
- 0
keyboards/cipulot/mnk_65_ec/keymaps/default/keymap.c 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
};

+ 43
- 0
keyboards/cipulot/mnk_65_ec/keymaps/via/keymap.c 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
};

+ 1
- 0
keyboards/cipulot/mnk_65_ec/keymaps/via/rules.mk View File

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

+ 22
- 0
keyboards/cipulot/mnk_65_ec/mcuconf.h 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

+ 3
- 0
keyboards/cipulot/mnk_65_ec/post_rules.mk View File

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

+ 26
- 0
keyboards/cipulot/mnk_65_ec/readme.md View File

@ -0,0 +1,26 @@
# Monokei MNK 65 EC
![MNK 65 EC PCB](https://i.imgur.com/k5ZvGhth.jpeg)
EC version of the Monokei MNK 65.
* Keyboard Maintainer: [cipulot](https://github.com/cipulot)
* Hardware Supported: Monokei MNK 65 EC
* Hardware Availability: [Monokei](https://monokei.co/)
Make example for this keyboard (after setting up your build environment):
make cipulot/mnk_65_ec:default
Flashing example for this keyboard:
make cipulot/mnk_65_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

+ 5
- 0
keyboards/cipulot/mnk_65_ec/rules.mk 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

+ 125
- 0
keyboards/doio/kb3x/info.json View File

@ -0,0 +1,125 @@
{
"manufacturer": "DOIO",
"keyboard_name": "KB3x-01",
"maintainer": "DOIO2022",
"bootloader": "stm32duino",
"diode_direction": "COL2ROW",
"dynamic_keymap": {
"layer_count": 6
},
"encoder": {
"rotary": [
{"pin_a": "B5", "pin_b": "B6", "resolution": 2},
{"pin_a": "A1", "pin_b": "A2", "resolution": 2},
{"pin_a": "A3", "pin_b": "A4", "resolution": 2}
]
},
"features": {
"bootmagic": true,
"encoder": true,
"extrakey": true,
"mousekey": true,
"rgb_matrix": true
},
"matrix_pins": {
"cols": ["B14", "B13", "B12", "B0", "A7", "A6"],
"rows": ["B3", "B4", "B9", "B8"]
},
"processor": "STM32F103",
"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
},
"driver": "ws2812",
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0, "flags": 1},
{"matrix": [0, 1], "x": 75, "y": 0, "flags": 1},
{"matrix": [0, 2], "x": 149, "y": 0, "flags": 1},
{"matrix": [0, 3], "x": 224, "y": 0, "flags": 1},
{"x": 112, "y": 64, "flags": 1},
{"x": 112, "y": 64, "flags": 1},
{"x": 112, "y": 64, "flags": 1},
{"x": 112, "y": 64, "flags": 1}
],
"max_brightness": 200,
"sleep": true
},
"url": "",
"usb": {
"device_version": "0.0.1",
"pid": "0x3F01",
"vid": "0xD010"
},
"ws2812": {
"pin": "A10"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [3, 0], "x": 0, "y": 0},
{"matrix": [3, 1], "x": 1, "y": 0},
{"matrix": [3, 2], "x": 2, "y": 0},
{"matrix": [3, 3], "x": 6.5, "y": 0},
{"matrix": [3, 4], "x": 7.5, "y": 0},
{"matrix": [3, 5], "x": 8.5, "y": 0},
{"matrix": [0, 0], "x": 1, "y": 1.25},
{"matrix": [1, 0], "x": 4.25, "y": 1.25},
{"matrix": [2, 0], "x": 7.5, "y": 1.25},
{"matrix": [0, 3], "x": 0, "y": 2.25},
{"matrix": [0, 4], "x": 1, "y": 2.25, "encoder": 0},
{"matrix": [0, 1], "x": 2, "y": 2.25},
{"matrix": [1, 3], "x": 3.25, "y": 2.25},
{"matrix": [1, 4], "x": 4.25, "y": 2.25, "encoder": 1},
{"matrix": [1, 1], "x": 5.25, "y": 2.25},
{"matrix": [2, 3], "x": 6.5, "y": 2.25},
{"matrix": [2, 4], "x": 7.5, "y": 2.25, "encoder": 2},
{"matrix": [2, 1], "x": 8.5, "y": 2.25},
{"matrix": [0, 2], "x": 1, "y": 3.25},
{"matrix": [1, 2], "x": 4.25, "y": 3.25},
{"matrix": [2, 2], "x": 7.5, "y": 3.25}
]
}
}
}

+ 51
- 0
keyboards/doio/kb3x/keymaps/default/keymap.c View File

@ -0,0 +1,51 @@
/* Copyright 2022 DOIO
* Copyright 2022 DOIO2022 <https://github.com/DOIO2022>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum layer_names {
_LAY0,
_LAY1,
_LAY2
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_LAY0] = LAYOUT(
TO(1), RGB_MOD, RGB_TOG, RGB_HUI, RGB_VAD, RGB_VAI,
KC_MPLY, KC_UP, KC_UP,
KC_MNXT, KC_TRNS, KC_MPRV, A(KC_LEFT), KC_TRNS, A(KC_RIGHT), KC_RIGHT, KC_TRNS, KC_LEFT,
KC_MPLY, KC_DOWN, KC_DOWN),
[_LAY1] = LAYOUT(
TO(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_WH_U, S(KC_RBRC), C(KC_L),
C(KC_WH_D), KC_TRNS, C(KC_WH_U), KC_DOT, KC_TRNS, KC_COMM, C(KC_B), KC_TRNS, C(KC_U),
KC_WH_D, S(KC_LBRC), C(KC_M)),
[_LAY2] = LAYOUT(
TO(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_B, KC_UP, S(KC_I),
KC_P, KC_TRNS, KC_H, KC_RIGHT, KC_TRNS, KC_LEFT, KC_O, KC_TRNS, KC_I,
KC_Y, KC_DOWN, S(KC_O))
};
#ifdef ENCODER_MAP_ENABLE
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[_LAY0] = { ENCODER_CCW_CW(C(KC_DOWN), C(KC_UP)), ENCODER_CCW_CW(C(KC_PMNS), C(KC_PPLS)), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_LAY1] = { ENCODER_CCW_CW(C(KC_PMNS), C(KC_PPLS)), ENCODER_CCW_CW(KC_LBRC, KC_RBRC), ENCODER_CCW_CW(C(S(KC_U)), C(KC_I)) },
[_LAY2] = { ENCODER_CCW_CW(KC_C, KC_V), ENCODER_CCW_CW(KC_MINS, KC_EQL), ENCODER_CCW_CW(KC_J, KC_L) }
};
#endif

+ 1
- 0
keyboards/doio/kb3x/keymaps/default/rules.mk View File

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

+ 73
- 0
keyboards/doio/kb3x/keymaps/via/keymap.c View File

@ -0,0 +1,73 @@
/* Copyright 2022 DOIO
* Copyright 2022 DOIO2022 <https://github.com/DOIO2022>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum layer_names {
_LAY0,
_LAY1,
_LAY2,
_LAY3,
_LAY4,
_LAY5
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_LAY0] = LAYOUT(
TO(1), RGB_MOD, RGB_TOG, RGB_HUI, RGB_VAD, RGB_VAI,
KC_MPLY, KC_UP, KC_UP,
KC_MNXT, KC_TRNS, KC_MPRV, A(KC_LEFT), KC_TRNS, A(KC_RIGHT), KC_RIGHT, KC_TRNS, KC_LEFT,
KC_MPLY, KC_DOWN, KC_DOWN),
[_LAY1] = LAYOUT(
TO(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_WH_U, S(KC_RBRC), C(KC_L),
C(KC_WH_D), KC_TRNS, C(KC_WH_U), KC_DOT, KC_TRNS, KC_COMM, C(KC_B), KC_TRNS, C(KC_U),
KC_WH_D, S(KC_LBRC), C(KC_M)),
[_LAY2] = LAYOUT(
TO(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_B, KC_UP, S(KC_I),
KC_P, KC_TRNS, KC_H, KC_RIGHT, KC_TRNS, KC_LEFT, KC_O, KC_TRNS, KC_I,
KC_Y, KC_DOWN, S(KC_O)),
[_LAY3] = LAYOUT(
TO(4), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS),
[_LAY4] = LAYOUT(
TO(5), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS),
[_LAY5] = LAYOUT(
TO(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS),
};
#ifdef ENCODER_MAP_ENABLE
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[_LAY0] = { ENCODER_CCW_CW(C(KC_DOWN), C(KC_UP)), ENCODER_CCW_CW(C(KC_PMNS), C(KC_PPLS)), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_LAY1] = { ENCODER_CCW_CW(C(KC_PMNS), C(KC_PPLS)), ENCODER_CCW_CW(KC_LBRC, KC_RBRC), ENCODER_CCW_CW(C(S(KC_U)), C(KC_I)) },
[_LAY2] = { ENCODER_CCW_CW(KC_C, KC_V), ENCODER_CCW_CW(KC_MINS, KC_EQL), ENCODER_CCW_CW(KC_J, KC_L) },
[_LAY3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
[_LAY4] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
[_LAY5] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
};
#endif

+ 2
- 0
keyboards/doio/kb3x/keymaps/via/rules.mk View File

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

+ 26
- 0
keyboards/doio/kb3x/readme.md View File

@ -0,0 +1,26 @@
# doio/kb3x
![kb3x-01](https://i.imgur.com/6DvIu9Mh.png)
QMK for DOIO Knob keypad .
* Keyboard Maintainer: DOIO2022
* Hardware Supported: DOIO Knob keypad
Make example for this keyboard (after setting up your build environment):
make doio/kb3x:default
Flashing example for this keyboard:
make doio/kb3x: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
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

+ 1
- 0
keyboards/doio/kb3x/rules.mk View File

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

+ 104
- 0
keyboards/handwired/jotlily60/info.json View File

@ -0,0 +1,104 @@
{
"manufacturer": "Jotix",
"keyboard_name": "jotlily60",
"maintainer" : "jotix",
"url": "https://github.com/qmk/qmk_firmware/tree/master/keyboards/handwired/jotlily60",
"usb": {
"vid": "0x4A4F",
"pid": "0x2332",
"device_version": "0.0.1"
},
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"development_board": "promicro",
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": [ "D0", "D4", "C6", "D7", "E6", "B4", "B5" ],
"rows": [ "F7", "B1", "B3", "B2", "B6" ],
},
"split": {
"enabled": true,
"soft_serial_pin": "D3"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0.5},
{"matrix": [0, 1], "x": 1, "y": 0.5},
{"matrix": [0, 2], "x": 2, "y": 0.25},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0.25},
{"matrix": [0, 5], "x": 5, "y": 0.25},
{"matrix": [5, 5], "x": 10, "y": 0.25},
{"matrix": [5, 4], "x": 11, "y": 0.25},
{"matrix": [5, 3], "x": 12, "y": 0},
{"matrix": [5, 2], "x": 13, "y": 0.25},
{"matrix": [5, 1], "x": 14, "y": 0.5},
{"matrix": [5, 0], "x": 15, "y": 0.5},
{"matrix": [1, 0], "x": 0, "y": 1.5},
{"matrix": [1, 1], "x": 1, "y": 1.5},
{"matrix": [1, 2], "x": 2, "y": 1.25},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [1, 4], "x": 4, "y": 1.25},
{"matrix": [1, 5], "x": 5, "y": 1.25},
{"matrix": [6, 5], "x": 10, "y": 1.25},
{"matrix": [6, 4], "x": 11, "y": 1.25},
{"matrix": [6, 3], "x": 12, "y": 1},
{"matrix": [6, 2], "x": 13, "y": 1.25},
{"matrix": [6, 1], "x": 14, "y": 1.5},
{"matrix": [6, 0], "x": 15, "y": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2.5},
{"matrix": [2, 1], "x": 1, "y": 2.5},
{"matrix": [2, 2], "x": 2, "y": 2.25},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [2, 4], "x": 4, "y": 2.25},
{"matrix": [2, 5], "x": 5, "y": 2.25},
{"matrix": [7, 5], "x": 10, "y": 2.25},
{"matrix": [7, 4], "x": 11, "y": 2.25},
{"matrix": [7, 3], "x": 12, "y": 2},
{"matrix": [7, 2], "x": 13, "y": 2.25},
{"matrix": [7, 1], "x": 14, "y": 2.5},
{"matrix": [7, 0], "x": 15, "y": 2.5},
{"matrix": [3, 0], "x": 0, "y": 3.5},
{"matrix": [3, 1], "x": 1, "y": 3.5},
{"matrix": [3, 2], "x": 2, "y": 3.25},
{"matrix": [3, 3], "x": 3, "y": 3},
{"matrix": [3, 4], "x": 4, "y": 3.25},
{"matrix": [3, 5], "x": 5, "y": 3.25},
{"matrix": [3, 6], "x": 6, "y": 3.5},
{"matrix": [8, 6], "x": 9, "y": 3.5},
{"matrix": [8, 5], "x": 10, "y": 3.25},
{"matrix": [8, 4], "x": 11, "y": 3.25},
{"matrix": [8, 3], "x": 12, "y": 3},
{"matrix": [8, 2], "x": 13, "y": 3.25},
{"matrix": [8, 1], "x": 14, "y": 3.5},
{"matrix": [8, 0], "x": 15, "y": 3.5},
{"matrix": [4, 2], "x": 2, "y": 4.25},
{"matrix": [4, 3], "x": 3, "y": 4},
{"matrix": [4, 4], "x": 4, "y": 4.25},
{"matrix": [4, 5], "x": 5, "y": 4.5},
{"matrix": [4, 6], "x": 6, "y": 4.75},
{"matrix": [9, 6], "x": 9, "y": 4.75},
{"matrix": [9, 5], "x": 10, "y": 4.5},
{"matrix": [9, 4], "x": 11, "y": 4.25},
{"matrix": [9, 3], "x": 12, "y": 4},
{"matrix": [9, 2], "x": 13, "y": 4.25}
]
}
}
}

+ 65
- 0
keyboards/handwired/jotlily60/keymaps/default/keymap.c View File

@ -0,0 +1,65 @@
// Copyright 2024 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
enum layers {
_QWERTY,
_FN,
_ADJUST
};
#define FN MO(_FN)
#define ADJUST MO(_ADJUST)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
* +-------+-------+-------+-------+-------+-------+ +-------+-------+-------+-------+-------+-------+
* | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - |
* +-------+-------+-------+-------+-------+-------+ +-------+-------+-------+-------+-------+-------+
* | esc | Q | W | E | R | T | | Y | U | I | O | P | tab |
* +-------+-------+-------+-------+-------+-------+ +-------+-------+-------+-------+-------+-------+
* | caps | A | S | D | F | G | | H | J | K | L | ; | ' |
* +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
* | shift | Z | X | C | V | B | { | } | N | M | , | . | / | enter |
* +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
* | alt | super | ctrl | space | fn | fn | bspc | del | meh | ralt |
* +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
*/
[_QWERTY] = LAYOUT (
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TAB,
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_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR,KC_RCBR,KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_ENT,
KC_LALT,KC_LGUI,KC_LCTL,KC_SPC, FN, FN, KC_BSPC,KC_DEL, KC_MEH, KC_RALT
),
/* +-------+-------+-------+-------+-------+-------+ +-------+-------+-------+-------+-------+-------+
* | + | ! | @ | # | $ | % | | ^ | & | * | ( | ) | _ |
* +-------+-------+-------+-------+-------+-------+ +-------+-------+-------+-------+-------+-------+
* |adjust | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | |
* +-------+-------+-------+-------+-------+-------+ +-------+-------+-------+-------+-------+-------+
* | | F11 | F12 | F13 | F14 | F15 | | left | down | up | right | | | " |
* +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
* | | vol- | mute | vol+ | ` | ~ | [ | ] | home | end | pgup | pgdn | \ | |
* +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
* | | | | | | | | | | |
* +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
*/
[_FN] = LAYOUT (
KC_PLUS,KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC, KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_UNDS,
ADJUST, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
_______,KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_LEFT,KC_DOWN,KC_UP, KC_RGHT,KC_BSLS,KC_DQUO,
_______,KC_VOLD,KC_MUTE,KC_VOLU,KC_GRV, KC_TILD,KC_LBRC,KC_RBRC,KC_HOME,KC_END, KC_PGUP,KC_PGDN,KC_PIPE,_______,
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______
),
[_ADJUST] = LAYOUT (
_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
_______,QK_BOOT,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
_______,_______,_______,DB_TOGG,_______,_______, _______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______
),
};

+ 31
- 0
keyboards/handwired/jotlily60/keymaps/via/keymap.c View File

@ -0,0 +1,31 @@
// Copyright 2024 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT (
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TAB,
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_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR,KC_RCBR,KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_ENT,
KC_LALT,KC_LGUI,KC_LCTL,KC_SPC, MO(1), MO(1), KC_BSPC,KC_DEL, KC_MEH, KC_RALT
),
[1] = LAYOUT (
KC_PLUS,KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC, KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_UNDS,
MO(2), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
_______,KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_LEFT,KC_DOWN,KC_UP, KC_RGHT,KC_BSLS,KC_DQUO,
_______,KC_VOLD,KC_MUTE,KC_VOLU,KC_GRV, KC_TILD,KC_LBRC,KC_RBRC,KC_HOME,KC_END, KC_PGUP,KC_PGDN,KC_PIPE,_______,
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______
),
[2] = LAYOUT (
_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
_______,QK_BOOT,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______,_______,_______,_______,_______,_______,_______,_______
)
};

+ 1
- 0
keyboards/handwired/jotlily60/keymaps/via/rules.mk View File

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

+ 55
- 0
keyboards/handwired/jotlily60/readme.md View File

@ -0,0 +1,55 @@
# jotlily60
![jotlily60](https://i.imgur.com/I68WGmJh.jpg)
A split keyboard kit made by jotix, inspired in the Lily58 keyboard.
* Keyboard Maintainer: [jotix](https://github.com/jotix)
* Hardware Supported: Arduino Pro Micro
---
### Arduino Pro Micro Pinout
| Rows | 0 | 1 | 2 | 3 | 4 |
|-------------|----|----|----|----|----|
| Arduino pin | A0 | 15 | 14 | 16 | 10 |
| QMK pin | F7 | B1 | B3 | B2 | B6 |
| Columns | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|-------------|----|----|----|----|----|----|----|
| Arduino pin | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| QMK pin | D0 | D4 | C6 | D7 | E6 | B4 | B5 |
| Serial | |
|-------------|-----|
| Arduino pin | TX0 |
| QMK pin | D3 |
---
### Compiling the Firmware
Compile example for this keyboard (after setting up your build environment):
qmk compile -kb handwired/jotlily60 -km default
---
### The Defaukt Keymap
+-------+-------+-------+-------+-------+-------+ +-------+-------+-------+-------+-------+-------+
| = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - |
+-------+-------+-------+-------+-------+-------+ +-------+-------+-------+-------+-------+-------+
| esc | Q | W | E | R | T | | Y | U | I | O | P | tab |
+-------+-------+-------+-------+-------+-------+ +-------+-------+-------+-------+-------+-------+
| caps | A | S | D | F | G | | H | J | K | L | ; | ' |
+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| shift | Z | X | C | V | B | { | } | N | M | , | . | / | enter |
+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| alt | super | ctrl | space | fn | fn | bspc | del | meh | ralt |
+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
---
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).

+ 1
- 0
keyboards/handwired/jotlily60/rules.mk View File

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

+ 38
- 0
keyboards/handwired/technicpad/info.json View File

@ -0,0 +1,38 @@
{
"manufacturer": "nwhirschfeld",
"keyboard_name": "TechnicPad",
"maintainer": "nwhirschfeld",
"build": {
"lto": true
},
"development_board": "promicro",
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true
},
"matrix_pins": {
"direct": [
["D1"],
["D0"],
["D4"],
["C6"]
]
},
"url": "https://github.com/nwhirschfeld/TechnicPad",
"usb": {
"device_version": "0.0.1",
"pid": "0x5450",
"vid": "0x4E57"
},
"layouts": {
"LAYOUT": {
"layout": [
{"label": "D1", "matrix": [0, 0], "x": 0, "y": 0},
{"label": "D0", "matrix": [1, 0], "x": 0, "y": 1},
{"label": "D4", "matrix": [2, 0], "x": 1, "y": 0},
{"label": "C6", "matrix": [3, 0], "x": 1, "y": 1}
]
}
}
}

+ 8
- 0
keyboards/handwired/technicpad/keymaps/default/keymap.json View File

@ -0,0 +1,8 @@
{
"keyboard": "technicpad",
"keymap": "default",
"layers": [
["KC_A", "KC_B", "KC_C", "KC_D"]
],
"layout": "LAYOUT"
}

+ 13
- 0
keyboards/handwired/technicpad/keymaps/via/keymap.json View File

@ -0,0 +1,13 @@
{
"keyboard": "technicpad",
"keymap": "via",
"config": {
"features": {
"via": true
}
},
"layers": [
["KC_A", "KC_B", "KC_C", "KC_D"]
],
"layout": "LAYOUT"
}

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

Loading…
Cancel
Save