aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@live.com>2019-08-13 10:28:12 -0700
committerGitHub <noreply@github.com>2019-08-13 10:28:12 -0700
commit547fbe769c684745195a53baf9f62730ceea804d (patch)
tree5fa8550d2d5947b27e2f0c04e1730431eaaf6720
parent50045624411df31968f7e2d2996ad342d689fe4f (diff)
downloadqmk_firmware-547fbe769c684745195a53baf9f62730ceea804d.tar.gz
qmk_firmware-547fbe769c684745195a53baf9f62730ceea804d.zip
Enable PWM Support for Planck EZ Indicator Lights (#6473)
* remove led layer code * enable PWM on STM32F303 * Unusable PWM code * Updated PWM Stuff? * PWM Semi-working * Both LEDs working at the same time * Update names * Add led level functions * Add LED levels and persistent settings * Revert change due to issues with timing related code * Review feedback and minor cleanup
-rw-r--r--keyboards/planck/ez/ez.c167
-rw-r--r--keyboards/planck/ez/ez.h21
-rw-r--r--quantum/stm32/halconf.h2
-rw-r--r--quantum/stm32/mcuconf.h4
4 files changed, 164 insertions, 30 deletions
diff --git a/keyboards/planck/ez/ez.c b/keyboards/planck/ez/ez.c
index e739b90b8..8734042a4 100644
--- a/keyboards/planck/ez/ez.c
+++ b/keyboards/planck/ez/ez.c
@@ -14,6 +14,10 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */ 15 */
16#include "ez.h" 16#include "ez.h"
17#include "ch.h"
18#include "hal.h"
19 keyboard_config_t keyboard_config;
20
17 21
18#ifdef RGB_MATRIX_ENABLE 22#ifdef RGB_MATRIX_ENABLE
19const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { 23const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
@@ -112,39 +116,148 @@ void suspend_power_down_kb(void) {
112} 116}
113#endif 117#endif
114 118
115void matrix_init_kb(void) { 119/* Left B9 Right B8 */
116 matrix_init_user(); 120
121// See http://jared.geek.nz/2013/feb/linear-led-pwm
122static uint16_t cie_lightness(uint16_t v) {
123 if (v <= 5243) // if below 8% of max
124 return v / 9; // same as dividing by 900%
125 else {
126 uint32_t y = (((uint32_t) v + 10486) << 8) / (10486 + 0xFFFFUL); // add 16% of max and compare
127 // to get a useful result with integer division, we shift left in the expression above
128 // and revert what we've done again after squaring.
129 y = y * y * y >> 8;
130 if (y > 0xFFFFUL) // prevent overflow
131 return 0xFFFFU;
132 else
133 return (uint16_t) y;
134 }
135}
136
137static PWMConfig pwmCFG = {
138 0xFFFF,/* PWM clock frequency */
139 256,/* initial PWM period (in ticks) 1S (1/10kHz=0.1mS 0.1ms*10000 ticks=1S) */
140 NULL,
141 {
142 {PWM_OUTPUT_DISABLED, NULL}, /* channel 0 -> TIM1-CH1 = PA8 */
143 {PWM_OUTPUT_DISABLED, NULL}, /* channel 1 -> TIM1-CH2 = PA9 */
144 {PWM_OUTPUT_ACTIVE_HIGH, NULL},
145 {PWM_OUTPUT_ACTIVE_HIGH, NULL}
146 },
147 0, /* HW dependent part.*/
148 0
149};
150
151static uint32_t planck_ez_right_led_duty;
152static uint32_t planck_ez_left_led_duty;
153
154void planck_ez_right_led_level(uint8_t level) {
155 planck_ez_right_led_duty = (uint32_t)(cie_lightness(0xFFFF * (uint32_t) level / 255));
156 if (level == 0) {
157 // Turn backlight off
158 pwmDisableChannel(&PWMD4, 2);
159 } else {
160 // Turn backlight on
161 pwmEnableChannel(&PWMD4, 2, PWM_FRACTION_TO_WIDTH(&PWMD4,0xFFFF,planck_ez_right_led_duty));
162 }
163}
117 164
118 palSetPadMode(GPIOB, 8, PAL_MODE_OUTPUT_PUSHPULL);
119 palSetPadMode(GPIOB, 9, PAL_MODE_OUTPUT_PUSHPULL);
120 165
121 palClearPad(GPIOB, 8); 166void planck_ez_right_led_on(void){
122 palClearPad(GPIOB, 9); 167 pwmEnableChannel(&PWMD4, 2, PWM_FRACTION_TO_WIDTH(&PWMD4,0xFFFF,planck_ez_right_led_duty));
123} 168}
124 169
125void matrix_scan_kb(void) { 170void planck_ez_right_led_off(void){
126 matrix_scan_user(); 171 pwmDisableChannel(&PWMD4, 2);
127} 172}
128 173
129uint32_t layer_state_set_kb(uint32_t state) { 174void planck_ez_left_led_level(uint8_t level) {
130 175 planck_ez_left_led_duty = (uint32_t)(cie_lightness(0xFFFF * (uint32_t) level / 255));
131 palClearPad(GPIOB, 8); 176 if (level == 0) {
132 palClearPad(GPIOB, 9); 177 // Turn backlight off
133 state = layer_state_set_user(state); 178 pwmDisableChannel(&PWMD4, 3);
134 uint8_t layer = biton32(state); 179 } else {
135 switch (layer) { 180 // Turn backlight on
136 case 3: 181 pwmEnableChannel(&PWMD4, 3, PWM_FRACTION_TO_WIDTH(&PWMD4,0xFFFF,planck_ez_left_led_duty));
137 palSetPad(GPIOB, 9); 182 }
138 break; 183}
139 case 4: 184
140 palSetPad(GPIOB, 8); 185void planck_ez_left_led_on(void){
141 break; 186 pwmEnableChannel(&PWMD4, 3, PWM_FRACTION_TO_WIDTH(&PWMD4,0xFFFF,planck_ez_left_led_duty));
142 case 6: 187}
143 palSetPad(GPIOB, 9); 188
144 palSetPad(GPIOB, 8); 189void planck_ez_left_led_off(void){
145 break; 190 pwmDisableChannel(&PWMD4, 3);
146 default: 191}
147 break; 192
193
194void led_initialize_hardware(void) {
195 pwmStart(&PWMD4, &pwmCFG);
196
197 // set up defaults
198 planck_ez_right_led_level((uint8_t)keyboard_config.led_level * 255 / 4 );
199 palSetPadMode(GPIOB, 8, PAL_MODE_ALTERNATE(2));
200 planck_ez_left_led_level((uint8_t)keyboard_config.led_level * 255 / 4 );
201 palSetPadMode(GPIOB, 9, PAL_MODE_ALTERNATE(2));
202
203
204 // turn LEDs off by default
205 planck_ez_left_led_off();
206 planck_ez_right_led_off();
207}
208
209void keyboard_pre_init_kb(void) {
210 // read kb settings from eeprom
211 keyboard_config.raw = eeconfig_read_kb();
212
213 // initialize settings for front LEDs
214 led_initialize_hardware();
215}
216
217void eeconfig_init_kb(void) { // EEPROM is getting reset!
218 keyboard_config.raw = 0;
219 keyboard_config.led_level = 4;
220 eeconfig_update_kb(keyboard_config.raw);
221 eeconfig_init_user();
222}
223
224layer_state_t layer_state_set_kb(layer_state_t state) {
225 planck_ez_left_led_off();
226 planck_ez_right_led_off();
227 state = layer_state_set_user(state);
228 uint8_t layer = biton32(state);
229 switch (layer) {
230 case 3:
231 planck_ez_left_led_on();
232 break;
233 case 4:
234 planck_ez_right_led_on();
235 break;
236 case 6:
237 planck_ez_right_led_on();
238 planck_ez_left_led_on();
239 break;
240 default:
241 break;
148 } 242 }
149 return state; 243 return state;
150} 244}
245
246
247bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
248 switch (keycode) {
249 case LED_LEVEL:
250 if (record->event.pressed) {
251 keyboard_config.led_level++;
252 if (keyboard_config.led_level > 4) {
253 keyboard_config.led_level = 0;
254 }
255 planck_ez_right_led_level((uint8_t)keyboard_config.led_level * 255 / 4 );
256 planck_ez_left_led_level((uint8_t)keyboard_config.led_level * 255 / 4 );
257 eeconfig_update_kb(keyboard_config.raw);
258 layer_state_set_kb(layer_state);
259 }
260 break;
261 }
262 return true;
263}
diff --git a/keyboards/planck/ez/ez.h b/keyboards/planck/ez/ez.h
index 55c403242..e2ddaf3ce 100644
--- a/keyboards/planck/ez/ez.h
+++ b/keyboards/planck/ez/ez.h
@@ -50,3 +50,24 @@ LAYOUT_planck_1x2uC( \
50#define KEYMAP LAYOUT_ortho_4x12 50#define KEYMAP LAYOUT_ortho_4x12
51#define LAYOUT_planck_mit LAYOUT_planck_1x2uC 51#define LAYOUT_planck_mit LAYOUT_planck_1x2uC
52#define LAYOUT_planck_grid LAYOUT_ortho_4x12 52#define LAYOUT_planck_grid LAYOUT_ortho_4x12
53
54void planck_ez_right_led_on(void);
55void planck_ez_right_led_off(void);
56void planck_ez_right_led_level(uint8_t level);
57void planck_ez_left_led_on(void);
58void planck_ez_left_led_off(void);
59void planck_ez_left_led_level(uint8_t level);
60
61enum planck_ez_keycodes {
62 LED_LEVEL = SAFE_RANGE,
63 EZ_SAFE_RANGE,
64};
65
66typedef union {
67 uint32_t raw;
68 struct {
69 uint8_t led_level :3;
70 };
71} keyboard_config_t;
72
73extern keyboard_config_t keyboard_config;
diff --git a/quantum/stm32/halconf.h b/quantum/stm32/halconf.h
index c3e0cbb72..a14ace02b 100644
--- a/quantum/stm32/halconf.h
+++ b/quantum/stm32/halconf.h
@@ -111,7 +111,7 @@
111 * @brief Enables the PWM subsystem. 111 * @brief Enables the PWM subsystem.
112 */ 112 */
113#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) 113#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
114#define HAL_USE_PWM FALSE 114#define HAL_USE_PWM TRUE
115#endif 115#endif
116 116
117/** 117/**
diff --git a/quantum/stm32/mcuconf.h b/quantum/stm32/mcuconf.h
index 36f8ca225..32a73fb38 100644
--- a/quantum/stm32/mcuconf.h
+++ b/quantum/stm32/mcuconf.h
@@ -183,9 +183,9 @@
183 */ 183 */
184#define STM32_PWM_USE_ADVANCED FALSE 184#define STM32_PWM_USE_ADVANCED FALSE
185#define STM32_PWM_USE_TIM1 FALSE 185#define STM32_PWM_USE_TIM1 FALSE
186#define STM32_PWM_USE_TIM2 TRUE 186#define STM32_PWM_USE_TIM2 FALSE
187#define STM32_PWM_USE_TIM3 TRUE 187#define STM32_PWM_USE_TIM3 TRUE
188#define STM32_PWM_USE_TIM4 FALSE 188#define STM32_PWM_USE_TIM4 TRUE
189#define STM32_PWM_USE_TIM8 FALSE 189#define STM32_PWM_USE_TIM8 FALSE
190#define STM32_PWM_TIM1_IRQ_PRIORITY 7 190#define STM32_PWM_TIM1_IRQ_PRIORITY 7
191#define STM32_PWM_TIM2_IRQ_PRIORITY 7 191#define STM32_PWM_TIM2_IRQ_PRIORITY 7