Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b66acf04a | ||
|
|
5ac6fe1888 | ||
|
|
979ac0d8da | ||
|
|
7a89b51018 | ||
|
|
2a05d433c9 | ||
|
|
1aa40dde46 | ||
|
|
2ffb08843b | ||
|
|
2a8ccafe6e | ||
|
|
1757960b7b |
No files matched your search
+1
-1
@@ -23,4 +23,4 @@ endif
|
|||||||
|
|
||||||
# Generate the keymap.c
|
# Generate the keymap.c
|
||||||
$(KEYBOARD_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
|
$(KEYBOARD_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
|
||||||
bin/qmk json-keymap --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
|
bin/qmk json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
|
||||||
+104
-1
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
QMK can leverage the Analog-to-Digital Converter (ADC) on supported MCUs to measure voltages on certain pins. This can be useful for implementing things such as battery level indicators for Bluetooth keyboards, or volume controls using a potentiometer, as opposed to a [rotary encoder](feature_encoders.md).
|
QMK can leverage the Analog-to-Digital Converter (ADC) on supported MCUs to measure voltages on certain pins. This can be useful for implementing things such as battery level indicators for Bluetooth keyboards, or volume controls using a potentiometer, as opposed to a [rotary encoder](feature_encoders.md).
|
||||||
|
|
||||||
This driver is currently AVR-only. The values returned are 10-bit integers (0-1023) mapped between 0V and VCC (usually 5V or 3.3V).
|
This driver currently supports both AVR and a limited selection of ARM devices. On AVR devices, the values returned are 10-bit integers (0-1023) mapped between 0V and VCC (usually 5V or 3.3V). On supported ARM devices, there is more flexibility in control of operation through `#define`s, but by default the values returned are 12-bit integers (0-4095) mapped between 0V and VCC (usually 3.3V).
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
@@ -20,6 +20,8 @@ Then place this include at the top of your code:
|
|||||||
|
|
||||||
## Channels
|
## Channels
|
||||||
|
|
||||||
|
### AVR
|
||||||
|
|
||||||
|Channel|AT90USB64/128|ATmega16/32U4|ATmega32A|ATmega328P|
|
|Channel|AT90USB64/128|ATmega16/32U4|ATmega32A|ATmega328P|
|
||||||
|-------|-------------|-------------|---------|----------|
|
|-------|-------------|-------------|---------|----------|
|
||||||
|0 |`F0` |`F0` |`A0` |`C0` |
|
|0 |`F0` |`F0` |`A0` |`C0` |
|
||||||
@@ -39,8 +41,84 @@ Then place this include at the top of your code:
|
|||||||
|
|
||||||
<sup>\* The ATmega328P possesses two extra ADC channels; however, they are not present on the DIP pinout, and are not shared with GPIO pins. You can use `adc_read()` directly to gain access to these.</sup>
|
<sup>\* The ATmega328P possesses two extra ADC channels; however, they are not present on the DIP pinout, and are not shared with GPIO pins. You can use `adc_read()` directly to gain access to these.</sup>
|
||||||
|
|
||||||
|
### ARM
|
||||||
|
|
||||||
|
Note that some of these pins are doubled-up on ADCs with the same channel. This is because the pins can be used for either ADC.
|
||||||
|
|
||||||
|
Also note that the F0 and F3 use different numbering schemes. The F0 has a single ADC and the channels are 0-based, whereas the F3 has 4 ADCs and the channels are 1 based. This is because the F0 uses the `ADCv1` implementation of the ADC, whereas the F3 uses the `ADCv3` implementation.
|
||||||
|
|
||||||
|
|ADC|Channel|STM32F0XX|STM32F3XX|
|
||||||
|
|---|-------|---------|---------|
|
||||||
|
|1 |0 |`A0` | |
|
||||||
|
|1 |1 |`A1` |`A0` |
|
||||||
|
|1 |2 |`A2` |`A1` |
|
||||||
|
|1 |3 |`A3` |`A2` |
|
||||||
|
|1 |4 |`A4` |`A3` |
|
||||||
|
|1 |5 |`A5` |`F4` |
|
||||||
|
|1 |6 |`A6` |`C0` |
|
||||||
|
|1 |7 |`A7` |`C1` |
|
||||||
|
|1 |8 |`B0` |`C2` |
|
||||||
|
|1 |9 |`B1` |`C3` |
|
||||||
|
|1 |10 |`C0` |`F2` |
|
||||||
|
|1 |11 |`C1` | |
|
||||||
|
|1 |12 |`C2` | |
|
||||||
|
|1 |13 |`C3` | |
|
||||||
|
|1 |14 |`C4` | |
|
||||||
|
|1 |15 |`C5` | |
|
||||||
|
|1 |16 | | |
|
||||||
|
|2 |1 | |`A4` |
|
||||||
|
|2 |2 | |`A5` |
|
||||||
|
|2 |3 | |`A6` |
|
||||||
|
|2 |4 | |`A7` |
|
||||||
|
|2 |5 | |`C4` |
|
||||||
|
|2 |6 | |`C0` |
|
||||||
|
|2 |7 | |`C1` |
|
||||||
|
|2 |8 | |`C2` |
|
||||||
|
|2 |9 | |`C3` |
|
||||||
|
|2 |10 | |`F2` |
|
||||||
|
|2 |11 | |`C5` |
|
||||||
|
|2 |12 | |`B2` |
|
||||||
|
|2 |13 | | |
|
||||||
|
|2 |14 | | |
|
||||||
|
|2 |15 | | |
|
||||||
|
|2 |16 | | |
|
||||||
|
|3 |1 | |`B1` |
|
||||||
|
|3 |2 | |`E9` |
|
||||||
|
|3 |3 | |`E13` |
|
||||||
|
|3 |4 | | |
|
||||||
|
|3 |5 | | |
|
||||||
|
|3 |6 | |`E8` |
|
||||||
|
|3 |7 | |`D10` |
|
||||||
|
|3 |8 | |`D11` |
|
||||||
|
|3 |9 | |`D12` |
|
||||||
|
|3 |10 | |`D13` |
|
||||||
|
|3 |11 | |`D14` |
|
||||||
|
|3 |12 | |`B0` |
|
||||||
|
|3 |13 | |`E7` |
|
||||||
|
|3 |14 | |`E10` |
|
||||||
|
|3 |15 | |`E11` |
|
||||||
|
|3 |16 | |`E12` |
|
||||||
|
|4 |1 | |`E14` |
|
||||||
|
|4 |2 | |`B12` |
|
||||||
|
|4 |3 | |`B13` |
|
||||||
|
|4 |4 | |`B14` |
|
||||||
|
|4 |5 | |`B15` |
|
||||||
|
|4 |6 | |`E8` |
|
||||||
|
|4 |7 | |`D10` |
|
||||||
|
|4 |8 | |`D11` |
|
||||||
|
|4 |9 | |`D12` |
|
||||||
|
|4 |10 | |`D13` |
|
||||||
|
|4 |11 | |`D14` |
|
||||||
|
|4 |12 | |`D8` |
|
||||||
|
|4 |13 | |`D9` |
|
||||||
|
|4 |14 | | |
|
||||||
|
|4 |15 | | |
|
||||||
|
|4 |16 | | |
|
||||||
|
|
||||||
## Functions
|
## Functions
|
||||||
|
|
||||||
|
### AVR
|
||||||
|
|
||||||
|Function |Description |
|
|Function |Description |
|
||||||
|----------------------------|-------------------------------------------------------------------------------------------------------------------|
|
|----------------------------|-------------------------------------------------------------------------------------------------------------------|
|
||||||
|`analogReference(mode)` |Sets the analog voltage reference source. Must be one of `ADC_REF_EXTERNAL`, `ADC_REF_POWER` or `ADC_REF_INTERNAL`.|
|
|`analogReference(mode)` |Sets the analog voltage reference source. Must be one of `ADC_REF_EXTERNAL`, `ADC_REF_POWER` or `ADC_REF_INTERNAL`.|
|
||||||
@@ -48,3 +126,28 @@ Then place this include at the top of your code:
|
|||||||
|`analogReadPin(pin)` |Reads the value from the specified QMK pin, eg. `F6` for ADC6 on the ATmega32U4. |
|
|`analogReadPin(pin)` |Reads the value from the specified QMK pin, eg. `F6` for ADC6 on the ATmega32U4. |
|
||||||
|`pinToMux(pin)` |Translates a given QMK pin to a mux value. If an unsupported pin is given, returns the mux value for "0V (GND)". |
|
|`pinToMux(pin)` |Translates a given QMK pin to a mux value. If an unsupported pin is given, returns the mux value for "0V (GND)". |
|
||||||
|`adc_read(mux)` |Reads the value from the ADC according to the specified mux. See your MCU's datasheet for more information. |
|
|`adc_read(mux)` |Reads the value from the ADC according to the specified mux. See your MCU's datasheet for more information. |
|
||||||
|
|
||||||
|
### ARM
|
||||||
|
|
||||||
|
Note that care was taken to match all of the functions used for AVR devices, however complications in the ARM platform prevent that from always being possible. For example, the `STM32` chips do not have assigned Arduino pins. We could use the default pin numbers, but those numbers change based on the package type of the device. For this reason, please specify your target pins with their identifiers (`A0`, `F3`, etc.). Also note that there are some variants of functions that accept the target ADC for the pin. Some pins can be used for multiple ADCs, and this specified can help you pick which ADC will be used to interact with that pin.
|
||||||
|
|
||||||
|
|Function |Description |
|
||||||
|
|----------------------------|--------------------------------------------------------------------------------------------------------------------|
|
||||||
|
|`analogReadPin(pin)` |Reads the value from the specified QMK pin, eg. `A0` for channel 0 on the STM32F0 and ADC1 channel 1 on the STM32F3. Note that if a pin can be used for multiple ADCs, it will pick the lower numbered ADC for this function. eg. `C0` will be channel 6 of ADC 1 when it could be used for ADC 2 as well.|
|
||||||
|
|`analogReadPinAdc(pin, adc)`|Reads the value from the specified QMK pin and ADC, eg. `C0, 1` will read from channel 6, ADC 2 instead of ADC 1. Note that the ADCs are 0-indexed for this function.|
|
||||||
|
|`pinToMux(pin)` |Translates a given QMK pin to a channel and ADC combination. If an unsupported pin is given, returns the mux value for "0V (GND)".|
|
||||||
|
|`adc_read(mux)` |Reads the value from the ADC according to the specified pin and adc combination. See your MCU's datasheet for more information.|
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
## ARM
|
||||||
|
|
||||||
|
The ARM implementation of the ADC has a few additional options that you can override in your own keyboards and keymaps to change how it operates.
|
||||||
|
|
||||||
|
|`#define` |Type |Default |Description|
|
||||||
|
|-------------------|------|---------------------|-----------|
|
||||||
|
|ADC_CIRCULAR_BUFFER|`bool`|`false` |If `TRUE`, then the implementation will use a circular buffer.|
|
||||||
|
|ADC_NUM_CHANNELS |`int` |`1` |Sets the number of channels that will be scanned as part of an ADC operation. The current implementation only supports `1`.|
|
||||||
|
|ADC_BUFFER_DEPTH |`int` |`2` |Sets the depth of each result. Since we are only getting a 12-bit result by default, we set this to `2` bytes so we can contain our one value. This could be set to 1 if you opt for a 8-bit or lower result.|
|
||||||
|
|ADC_SAMPLING_RATE |`int` |`ADC_SMPR_SMP_1P5` |Sets the sampling rate of the ADC. By default, it is set to the fastest setting. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.|
|
||||||
|
|ADC_RESOLUTION |`int` |`ADC_CFGR1_RES_12BIT`|The resolution of your result. We choose 12 bit by default, but you can opt for 12, 10, 8, or 6 bit. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.|
|
||||||
+2
-2
@@ -231,14 +231,14 @@ Check your environment and report problems only:
|
|||||||
|
|
||||||
qmk doctor -n
|
qmk doctor -n
|
||||||
|
|
||||||
## `qmk json-keymap`
|
## `qmk json2c`
|
||||||
|
|
||||||
Creates a keymap.c from a QMK Configurator export.
|
Creates a keymap.c from a QMK Configurator export.
|
||||||
|
|
||||||
**Usage**:
|
**Usage**:
|
||||||
|
|
||||||
```
|
```
|
||||||
qmk json-keymap [-o OUTPUT] filename
|
qmk json2c [-o OUTPUT] filename
|
||||||
```
|
```
|
||||||
|
|
||||||
## `qmk kle2json`
|
## `qmk kle2json`
|
||||||
|
|||||||
@@ -190,6 +190,8 @@ If you define these options you will enable the associated feature, which may in
|
|||||||
* pin the DI on the WS2812 is hooked-up to
|
* pin the DI on the WS2812 is hooked-up to
|
||||||
* `#define RGBLIGHT_ANIMATIONS`
|
* `#define RGBLIGHT_ANIMATIONS`
|
||||||
* run RGB animations
|
* run RGB animations
|
||||||
|
* `#define RGBLIGHT_LAYERS`
|
||||||
|
* Lets you define [lighting layers](feature_rgblight.md) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state.
|
||||||
* `#define RGBLED_NUM 12`
|
* `#define RGBLED_NUM 12`
|
||||||
* number of LEDs
|
* number of LEDs
|
||||||
* `#define RGBLIGHT_SPLIT`
|
* `#define RGBLIGHT_SPLIT`
|
||||||
|
|||||||
@@ -172,6 +172,62 @@ const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31};
|
|||||||
const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 170, 127, 85, 64};
|
const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 170, 127, 85, 64};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Lighting Layers
|
||||||
|
|
||||||
|
By including `#define RGBLIGHT_LAYERS` in your `config.h` file you can enable lighting layers. These make
|
||||||
|
it easy to use your underglow LEDs as status indicators to show which keyboard layer is currently active, or the state of caps lock, all without disrupting any animations. [Here's a video](https://youtu.be/uLGE1epbmdY) showing an example of what you can do.
|
||||||
|
|
||||||
|
To define a layer, we modify `keymap.c` to list out LED ranges and the colors we want to overlay on them using an array of `rgblight_segment_t` using the `RGBLIGHT_LAYER_SEGMENTS` macro. We can define multiple layers and enable/disable them independently:
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Light LEDs 6 to 9 and 12 to 15 red when caps lock is active. Hard to ignore!
|
||||||
|
const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
|
||||||
|
{6, 4, HSV_RED}, // Light 4 LEDs, starting with LED 6
|
||||||
|
{12, 4, HSV_RED} // Light 4 LEDs, starting with LED 12
|
||||||
|
);
|
||||||
|
// Light LEDs 9 & 10 in cyan when keyboard layer 1 is active
|
||||||
|
const rgblight_segment_t PROGMEM my_layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(
|
||||||
|
{9, 2, HSV_CYAN}
|
||||||
|
);
|
||||||
|
// Light LEDs 11 & 12 in purple when keyboard layer 2 is active
|
||||||
|
const rgblight_segment_t PROGMEM my_layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS(
|
||||||
|
{11, 2, HSV_PURPLE},
|
||||||
|
);
|
||||||
|
// etc..
|
||||||
|
```
|
||||||
|
|
||||||
|
We combine these layers into an array using the `RGBLIGHT_LAYERS_LIST` macro, and assign it to the `rgblight_layers` variable during keyboard setup. Note that you can only define up to 8 lighting layers. Any extra layers will be ignored. Since the different lighting layers overlap, the order matters in the array, with later layers taking precedence:
|
||||||
|
|
||||||
|
```c
|
||||||
|
// 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_layer1_layer, // Overrides caps lock layer
|
||||||
|
my_layer2_layer // Overrides other layers
|
||||||
|
);
|
||||||
|
|
||||||
|
void keyboard_post_init_user(void) {
|
||||||
|
// Enable the LED layers
|
||||||
|
rgblight_layers = my_rgb_layers;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally, we enable and disable the lighting layers whenever the state of the keyboard changes:
|
||||||
|
|
||||||
|
```c
|
||||||
|
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||||
|
// Both layers will light up if both kb layers are active
|
||||||
|
rgblight_set_layer_state(1, layer_state_cmp(state, 1));
|
||||||
|
rgblight_set_layer_state(2, layer_state_cmp(state, 2));
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool led_update_user(led_t led_state) {
|
||||||
|
rgblight_set_layer_state(0, led_state.caps_lock);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Functions
|
## Functions
|
||||||
|
|
||||||
If you need to change your RGB lighting in code, for example in a macro to change the color whenever you switch layers, QMK provides a set of functions to assist you. See [`rgblight.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight.h) for the full list, but the most commonly used functions include:
|
If you need to change your RGB lighting in code, for example in a macro to change the color whenever you switch layers, QMK provides a set of functions to assist you. See [`rgblight.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight.h) for the full list, but the most commonly used functions include:
|
||||||
@@ -263,6 +319,12 @@ rgblight_sethsv(HSV_GREEN, 2); // led 2
|
|||||||
|`rgblight_sethsv(h, s, v)` |Set effect range LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 |
|
|`rgblight_sethsv(h, s, v)` |Set effect range LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 |
|
||||||
|`rgblight_sethsv_noeeprom(h, s, v)` |Set effect range LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 (not written to EEPROM) |
|
|`rgblight_sethsv_noeeprom(h, s, v)` |Set effect range LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 (not written to EEPROM) |
|
||||||
|
|
||||||
|
#### layer functions
|
||||||
|
|Function |Description |
|
||||||
|
|--------------------------------------------|-------------|
|
||||||
|
|`rgblight_get_layer_state(i)` |Returns `true` if lighting layer `i` is enabled |
|
||||||
|
|`rgblight_set_layer_state(i, is_on)` |Enable or disable lighting layer `i` based on value of `bool is_on` |
|
||||||
|
|
||||||
#### query
|
#### query
|
||||||
|Function |Description |
|
|Function |Description |
|
||||||
|-----------------------|-----------------|
|
|-----------------------|-----------------|
|
||||||
|
|||||||
+2
-2
@@ -215,14 +215,14 @@ qmk doctor [-y] [-n]
|
|||||||
|
|
||||||
qmk doctor -n
|
qmk doctor -n
|
||||||
|
|
||||||
## `qmk json-keymap`
|
## `qmk json2c`
|
||||||
|
|
||||||
QMK Configurator からエクスポートしたものから keymap.c を生成します。
|
QMK Configurator からエクスポートしたものから keymap.c を生成します。
|
||||||
|
|
||||||
**使用法**:
|
**使用法**:
|
||||||
|
|
||||||
```
|
```
|
||||||
qmk json-keymap [-o OUTPUT] filename
|
qmk json2c [-o OUTPUT] filename
|
||||||
```
|
```
|
||||||
|
|
||||||
## `qmk kle2json`
|
## `qmk kle2json`
|
||||||
|
|||||||
@@ -0,0 +1,207 @@
|
|||||||
|
/* Copyright 2019 Drew Mills
|
||||||
|
*
|
||||||
|
* 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 "analog.h"
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
/* User configurable ADC options */
|
||||||
|
#ifndef ADC_CIRCULAR_BUFFER
|
||||||
|
# define ADC_CIRCULAR_BUFFER FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ADC_NUM_CHANNELS
|
||||||
|
# define ADC_NUM_CHANNELS 1
|
||||||
|
#elif ADC_NUM_CHANNELS != 1
|
||||||
|
# error "The ARM ADC implementation currently only supports reading one channel at a time."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ADC_BUFFER_DEPTH
|
||||||
|
# define ADC_BUFFER_DEPTH 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For more sampling rate options, look at hal_adc_lld.h in ChibiOS
|
||||||
|
#ifndef ADC_SAMPLING_RATE
|
||||||
|
# define ADC_SAMPLING_RATE ADC_SMPR_SMP_1P5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Options are 12, 10, 8, and 6 bit.
|
||||||
|
#ifndef ADC_RESOLUTION
|
||||||
|
# define ADC_RESOLUTION ADC_CFGR1_RES_12BIT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static ADCConfig adcCfg = {};
|
||||||
|
static adcsample_t sampleBuffer[ADC_NUM_CHANNELS * ADC_BUFFER_DEPTH];
|
||||||
|
|
||||||
|
// Initialize to max number of ADCs, set to empty object to initialize all to false.
|
||||||
|
#if defined(STM32F0XX)
|
||||||
|
static bool adcInitialized[1] = {};
|
||||||
|
#elif defined(STM32F3XX)
|
||||||
|
static bool adcInitialized[4] = {};
|
||||||
|
#else
|
||||||
|
# error "adcInitialized has not been implemented for this ARM microcontroller."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static ADCConversionGroup adcConversionGroup = {
|
||||||
|
ADC_CIRCULAR_BUFFER,
|
||||||
|
(uint16_t)(ADC_NUM_CHANNELS),
|
||||||
|
NULL, // No end callback
|
||||||
|
NULL, // No error callback
|
||||||
|
#if defined(STM32F0XX)
|
||||||
|
ADC_CFGR1_CONT | ADC_RESOLUTION,
|
||||||
|
ADC_TR(0, 0).ADC_SAMPLING_RATE,
|
||||||
|
NULL, // Doesn't specify a default channel
|
||||||
|
#elif defined(STM32F3XX)
|
||||||
|
ADC_CFGR_CONT | ADC_RESOLUTION,
|
||||||
|
ADC_TR(0, 4095),
|
||||||
|
{
|
||||||
|
ADC_SAMPLING_RATE,
|
||||||
|
ADC_SAMPLING_RATE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
0, // Doesn't specify a default channel
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline ADCDriver* intToADCDriver(uint8_t adcInt) {
|
||||||
|
ADCDriver* target;
|
||||||
|
|
||||||
|
switch (adcInt) {
|
||||||
|
// clang-format off
|
||||||
|
#if STM32_ADC_USE_ADC1
|
||||||
|
case 0: target = &ADCD1; break;
|
||||||
|
#endif
|
||||||
|
#if STM32_ADC_USE_ADC2
|
||||||
|
case 1: target = &ADCD2; break;
|
||||||
|
#endif
|
||||||
|
#if STM32_ADC_USE_ADC3
|
||||||
|
case 2: target = &ADCD3; break;
|
||||||
|
#endif
|
||||||
|
#if STM32_ADC_USE_ADC4
|
||||||
|
case 3: target = &ADCD4; break;
|
||||||
|
#endif
|
||||||
|
default: target = NULL; break;
|
||||||
|
// clang-format on
|
||||||
|
}
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void manageAdcInitializationDriver(uint8_t adc, ADCDriver* adcDriver) {
|
||||||
|
if (!adcInitialized[adc]) {
|
||||||
|
adcStart(adcDriver, &adcCfg);
|
||||||
|
adcInitialized[adc] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void manageAdcInitialization(uint8_t adc) { manageAdcInitializationDriver(adc, intToADCDriver(adc)); }
|
||||||
|
|
||||||
|
pin_and_adc pinToMux(pin_t pin) {
|
||||||
|
switch (pin) {
|
||||||
|
// clang-format off
|
||||||
|
#if defined(STM32F0XX)
|
||||||
|
case A0: return (pin_and_adc){ ADC_CHANNEL_IN0, 0 };
|
||||||
|
case A1: return (pin_and_adc){ ADC_CHANNEL_IN1, 0 };
|
||||||
|
case A2: return (pin_and_adc){ ADC_CHANNEL_IN2, 0 };
|
||||||
|
case A3: return (pin_and_adc){ ADC_CHANNEL_IN3, 0 };
|
||||||
|
case A4: return (pin_and_adc){ ADC_CHANNEL_IN4, 0 };
|
||||||
|
case A5: return (pin_and_adc){ ADC_CHANNEL_IN5, 0 };
|
||||||
|
case A6: return (pin_and_adc){ ADC_CHANNEL_IN6, 0 };
|
||||||
|
case A7: return (pin_and_adc){ ADC_CHANNEL_IN7, 0 };
|
||||||
|
case B0: return (pin_and_adc){ ADC_CHANNEL_IN8, 0 };
|
||||||
|
case B1: return (pin_and_adc){ ADC_CHANNEL_IN9, 0 };
|
||||||
|
case C0: return (pin_and_adc){ ADC_CHANNEL_IN10, 0 };
|
||||||
|
case C1: return (pin_and_adc){ ADC_CHANNEL_IN11, 0 };
|
||||||
|
case C2: return (pin_and_adc){ ADC_CHANNEL_IN12, 0 };
|
||||||
|
case C3: return (pin_and_adc){ ADC_CHANNEL_IN13, 0 };
|
||||||
|
case C4: return (pin_and_adc){ ADC_CHANNEL_IN14, 0 };
|
||||||
|
case C5: return (pin_and_adc){ ADC_CHANNEL_IN15, 0 };
|
||||||
|
#elif defined(STM32F3XX)
|
||||||
|
case A0: return (pin_and_adc){ ADC_CHANNEL_IN1, 0 };
|
||||||
|
case A1: return (pin_and_adc){ ADC_CHANNEL_IN2, 0 };
|
||||||
|
case A2: return (pin_and_adc){ ADC_CHANNEL_IN3, 0 };
|
||||||
|
case A3: return (pin_and_adc){ ADC_CHANNEL_IN4, 0 };
|
||||||
|
case A4: return (pin_and_adc){ ADC_CHANNEL_IN1, 1 };
|
||||||
|
case A5: return (pin_and_adc){ ADC_CHANNEL_IN2, 1 };
|
||||||
|
case A6: return (pin_and_adc){ ADC_CHANNEL_IN3, 1 };
|
||||||
|
case A7: return (pin_and_adc){ ADC_CHANNEL_IN4, 1 };
|
||||||
|
case B0: return (pin_and_adc){ ADC_CHANNEL_IN12, 2 };
|
||||||
|
case B1: return (pin_and_adc){ ADC_CHANNEL_IN1, 2 };
|
||||||
|
case B2: return (pin_and_adc){ ADC_CHANNEL_IN12, 1 };
|
||||||
|
case B12: return (pin_and_adc){ ADC_CHANNEL_IN2, 3 };
|
||||||
|
case B13: return (pin_and_adc){ ADC_CHANNEL_IN3, 3 };
|
||||||
|
case B14: return (pin_and_adc){ ADC_CHANNEL_IN4, 3 };
|
||||||
|
case B15: return (pin_and_adc){ ADC_CHANNEL_IN5, 3 };
|
||||||
|
case C0: return (pin_and_adc){ ADC_CHANNEL_IN6, 0 }; // Can also be ADC2
|
||||||
|
case C1: return (pin_and_adc){ ADC_CHANNEL_IN7, 0 }; // Can also be ADC2
|
||||||
|
case C2: return (pin_and_adc){ ADC_CHANNEL_IN8, 0 }; // Can also be ADC2
|
||||||
|
case C3: return (pin_and_adc){ ADC_CHANNEL_IN9, 0 }; // Can also be ADC2
|
||||||
|
case C4: return (pin_and_adc){ ADC_CHANNEL_IN5, 1 };
|
||||||
|
case C5: return (pin_and_adc){ ADC_CHANNEL_IN11, 1 };
|
||||||
|
case D8: return (pin_and_adc){ ADC_CHANNEL_IN12, 3 };
|
||||||
|
case D9: return (pin_and_adc){ ADC_CHANNEL_IN13, 3 };
|
||||||
|
case D10: return (pin_and_adc){ ADC_CHANNEL_IN7, 2 }; // Can also be ADC4
|
||||||
|
case D11: return (pin_and_adc){ ADC_CHANNEL_IN8, 2 }; // Can also be ADC4
|
||||||
|
case D12: return (pin_and_adc){ ADC_CHANNEL_IN9, 2 }; // Can also be ADC4
|
||||||
|
case D13: return (pin_and_adc){ ADC_CHANNEL_IN10, 2 }; // Can also be ADC4
|
||||||
|
case D14: return (pin_and_adc){ ADC_CHANNEL_IN11, 2 }; // Can also be ADC4
|
||||||
|
case E7: return (pin_and_adc){ ADC_CHANNEL_IN13, 2 };
|
||||||
|
case E8: return (pin_and_adc){ ADC_CHANNEL_IN6, 2 }; // Can also be ADC4
|
||||||
|
case E9: return (pin_and_adc){ ADC_CHANNEL_IN2, 2 };
|
||||||
|
case E10: return (pin_and_adc){ ADC_CHANNEL_IN14, 2 };
|
||||||
|
case E11: return (pin_and_adc){ ADC_CHANNEL_IN15, 2 };
|
||||||
|
case E12: return (pin_and_adc){ ADC_CHANNEL_IN16, 2 };
|
||||||
|
case E13: return (pin_and_adc){ ADC_CHANNEL_IN3, 2 };
|
||||||
|
case E14: return (pin_and_adc){ ADC_CHANNEL_IN1, 3 };
|
||||||
|
case E15: return (pin_and_adc){ ADC_CHANNEL_IN2, 3 };
|
||||||
|
case F2: return (pin_and_adc){ ADC_CHANNEL_IN10, 0 }; // Can also be ADC2
|
||||||
|
case F4: return (pin_and_adc){ ADC_CHANNEL_IN5, 0 };
|
||||||
|
#else
|
||||||
|
#error "An ADC pin-to-mux configuration has not been specified for this microcontroller."
|
||||||
|
#endif
|
||||||
|
default: return (pin_and_adc){ 0, 0 };
|
||||||
|
// clang-format on
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
adcsample_t analogReadPin(pin_t pin) { return adc_read(pinToMux(pin)); }
|
||||||
|
|
||||||
|
adcsample_t analogReadPinAdc(pin_t pin, uint8_t adc) {
|
||||||
|
pin_and_adc target = pinToMux(pin);
|
||||||
|
target.adc = adc;
|
||||||
|
return adc_read(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
adcsample_t adc_read(pin_and_adc mux) {
|
||||||
|
#if defined(STM32F0XX)
|
||||||
|
adcConversionGroup.sqr = ADC_CHSELR_CHSEL1;
|
||||||
|
#elif defined(STM32F3XX)
|
||||||
|
adcConversionGroup.sqr[0] = ADC_SQR1_SQ1_N(mux.pin);
|
||||||
|
#else
|
||||||
|
# error "adc_read has not been updated to support this ARM microcontroller."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ADCDriver* targetDriver = intToADCDriver(mux.adc);
|
||||||
|
manageAdcInitializationDriver(mux.adc, targetDriver);
|
||||||
|
|
||||||
|
adcConvert(targetDriver, &adcConversionGroup, &sampleBuffer[0], ADC_BUFFER_DEPTH);
|
||||||
|
adcsample_t* result = sampleBuffer;
|
||||||
|
|
||||||
|
return *result;
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/* Copyright 2019 Drew Mills
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
#include "ch.h"
|
||||||
|
#include <hal.h>
|
||||||
|
|
||||||
|
#if !defined(STM32F0XX) && !defined(STM32F3XX)
|
||||||
|
# error "Only STM23F0 and STM32F3 devices have ADC support in QMK at this time."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !HAL_USE_ADC
|
||||||
|
# error "You need to set HAL_USE_ADC to TRUE in your halconf.h to use the ADC."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !STM32_ADC_USE_ADC1 && !STM32_ADC_USE_ADC2 && !STM32_ADC_USE_ADC3 && !STM32_ADC_USE_ADC4
|
||||||
|
# error "You need to set one of the 'STM32_ADC_USE_ADCx' settings to TRUE in your mcuconf.h to use the ADC."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if STM32_ADC_DUAL_MODE
|
||||||
|
# error "STM32 ADC Dual Mode is not supported at this time."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if STM32_ADCV3_OVERSAMPLING
|
||||||
|
# error "STM32 ADCV3 Oversampling is not supported at this time."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
pin_t pin;
|
||||||
|
uint8_t adc;
|
||||||
|
} pin_and_adc;
|
||||||
|
#define PIN_AND_ADC(p, a) \
|
||||||
|
(pin_and_adc) { p, a }
|
||||||
|
|
||||||
|
// analogReference has been left un-defined for ARM devices.
|
||||||
|
// void analogReference(uint8_t mode);
|
||||||
|
|
||||||
|
adcsample_t analogReadPin(pin_t pin);
|
||||||
|
adcsample_t analogReadPinAdc(pin_t pin, uint8_t adc);
|
||||||
|
pin_and_adc pinToMux(pin_t pin);
|
||||||
|
|
||||||
|
adcsample_t adc_read(pin_and_adc mux);
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
/* Copyright 2019 Ryota Goto
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
/*
|
|
||||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \
|
|
||||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \
|
|
||||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \
|
|
||||||
K300, K301, K302, K304, K306, K308, K309, K310, K311 \
|
|
||||||
*/
|
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|
||||||
[0] = LAYOUT_all( /* Base */
|
|
||||||
MO(2), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
|
|
||||||
MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
|
|
||||||
KC_LSFT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT,
|
|
||||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_GRV, KC_RGUI, KC_DEL
|
|
||||||
),
|
|
||||||
[1] = LAYOUT_all( /* Extra Keys */
|
|
||||||
_______, _______, KC_PGUP, _______, _______, KC_LBRC, KC_RBRC, _______, KC_UP, _______, _______, _______,
|
|
||||||
_______, KC_HOME, KC_PGDN, KC_END, _______, KC_BSLS, KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______,
|
|
||||||
_______, _______, _______, _______, _______, KC_PSCR, KC_ESC, KC_QUOT, _______, KC_DOT, _______, _______,
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______
|
|
||||||
),
|
|
||||||
[2] = LAYOUT_all( /* Num and FN */
|
|
||||||
_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
|
|
||||||
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, _______, _______, _______,
|
|
||||||
_______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______,
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______
|
|
||||||
),
|
|
||||||
[3] = LAYOUT_all( /* Other */
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______
|
|
||||||
)
|
|
||||||
};
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# The proto via keymap for equinox
|
|
||||||
|
|
||||||
Has the necessary tweaks to run on early prototype PCBs.
|
|
||||||
Not to be used for production run PCBs.
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
VIA_ENABLE = yes
|
|
||||||
|
|
||||||
# Fix for prototype missing COL0, COL1, using backlight and RGB underglow I/O pins
|
|
||||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
|
||||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
|
||||||
+4
@@ -21,3 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#undef MATRIX_COL_PINS
|
#undef MATRIX_COL_PINS
|
||||||
#define MATRIX_COL_PINS { C4, B7, C6, C7, B6, B5, B4, B3, B2, B1, B0, D6 }
|
#define MATRIX_COL_PINS { C4, B7, C6, C7, B6, B5, B4, B3, B2, B1, B0, D6 }
|
||||||
|
|
||||||
|
// This directs backlight code to use a disconnected pin, so the firwmare still has
|
||||||
|
// backlight code and VIA support even though it doesn't do anything.
|
||||||
|
#undef BACKLIGHT_PIN
|
||||||
|
#define BACKLIGHT_PIN D1
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Dummy rules.mk, rev0 uses parent rules.mk as is
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 Ryota Goto
|
||||||
|
|
||||||
|
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
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Dummy rules.mk, rev1 uses parent rules.mk as is
|
||||||
@@ -32,7 +32,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
SEND_STRING("Hello from Illuminati Works");
|
SEND_STRING("Hello from Illuminati Works");
|
||||||
} else {
|
} else {
|
||||||
SEND_STRING("iS0 working properly");
|
SEND_STRING("iS0 working properly");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/* Copyright 2020 Lorenz Wellmer
|
||||||
|
*
|
||||||
|
* 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_tkl_ansi(
|
||||||
|
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
|
||||||
|
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_INS, KC_HOME, 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_BSLS, KC_DEL, KC_END, 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_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_UP,
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
|
||||||
|
|
||||||
|
[1] = LAYOUT_tkl_ansi(
|
||||||
|
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, BL_TOGG, BL_DEC, BL_INC,
|
||||||
|
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_VOLU,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# The default ANSI keymap for Kira 80
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/* Copyright 2020 Lorenz Wellmer
|
||||||
|
*
|
||||||
|
* 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_tkl_ansi_wkl(
|
||||||
|
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
|
||||||
|
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_INS, KC_HOME, 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_BSLS, KC_DEL, KC_END, 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_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_UP,
|
||||||
|
KC_LCTL, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),
|
||||||
|
|
||||||
|
[1] = LAYOUT_tkl_ansi_wkl(
|
||||||
|
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, BL_TOGG, BL_DEC, BL_INC,
|
||||||
|
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_VOLU,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# The default ANSI WKL keymap for Kira 80
|
||||||
@@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
|
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
|
||||||
|
|
||||||
[1] = LAYOUT_all(
|
[1] = LAYOUT_all(
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, BL_TOGG, BL_DEC, BL_INC,
|
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, BL_TOGG, BL_DEC, BL_INC,
|
||||||
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_VOLU,
|
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_VOLU,
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD,
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD,
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
# The default keymap for kira80
|
# The default keymap for Kira 80
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/* Copyright 2020 Lorenz Wellmer
|
||||||
|
*
|
||||||
|
* 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_tkl_iso(
|
||||||
|
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
|
||||||
|
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_INS, KC_HOME, 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_DEL, KC_END, 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_NUHS, 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_UP,
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
|
||||||
|
|
||||||
|
[1] = LAYOUT_tkl_iso(
|
||||||
|
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, BL_TOGG, BL_DEC, BL_INC,
|
||||||
|
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_VOLU,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# The default ISO keymap for Kira 80
|
||||||
@@ -52,10 +52,10 @@
|
|||||||
K075, K076, K077, K079, K083, K084, K085, K086, K087, K088, K082 \
|
K075, K076, K077, K079, K083, K084, K085, K086, K087, K088, K082 \
|
||||||
) { \
|
) { \
|
||||||
{ K000, K001, K002, K003, K004, K005, KC_NO, K007, K008, K009, K010, K011, K012, K013, KC_NO }, \
|
{ K000, K001, K002, K003, K004, K005, KC_NO, K007, K008, K009, K010, K011, K012, K013, KC_NO }, \
|
||||||
{ K015, K016, K017, K018, K019, K020, K021, K022, K023, K024, K025, K026, K027, K028, K029 }, \
|
{ K015, K016, K017, K018, K019, K020, K021, K022, K023, K024, K025, K026, K027, K028, KC_NO }, \
|
||||||
{ K030, K031, K032, K033, K034, K035, K036, K037, K038, K039, K040, K041, K042, K043, KC_NO }, \
|
{ K030, K031, K032, K033, K034, K035, K036, K037, K038, K039, K040, K041, K042, K043, KC_NO }, \
|
||||||
{ K045, K046, K047, K048, K049, K050, K051, K052, K053, K054, K055, K056, K057, K058, KC_NO }, \
|
{ K045, K046, K047, K048, K049, K050, K051, K052, K053, K054, K055, K056, K057, KC_NO, KC_NO }, \
|
||||||
{ K060, K061, K062, K063, K064, K065, K066, K067, K068, K069, K070, K071, K072, K073, KC_NO }, \
|
{ K060, K061, K062, K063, K064, K065, K066, K067, K068, K069, K070, K071, KC_NO, K073, KC_NO }, \
|
||||||
{ K075, K076, K077, KC_NO, K079, KC_NO, KC_NO, K082, K083, K084, K085, K086, K087, K088, KC_NO }, \
|
{ K075, K076, K077, KC_NO, K079, KC_NO, KC_NO, K082, K083, K084, K085, K086, K087, K088, KC_NO }, \
|
||||||
{ KC_NO, K091, K092, KC_NO, K094, K095, K096, K097, K098, KC_NO, KC_NO, KC_NO, K102, K103, KC_NO } \
|
{ KC_NO, K091, K092, KC_NO, K094, K095, K096, K097, K098, KC_NO, KC_NO, KC_NO, K102, K103, KC_NO } \
|
||||||
}
|
}
|
||||||
@@ -69,11 +69,11 @@
|
|||||||
K075, K077, K079, K084, K086, K087, K088, K082 \
|
K075, K077, K079, K084, K086, K087, K088, K082 \
|
||||||
) { \
|
) { \
|
||||||
{ K000, K001, K002, K003, K004, K005, KC_NO, K007, K008, K009, K010, K011, K012, K013, KC_NO }, \
|
{ K000, K001, K002, K003, K004, K005, KC_NO, K007, K008, K009, K010, K011, K012, K013, KC_NO }, \
|
||||||
{ K015, K016, K017, K018, K019, K020, K021, K022, K023, K024, K025, K026, K027, K028, K029 }, \
|
{ K015, K016, K017, K018, K019, K020, K021, K022, K023, K024, K025, K026, K027, K028, KC_NO }, \
|
||||||
{ K030, K031, K032, K033, K034, K035, K036, K037, K038, K039, K040, K041, K042, K043, KC_NO }, \
|
{ K030, K031, K032, K033, K034, K035, K036, K037, K038, K039, K040, K041, K042, K043, KC_NO }, \
|
||||||
{ K045, K046, K047, K048, K049, K050, K051, K052, K053, K054, K055, K056, K057, K058, KC_NO }, \
|
{ K045, K046, K047, K048, K049, K050, K051, K052, K053, K054, K055, K056, K057, KC_NO, KC_NO }, \
|
||||||
{ K060, K061, K062, K063, K064, K065, K066, K067, K068, K069, K070, K071, K072, K073, KC_NO }, \
|
{ K060, K061, K062, K063, K064, K065, K066, K067, K068, K069, K070, K071, KC_NO, K073, KC_NO }, \
|
||||||
{ K075, K076, K077, KC_NO, K079, KC_NO, KC_NO, K082, K083, K084, K085, K086, K087, K088, KC_NO }, \
|
{ K075, KC_NO, K077, KC_NO, K079, KC_NO, KC_NO, K082, KC_NO, K084, KC_NO, K086, K087, K088, KC_NO }, \
|
||||||
{ KC_NO, K091, K092, KC_NO, K094, K095, K096, K097, K098, KC_NO, KC_NO, KC_NO, K102, K103, KC_NO } \
|
{ KC_NO, K091, K092, KC_NO, K094, K095, K096, K097, K098, KC_NO, KC_NO, KC_NO, K102, K103, KC_NO } \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,10 +86,10 @@
|
|||||||
K075, K076, K077, K079, K083, K084, K085, K086, K087, K088, K082 \
|
K075, K076, K077, K079, K083, K084, K085, K086, K087, K088, K082 \
|
||||||
) { \
|
) { \
|
||||||
{ K000, K001, K002, K003, K004, K005, KC_NO, K007, K008, K009, K010, K011, K012, K013, KC_NO }, \
|
{ K000, K001, K002, K003, K004, K005, KC_NO, K007, K008, K009, K010, K011, K012, K013, KC_NO }, \
|
||||||
{ K015, K016, K017, K018, K019, K020, K021, K022, K023, K024, K025, K026, K027, K028, K029 }, \
|
{ K015, K016, K017, K018, K019, K020, K021, K022, K023, K024, K025, K026, K027, K028, KC_NO }, \
|
||||||
{ K030, K031, K032, K033, K034, K035, K036, K037, K038, K039, K040, K041, K042, K043, KC_NO }, \
|
{ K030, K031, K032, K033, K034, K035, K036, K037, K038, K039, K040, K041, K042, K043, KC_NO }, \
|
||||||
{ K045, K046, K047, K048, K049, K050, K051, K052, K053, K054, K055, K056, K057, K058, KC_NO }, \
|
{ K045, K046, K047, K048, K049, K050, K051, K052, K053, K054, K055, K056, K057, K058, KC_NO }, \
|
||||||
{ K060, K061, K062, K063, K064, K065, K066, K067, K068, K069, K070, K071, K072, K073, KC_NO }, \
|
{ K060, K061, K062, K063, K064, K065, K066, K067, K068, K069, K070, K071, KC_NO, K073, KC_NO }, \
|
||||||
{ K075, K076, K077, KC_NO, K079, KC_NO, KC_NO, K082, K083, K084, K085, K086, K087, K088, KC_NO }, \
|
{ K075, K076, K077, KC_NO, K079, KC_NO, KC_NO, K082, K083, K084, K085, K086, K087, K088, KC_NO }, \
|
||||||
{ KC_NO, K091, K092, KC_NO, K094, K095, K096, K097, K098, KC_NO, KC_NO, KC_NO, K102, K103, KC_NO } \
|
{ KC_NO, K091, K092, KC_NO, K094, K095, K096, K097, K098, KC_NO, KC_NO, KC_NO, K102, K103, KC_NO } \
|
||||||
}
|
}
|
||||||
@@ -1,15 +1,14 @@
|
|||||||
#ifndef CONFIG_H
|
#pragma once
|
||||||
#define CONFIG_H
|
|
||||||
|
|
||||||
#include "config_common.h"
|
#include "config_common.h"
|
||||||
|
|
||||||
/* USB Device descriptor parameter */
|
/* USB Device descriptor parameter */
|
||||||
#define VENDOR_ID 0xFEED
|
#define VENDOR_ID 0x5436 // "T6"
|
||||||
#define PRODUCT_ID 0x6060
|
#define PRODUCT_ID 0x6060 // Tokyo60
|
||||||
#define DEVICE_VER 0x0001
|
#define DEVICE_VER 0x0001
|
||||||
#define MANUFACTURER Tokyo Keyboard
|
#define MANUFACTURER Tokyo Keyboard
|
||||||
#define PRODUCT tokyo60
|
#define PRODUCT Tokyo60
|
||||||
#define DESCRIPTION q.m.k. keyboard firmware for tokyo60
|
#define DESCRIPTION q.m.k. keyboard firmware for Tokyo60
|
||||||
|
|
||||||
/* key matrix size */
|
/* key matrix size */
|
||||||
#define MATRIX_ROWS 5
|
#define MATRIX_ROWS 5
|
||||||
@@ -54,5 +53,3 @@
|
|||||||
/* For Production */
|
/* For Production */
|
||||||
#define QMK_ESC_OUTPUT F0 // usually COL
|
#define QMK_ESC_OUTPUT F0 // usually COL
|
||||||
#define QMK_ESC_INPUT D0 // usually ROW
|
#define QMK_ESC_INPUT D0 // usually ROW
|
||||||
|
|
||||||
#endif
|
|
||||||
+310
-2
@@ -1,12 +1,320 @@
|
|||||||
{
|
{
|
||||||
"keyboard_name": "Tokyo60",
|
"keyboard_name": "Tokyo60",
|
||||||
"url": "",
|
"url": "https://tokyokeyboard.com/",
|
||||||
"maintainer": "qmk",
|
"maintainer": "qmk",
|
||||||
"width": 15,
|
"width": 15,
|
||||||
"height": 5,
|
"height": 5,
|
||||||
"layouts": {
|
"layouts": {
|
||||||
"LAYOUT_60_hhkb": {
|
"LAYOUT_60_hhkb": {
|
||||||
"layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"~", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Delete", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Os", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Os", "x":12.5, "y":4}]
|
"layout": [{
|
||||||
|
"label": "Esc",
|
||||||
|
"x": 0,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "!",
|
||||||
|
"x": 1,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "@",
|
||||||
|
"x": 2,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "#",
|
||||||
|
"x": 3,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "$",
|
||||||
|
"x": 4,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "%",
|
||||||
|
"x": 5,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "^",
|
||||||
|
"x": 6,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "&",
|
||||||
|
"x": 7,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "*",
|
||||||
|
"x": 8,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "(",
|
||||||
|
"x": 9,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": ")",
|
||||||
|
"x": 10,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "_",
|
||||||
|
"x": 11,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "+",
|
||||||
|
"x": 12,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "|",
|
||||||
|
"x": 13,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "~",
|
||||||
|
"x": 14,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Tab",
|
||||||
|
"x": 0,
|
||||||
|
"y": 1,
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Q",
|
||||||
|
"x": 1.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "W",
|
||||||
|
"x": 2.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "E",
|
||||||
|
"x": 3.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "R",
|
||||||
|
"x": 4.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "T",
|
||||||
|
"x": 5.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Y",
|
||||||
|
"x": 6.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "U",
|
||||||
|
"x": 7.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "I",
|
||||||
|
"x": 8.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "O",
|
||||||
|
"x": 9.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "P",
|
||||||
|
"x": 10.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "{",
|
||||||
|
"x": 11.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "}",
|
||||||
|
"x": 12.5,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Delete",
|
||||||
|
"x": 13.5,
|
||||||
|
"y": 1,
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Control",
|
||||||
|
"x": 0,
|
||||||
|
"y": 2,
|
||||||
|
"w": 1.75
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "A",
|
||||||
|
"x": 1.75,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "S",
|
||||||
|
"x": 2.75,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "D",
|
||||||
|
"x": 3.75,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "F",
|
||||||
|
"x": 4.75,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "G",
|
||||||
|
"x": 5.75,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "H",
|
||||||
|
"x": 6.75,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "J",
|
||||||
|
"x": 7.75,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "K",
|
||||||
|
"x": 8.75,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "L",
|
||||||
|
"x": 9.75,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": ":",
|
||||||
|
"x": 10.75,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "\"",
|
||||||
|
"x": 11.75,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Enter",
|
||||||
|
"x": 12.75,
|
||||||
|
"y": 2,
|
||||||
|
"w": 2.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Shift",
|
||||||
|
"x": 0,
|
||||||
|
"y": 3,
|
||||||
|
"w": 2.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Z",
|
||||||
|
"x": 2.25,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "X",
|
||||||
|
"x": 3.25,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "C",
|
||||||
|
"x": 4.25,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "V",
|
||||||
|
"x": 5.25,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "B",
|
||||||
|
"x": 6.25,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "N",
|
||||||
|
"x": 7.25,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "M",
|
||||||
|
"x": 8.25,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "<",
|
||||||
|
"x": 9.25,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": ">",
|
||||||
|
"x": 10.25,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "?",
|
||||||
|
"x": 11.25,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Shift",
|
||||||
|
"x": 12.25,
|
||||||
|
"y": 3,
|
||||||
|
"w": 1.75
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Fn",
|
||||||
|
"x": 14,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Os",
|
||||||
|
"x": 1.5,
|
||||||
|
"y": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Alt",
|
||||||
|
"x": 2.5,
|
||||||
|
"y": 4,
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 4,
|
||||||
|
"y": 4,
|
||||||
|
"w": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Alt",
|
||||||
|
"x": 11,
|
||||||
|
"y": 4,
|
||||||
|
"w": 1.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Os",
|
||||||
|
"x": 12.5,
|
||||||
|
"y": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
#define BL 0
|
||||||
|
#define FN 1
|
||||||
|
/*
|
||||||
|
* Default HHKB Layout
|
||||||
|
*/
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
|
[BL] = 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_BSPC, \
|
||||||
|
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
|
||||||
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(FN), \
|
||||||
|
KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT ),
|
||||||
|
|
||||||
|
[FN]= LAYOUT_60_hhkb(
|
||||||
|
KC_PWR, 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, RGB_TOG, RGB_MOD, RGB_RMOD, BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
|
||||||
|
|
||||||
|
[2]= LAYOUT_60_hhkb(
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||||
|
_______, _______, _______, _______, _______ ),
|
||||||
|
|
||||||
|
[3]= LAYOUT_60_hhkb(
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||||
|
_______, _______, _______, _______, _______ ),
|
||||||
|
};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
VIA_ENABLE = yes
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
# tokyo60
|
# Tokyo60
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Minimal hacker style mechanical keyboard designed in Tokyo. Full aluminum hi-pro construction with integrated top-plate. Cherry MX compatible. More Info at [Tokyo Keyboard](http://tokyokeyboard.com).
|
Minimal hacker style mechanical keyboard designed in Tokyo. Full aluminum hi-pro construction with integrated top-plate. Cherry MX compatible. More Info at [Tokyo Keyboard](http://tokyokeyboard.com).
|
||||||
|
|
||||||
Keyboard Maintainer: [Tokyo Keyboard](http://tokyokeyboard.com)
|
* Keyboard Maintainer: [Tokyo Keyboard](http://tokyokeyboard.com)
|
||||||
Hardware Supported: tokyo60 rev1
|
* Hardware Supported: Tokyo60 Rev.1
|
||||||
Hardware Availability: [Tokyo Keyboard](http://tokyokeyboard.com), [Massdrop](https://www.massdrop.com/buy/massdrop-x-tokyo-keyboard-tokyo60-keyboard-kit?mode=guest_open)
|
* Hardware Availability: [Drop](https://drop.com/buy/massdrop-x-tokyo-keyboard-tokyo60-keyboard-kit?mode=guest_open)
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
make tokyo60:default
|
make tokyo60:default
|
||||||
|
|
||||||
See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
|
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
||||||
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
|
|||||||
# Build Options
|
# Build Options
|
||||||
# change yes to no to disable
|
# change yes to no to disable
|
||||||
#
|
#
|
||||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
|
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
|
||||||
MOUSEKEY_ENABLE = no # Mouse keys
|
MOUSEKEY_ENABLE = no # Mouse keys
|
||||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
#ifndef TOKYO60_H
|
#pragma once
|
||||||
#define TOKYO60_H
|
|
||||||
|
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
||||||
|
#define XXX KC_NO
|
||||||
|
|
||||||
#define LAYOUT_60_hhkb( \
|
#define LAYOUT_60_hhkb( \
|
||||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K1D,\
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K1D,\
|
||||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K2D, \
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K2D, \
|
||||||
@@ -12,9 +13,7 @@
|
|||||||
) { \
|
) { \
|
||||||
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
|
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
|
||||||
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
|
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
|
||||||
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D }, \
|
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, XXX, K2D }, \
|
||||||
{ K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
|
{ K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
|
||||||
{ KC_NO, K42, K43, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K4B, K4C, K4D } \
|
{ XXX, K42, K43, XXX, XXX, K46, XXX, XXX, XXX, XXX, XXX, K4B, K4C, K4D } \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -10,6 +10,7 @@ from . import doctor
|
|||||||
from . import flash
|
from . import flash
|
||||||
from . import hello
|
from . import hello
|
||||||
from . import json
|
from . import json
|
||||||
|
from . import json2c
|
||||||
from . import list
|
from . import list
|
||||||
from . import kle2json
|
from . import kle2json
|
||||||
from . import new
|
from . import new
|
||||||
|
|||||||
@@ -1,56 +1,16 @@
|
|||||||
"""Generate a keymap.c from a configurator export.
|
"""Generate a keymap.c from a configurator export.
|
||||||
"""
|
"""
|
||||||
import json
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from milc import cli
|
from milc import cli
|
||||||
|
|
||||||
import qmk.keymap
|
|
||||||
import qmk.path
|
|
||||||
|
|
||||||
|
|
||||||
@cli.argument('-o', '--output', arg_only=True, type=Path, help='File to write to')
|
@cli.argument('-o', '--output', arg_only=True, type=Path, help='File to write to')
|
||||||
@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
|
@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
|
||||||
@cli.argument('filename', arg_only=True, help='Configurator JSON file')
|
@cli.argument('filename', arg_only=True, help='Configurator JSON file')
|
||||||
@cli.subcommand('Creates a keymap.c from a QMK Configurator export.')
|
@cli.subcommand('Creates a keymap.c from a QMK Configurator export.')
|
||||||
def json_keymap(cli):
|
def json_keymap(cli):
|
||||||
"""Generate a keymap.c from a configurator export.
|
"""Renamed to `qmk json2c`.
|
||||||
|
|
||||||
This command uses the `qmk.keymap` module to generate a keymap.c from a configurator export. The generated keymap is written to stdout, or to a file if -o is provided.
|
|
||||||
"""
|
"""
|
||||||
cli.args.filename = qmk.path.normpath(cli.args.filename)
|
cli.log.error('This command has been renamed to `qmk json2c`.')
|
||||||
|
exit(1)
|
||||||
# Error checking
|
|
||||||
if not cli.args.filename.exists():
|
|
||||||
cli.log.error('JSON file does not exist!')
|
|
||||||
cli.print_usage()
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
if str(cli.args.filename) == '-':
|
|
||||||
# TODO(skullydazed/anyone): Read file contents from STDIN
|
|
||||||
cli.log.error('Reading from STDIN is not (yet) supported.')
|
|
||||||
cli.print_usage()
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
# Environment processing
|
|
||||||
if cli.args.output == ('-'):
|
|
||||||
cli.args.output = None
|
|
||||||
|
|
||||||
# Parse the configurator json
|
|
||||||
with cli.args.filename.open('r') as fd:
|
|
||||||
user_keymap = json.load(fd)
|
|
||||||
|
|
||||||
# Generate the keymap
|
|
||||||
keymap_c = qmk.keymap.generate(user_keymap['keyboard'], user_keymap['layout'], user_keymap['layers'])
|
|
||||||
|
|
||||||
if cli.args.output:
|
|
||||||
cli.args.output.parent.mkdir(parents=True, exist_ok=True)
|
|
||||||
if cli.args.output.exists():
|
|
||||||
cli.args.output.replace(cli.args.output.name + '.bak')
|
|
||||||
cli.args.output.write_text(keymap_c)
|
|
||||||
|
|
||||||
if not cli.args.quiet:
|
|
||||||
cli.log.info('Wrote keymap to %s.', cli.args.output)
|
|
||||||
|
|
||||||
else:
|
|
||||||
print(keymap_c)
|
|
||||||
Executable
+56
@@ -0,0 +1,56 @@
|
|||||||
|
"""Generate a keymap.c from a configurator export.
|
||||||
|
"""
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from milc import cli
|
||||||
|
|
||||||
|
import qmk.keymap
|
||||||
|
import qmk.path
|
||||||
|
|
||||||
|
|
||||||
|
@cli.argument('-o', '--output', arg_only=True, type=Path, help='File to write to')
|
||||||
|
@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
|
||||||
|
@cli.argument('filename', arg_only=True, help='Configurator JSON file')
|
||||||
|
@cli.subcommand('Creates a keymap.c from a QMK Configurator export.')
|
||||||
|
def json2c(cli):
|
||||||
|
"""Generate a keymap.c from a configurator export.
|
||||||
|
|
||||||
|
This command uses the `qmk.keymap` module to generate a keymap.c from a configurator export. The generated keymap is written to stdout, or to a file if -o is provided.
|
||||||
|
"""
|
||||||
|
cli.args.filename = qmk.path.normpath(cli.args.filename)
|
||||||
|
|
||||||
|
# Error checking
|
||||||
|
if not cli.args.filename.exists():
|
||||||
|
cli.log.error('JSON file does not exist!')
|
||||||
|
cli.print_usage()
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
if str(cli.args.filename) == '-':
|
||||||
|
# TODO(skullydazed/anyone): Read file contents from STDIN
|
||||||
|
cli.log.error('Reading from STDIN is not (yet) supported.')
|
||||||
|
cli.print_usage()
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
# Environment processing
|
||||||
|
if cli.args.output == ('-'):
|
||||||
|
cli.args.output = None
|
||||||
|
|
||||||
|
# Parse the configurator json
|
||||||
|
with cli.args.filename.open('r') as fd:
|
||||||
|
user_keymap = json.load(fd)
|
||||||
|
|
||||||
|
# Generate the keymap
|
||||||
|
keymap_c = qmk.keymap.generate(user_keymap['keyboard'], user_keymap['layout'], user_keymap['layers'])
|
||||||
|
|
||||||
|
if cli.args.output:
|
||||||
|
cli.args.output.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
if cli.args.output.exists():
|
||||||
|
cli.args.output.replace(cli.args.output.name + '.bak')
|
||||||
|
cli.args.output.write_text(keymap_c)
|
||||||
|
|
||||||
|
if not cli.args.quiet:
|
||||||
|
cli.log.info('Wrote keymap to %s.', cli.args.output)
|
||||||
|
|
||||||
|
else:
|
||||||
|
print(keymap_c)
|
||||||
@@ -38,17 +38,23 @@
|
|||||||
# include "velocikey.h"
|
# include "velocikey.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef MIN
|
||||||
|
# define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef RGBLIGHT_SPLIT
|
#ifdef RGBLIGHT_SPLIT
|
||||||
/* for split keyboard */
|
/* for split keyboard */
|
||||||
# define RGBLIGHT_SPLIT_SET_CHANGE_MODE rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_MODE
|
# define RGBLIGHT_SPLIT_SET_CHANGE_MODE rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_MODE
|
||||||
# define RGBLIGHT_SPLIT_SET_CHANGE_HSVS rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_HSVS
|
# define RGBLIGHT_SPLIT_SET_CHANGE_HSVS rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_HSVS
|
||||||
# define RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS rgblight_status.change_flags |= (RGBLIGHT_STATUS_CHANGE_MODE | RGBLIGHT_STATUS_CHANGE_HSVS)
|
# define RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS rgblight_status.change_flags |= (RGBLIGHT_STATUS_CHANGE_MODE | RGBLIGHT_STATUS_CHANGE_HSVS)
|
||||||
|
# define RGBLIGHT_SPLIT_SET_CHANGE_LAYERS rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_LAYERS
|
||||||
# define RGBLIGHT_SPLIT_SET_CHANGE_TIMER_ENABLE rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_TIMER
|
# define RGBLIGHT_SPLIT_SET_CHANGE_TIMER_ENABLE rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_TIMER
|
||||||
# define RGBLIGHT_SPLIT_ANIMATION_TICK rgblight_status.change_flags |= RGBLIGHT_STATUS_ANIMATION_TICK
|
# define RGBLIGHT_SPLIT_ANIMATION_TICK rgblight_status.change_flags |= RGBLIGHT_STATUS_ANIMATION_TICK
|
||||||
#else
|
#else
|
||||||
# define RGBLIGHT_SPLIT_SET_CHANGE_MODE
|
# define RGBLIGHT_SPLIT_SET_CHANGE_MODE
|
||||||
# define RGBLIGHT_SPLIT_SET_CHANGE_HSVS
|
# define RGBLIGHT_SPLIT_SET_CHANGE_HSVS
|
||||||
# define RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS
|
# define RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS
|
||||||
|
# define RGBLIGHT_SPLIT_SET_CHANGE_LAYERS
|
||||||
# define RGBLIGHT_SPLIT_SET_CHANGE_TIMER_ENABLE
|
# define RGBLIGHT_SPLIT_SET_CHANGE_TIMER_ENABLE
|
||||||
# define RGBLIGHT_SPLIT_ANIMATION_TICK
|
# define RGBLIGHT_SPLIT_ANIMATION_TICK
|
||||||
#endif
|
#endif
|
||||||
@@ -97,6 +103,10 @@ LED_TYPE led[RGBLED_NUM];
|
|||||||
# define LED_ARRAY led
|
# define LED_ARRAY led
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef RGBLIGHT_LAYERS
|
||||||
|
rgblight_segment_t const *const *rgblight_layers = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
static uint8_t clipping_start_pos = 0;
|
static uint8_t clipping_start_pos = 0;
|
||||||
static uint8_t clipping_num_leds = RGBLED_NUM;
|
static uint8_t clipping_num_leds = RGBLED_NUM;
|
||||||
static uint8_t effect_start_pos = 0;
|
static uint8_t effect_start_pos = 0;
|
||||||
@@ -604,11 +614,67 @@ void rgblight_sethsv_master(uint8_t hue, uint8_t sat, uint8_t val) { rgblight_se
|
|||||||
void rgblight_sethsv_slave(uint8_t hue, uint8_t sat, uint8_t val) { rgblight_sethsv_range(hue, sat, val, (uint8_t)RGBLED_NUM / 2, (uint8_t)RGBLED_NUM); }
|
void rgblight_sethsv_slave(uint8_t hue, uint8_t sat, uint8_t val) { rgblight_sethsv_range(hue, sat, val, (uint8_t)RGBLED_NUM / 2, (uint8_t)RGBLED_NUM); }
|
||||||
#endif // ifndef RGBLIGHT_SPLIT
|
#endif // ifndef RGBLIGHT_SPLIT
|
||||||
|
|
||||||
|
#ifdef RGBLIGHT_LAYERS
|
||||||
|
void rgblight_set_layer_state(uint8_t layer, bool enabled) {
|
||||||
|
uint8_t mask = 1 << layer;
|
||||||
|
if (enabled) {
|
||||||
|
rgblight_status.enabled_layer_mask |= mask;
|
||||||
|
} else {
|
||||||
|
rgblight_status.enabled_layer_mask &= ~mask;
|
||||||
|
}
|
||||||
|
RGBLIGHT_SPLIT_SET_CHANGE_LAYERS;
|
||||||
|
// Static modes don't have a ticker running to update the LEDs
|
||||||
|
if (rgblight_status.timer_enabled == false) {
|
||||||
|
rgblight_mode_noeeprom(rgblight_config.mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rgblight_get_layer_state(uint8_t layer) {
|
||||||
|
uint8_t mask = 1 << layer;
|
||||||
|
return (rgblight_status.enabled_layer_mask & mask) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write any enabled LED layers into the buffer
|
||||||
|
static void rgblight_layers_write(void) {
|
||||||
|
uint8_t i = 0;
|
||||||
|
// For each layer
|
||||||
|
for (const rgblight_segment_t *const *layer_ptr = rgblight_layers; i < RGBLIGHT_MAX_LAYERS; layer_ptr++, i++) {
|
||||||
|
if (!rgblight_get_layer_state(i)) {
|
||||||
|
continue; // Layer is disabled
|
||||||
|
}
|
||||||
|
const rgblight_segment_t *segment_ptr = pgm_read_ptr(layer_ptr);
|
||||||
|
if (segment_ptr == NULL) {
|
||||||
|
break; // No more layers
|
||||||
|
}
|
||||||
|
// For each segment
|
||||||
|
while (1) {
|
||||||
|
rgblight_segment_t segment;
|
||||||
|
memcpy_P(&segment, segment_ptr, sizeof(rgblight_segment_t));
|
||||||
|
if (segment.index == RGBLIGHT_END_SEGMENT_INDEX) {
|
||||||
|
break; // No more segments
|
||||||
|
}
|
||||||
|
// Write segment.count LEDs
|
||||||
|
LED_TYPE *const limit = &led[MIN(segment.index + segment.count, RGBLED_NUM)];
|
||||||
|
for (LED_TYPE *led_ptr = &led[segment.index]; led_ptr < limit; led_ptr++) {
|
||||||
|
sethsv(segment.hue, segment.sat, segment.val, led_ptr);
|
||||||
|
}
|
||||||
|
segment_ptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef RGBLIGHT_CUSTOM_DRIVER
|
#ifndef RGBLIGHT_CUSTOM_DRIVER
|
||||||
void rgblight_set(void) {
|
void rgblight_set(void) {
|
||||||
LED_TYPE *start_led;
|
LED_TYPE *start_led;
|
||||||
uint16_t num_leds = clipping_num_leds;
|
uint16_t num_leds = clipping_num_leds;
|
||||||
|
|
||||||
|
# ifdef RGBLIGHT_LAYERS
|
||||||
|
if (rgblight_layers != NULL) {
|
||||||
|
rgblight_layers_write();
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
if (!rgblight_config.enable) {
|
if (!rgblight_config.enable) {
|
||||||
for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) {
|
for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) {
|
||||||
led[i].r = 0;
|
led[i].r = 0;
|
||||||
@@ -652,6 +718,11 @@ void rgblight_get_syncinfo(rgblight_syncinfo_t *syncinfo) {
|
|||||||
|
|
||||||
/* for split keyboard slave side */
|
/* for split keyboard slave side */
|
||||||
void rgblight_update_sync(rgblight_syncinfo_t *syncinfo, bool write_to_eeprom) {
|
void rgblight_update_sync(rgblight_syncinfo_t *syncinfo, bool write_to_eeprom) {
|
||||||
|
# ifdef RGBLIGHT_LAYERS
|
||||||
|
if (syncinfo->status.change_flags & RGBLIGHT_STATUS_CHANGE_LAYERS) {
|
||||||
|
rgblight_status.enabled_layer_mask = syncinfo->status.enabled_layer_mask;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
if (syncinfo->status.change_flags & RGBLIGHT_STATUS_CHANGE_MODE) {
|
if (syncinfo->status.change_flags & RGBLIGHT_STATUS_CHANGE_MODE) {
|
||||||
if (syncinfo->config.enable) {
|
if (syncinfo->config.enable) {
|
||||||
rgblight_config.enable = 1; // == rgblight_enable_noeeprom();
|
rgblight_config.enable = 1; // == rgblight_enable_noeeprom();
|
||||||
|
|||||||
+38
-8
@@ -170,6 +170,32 @@ enum RGBLIGHT_EFFECT_MODE {
|
|||||||
# include <avr/pgmspace.h>
|
# include <avr/pgmspace.h>
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef RGBLIGHT_LAYERS
|
||||||
|
typedef struct {
|
||||||
|
uint8_t index; // The first LED to light
|
||||||
|
uint8_t count; // The number of LEDs to light
|
||||||
|
uint8_t hue;
|
||||||
|
uint8_t sat;
|
||||||
|
uint8_t val;
|
||||||
|
} rgblight_segment_t;
|
||||||
|
|
||||||
|
# define RGBLIGHT_END_SEGMENT_INDEX (255)
|
||||||
|
# define RGBLIGHT_END_SEGMENTS \
|
||||||
|
{ RGBLIGHT_END_SEGMENT_INDEX, 0, 0, 0 }
|
||||||
|
# define RGBLIGHT_MAX_LAYERS 8
|
||||||
|
# define RGBLIGHT_LAYER_SEGMENTS(...) \
|
||||||
|
{ __VA_ARGS__, RGBLIGHT_END_SEGMENTS }
|
||||||
|
# define RGBLIGHT_LAYERS_LIST(...) \
|
||||||
|
{ __VA_ARGS__, NULL }
|
||||||
|
|
||||||
|
// Get/set enabled rgblight layers
|
||||||
|
void rgblight_set_layer_state(uint8_t layer, bool enabled);
|
||||||
|
bool rgblight_get_layer_state(uint8_t layer);
|
||||||
|
|
||||||
|
// Point this to an array of rgblight_segment_t arrays in keyboard_post_init_user to use rgblight layers
|
||||||
|
extern const rgblight_segment_t *const *rgblight_layers;
|
||||||
|
# endif
|
||||||
|
|
||||||
extern LED_TYPE led[RGBLED_NUM];
|
extern LED_TYPE led[RGBLED_NUM];
|
||||||
|
|
||||||
extern const uint8_t RGBLED_BREATHING_INTERVALS[4] PROGMEM;
|
extern const uint8_t RGBLED_BREATHING_INTERVALS[4] PROGMEM;
|
||||||
@@ -199,6 +225,9 @@ typedef struct _rgblight_status_t {
|
|||||||
# ifdef RGBLIGHT_SPLIT
|
# ifdef RGBLIGHT_SPLIT
|
||||||
uint8_t change_flags;
|
uint8_t change_flags;
|
||||||
# endif
|
# endif
|
||||||
|
# ifdef RGBLIGHT_LAYERS
|
||||||
|
uint8_t enabled_layer_mask;
|
||||||
|
# endif
|
||||||
} rgblight_status_t;
|
} rgblight_status_t;
|
||||||
|
|
||||||
/* === Utility Functions ===*/
|
/* === Utility Functions ===*/
|
||||||
@@ -294,25 +323,26 @@ void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom);
|
|||||||
# define EZ_RGB(val) rgblight_show_solid_color((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF)
|
# define EZ_RGB(val) rgblight_show_solid_color((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF)
|
||||||
void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b);
|
void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b);
|
||||||
|
|
||||||
#ifdef RGBLIGHT_USE_TIMER
|
# ifdef RGBLIGHT_USE_TIMER
|
||||||
void rgblight_task(void);
|
void rgblight_task(void);
|
||||||
void rgblight_timer_init(void);
|
void rgblight_timer_init(void);
|
||||||
void rgblight_timer_enable(void);
|
void rgblight_timer_enable(void);
|
||||||
void rgblight_timer_disable(void);
|
void rgblight_timer_disable(void);
|
||||||
void rgblight_timer_toggle(void);
|
void rgblight_timer_toggle(void);
|
||||||
#else
|
# else
|
||||||
#define rgblight_task()
|
# define rgblight_task()
|
||||||
#define rgblight_timer_init()
|
# define rgblight_timer_init()
|
||||||
#define rgblight_timer_enable()
|
# define rgblight_timer_enable()
|
||||||
#define rgblight_timer_disable()
|
# define rgblight_timer_disable()
|
||||||
#define rgblight_timer_toggle()
|
# define rgblight_timer_toggle()
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
# ifdef RGBLIGHT_SPLIT
|
# ifdef RGBLIGHT_SPLIT
|
||||||
# define RGBLIGHT_STATUS_CHANGE_MODE (1 << 0)
|
# define RGBLIGHT_STATUS_CHANGE_MODE (1 << 0)
|
||||||
# define RGBLIGHT_STATUS_CHANGE_HSVS (1 << 1)
|
# define RGBLIGHT_STATUS_CHANGE_HSVS (1 << 1)
|
||||||
# define RGBLIGHT_STATUS_CHANGE_TIMER (1 << 2)
|
# define RGBLIGHT_STATUS_CHANGE_TIMER (1 << 2)
|
||||||
# define RGBLIGHT_STATUS_ANIMATION_TICK (1 << 3)
|
# define RGBLIGHT_STATUS_ANIMATION_TICK (1 << 3)
|
||||||
|
# define RGBLIGHT_STATUS_CHANGE_LAYERS (1 << 4)
|
||||||
|
|
||||||
typedef struct _rgblight_syncinfo_t {
|
typedef struct _rgblight_syncinfo_t {
|
||||||
rgblight_config_t config;
|
rgblight_config_t config;
|
||||||
|
|||||||
Reference in new issue
Block a user