v2.c (2411B)
1 // Copyright 2022 Jay Greco 2 // SPDX-License-Identifier: GPL-2.0-or-later 3 4 #include "v2.h" 5 6 // SCRAMBLE PWM LED config 7 pwm_led_t scramble_rgb = { 8 {GP18, GP19, GP20}, 9 {&PWMD1, &PWMD1, &PWMD2}, 10 {0, 1, 0}, 11 PWM_OUTPUT_ACTIVE_LOW, 12 0 13 }; 14 15 // Internal PWM init 16 // only runs once per PWM LED 17 void _init_pwm(pwm_led_t* led) { 18 if (!led->init_complete) { 19 for (int i=0; i<NUM_RGB_IDX; i++) { 20 palSetPadMode(PAL_PORT(led->pin[i]), PAL_PAD(led->pin[i]), PWM_PAL_MODE); 21 22 static PWMConfig pwmCFG = { 23 .frequency = PWM_PWM_COUNTER_FREQUENCY, 24 .period = PWM_PWM_PERIOD, 25 }; 26 27 // Channels are always configured as active low 28 // If active high is needed, pwm is inverted in _set_led_pwm() 29 pwmCFG.channels[0].mode = PWM_OUTPUT_ACTIVE_LOW; 30 pwmCFG.channels[1].mode = PWM_OUTPUT_ACTIVE_LOW; 31 pwmStart(led->driver[i], &pwmCFG); 32 33 // Start LEDs in the OFF state 34 uint8_t pwm = led->mode == PWM_OUTPUT_ACTIVE_HIGH ? 100 : 0; 35 pwmEnableChannel(led->driver[i], led->channel[i], PWM_FRACTION_TO_WIDTH(led->driver[i], 99, pwm)); 36 } 37 38 led->init_complete = 1; 39 } 40 } 41 42 // Internal generic PWM setter 43 void _set_led_pwm(uint8_t pwm, pwm_led_t* led, uint8_t channel) { 44 if (pwm > 100) pwm = 100; 45 if (led->mode == PWM_OUTPUT_ACTIVE_HIGH) pwm = (100 - pwm); 46 47 _init_pwm(led); 48 pwmEnableChannel(led->driver[channel], led->channel[channel], PWM_FRACTION_TO_WIDTH(led->driver[channel], 99, pwm)); 49 } 50 51 // SCRAMBLE 52 void set_scramble_LED(uint8_t mode) { 53 switch(mode) { 54 case LED_ON: 55 set_scramble_LED_rgb_pwm(65, 100, 95); 56 break; 57 58 case LED_DIM: 59 set_scramble_LED_rgb_pwm(3, 9, 3); 60 break; 61 62 default: //LED_OFF 63 set_scramble_LED_rgb_pwm(0, 0, 0); 64 break; 65 } 66 } 67 68 void set_scramble_LED_rgb_pwm(uint8_t r_pwm, uint8_t g_pwm, uint8_t b_pwm) { 69 _set_led_pwm(r_pwm, &scramble_rgb, RED); 70 _set_led_pwm(g_pwm, &scramble_rgb, GREEN); 71 _set_led_pwm(b_pwm, &scramble_rgb, BLUE); 72 } 73 74 void set_scramble_LED_r_pwm(uint8_t pwm) { 75 _set_led_pwm(pwm, &scramble_rgb, RED); 76 } 77 78 void set_scramble_LED_g_pwm(uint8_t pwm) { 79 _set_led_pwm(pwm, &scramble_rgb, GREEN); 80 } 81 82 void set_scramble_LED_b_pwm(uint8_t pwm) { 83 _set_led_pwm(pwm, &scramble_rgb, BLUE); 84 }