qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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 }