Merge remote-tracking branch 'upstream/master' into develop

This commit is contained in:
fauxpark
2021-02-08 07:57:09 +11:00
21 changed files with 2433 additions and 124 deletions
+213 -109
View File
@@ -2,132 +2,236 @@
The I2C Master drivers used in QMK have a set of common functions to allow portability between MCUs.
## An important note on I2C Addresses :id=note-on-i2c-addresses
## I2C Addressing :id=note-on-i2c-addresses
All of the addresses expected by this driver should be pushed to the upper 7 bits of the address byte. Setting
the lower bit (indicating read/write) will be done by the respective functions. Almost all I2C addresses listed
All of the addresses expected by this driver should be pushed to the upper 7 bits of the address byte. Setting
the lower bit (indicating read/write) will be done by the respective functions. Almost all I2C addresses listed
on datasheets and the internet will be represented as 7 bits occupying the lower 7 bits and will need to be
shifted to the left (more significant) by one bit. This is easy to do via the bitwise shift operator `<< 1`.
shifted to the left (more significant) by one bit. This is easy to do via the bitwise shift operator `<< 1`.
You can either do this on each call to the functions below, or once in your definition of the address. For example if your device has an address of `0x18`:
You can either do this on each call to the functions below, or once in your definition of the address. For example, if your device has an address of `0x18`:
`#define MY_I2C_ADDRESS (0x18 << 1)`
```c
#define MY_I2C_ADDRESS (0x18 << 1)
```
See https://www.robot-electronics.co.uk/i2c-tutorial for more information about I2C addressing and other technical details.
## Available functions :id=available-functions
## AVR Configuration :id=avr-configuration
|Function |Description |
|------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|`void i2c_init(void);` |Initializes the I2C driver. This function should be called once before any transaction is initiated. |
|`i2c_status_t i2c_start(uint8_t address, uint16_t timeout);` |Starts an I2C transaction. Address is the 7-bit slave address without the direction bit. |
|`i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. Returns status of transaction. |
|`i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Receive data over I2C. Address is the 7-bit slave address without the direction. Saves number of bytes specified by `length` in `data` array. Returns status of transaction. |
|`i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_transmit` function but `regaddr` sets where in the slave the data will be written. |
|`i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_receive` function but `regaddr` sets from where in the slave the data will be read. |
|`i2c_status_t i2c_stop(void);` |Ends an I2C transaction. |
The following defines can be used to configure the I2C master driver:
### Function Return :id=function-return
|`config.h` Override|Description |Default |
|-------------------|---------------------|--------|
|`F_SCL` |Clock frequency in Hz|`400000`|
All the above functions, except `void i2c_init(void);` return the following truth table:
No further setup is required - just connect the `SDA` and `SCL` pins of your I2C devices to the matching pins on the MCU:
|Return Constant |Value|Description |
|--------------------|-----|--------------------------------|
|`I2C_STATUS_SUCCESS`|0 |Operation executed successfully.|
|`I2C_STATUS_ERROR` |-1 |Operation failed. |
|`I2C_STATUS_TIMEOUT`|-2 |Operation timed out. |
|MCU |`SCL`|`SDA`|
|------------------|-----|-----|
|ATmega16/32U4 |`D0` |`D1` |
|AT90USB64/128 |`D0` |`D1` |
|ATmega32A |`C0` |`C1` |
|ATmega328/P |`C5` |`C4` |
?> The ATmega16/32U2 does not possess I2C functionality, and so cannot use this driver.
## AVR :id=avr
## ChibiOS/ARM Configuration :id=arm-configuration
### Configuration :id=avr-configuration
You'll need to determine which pins can be used for I2C -- a an example, STM32 parts generally have multiple I2C peripherals, labeled I2C1, I2C2, I2C3 etc.
The following defines can be used to configure the I2C master driver.
|Variable |Description |Default|
|------------------|---------------------------------------------------|-------|
|`F_SCL` |Clock frequency in Hz |400KHz |
AVRs usually have set GPIO which turn into I2C pins, therefore no further configuration is required.
## ARM :id=arm
For ARM the Chibios I2C HAL driver is under the hood.
This section assumes an STM32 MCU.
### Configuration :id=arm-configuration
The configuration for ARM MCUs can be quite complex as often there are multiple I2C drivers which can be assigned to a variety of ports.
Firstly the `mcuconf.h` file must be setup to enable the necessary hardware drivers.
|Variable |Description |Default|
|------------------------------|------------------------------------------------------------------------------------|-------|
|`#STM32_I2C_USE_XXX` |Enable/Disable the hardware driver XXX (each driver should be explicitly listed) |FALSE |
|`#STM32_I2C_BUSY_TIMEOUT` |Time in ms until the I2C command is aborted if no response is received |50 |
|`#STM32_I2C_XXX_IRQ_PRIORITY` |Interrupt priority for hardware driver XXX (THIS IS AN EXPERT SETTING) |10 |
|`#STM32_I2C_USE_DMA` |Enable/Disable the ability of the MCU to offload the data transfer to the DMA unit |TRUE |
|`#STM32_I2C_XXX_DMA_PRIORITY` |Priority of DMA unit for hardware driver XXX (THIS IS AN EXPERT SETTING) |1 |
Secondly, in the `halconf.h` file, `#define HAL_USE_I2C` must be set to `TRUE`. This allows ChibiOS to load its I2C driver.
Lastly, we need to assign the correct GPIO pins depending on the I2C hardware driver we want to use.
By default the I2C1 hardware driver is assumed to be used. If another hardware driver is used, `#define I2C_DRIVER I2CDX` should be added to the `config.h` file with X being the number of hardware driver used. For example is I2C3 is enabled, the `config.h` file should contain `#define I2C_DRIVER I2CD3`. This aligns the QMK I2C driver with the Chibios I2C driver.
STM32 MCUs allows a variety of pins to be configured as I2C pins depending on the hardware driver used. By default B6 and B7 are set to I2C. You can use these defines to set your i2c pins:
| Variable | Description | Default |
|--------------------------|----------------------------------------------------------------------------------------------|---------|
| `I2C1_SCL_BANK` | The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SCL | `GPIOB` |
| `I2C1_SDA_BANK` | The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SDA | `GPIOB` |
| `I2C1_SCL` | The pin number for the SCL pin (0-15) | `6` |
| `I2C1_SDA` | The pin number for the SDA pin (0-15) | `7` |
| `I2C1_BANK` (deprecated) | The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`), superceded by `I2C1_SCL_BANK`, `I2C1_SDA_BANK` | `GPIOB` |
The ChibiOS I2C driver configuration depends on STM32 MCU:
STM32F1xx, STM32F2xx, STM32F4xx, STM32L0xx and STM32L1xx use I2Cv1;
STM32F0xx, STM32F3xx, STM32F7xx and STM32L4xx use I2Cv2;
#### I2Cv1 :id=i2cv1
STM32 MCUs allow for different clock and duty parameters when configuring I2Cv1. These can be modified using the following parameters, using <https://www.playembedded.org/blog/stm32-i2c-chibios/#I2Cv1_configuration_structure> as a reference:
| Variable | Default |
|--------------------|------------------|
| `I2C1_OPMODE` | `OPMODE_I2C` |
| `I2C1_CLOCK_SPEED` | `100000` |
| `I2C1_DUTY_CYCLE` | `STD_DUTY_CYCLE` |
#### I2Cv2 :id=i2cv2
STM32 MCUs allow for different timing parameters when configuring I2Cv2. These can be modified using the following parameters, using <https://www.st.com/en/embedded-software/stsw-stm32126.html> as a reference:
| Variable | Default |
|-----------------------|---------|
| `I2C1_TIMINGR_PRESC` | `15U` |
| `I2C1_TIMINGR_SCLDEL` | `4U` |
| `I2C1_TIMINGR_SDADEL` | `2U` |
| `I2C1_TIMINGR_SCLH` | `15U` |
| `I2C1_TIMINGR_SCLL` | `21U` |
STM32 MCUs allow for different "alternate function" modes when configuring GPIO pins. These are required to switch the pins used to I2Cv2 mode. See the respective datasheet for the appropriate values for your MCU.
| Variable | Default |
|---------------------|---------|
| `I2C1_SCL_PAL_MODE` | `4` |
| `I2C1_SDA_PAL_MODE` | `4` |
#### Other :id=other
You can also overload the `void i2c_init(void)` function, which has a weak attribute. If you do this the configuration variables above will not be used. Please consult the datasheet of your MCU for the available GPIO configurations. The following is an example initialization function:
To enable I2C, modify your board's `halconf.h` to enable I2C:
```c
void i2c_init(void)
{
setPinInput(B6); // Try releasing special pins for a short time
setPinInput(B7);
wait_ms(10); // Wait for the release to happen
#define HAL_USE_I2C TRUE
```
palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B6 to I2C function
palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B7 to I2C function
Then, modify your board's `mcuconf.h` to enable the peripheral you've chosen, for example:
```c
#undef STM32_I2C_USE_I2C2
#define STM32_I2C_USE_I2C2 TRUE
```
|`mcuconf.h` Setting |Description |Default|
|----------------------------|----------------------------------------------------------------------------------|-------|
|`STM32_I2C_BUSY_TIMEOUT` |Time in milliseconds until the I2C command is aborted if no response is received |`50` |
|`STM32_I2C_XXX_IRQ_PRIORITY`|Interrupt priority for hardware driver XXX (THIS IS AN EXPERT SETTING) |`10` |
|`STM32_I2C_USE_DMA` |Enable/Disable the ability of the MCU to offload the data transfer to the DMA unit|`TRUE` |
|`STM32_I2C_XXX_DMA_PRIORITY`|Priority of DMA unit for hardware driver XXX (THIS IS AN EXPERT SETTING) |`1` |
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
|`config.h` Overrride |Description |Default|
|------------------------|-------------------------------------------------------------------------------------------|-------|
|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc. |`I2CD1`|
|`I2C1_BANK` (deprecated)|The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`), superseded by `I2C1_SCL_BANK`/`I2C1_SDA_BANK`|`GPIOB`|
|`I2C1_SCL_BANK` |The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SCL |`GPIOB`|
|`I2C1_SCL` |The pin number for SCL (0-15) |`6` |
|`I2C1_SCL_PAL_MODE` |The alternate function mode for SCL |`4` |
|`I2C1_SDA_BANK` |The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SDA |`GPIOB`|
|`I2C1_SDA` |The pin number for SDA (0-15) |`7` |
|`I2C1_SDA_PAL_MODE` |The alternate function mode for SDA |`4` |
The following configuration values depend on the specific MCU in use.
### I2Cv1 :id=i2cv1
* STM32F1xx
* STM32F2xx
* STM32F4xx
* STM32L0xx
* STM32L1xx
See [this page](https://www.playembedded.org/blog/stm32-i2c-chibios/#7_I2Cv1_configuration_structure) for the I2Cv1 configuration structure.
|`config.h` Override|Default |
|-------------------|----------------|
|`I2C1_OPMODE` |`OPMODE_I2C` |
|`I2C1_CLOCK_SPEED` |`100000` |
|`I2C1_DUTY_CYCLE` |`STD_DUTY_CYCLE`|
### I2Cv2 :id=i2cv2
* STM32F0xx
* STM32F3xx
* STM32F7xx
* STM32L4xx
See [this page](https://www.playembedded.org/blog/stm32-i2c-chibios/#8_I2Cv2_I2Cv3_configuration_structure) for the I2Cv2 configuration structure.
|`config.h` Override |Default|
|---------------------|-------|
|`I2C1_TIMINGR_PRESC` |`0U` |
|`I2C1_TIMINGR_SCLDEL`|`7U` |
|`I2C1_TIMINGR_SDADEL`|`0U` |
|`I2C1_TIMINGR_SCLH` |`38U` |
|`I2C1_TIMINGR_SCLL` |`129U` |
## Functions :id=functions
### `void i2c_init(void)`
Initialize the I2C driver. This function must be called only once, before any of the below functions can be called.
This function is weakly defined, meaning it can be overridden if necessary for your particular use case:
```c
void i2c_init(void) {
setPinInput(B6); // Try releasing special pins for a short time
setPinInput(B7);
wait_ms(10); // Wait for the release to happen
palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B6 to I2C function
palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B7 to I2C function
}
```
---
### `i2c_status_t i2c_start(uint8_t address, uint16_t timeout)`
Start an I2C transaction.
#### Arguments
- `uint8_t address`
The 7-bit I2C address of the device (ie. without the read/write bit - this will be set automatically).
- `uint16_t timeout`
The time in milliseconds to wait for a response from the target device.
#### Return Value
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
---
### `i2c_status_t i2c_transmit(uint8_t address, uint8_t *data, uint16_t length, uint16_t timeout)`
Send multiple bytes to the selected I2C device.
#### Arguments
- `uint8_t address`
The 7-bit I2C address of the device.
- `uint8_t *data`
A pointer to the data to transmit.
- `uint16_t length`
The number of bytes to write. Take care not to overrun the length of `data`.
- `uint16_t timeout`
The time in milliseconds to wait for a response from the target device.
#### Return Value
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
---
### `i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)`
Receive multiple bytes from the selected SPI device.
#### Arguments
- `uint8_t address`
The 7-bit I2C address of the device.
- `uint8_t *data`
A pointer to the buffer to read into.
- `uint16_t length`
The number of bytes to read. Take care not to overrun the length of `data`.
- `uint16_t timeout`
The time in milliseconds to wait for a response from the target device.
#### Return Value
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
---
### `i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)`
Writes to a register on the I2C device.
#### Arguments
- `uint8_t devaddr`
The 7-bit I2C address of the device.
- `uint8_t regaddr`
The register address to write to.
- `uint8_t *data`
A pointer to the data to transmit.
- `uint16_t length`
The number of bytes to write. Take care not to overrun the length of `data`.
- `uint16_t timeout`
The time in milliseconds to wait for a response from the target device.
#### Return Value
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
---
### `i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)`
Reads from a register on the I2C device.
#### Arguments
- `uint8_t devaddr`
The 7-bit I2C address of the device.
- `uint8_t regaddr`
The register address to read from.
- `uint16_t length`
The number of bytes to read. Take care not to overrun the length of `data`.
- `uint16_t timeout`
The time in milliseconds to wait for a response from the target device.
#### Return Value
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
---
### `i2c_status_t i2c_stop(void)`
Stop the current I2C transaction.
+27 -15
View File
@@ -8,7 +8,7 @@ No special setup is required - just connect the `SS`, `SCK`, `MOSI` and `MISO` p
|MCU |`SS`|`SCK`|`MOSI`|`MISO`|
|-----------------|----|-----|------|------|
|ATMega16/32U2/4 |`B0`|`B1` |`B2` |`B3` |
|ATmega16/32U2/4 |`B0`|`B1` |`B2` |`B3` |
|AT90USB64/128/162|`B0`|`B1` |`B2` |`B3` |
|ATmega32A |`B4`|`B7` |`B5` |`B6` |
|ATmega328/P |`B2`|`B5` |`B3` |`B4` |
@@ -20,22 +20,34 @@ You may use more than one slave select pin, not just the `SS` pin. This is usefu
You'll need to determine which pins can be used for SPI -- as an example, STM32 parts generally have multiple SPI peripherals, labeled SPI1, SPI2, SPI3 etc.
To enable SPI, modify your board's `halconf.h` to enable SPI - both `HAL_USE_SPI` and `SPI_USE_WAIT` should be `TRUE`, and `SPI_SELECT_MODE` should be `SPI_SELECT_MODE_PAD`.
Then, modify your board's `mcuconf.h` to enable the SPI peripheral you've chosen -- in the case of using SPI2, modify `STM32_SPI_USE_SPI2` to be `TRUE`.
To enable SPI, modify your board's `halconf.h` to enable SPI:
As per the AVR configuration, you may select any other standard GPIO as a slave select pin, and can be supplied to `spi_start()`.
```c
#define HAL_USE_SPI TRUE
#define SPI_USE_WAIT TRUE
#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
```
Then, modify your board's `mcuconf.h` to enable the peripheral you've chosen, for example:
```c
#undef STM32_SPI_USE_SPI2
#define STM32_SPI_USE_SPI2 TRUE
```
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
`config.h` override | Description | Default Value
----------------------------|---------------------------------------------------------------|--------------
`#define SPI_DRIVER` | SPI peripheral to use - SPI1 => `SPID1`, SPI2 => `SPID2` etc. | `SPID2`
`#define SPI_SCK_PIN` | The pin to use for the SCK | `B13`
`#define SPI_SCK_PAL_MODE` | The alternate function mode for the SCK pin | `5`
`#define SPI_MOSI_PIN` | The pin to use for the MOSI | `B15`
`#define SPI_MOSI_PAL_MODE` | The alternate function mode for the MOSI pin | `5`
`#define SPI_MISO_PIN` | The pin to use for the MISO | `B14`
`#define SPI_MISO_PAL_MODE` | The alternate function mode for the MISO pin | `5`
|`config.h` Override|Description |Default|
|-------------------|-------------------------------------------------------------|-------|
|`SPI_DRIVER` |SPI peripheral to use - SPI1 -> `SPID1`, SPI2 -> `SPID2` etc.|`SPID2`|
|`SPI_SCK_PIN` |The pin to use for SCK |`B13` |
|`SPI_SCK_PAL_MODE` |The alternate function mode for SCK |`5` |
|`SPI_MOSI_PIN` |The pin to use for MOSI |`B15` |
|`SPI_MOSI_PAL_MODE`|The alternate function mode for MOSI |`5` |
|`SPI_MISO_PIN` |The pin to use for MISO |`B14` |
|`SPI_MISO_PAL_MODE`|The alternate function mode for MISO |`5` |
As per the AVR configuration, you may choose any other standard GPIO as a slave select pin, which should be supplied to `spi_start()`.
## Functions
@@ -112,7 +124,7 @@ Send multiple bytes to the selected SPI device.
#### Return Value
`SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_SUCCESS` on success, or `SPI_STATUS_ERROR` otherwise.
`SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_ERROR` if some other error occurs, otherwise `SPI_STATUS_SUCCESS`.
---
@@ -129,7 +141,7 @@ Receive multiple bytes from the selected SPI device.
#### Return Value
`SPI_STATUS_TIMEOUT` if the internal transmission timeout period elapses, `SPI_STATUS_SUCCESS` on success, or `SPI_STATUS_ERROR` otherwise.
`SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_ERROR` if some other error occurs, otherwise `SPI_STATUS_SUCCESS`.
---
+19
View File
@@ -0,0 +1,19 @@
/* Copyright 2021 Danny Nguyen <danny@keeb.io>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "config_common.h"
+17
View File
@@ -0,0 +1,17 @@
/* Copyright 2021 Danny Nguyen <danny@keeb.io>
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 "dsp40.h"
+21
View File
@@ -0,0 +1,21 @@
/* Copyright 2021 Danny Nguyen <danny@keeb.io>
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
#ifdef KEYBOARD_keebio_dsp40_rev1
#include "rev1.h"
#endif
+107
View File
@@ -0,0 +1,107 @@
{
"keyboard_name": "DSP40",
"url": "https://keeb.io",
"maintainer": "nooges",
"width": 12,
"height": 4,
"layouts": {
"LAYOUT": {
"layout": [
{ "label": "Esc", "x": 0, "y": 0 },
{ "label": "Q", "x": 1, "y": 0 },
{ "label": "W", "x": 2, "y": 0 },
{ "label": "E", "x": 3, "y": 0 },
{ "label": "R", "x": 4, "y": 0 },
{ "label": "T", "x": 5, "y": 0 },
{ "label": "Y", "x": 6, "y": 0 },
{ "label": "U", "x": 7, "y": 0 },
{ "label": "I", "x": 8, "y": 0 },
{ "label": "O", "x": 9, "y": 0 },
{ "label": "P", "x": 10, "y": 0 },
{ "label": "Back<br>Space", "x": 11, "y": 0 },
{ "label": "Tab", "x": 0, "y": 1, "w": 1.25 },
{ "label": "A", "x": 1.25, "y": 1 },
{ "label": "S", "x": 2.25, "y": 1 },
{ "label": "D", "x": 3.25, "y": 1 },
{ "label": "F", "x": 4.25, "y": 1 },
{ "label": "G", "x": 5.25, "y": 1 },
{ "label": "H", "x": 6.25, "y": 1 },
{ "label": "J", "x": 7.25, "y": 1 },
{ "label": "K", "x": 8.25, "y": 1 },
{ "label": "L", "x": 9.25, "y": 1 },
{ "label": "Enter", "x": 10.25, "y": 1, "w": 1.75 },
{ "label": "Shift", "x": 0, "y": 2, "w": 1.75 },
{ "label": "Z", "x": 1.75, "y": 2 },
{ "label": "X", "x": 2.75, "y": 2 },
{ "label": "C", "x": 3.75, "y": 2 },
{ "label": "V", "x": 4.75, "y": 2 },
{ "label": "B", "x": 5.75, "y": 2 },
{ "label": "N", "x": 6.75, "y": 2 },
{ "label": "M", "x": 7.75, "y": 2 },
{ "label": "<", "x": 8.75, "y": 2 },
{ "label": "Shift", "x": 9.75, "y": 2, "w": 1.25 },
{ "label": "Fn", "x": 11, "y": 2 },
{ "label": "Hyper", "x": 0, "y": 3, "w": 1.25 },
{ "label": "Super", "x": 1.25, "y": 3 },
{ "label": "Meta", "x": 2.25, "y": 3, "w": 1.25 },
{ "x": 3.5, "y": 3, "w": 2.25 },
{ "x": 5.75, "y": 3, "w": 2.75 },
{ "label": "Super", "x": 8.5, "y": 3, "w": 1.25 },
{ "label": "Meta", "x": 9.75, "y": 3 },
{ "label": "Super", "x": 10.75, "y": 3, "w": 1.25 }
]
},
"LAYOUT_ortho_4x12": {
"layout": [
{ "label": "Tab", "x": 0, "y": 0 },
{ "label": "Q", "x": 1, "y": 0 },
{ "label": "W", "x": 2, "y": 0 },
{ "label": "E", "x": 3, "y": 0 },
{ "label": "R", "x": 4, "y": 0 },
{ "label": "T", "x": 5, "y": 0 },
{ "label": "Y", "x": 6, "y": 0 },
{ "label": "U", "x": 7, "y": 0 },
{ "label": "I", "x": 8, "y": 0 },
{ "label": "O", "x": 9, "y": 0 },
{ "label": "P", "x": 10, "y": 0 },
{ "label": "Back Space", "x": 11, "y": 0 },
{ "label": "Esc", "x": 0, "y": 1 },
{ "label": "A", "x": 1, "y": 1 },
{ "label": "S", "x": 2, "y": 1 },
{ "label": "D", "x": 3, "y": 1 },
{ "label": "F", "x": 4, "y": 1 },
{ "label": "G", "x": 5, "y": 1 },
{ "label": "H", "x": 6, "y": 1 },
{ "label": "J", "x": 7, "y": 1 },
{ "label": "K", "x": 8, "y": 1 },
{ "label": "L", "x": 9, "y": 1 },
{ "label": ";", "x": 10, "y": 1 },
{ "label": "'", "x": 11, "y": 1 },
{ "label": "Shift", "x": 0, "y": 2 },
{ "label": "Z", "x": 1, "y": 2 },
{ "label": "X", "x": 2, "y": 2 },
{ "label": "C", "x": 3, "y": 2 },
{ "label": "V", "x": 4, "y": 2 },
{ "label": "B", "x": 5, "y": 2 },
{ "label": "N", "x": 6, "y": 2 },
{ "label": "M", "x": 7, "y": 2 },
{ "label": ",", "x": 8, "y": 2 },
{ "label": ".", "x": 9, "y": 2 },
{ "label": "/", "x": 10, "y": 2 },
{ "label": "Enter", "x": 11, "y": 2 },
{ "x": 0, "y": 3 },
{ "label": "Ctrl", "x": 1, "y": 3 },
{ "label": "Alt", "x": 2, "y": 3 },
{ "label": "Super", "x": 3, "y": 3 },
{ "label": "Lower", "x": 4, "y": 3 },
{ "label": "Space", "x": 5, "y": 3 },
{ "label": "Space", "x": 6, "y": 3 },
{ "label": "Raise", "x": 7, "y": 3 },
{ "label": "Left", "x": 8, "y": 3 },
{ "label": "Down", "x": 9, "y": 3 },
{ "label": "Up", "x": 10, "y": 3 },
{ "label": "Right", "x": 11, "y": 3 }
]
}
}
}
@@ -0,0 +1,19 @@
/* Copyright 2021 Danny Nguyen <danny@keeb.io>
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 TAPPING_TERM 150
@@ -0,0 +1,214 @@
/* Copyright 2021 Danny Nguyen <danny@keeb.io>
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 {
_MAC,
_WINDOWS,
_TESTMODE,
_LOWER,
_RAISE,
_FKEYS,
_ADJUST,
};
enum custom_keycodes {
MAC = SAFE_RANGE,
WINDOWS,
TESTMODE,
LOWER,
RAISE,
ADJUST,
};
#define KC_ KC_TRNS
#define KC_CAPW LGUI(LSFT(KC_3)) // Capture whole screen
#define KC_CPYW LGUI(LSFT(LCTL(KC_3))) // Copy whole screen
#define KC_CAPP LGUI(LSFT(KC_4)) // Capture portion of screen
#define KC_CPYP LGUI(LSFT(LCTL(KC_4))) // Copy portion of screen
#define KC_ESCC MT(MOD_LCTL, KC_ESC)
#define KC_LOWR LOWER
#define KC_RASE RAISE
#define KC_GRVF LT(_FKEYS, KC_GRV)
#define KC_ENTS MT(MOD_LSFT, KC_ENT)
#define KC_BL_S BL_STEP
#define KC_BL_T BL_TOGG
#define KC_RMOD RGB_MOD
#ifndef LAYOUT_kc_ortho_4x12
#define LAYOUT_kc_ortho_4x12( \
L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \
L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \
L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \
) \
LAYOUT_ortho_4x12( \
KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, \
KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, \
KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \
KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35 \
)
#endif
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_MAC] = LAYOUT_kc_ortho_4x12(
//┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐
TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
ESCC, A , S , D , F , G , H , J , K , L ,SCLN,QUOT,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,ENTS,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
GRVF,LCTL,LALT,LGUI,LOWR,SPC , BSPC,RASE,LEFT,DOWN, UP ,RGHT
//└────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘
),
[_WINDOWS] = LAYOUT_kc_ortho_4x12(
//┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐
TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
ESCC, A , S , D , F , G , H , J , K , L ,SCLN,QUOT,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,ENTS,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
GRVF,LALT,LGUI,LCTL,LOWR,SPC , BSPC,RASE,LEFT,DOWN, UP ,RGHT
//└────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘
),
[_TESTMODE] = LAYOUT_kc_ortho_4x12(
//┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐
TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
RMOD,BL_S, S , D , F , G , RMOD,BL_S, K , L ,SCLN,QUOT,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,ENTS,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
GRVF,LALT,LGUI,LCTL,LOWR,SPC , BSPC,RASE,LEFT,DOWN, UP ,RGHT
//└────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘
),
[_LOWER] = LAYOUT_kc_ortho_4x12(
//┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐
, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , ,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
DEL ,CAPP,LEFT,RGHT, UP ,LBRC, RBRC, P4 , P5 , P6 ,PLUS,PIPE,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
,CPYP, , ,DOWN,LCBR, RCBR, P1 , P2 , P3 ,MINS, ,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
BL_S,BL_T, , , ,DEL , DEL , , P0 ,PDOT, ,
//└────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘
),
[_RAISE] = LAYOUT_kc_ortho_4x12(
//┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐
,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, ,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, EQL ,HOME, , , ,BSLS,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
MUTE,MSTP,MPLY,VOLD,PGDN,MINS, PLUS,END , , , , ,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
, , , , , , , , , , ,
//└────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘
),
[_FKEYS] = LAYOUT_kc_ortho_4x12(
//┌────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬────┐
F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
, , , , , , , , , , , ,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
, , , , , , , , , , , ,
//├────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼────┤
, , , , , , , , , , ,
//└────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴────┘
),
/* Adjust (Lower + Raise)
* ,-----------------------------------------------------------------------------------.
* | | Reset|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | | | | | | | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
[_ADJUST] = LAYOUT_ortho_4x12(
_______, RESET , RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, _______,
_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, MAC, WINDOWS, TESTMODE,_______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case MAC:
if (record->event.pressed) {
set_single_persistent_default_layer(_MAC);
}
return false;
break;
case WINDOWS:
if (record->event.pressed) {
set_single_persistent_default_layer(_WINDOWS);
}
return false;
break;
case TESTMODE:
if (record->event.pressed) {
set_single_persistent_default_layer(_TESTMODE);
}
return false;
break;
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
case ADJUST:
if (record->event.pressed) {
layer_on(_ADJUST);
} else {
layer_off(_ADJUST);
}
return false;
break;
}
return true;
}
+116
View File
@@ -0,0 +1,116 @@
/* Copyright 2021 Danny Nguyen <danny@keeb.io>
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 custom_layer {
_QWERTY,
_LOWER,
_RAISE,
_ADJUST,
};
enum custom_keycodes {
QWERTY = SAFE_RANGE,
LOWER,
RAISE,
ADJUST,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Default Layer
* ,-----------------------------------------------------------.
* | Esc| Q | W | E | R | T | Y | U | I | O | P | BS |
* |-----------------------------------------------------------|
* | Tab | A | S | D | F | G | H | J | K | L | Ent |
* |-----------------------------------------------------------|
* | LSft | Z | X | C | V | B | N | M | , | . | /? |
* |-----------------------------------------------------------|
* | LCtl | LGui| LAlt| spc fn0 | spc fn1 |fn2|RAlt|RCtl |
* `-----------------------------------------------------------'
*/
[_QWERTY] = LAYOUT(
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, 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_LCTL, KC_LGUI, KC_LALT, LT(_LOWER, KC_SPC), LT(_RAISE, KC_SPC), LT(_ADJUST, KC_LGUI), KC_RALT, KC_RCTL
),
[_LOWER] = LAYOUT(
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),BL_TOGG, BL_INC, BL_DEC,
_______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
[_RAISE] = LAYOUT(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, KC_DEL,
_______, KC_TRNS, _______, KC_TRNS, KC_TRNS, _______, _______, RGB_TOG
),
[_ADJUST] = LAYOUT(
_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL,
_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
)
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
case ADJUST:
if (record->event.pressed) {
layer_on(_ADJUST);
} else {
layer_off(_ADJUST);
}
return false;
break;
}
return true;
}
void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) {
if (clockwise) {
tap_code(KC_VOLU);
} else {
tap_code(KC_VOLD);
}
}
}
+75
View File
@@ -0,0 +1,75 @@
/* Copyright 2021 Danny Nguyen <danny@keeb.io>
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 via_layers {
_MAIN,
_FN1,
_FN2,
_FN3,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Default Layer
* ,-----------------------------------------------------------.
* | Esc| Q | W | E | R | T | Y | U | I | O | P | BS |
* |-----------------------------------------------------------|
* | Tab | A | S | D | F | G | H | J | K | L | Ent |
* |-----------------------------------------------------------|
* | LSft | Z | X | C | V | B | N | M | , | . | /? |
* |-----------------------------------------------------------|
* | LCtl | LGui| LAlt| spc fn1 | spc fn2 |fn3|RAlt|RCtl |
* `-----------------------------------------------------------'
*/
[_MAIN] = LAYOUT_ortho_4x12(
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_TAB, 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_SLSH,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, LT(_FN1, KC_SPC), KC_SPC, KC_SPC, LT(_FN2, KC_SPC), MO(_FN3), LT(_FN3, KC_LGUI), KC_RALT, KC_RCTL
),
[_FN1] = LAYOUT_ortho_4x12(
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______, KC_PIPE,
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),BL_TOGG,BL_INC, BL_DEC,
_______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
[_FN2] = LAYOUT_ortho_4x12(
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______, KC_BSLS,
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, KC_DEL,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[_FN3] = LAYOUT_ortho_4x12(
_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};
void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) {
if (clockwise) {
tap_code(KC_VOLU);
} else {
tap_code(KC_VOLD);
}
}
}
@@ -0,0 +1,5 @@
VIA_ENABLE = yes
LTO_ENABLE = yes
MOUSEKEY_ENABLE = yes
CONSOLE_ENABLE = yes
COMMAND_ENABLE = no
+13
View File
@@ -0,0 +1,13 @@
# DSP40
A 40% keyboard with ortho and staggered layout options.
* Keyboard Maintainer: [Bakingpy/nooges](https://github.com/nooges)
* Hardware Supported: STM32F072CBT6
* Hardware Availability: [Keebio](https://keeb.io/)
Make example for this keyboard (after setting up your build environment):
make keebio/dsp40/rev1: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).
File diff suppressed because it is too large Load Diff
+65
View File
@@ -0,0 +1,65 @@
/* Copyright 2021 Danny Nguyen <danny@keeb.io>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xCB10
#define PRODUCT_ID 0x144C
#define DEVICE_VER 0x0100
#define MANUFACTURER Keebio
#define PRODUCT DSP40 Rev. 1
/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 12
/* Keyboard Matrix Assignments */
#define MATRIX_ROW_PINS { B9, A9, A8, B15 }
#define MATRIX_COL_PINS { B10, B2, A3, A4, B7, B6, A10, C13, C14, C15, F0, F1 }
#define ENCODERS_PAD_A { A1 }
#define ENCODERS_PAD_B { A2 }
#define TAP_CODE_DELAY 10
#define DIODE_DIRECTION COL2ROW
#define BACKLIGHT_PIN A6
#define BACKLIGHT_PWM_DRIVER PWMD3
#define BACKLIGHT_PWM_CHANNEL 1
#define BACKLIGHT_PAL_MODE 1
// #define BACKLIGHT_BREATHING
#define BACKLIGHT_LEVELS 7
#define RGB_DI_PIN D3
#ifdef RGB_DI_PIN
#define RGBLED_NUM 4
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
#define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
#define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
/*== all animations enable ==*/
#define RGBLIGHT_ANIMATIONS
#endif
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
File diff suppressed because it is too large Load Diff
+176
View File
@@ -0,0 +1,176 @@
/*
ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#ifndef _MCUCONF_H_
#define _MCUCONF_H_
/*
* STM32F0xx drivers configuration.
* The following settings override the default settings present in
* the various device driver implementation headers.
* Note that the settings for each driver only have effect if the whole
* driver is enabled in halconf.h.
*
* IRQ priorities:
* 3...0 Lowest...Highest.
*
* DMA priorities:
* 0...3 Lowest...Highest.
*/
#define STM32F0xx_MCUCONF
// #define STM32F070xB
/*
* HAL driver system settings.
*/
#define STM32_NO_INIT FALSE
#define STM32_PVD_ENABLE FALSE
#define STM32_PLS STM32_PLS_LEV0
#define STM32_HSI_ENABLED TRUE
#define STM32_HSI14_ENABLED TRUE
#define STM32_HSI48_ENABLED FALSE
#define STM32_LSI_ENABLED TRUE
#define STM32_HSE_ENABLED FALSE
#define STM32_LSE_ENABLED FALSE
#define STM32_SW STM32_SW_PLL
#define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2
#define STM32_PREDIV_VALUE 1
#define STM32_PLLMUL_VALUE 12
#define STM32_HPRE STM32_HPRE_DIV1
#define STM32_PPRE STM32_PPRE_DIV1
#define STM32_ADCSW STM32_ADCSW_HSI14
#define STM32_ADCPRE STM32_ADCPRE_DIV4
#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
#define STM32_ADCPRE STM32_ADCPRE_DIV4
#define STM32_ADCSW STM32_ADCSW_HSI14
#define STM32_USBSW STM32_USBSW_HSI48
#define STM32_CECSW STM32_CECSW_HSI
#define STM32_I2C1SW STM32_I2C1SW_HSI
#define STM32_USART1SW STM32_USART1SW_PCLK
#define STM32_RTCSEL STM32_RTCSEL_LSI
/*
* ADC driver system settings.
*/
#define STM32_ADC_USE_ADC1 FALSE
#define STM32_ADC_ADC1_DMA_PRIORITY 2
#define STM32_ADC_IRQ_PRIORITY 2
#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2
/*
* EXT driver system settings.
*/
#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3
#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3
#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3
#define STM32_EXT_EXTI16_IRQ_PRIORITY 3
#define STM32_EXT_EXTI17_IRQ_PRIORITY 3
/*
* GPT driver system settings.
*/
#define STM32_GPT_USE_TIM1 FALSE
#define STM32_GPT_USE_TIM2 FALSE
#define STM32_GPT_USE_TIM3 FALSE
#define STM32_GPT_USE_TIM14 FALSE
#define STM32_GPT_TIM1_IRQ_PRIORITY 2
#define STM32_GPT_TIM2_IRQ_PRIORITY 2
#define STM32_GPT_TIM3_IRQ_PRIORITY 2
#define STM32_GPT_TIM14_IRQ_PRIORITY 2
/*
* I2C driver system settings.
*/
#define STM32_I2C_USE_I2C1 FALSE
#define STM32_I2C_USE_I2C2 FALSE
#define STM32_I2C_BUSY_TIMEOUT 50
#define STM32_I2C_I2C1_IRQ_PRIORITY 3
#define STM32_I2C_I2C2_IRQ_PRIORITY 3
#define STM32_I2C_USE_DMA TRUE
#define STM32_I2C_I2C1_DMA_PRIORITY 1
#define STM32_I2C_I2C2_DMA_PRIORITY 1
#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure")
/*
* ICU driver system settings.
*/
#define STM32_ICU_USE_TIM1 FALSE
#define STM32_ICU_USE_TIM2 FALSE
#define STM32_ICU_USE_TIM3 FALSE
#define STM32_ICU_TIM1_IRQ_PRIORITY 3
#define STM32_ICU_TIM2_IRQ_PRIORITY 3
#define STM32_ICU_TIM3_IRQ_PRIORITY 3
/*
* PWM driver system settings.
*/
#define STM32_PWM_USE_ADVANCED FALSE
#define STM32_PWM_USE_TIM1 FALSE
#define STM32_PWM_USE_TIM2 FALSE
#define STM32_PWM_USE_TIM3 TRUE
#define STM32_PWM_TIM1_IRQ_PRIORITY 3
#define STM32_PWM_TIM2_IRQ_PRIORITY 3
#define STM32_PWM_TIM3_IRQ_PRIORITY 3
/*
* SERIAL driver system settings.
*/
#define STM32_SERIAL_USE_USART1 FALSE
#define STM32_SERIAL_USE_USART2 FALSE
#define STM32_SERIAL_USART1_PRIORITY 3
#define STM32_SERIAL_USART2_PRIORITY 3
/*
* SPI driver system settings.
*/
#define STM32_SPI_USE_SPI1 FALSE
#define STM32_SPI_USE_SPI2 FALSE
#define STM32_SPI_SPI1_DMA_PRIORITY 1
#define STM32_SPI_SPI2_DMA_PRIORITY 1
#define STM32_SPI_SPI1_IRQ_PRIORITY 2
#define STM32_SPI_SPI2_IRQ_PRIORITY 2
#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
/*
* ST driver system settings.
*/
#define STM32_ST_IRQ_PRIORITY 2
#define STM32_ST_USE_TIMER 2
/*
* UART driver system settings.
*/
#define STM32_UART_USE_USART1 FALSE
#define STM32_UART_USE_USART2 FALSE
#define STM32_UART_USART1_IRQ_PRIORITY 3
#define STM32_UART_USART2_IRQ_PRIORITY 3
#define STM32_UART_USART1_DMA_PRIORITY 0
#define STM32_UART_USART2_DMA_PRIORITY 0
#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
/*
* USB driver system settings.
*/
#define STM32_USB_USE_USB1 TRUE
#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE
#define STM32_USB_USB1_LP_IRQ_PRIORITY 3
#endif /* _MCUCONF_H_ */
+13
View File
@@ -0,0 +1,13 @@
# DSP40 Rev. 1
A 40% keyboard with ortho and staggered layout options.
* Keyboard Maintainer: [Bakingpy/nooges](https://github.com/nooges)
* Hardware Supported: STM32F072CBT6
* Hardware Availability: [Keebio](https://keeb.io/)
Make example for this keyboard (after setting up your build environment):
make keebio/dsp40/rev1: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).
+26
View File
@@ -0,0 +1,26 @@
/* Copyright 2021 Danny Nguyen <danny@keeb.io>
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 "rev1.h"
void eeconfig_init_kb(void) {
#ifdef BACKLIGHT_ENABLE
backlight_enable();
backlight_level(5);
#endif
eeconfig_update_kb(0);
eeconfig_init_user();
}
+47
View File
@@ -0,0 +1,47 @@
/* Copyright 2021 Danny Nguyen <danny@keeb.io>
*
* 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 "dsp40.h"
#include "quantum.h"
#define LAYOUT_ortho_4x12( \
KA1, KA2, KA3, KA4, KA5, KA6, KA7, KA8, KA9, KA10, KA11, KA12, \
KB1, KB2, KB3, KB4, KB5, KB6, KB7, KB8, KB9, KB10, KB11, KB12, \
KC1, KC2, KC3, KC4, KC5, KC6, KC7, KC8, KC9, KC10, KC11, KC12, \
KD1, KD2, KD3, KD4, KD5, KD6, KD7, KD8, KD9, KD10, KD11, KD12 \
) \
{ \
{ KA1, KA2, KA3, KA4, KA5, KA6, KA7, KA8, KA9, KA10, KA11, KA12 }, \
{ KB1, KB2, KB3, KB4, KB5, KB6, KB7, KB8, KB9, KB10, KB11, KB12 }, \
{ KC1, KC2, KC3, KC4, KC5, KC6, KC7, KC8, KC9, KC10, KC11, KC12 }, \
{ KD1, KD2, KD3, KD4, KD5, KD6, KD7, KD8, KD9, KD10, KD11, KD12 } \
}
#define LAYOUT( \
KA1, KA2, KA3, KA4, KA5, KA6, KA7, KA8, KA9, KA10, KA11, KA12, \
KB1, KB2, KB3, KB4, KB5, KB6, KB7, KB8, KB9, KB10, KB12, \
KC2, KC3, KC4, KC5, KC6, KC7, KC8, KC9, KC10, KC11, KC12, \
KD1, KD2, KD3, KD5, KD8, KD10, KD11, KD12 \
) \
{ \
{ KA1, KA2, KA3, KA4, KA5, KA6, KA7, KA8, KA9, KA10, KA11, KA12 }, \
{ KB1, KB2, KB3, KB4, KB5, KB6, KB7, KB8, KB9, KB10, KC_NO, KB12 }, \
{ KC_NO, KC2, KC3, KC4, KC5, KC6, KC7, KC8, KC9, KC10, KC11, KC12 }, \
{ KD1, KD2, KD3, KC_NO, KD5, KC_NO, KC_NO, KD8, KC_NO, KD10, KD11, KD12 } \
}
#define LAYOUT_40_staggered LAYOUT
+20
View File
@@ -0,0 +1,20 @@
# MCU name
MCU = STM32F072
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no # USB Nkey Rollover
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no # Enable Bluetooth
AUDIO_ENABLE = no # Audio output
ENCODER_ENABLE = yes
+1
View File
@@ -0,0 +1 @@
DEFAULT_FOLDER = keebio/dsp40/rev1