aboutsummaryrefslogtreecommitdiff
path: root/keyboards/planck/ez/ez.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/planck/ez/ez.c')
-rw-r--r--keyboards/planck/ez/ez.c167
1 files changed, 140 insertions, 27 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}