diff options
author | Jay Greco <jayv.greco@gmail.com> | 2023-01-27 00:03:57 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-27 08:03:57 +0000 |
commit | b3dca4bb36d0c08e8145f6f25649aaf61b513fdd (patch) | |
tree | efa1166c6bae58dc30fd8f2d4157c64a1fbb4837 /keyboards/nullbitsco/scramble/v2/v2.c | |
parent | 6e42b5854902963469a4016abeca48a9df5c1c46 (diff) |
Add RP2040 SCRAMBLE v2 (#19489)
Diffstat (limited to 'keyboards/nullbitsco/scramble/v2/v2.c')
-rw-r--r-- | keyboards/nullbitsco/scramble/v2/v2.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/keyboards/nullbitsco/scramble/v2/v2.c b/keyboards/nullbitsco/scramble/v2/v2.c new file mode 100644 index 0000000000..9b0a088855 --- /dev/null +++ b/keyboards/nullbitsco/scramble/v2/v2.c @@ -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); +} |