From 5d5cbb877da3a7f27f1c96948d240317e6263388 Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 8 Feb 2021 07:45:59 +1100 Subject: Rework I2C driver docs (#11658) --- docs/i2c_driver.md | 286 ++++++++++++++++++++++++++++++++++++----------------- docs/spi_driver.md | 42 +++++--- 2 files changed, 222 insertions(+), 106 deletions(-) diff --git a/docs/i2c_driver.md b/docs/i2c_driver.md index 0103e1b4cc..3ec34a0f87 100644 --- a/docs/i2c_driver.md +++ b/docs/i2c_driver.md @@ -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 - -|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. | +## AVR Configuration :id=avr-configuration -### Function Return :id=function-return +The following defines can be used to configure the I2C master driver: -All the above functions, except `void i2c_init(void);` return the following truth table: +|`config.h` Override|Description |Default | +|-------------------|---------------------|--------| +|`F_SCL` |Clock frequency in Hz|`400000`| -|Return Constant |Value|Description | -|--------------------|-----|--------------------------------| -|`I2C_STATUS_SUCCESS`|0 |Operation executed successfully.| -|`I2C_STATUS_ERROR` |-1 |Operation failed. | -|`I2C_STATUS_TIMEOUT`|-2 |Operation timed out. | +No further setup is required - just connect the `SDA` and `SCL` pins of your I2C devices to the matching pins on the MCU: +|MCU |`SCL`|`SDA`| +|------------------|-----|-----| +|ATmega16/32U4 |`D0` |`D1` | +|AT90USB64/128 |`D0` |`D1` | +|ATmega32A |`C0` |`C1` | +|ATmega328/P |`C5` |`C4` | -## AVR :id=avr +?> The ATmega16/32U2 does not possess I2C functionality, and so cannot use this driver. -### Configuration :id=avr-configuration +## ChibiOS/ARM Configuration :id=arm-configuration -The following defines can be used to configure the I2C master driver. +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. -|Variable |Description |Default| -|------------------|---------------------------------------------------|-------| -|`F_SCL` |Clock frequency in Hz |400KHz | +To enable I2C, modify your board's `halconf.h` to enable I2C: -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. +```c +#define HAL_USE_I2C TRUE +``` -### Configuration :id=arm-configuration +Then, modify your board's `mcuconf.h` to enable the peripheral you've chosen, for example: -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. +```c +#undef STM32_I2C_USE_I2C2 +#define STM32_I2C_USE_I2C2 TRUE +``` -Firstly the `mcuconf.h` file must be setup to enable the necessary hardware drivers. +|`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` | -|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 | +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. -Secondly, in the `halconf.h` file, `#define HAL_USE_I2C` must be set to `TRUE`. This allows ChibiOS to load its I2C driver. +|`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` | -Lastly, we need to assign the correct GPIO pins depending on the I2C hardware driver we want to use. +The following configuration values depend on the specific MCU in 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. +### I2Cv1 :id=i2cv1 -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: +* STM32F1xx +* STM32F2xx +* STM32F4xx +* STM32L0xx +* STM32L1xx -| 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` | +See [this page](https://www.playembedded.org/blog/stm32-i2c-chibios/#7_I2Cv1_configuration_structure) for the I2Cv1 configuration structure. -The ChibiOS I2C driver configuration depends on STM32 MCU: +|`config.h` Override|Default | +|-------------------|----------------| +|`I2C1_OPMODE` |`OPMODE_I2C` | +|`I2C1_CLOCK_SPEED` |`100000` | +|`I2C1_DUTY_CYCLE` |`STD_DUTY_CYCLE`| - STM32F1xx, STM32F2xx, STM32F4xx, STM32L0xx and STM32L1xx use I2Cv1; - STM32F0xx, STM32F3xx, STM32F7xx and STM32L4xx use I2Cv2; +### I2Cv2 :id=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 as a reference: +* STM32F0xx +* STM32F3xx +* STM32F7xx +* STM32L4xx -| Variable | Default | -|--------------------|------------------| -| `I2C1_OPMODE` | `OPMODE_I2C` | -| `I2C1_CLOCK_SPEED` | `100000` | -| `I2C1_DUTY_CYCLE` | `STD_DUTY_CYCLE` | +See [this page](https://www.playembedded.org/blog/stm32-i2c-chibios/#8_I2Cv2_I2Cv3_configuration_structure) for the I2Cv2 configuration structure. -#### I2Cv2 :id=i2cv2 -STM32 MCUs allow for different timing parameters when configuring I2Cv2. These can be modified using the following parameters, using as a reference: +|`config.h` Override |Default| +|---------------------|-------| +|`I2C1_TIMINGR_PRESC` |`0U` | +|`I2C1_TIMINGR_SCLDEL`|`7U` | +|`I2C1_TIMINGR_SDADEL`|`0U` | +|`I2C1_TIMINGR_SCLH` |`38U` | +|`I2C1_TIMINGR_SCLL` |`129U` | -| Variable | Default | -|-----------------------|---------| -| `I2C1_TIMINGR_PRESC` | `15U` | -| `I2C1_TIMINGR_SCLDEL` | `4U` | -| `I2C1_TIMINGR_SDADEL` | `2U` | -| `I2C1_TIMINGR_SCLH` | `15U` | -| `I2C1_TIMINGR_SCLL` | `21U` | +## Functions :id=functions -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. +### `void i2c_init(void)` -| Variable | Default | -|---------------------|---------| -| `I2C1_SCL_PAL_MODE` | `4` | -| `I2C1_SDA_PAL_MODE` | `4` | +Initialize the I2C driver. This function must be called only once, before any of the below functions can be called. -#### 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: +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 +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. diff --git a/docs/spi_driver.md b/docs/spi_driver.md index 1d432432ad..16fe1d803f 100644 --- a/docs/spi_driver.md +++ b/docs/spi_driver.md @@ -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 |`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`. --- -- cgit v1.2.3 From fc29c7a589837c2d1e4173d59d2849f89d3cb72b Mon Sep 17 00:00:00 2001 From: Danny Date: Sun, 7 Feb 2021 15:49:16 -0500 Subject: Add DSP40 (#11579) Co-authored-by: Drashna Jaelre Co-authored-by: Ryan --- keyboards/keebio/dsp40/config.h | 19 + keyboards/keebio/dsp40/dsp40.c | 17 + keyboards/keebio/dsp40/dsp40.h | 21 + keyboards/keebio/dsp40/info.json | 107 ++++ keyboards/keebio/dsp40/keymaps/bakingpy/config.h | 19 + keyboards/keebio/dsp40/keymaps/bakingpy/keymap.c | 214 +++++++ keyboards/keebio/dsp40/keymaps/default/keymap.c | 116 ++++ keyboards/keebio/dsp40/keymaps/via/keymap.c | 75 +++ keyboards/keebio/dsp40/keymaps/via/rules.mk | 5 + keyboards/keebio/dsp40/readme.md | 13 + keyboards/keebio/dsp40/rev1/chconf.h | 714 +++++++++++++++++++++++ keyboards/keebio/dsp40/rev1/config.h | 65 +++ keyboards/keebio/dsp40/rev1/halconf.h | 525 +++++++++++++++++ keyboards/keebio/dsp40/rev1/mcuconf.h | 176 ++++++ keyboards/keebio/dsp40/rev1/readme.md | 13 + keyboards/keebio/dsp40/rev1/rev1.c | 26 + keyboards/keebio/dsp40/rev1/rev1.h | 47 ++ keyboards/keebio/dsp40/rev1/rules.mk | 20 + keyboards/keebio/dsp40/rules.mk | 1 + 19 files changed, 2193 insertions(+) create mode 100644 keyboards/keebio/dsp40/config.h create mode 100644 keyboards/keebio/dsp40/dsp40.c create mode 100644 keyboards/keebio/dsp40/dsp40.h create mode 100644 keyboards/keebio/dsp40/info.json create mode 100644 keyboards/keebio/dsp40/keymaps/bakingpy/config.h create mode 100644 keyboards/keebio/dsp40/keymaps/bakingpy/keymap.c create mode 100755 keyboards/keebio/dsp40/keymaps/default/keymap.c create mode 100755 keyboards/keebio/dsp40/keymaps/via/keymap.c create mode 100644 keyboards/keebio/dsp40/keymaps/via/rules.mk create mode 100644 keyboards/keebio/dsp40/readme.md create mode 100644 keyboards/keebio/dsp40/rev1/chconf.h create mode 100644 keyboards/keebio/dsp40/rev1/config.h create mode 100644 keyboards/keebio/dsp40/rev1/halconf.h create mode 100644 keyboards/keebio/dsp40/rev1/mcuconf.h create mode 100644 keyboards/keebio/dsp40/rev1/readme.md create mode 100644 keyboards/keebio/dsp40/rev1/rev1.c create mode 100644 keyboards/keebio/dsp40/rev1/rev1.h create mode 100644 keyboards/keebio/dsp40/rev1/rules.mk create mode 100644 keyboards/keebio/dsp40/rules.mk diff --git a/keyboards/keebio/dsp40/config.h b/keyboards/keebio/dsp40/config.h new file mode 100644 index 0000000000..d4a20c4bcf --- /dev/null +++ b/keyboards/keebio/dsp40/config.h @@ -0,0 +1,19 @@ +/* Copyright 2021 Danny Nguyen + +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 . +*/ + +#pragma once + +#include "config_common.h" diff --git a/keyboards/keebio/dsp40/dsp40.c b/keyboards/keebio/dsp40/dsp40.c new file mode 100644 index 0000000000..745cd386d4 --- /dev/null +++ b/keyboards/keebio/dsp40/dsp40.c @@ -0,0 +1,17 @@ +/* Copyright 2021 Danny Nguyen + +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 . +*/ + +#include "dsp40.h" diff --git a/keyboards/keebio/dsp40/dsp40.h b/keyboards/keebio/dsp40/dsp40.h new file mode 100644 index 0000000000..ec5e5fbbcb --- /dev/null +++ b/keyboards/keebio/dsp40/dsp40.h @@ -0,0 +1,21 @@ +/* Copyright 2021 Danny Nguyen + +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 . +*/ + +#pragma once + +#ifdef KEYBOARD_keebio_dsp40_rev1 + #include "rev1.h" +#endif diff --git a/keyboards/keebio/dsp40/info.json b/keyboards/keebio/dsp40/info.json new file mode 100644 index 0000000000..e00f4f21a6 --- /dev/null +++ b/keyboards/keebio/dsp40/info.json @@ -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
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 } + ] + } + } +} diff --git a/keyboards/keebio/dsp40/keymaps/bakingpy/config.h b/keyboards/keebio/dsp40/keymaps/bakingpy/config.h new file mode 100644 index 0000000000..21bdbf97e3 --- /dev/null +++ b/keyboards/keebio/dsp40/keymaps/bakingpy/config.h @@ -0,0 +1,19 @@ +/* Copyright 2021 Danny Nguyen + +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 . +*/ + +#pragma once + +#define TAPPING_TERM 150 diff --git a/keyboards/keebio/dsp40/keymaps/bakingpy/keymap.c b/keyboards/keebio/dsp40/keymaps/bakingpy/keymap.c new file mode 100644 index 0000000000..7081eedbdd --- /dev/null +++ b/keyboards/keebio/dsp40/keymaps/bakingpy/keymap.c @@ -0,0 +1,214 @@ +/* Copyright 2021 Danny Nguyen + +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 . +*/ + +#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; +} diff --git a/keyboards/keebio/dsp40/keymaps/default/keymap.c b/keyboards/keebio/dsp40/keymaps/default/keymap.c new file mode 100755 index 0000000000..e4162d3b48 --- /dev/null +++ b/keyboards/keebio/dsp40/keymaps/default/keymap.c @@ -0,0 +1,116 @@ +/* Copyright 2021 Danny Nguyen + +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 . +*/ + +#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); + } + } +} diff --git a/keyboards/keebio/dsp40/keymaps/via/keymap.c b/keyboards/keebio/dsp40/keymaps/via/keymap.c new file mode 100755 index 0000000000..dfa7a18323 --- /dev/null +++ b/keyboards/keebio/dsp40/keymaps/via/keymap.c @@ -0,0 +1,75 @@ +/* Copyright 2021 Danny Nguyen + +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 . +*/ + +#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); + } + } +} diff --git a/keyboards/keebio/dsp40/keymaps/via/rules.mk b/keyboards/keebio/dsp40/keymaps/via/rules.mk new file mode 100644 index 0000000000..d96967a608 --- /dev/null +++ b/keyboards/keebio/dsp40/keymaps/via/rules.mk @@ -0,0 +1,5 @@ +VIA_ENABLE = yes +LTO_ENABLE = yes +MOUSEKEY_ENABLE = yes +CONSOLE_ENABLE = yes +COMMAND_ENABLE = no diff --git a/keyboards/keebio/dsp40/readme.md b/keyboards/keebio/dsp40/readme.md new file mode 100644 index 0000000000..c6b195c404 --- /dev/null +++ b/keyboards/keebio/dsp40/readme.md @@ -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). diff --git a/keyboards/keebio/dsp40/rev1/chconf.h b/keyboards/keebio/dsp40/rev1/chconf.h new file mode 100644 index 0000000000..03f63da36a --- /dev/null +++ b/keyboards/keebio/dsp40/rev1/chconf.h @@ -0,0 +1,714 @@ +/* + ChibiOS - Copyright (C) 2006..2018 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. +*/ + +/** + * @file rt/templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ +#define _CHIBIOS_RT_CONF_VER_6_0_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#if !defined(CH_CFG_ST_RESOLUTION) +#define CH_CFG_ST_RESOLUTION 32 +#endif + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#if !defined(CH_CFG_ST_FREQUENCY) +#define CH_CFG_ST_FREQUENCY 10000 +#endif + +/** + * @brief Time intervals data size. + * @note Allowed values are 16, 32 or 64 bits. + */ +#if !defined(CH_CFG_INTERVALS_SIZE) +#define CH_CFG_INTERVALS_SIZE 32 +#endif + +/** + * @brief Time types data size. + * @note Allowed values are 16 or 32 bits. + */ +#if !defined(CH_CFG_TIME_TYPES_SIZE) +#define CH_CFG_TIME_TYPES_SIZE 32 +#endif + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#if !defined(CH_CFG_ST_TIMEDELTA) +#define CH_CFG_ST_TIMEDELTA 2 +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#if !defined(CH_CFG_TIME_QUANTUM) +#define CH_CFG_TIME_QUANTUM 0 +#endif + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#if !defined(CH_CFG_MEMCORE_SIZE) +#define CH_CFG_MEMCORE_SIZE 0 +#endif + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#if !defined(CH_CFG_NO_IDLE_THREAD) +#define CH_CFG_NO_IDLE_THREAD FALSE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_OPTIMIZE_SPEED) +#define CH_CFG_OPTIMIZE_SPEED FALSE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_TM) +#define CH_CFG_USE_TM FALSE +#endif + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_REGISTRY) +#define CH_CFG_USE_REGISTRY TRUE +#endif + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_WAITEXIT) +#define CH_CFG_USE_WAITEXIT TRUE +#endif + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_SEMAPHORES) +#define CH_CFG_USE_SEMAPHORES TRUE +#endif + +/** +