Add RP2040 SCRAMBLE v2 (#19489)
parent
6e42b58549
commit
b3dca4bb36
@ -1,19 +1,4 @@ |
|||||||
# MCU name
|
# NOTE: This file is shared and only exists to set the default build
|
||||||
MCU = atmega328p
|
# The real build rules are set in the v1/v2 directories
|
||||||
|
|
||||||
# Bootloader selection
|
DEFAULT_FOLDER = nullbitsco/scramble/v2
|
||||||
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,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