rgblight_custom.c (2419B)
1 // Copyright 2024 Dasky (@daskygit) 2 // SPDX-License-Identifier: GPL-2.0-or-later 3 4 #include <hal.h> 5 #include "chibios_config.h" 6 #include "gpio.h" 7 #include "color.h" 8 #include "rgblight_drivers.h" 9 10 static PWMConfig pwmCFG = { 11 .frequency = 0xFFFF, 12 .period = 256, 13 }; 14 15 rgb_t prime_leds[RGBLIGHT_LED_COUNT]; 16 17 void init_custom(void) { 18 palSetPadMode(PAL_PORT(RGB_RED_PIN), PAL_PAD(RGB_RED_PIN), PAL_MODE_ALTERNATE_PUSHPULL); 19 palSetPadMode(PAL_PORT(RGB_GREEN_PIN), PAL_PAD(RGB_GREEN_PIN), PAL_MODE_ALTERNATE_PUSHPULL); 20 palSetPadMode(PAL_PORT(RGB_BLUE_PIN), PAL_PAD(RGB_BLUE_PIN), PAL_MODE_ALTERNATE_PUSHPULL); 21 pwmCFG.channels[RGB_RED_PWM_CHANNEL - 1].mode = PWM_OUTPUT_ACTIVE_HIGH; 22 pwmCFG.channels[RGB_GREEN_PWM_CHANNEL - 1].mode = PWM_OUTPUT_ACTIVE_HIGH; 23 pwmCFG.channels[RGB_BLUE_PWM_CHANNEL - 1].mode = PWM_OUTPUT_ACTIVE_HIGH; 24 pwmStart(&RGB_PWM_DRIVER, &pwmCFG); 25 } 26 27 void set_color_custom(int index, uint8_t red, uint8_t green, uint8_t blue) { 28 prime_leds[index].r = red; 29 prime_leds[index].g = green; 30 prime_leds[index].b = blue; 31 } 32 33 void set_color_all_custom(uint8_t red, uint8_t green, uint8_t blue) { 34 for (int i = 0; i < RGBLIGHT_LED_COUNT; i++) { 35 set_color_custom(i, red, green, blue); 36 } 37 } 38 39 void flush_custom(void) { 40 if (prime_leds[0].r == 0) { 41 pwmDisableChannel(&RGB_PWM_DRIVER, RGB_RED_PWM_CHANNEL - 1); 42 } else { 43 uint32_t duty = ((uint32_t)0xFFFF * prime_leds[0].r) / 0xFF; 44 pwmEnableChannel(&RGB_PWM_DRIVER, RGB_RED_PWM_CHANNEL - 1, PWM_FRACTION_TO_WIDTH(&RGB_PWM_DRIVER, 0xFFFF, duty)); 45 } 46 if (prime_leds[0].g == 0) { 47 pwmDisableChannel(&RGB_PWM_DRIVER, RGB_GREEN_PWM_CHANNEL - 1); 48 } else { 49 uint32_t duty = ((uint32_t)0xFFFF * prime_leds[0].g) / 0xFF; 50 pwmEnableChannel(&RGB_PWM_DRIVER, RGB_GREEN_PWM_CHANNEL - 1, PWM_FRACTION_TO_WIDTH(&RGB_PWM_DRIVER, 0xFFFF, duty)); 51 } 52 if (prime_leds[0].b == 0) { 53 pwmDisableChannel(&RGB_PWM_DRIVER, RGB_BLUE_PWM_CHANNEL - 1); 54 } else { 55 uint32_t duty = ((uint32_t)0xFFFF * prime_leds[0].b) / 0xFF; 56 pwmEnableChannel(&RGB_PWM_DRIVER, RGB_BLUE_PWM_CHANNEL - 1, PWM_FRACTION_TO_WIDTH(&RGB_PWM_DRIVER, 0xFFFF, duty)); 57 } 58 } 59 60 const rgblight_driver_t rgblight_driver = { 61 .init = init_custom, 62 .set_color = set_color_custom, 63 .set_color_all = set_color_all_custom, 64 .flush = flush_custom, 65 };