Add RP2040 SCRAMBLE v2 (#19489)
parent
6e42b58549
commit
b3dca4bb36
|
@ -1,19 +1,4 @@
|
|||
# MCU name
|
||||
MCU = atmega328p
|
||||
# NOTE: This file is shared and only exists to set the default build
|
||||
# The real build rules are set in the v1/v2 directories
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = usbasploader
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
NKRO_ENABLE = no # Enable N-Key Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
ENCODER_ENABLE = yes # Use rotary encoder
|
||||
DEFAULT_FOLDER = nullbitsco/scramble/v2
|
||||
|
|
|
@ -16,25 +16,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
// place overrides here
|
||||
void set_scramble_LED(uint8_t mode) {
|
||||
switch(mode) {
|
||||
case LED_ON:
|
||||
setPinOutput(PIN_LED);
|
||||
writePin(PIN_LED, GPIO_STATE_HIGH);
|
||||
break;
|
||||
|
||||
case LED_DIM:
|
||||
setPinInput(PIN_LED);
|
||||
break;
|
||||
|
||||
case LED_OFF:
|
||||
setPinOutput(PIN_LED);
|
||||
writePin(PIN_LED, GPIO_STATE_LOW);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,18 +18,13 @@
|
|||
|
||||
#include "quantum.h"
|
||||
|
||||
// Indication LED settings
|
||||
#define LED_ON 2
|
||||
#define LED_DIM 1
|
||||
#define LED_OFF 0
|
||||
|
||||
#define GPIO_STATE_LOW 0
|
||||
#define GPIO_STATE_HIGH 1
|
||||
|
||||
#define PIN_LED B2
|
||||
|
||||
void set_scramble_LED(uint8_t mode);
|
||||
#if defined(KEYBOARD_nullbitsco_scramble_v1)
|
||||
#include "v1.h"
|
||||
#elif defined(KEYBOARD_nullbitsco_scramble_v2)
|
||||
#include "v2.h"
|
||||
#endif
|
||||
|
||||
// Layout is the same in all revisions
|
||||
#define LAYOUT( \
|
||||
K01, K02, K03, \
|
||||
K11, K12, K13 \
|
||||
|
|
|
@ -15,6 +15,8 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* NOTE: This config file is specific to AVR builds. */
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "config_common.h"
|
|
@ -0,0 +1,21 @@
|
|||
# NOTE: This file is specific to AVR builds.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega328p
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = usbasploader
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
NKRO_ENABLE = no # Enable N-Key Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
ENCODER_ENABLE = yes # Use rotary encoder
|
|
@ -0,0 +1,25 @@
|
|||
// Copyright 2022 Jay Greco
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "v1.h"
|
||||
|
||||
void set_scramble_LED(uint8_t mode) {
|
||||
switch(mode) {
|
||||
case LED_ON:
|
||||
setPinOutput(PIN_LED);
|
||||
writePin(PIN_LED, GPIO_STATE_HIGH);
|
||||
break;
|
||||
|
||||
case LED_DIM:
|
||||
setPinInput(PIN_LED);
|
||||
break;
|
||||
|
||||
case LED_OFF:
|
||||
setPinOutput(PIN_LED);
|
||||
writePin(PIN_LED, GPIO_STATE_LOW);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
// Copyright 2022 Jay Greco
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "scramble.h"
|
||||
|
||||
// Indication LED settings
|
||||
#define LED_ON 2
|
||||
#define LED_DIM 1
|
||||
#define LED_OFF 0
|
||||
|
||||
#define GPIO_STATE_LOW 0
|
||||
#define GPIO_STATE_HIGH 1
|
||||
|
||||
#define PIN_LED B2
|
||||
|
||||
void set_scramble_LED(uint8_t mode);
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
Copyright 2021 Jay Greco
|
||||
|
||||
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/>.
|
||||
*/
|
||||
|
||||
/* NOTE: This config file is specific to RP2040 builds. */
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "config_common.h"
|
||||
|
||||
/* key matrix size */
|
||||
#define MATRIX_ROWS 2
|
||||
#define MATRIX_COLS 3
|
||||
|
||||
#define DIRECT_PINS {{GP6,GP8,GP10}, {GP29,GP28,GP22}}
|
||||
|
||||
/* Set 0 if debouncing isn't needed */
|
||||
#define DEBOUNCE 10
|
||||
|
||||
/* Optional encoder pins */
|
||||
#define ENCODERS_PAD_A { GP24 }
|
||||
#define ENCODERS_PAD_B { GP25 }
|
||||
#define TAP_CODE_DELAY 10
|
||||
|
||||
/* RP2040-specific defines*/
|
||||
#define RP2040_FLASH_GENERIC_03H
|
||||
#define I2C1_SDA_PIN GP26
|
||||
#define I2C1_SCL_PIN GP27
|
||||
#define I2C_DRIVER I2CD2
|
|
@ -0,0 +1,9 @@
|
|||
// Copyright 2022 Jay Greco
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_I2C TRUE
|
||||
#define HAL_USE_PWM TRUE
|
||||
|
||||
#include_next <halconf.h>
|
|
@ -0,0 +1,14 @@
|
|||
// Copyright 2022 Jay Greco
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef RP_I2C_USE_I2C1
|
||||
#define RP_I2C_USE_I2C1 TRUE
|
||||
|
||||
#undef RP_PWM_USE_PWM1
|
||||
#define RP_PWM_USE_PWM1 TRUE
|
||||
#undef RP_PWM_USE_PWM2
|
||||
#define RP_PWM_USE_PWM2 TRUE
|
|
@ -0,0 +1,21 @@
|
|||
# NOTE: This file is is specific to RP2040 builds.
|
||||
|
||||
# MCU name
|
||||
MCU = RP2040
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = rp2040
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
NKRO_ENABLE = no # Enable N-Key Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
ENCODER_ENABLE = yes # Use rotary encoder
|
|
@ -0,0 +1,84 @@
|
|||
// Copyright 2022 Jay Greco
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "v2.h"
|
||||
|
||||
// SCRAMBLE PWM LED config
|
||||
pwm_led_t scramble_rgb = {
|
||||
{GP18, GP19, GP20},
|
||||
{&PWMD1, &PWMD1, &PWMD2},
|
||||
{0, 1, 0},
|
||||
PWM_OUTPUT_ACTIVE_LOW,
|
||||
0
|
||||
};
|
||||
|
||||
// Internal PWM init
|
||||
// only runs once per PWM LED
|
||||
void _init_pwm(pwm_led_t* led) {
|
||||
if (!led->init_complete) {
|
||||
for (int i=0; i<NUM_RGB_IDX; i++) {
|
||||
palSetPadMode(PAL_PORT(led->pin[i]), PAL_PAD(led->pin[i]), PWM_PAL_MODE);
|
||||
|
||||
static PWMConfig pwmCFG = {
|
||||
.frequency = PWM_PWM_COUNTER_FREQUENCY,
|
||||
.period = PWM_PWM_PERIOD,
|
||||
};
|
||||
|
||||
// Channels are always configured as active low
|
||||
// If active high is needed, pwm is inverted in _set_led_pwm()
|
||||
pwmCFG.channels[0].mode = PWM_OUTPUT_ACTIVE_LOW;
|
||||
pwmCFG.channels[1].mode = PWM_OUTPUT_ACTIVE_LOW;
|
||||
pwmStart(led->driver[i], &pwmCFG);
|
||||
|
||||
// Start LEDs in the OFF state
|
||||
uint8_t pwm = led->mode == PWM_OUTPUT_ACTIVE_HIGH ? 100 : 0;
|
||||
pwmEnableChannel(led->driver[i], led->channel[i], PWM_FRACTION_TO_WIDTH(led->driver[i], 99, pwm));
|
||||
}
|
||||
|
||||
led->init_complete = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Internal generic PWM setter
|
||||
void _set_led_pwm(uint8_t pwm, pwm_led_t* led, uint8_t channel) {
|
||||
if (pwm > 100) pwm = 100;
|
||||
if (led->mode == PWM_OUTPUT_ACTIVE_HIGH) pwm = (100 - pwm);
|
||||
|
||||
_init_pwm(led);
|
||||
pwmEnableChannel(led->driver[channel], led->channel[channel], PWM_FRACTION_TO_WIDTH(led->driver[channel], 99, pwm));
|
||||
}
|
||||
|
||||
// SCRAMBLE
|
||||
void set_scramble_LED(uint8_t mode) {
|
||||
switch(mode) {
|
||||
case LED_ON:
|
||||
set_scramble_LED_rgb_pwm(65, 100, 95);
|
||||
break;
|
||||
|
||||
case LED_DIM:
|
||||
set_scramble_LED_rgb_pwm(3, 9, 3);
|
||||
break;
|
||||
|
||||
default: //LED_OFF
|
||||
set_scramble_LED_rgb_pwm(0, 0, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void set_scramble_LED_rgb_pwm(uint8_t r_pwm, uint8_t g_pwm, uint8_t b_pwm) {
|
||||
_set_led_pwm(r_pwm, &scramble_rgb, RED);
|
||||
_set_led_pwm(g_pwm, &scramble_rgb, GREEN);
|
||||
_set_led_pwm(b_pwm, &scramble_rgb, BLUE);
|
||||
}
|
||||
|
||||
void set_scramble_LED_r_pwm(uint8_t pwm) {
|
||||
_set_led_pwm(pwm, &scramble_rgb, RED);
|
||||
}
|
||||
|
||||
void set_scramble_LED_g_pwm(uint8_t pwm) {
|
||||
_set_led_pwm(pwm, &scramble_rgb, GREEN);
|
||||
}
|
||||
|
||||
void set_scramble_LED_b_pwm(uint8_t pwm) {
|
||||
_set_led_pwm(pwm, &scramble_rgb, BLUE);
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
// Copyright 2022 Jay Greco
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "scramble.h"
|
||||
#include <hal.h>
|
||||
|
||||
enum led_mode {
|
||||
LED_OFF = 0,
|
||||
LED_DIM,
|
||||
LED_ON,
|
||||
NUM_LED_MODE
|
||||
};
|
||||
|
||||
enum rgb_idx {
|
||||
RED = 0,
|
||||
GREEN,
|
||||
BLUE,
|
||||
NUM_RGB_IDX
|
||||
};
|
||||
|
||||
typedef struct pwm_led_t {
|
||||
uint32_t pin[3];
|
||||
PWMDriver* driver[3];
|
||||
uint8_t channel[3];
|
||||
uint8_t mode;
|
||||
uint8_t init_complete;
|
||||
} pwm_led_t;
|
||||
|
||||
#define PWM_PAL_MODE (PAL_MODE_ALTERNATE_PWM | PAL_RP_PAD_DRIVE12 | PAL_RP_GPIO_OE)
|
||||
#define PWM_PWM_COUNTER_FREQUENCY 1000000
|
||||
#define PWM_PWM_PERIOD PWM_PWM_COUNTER_FREQUENCY / 1000
|
||||
|
||||
// RP2040 adds HW PWM control!
|
||||
// PWM values are in percent, 0-100
|
||||
void
|
||||
set_scramble_LED(uint8_t mode),
|
||||
set_scramble_LED_rgb_pwm(uint8_t r_pwm, uint8_t g_pwm, uint8_t b_pwm),
|
||||
set_scramble_LED_r_pwm(uint8_t pwm),
|
||||
set_scramble_LED_g_pwm(uint8_t pwm),
|
||||
set_scramble_LED_b_pwm(uint8_t pwm);
|
||||
|
Loading…
Reference in New Issue