adds soft pwm for non-timed ports

This commit is contained in:
Jack Humbert 2017-02-12 11:29:42 -05:00
parent a0c2305bd1
commit 8d0fdf1008
4 changed files with 50 additions and 18 deletions

View File

@ -56,13 +56,13 @@ EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
CONSOLE_ENABLE ?= no # Console for debug(+400) CONSOLE_ENABLE ?= no # Console for debug(+400)
COMMAND_ENABLE ?= no # Commands for debug and configuration COMMAND_ENABLE ?= no # Commands for debug and configuration
NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality
MIDI_ENABLE ?= yes # MIDI controls MIDI_ENABLE ?= yes # MIDI controls
AUDIO_ENABLE ?= yes # Audio output on port C6 AUDIO_ENABLE ?= yes # Audio output on port C6
UNICODE_ENABLE ?= no # Unicode UNICODE_ENABLE ?= no # Unicode
BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight.
API_SYSEX_ENABLE = yes API_SYSEX_ENABLE = no
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend

View File

@ -58,13 +58,13 @@ EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
CONSOLE_ENABLE ?= no # Console for debug(+400) CONSOLE_ENABLE ?= no # Console for debug(+400)
COMMAND_ENABLE ?= no # Commands for debug and configuration COMMAND_ENABLE ?= no # Commands for debug and configuration
NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality
MIDI_ENABLE ?= yes # MIDI controls MIDI_ENABLE ?= yes # MIDI controls
AUDIO_ENABLE ?= yes # Audio output on port C6 AUDIO_ENABLE ?= yes # Audio output on port C6
UNICODE_ENABLE ?= no # Unicode UNICODE_ENABLE ?= no # Unicode
BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight.
API_SYSEX_ENABLE ?= yes API_SYSEX_ENABLE ?= no
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend

View File

@ -7,6 +7,9 @@
#define TAPPING_TERM 200 #define TAPPING_TERM 200
#endif #endif
#include "backlight.h"
extern backlight_config_t backlight_config;
static void do_code16 (uint16_t code, void (*f) (uint8_t)) { static void do_code16 (uint16_t code, void (*f) (uint8_t)) {
switch (code) { switch (code) {
case QK_MODS ... QK_MODS_MAX: case QK_MODS ... QK_MODS_MAX:
@ -577,6 +580,10 @@ void matrix_scan_quantum() {
matrix_scan_combo(); matrix_scan_combo();
#endif #endif
#if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
backlight_task();
#endif
matrix_scan_kb(); matrix_scan_kb();
} }
@ -644,13 +651,13 @@ __attribute__ ((weak))
void backlight_set(uint8_t level) void backlight_set(uint8_t level)
{ {
// Prevent backlight blink on lowest level // Prevent backlight blink on lowest level
#if BACKLIGHT_ON_STATE == 0 // #if BACKLIGHT_ON_STATE == 0
// PORTx &= ~n // // PORTx &= ~n
_SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
#else // #else
// PORTx |= n // // PORTx |= n
_SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
#endif // #endif
if ( level == 0 ) { if ( level == 0 ) {
#ifndef NO_BACKLIGHT_CLOCK #ifndef NO_BACKLIGHT_CLOCK
@ -658,13 +665,13 @@ void backlight_set(uint8_t level)
TCCR1A &= ~(_BV(COM1x1)); TCCR1A &= ~(_BV(COM1x1));
OCR1x = 0x0; OCR1x = 0x0;
#else #else
#if BACKLIGHT_ON_STATE == 0 // #if BACKLIGHT_ON_STATE == 0
// PORTx |= n // // PORTx |= n
_SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
#else // #else
// PORTx &= ~n // // PORTx &= ~n
_SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
#endif // #endif
#endif #endif
} }
#ifndef NO_BACKLIGHT_CLOCK #ifndef NO_BACKLIGHT_CLOCK
@ -687,6 +694,30 @@ void backlight_set(uint8_t level)
#endif #endif
} }
uint8_t backlight_tick = 0;
void backlight_task(void) {
#ifdef NO_BACKLIGHT_CLOCK
if ((0xFFFF >> ((BACKLIGHT_LEVELS - backlight_config.level) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) {
#if BACKLIGHT_ON_STATE == 0
// PORTx &= ~n
_SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
#else
// PORTx |= n
_SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
#endif
} else {
#if BACKLIGHT_ON_STATE == 0
// PORTx |= n
_SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
#else
// PORTx &= ~n
_SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
#endif
}
backlight_tick = (backlight_tick + 1) % 16;
#endif
}
#ifdef BACKLIGHT_BREATHING #ifdef BACKLIGHT_BREATHING

View File

@ -95,6 +95,7 @@ void unregister_code16 (uint16_t code);
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
void backlight_init_ports(void); void backlight_init_ports(void);
void backlight_task(void);
#ifdef BACKLIGHT_BREATHING #ifdef BACKLIGHT_BREATHING
void breathing_enable(void); void breathing_enable(void);