Merge pull request #1090 from qmk/backlight_softpwm
Adds soft PWM backlight for non-timed ports
This commit is contained in:
		
						commit
						b794719952
					
				
					 4 changed files with 50 additions and 18 deletions
				
			
		| 
						 | 
				
			
			@ -56,13 +56,13 @@ EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
 | 
			
		|||
CONSOLE_ENABLE ?= no         # Console for debug(+400)
 | 
			
		||||
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
 | 
			
		||||
BACKLIGHT_ENABLE ?= no      # Enable keyboard backlight functionality
 | 
			
		||||
BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
 | 
			
		||||
MIDI_ENABLE ?= yes            # MIDI controls
 | 
			
		||||
AUDIO_ENABLE ?= yes           # Audio output on port C6
 | 
			
		||||
UNICODE_ENABLE ?= no         # Unicode
 | 
			
		||||
BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
			
		||||
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
 | 
			
		||||
SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,13 +58,13 @@ EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
 | 
			
		|||
CONSOLE_ENABLE ?= no         # Console for debug(+400)
 | 
			
		||||
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
 | 
			
		||||
BACKLIGHT_ENABLE ?= no      # Enable keyboard backlight functionality
 | 
			
		||||
BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
 | 
			
		||||
MIDI_ENABLE ?= yes            # MIDI controls
 | 
			
		||||
AUDIO_ENABLE ?= yes           # Audio output on port C6
 | 
			
		||||
UNICODE_ENABLE ?= no         # Unicode
 | 
			
		||||
BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
			
		||||
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
 | 
			
		||||
SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
 | 
			
		||||
| 
						 | 
				
			
			@ -7,6 +7,9 @@
 | 
			
		|||
#define TAPPING_TERM 200
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "backlight.h"
 | 
			
		||||
extern backlight_config_t backlight_config;
 | 
			
		||||
 | 
			
		||||
#ifdef FAUXCLICKY_ENABLE
 | 
			
		||||
#include "fauxclicky.h"
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -601,6 +604,10 @@ void matrix_scan_quantum() {
 | 
			
		|||
    matrix_scan_combo();
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
 | 
			
		||||
    backlight_task();
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  matrix_scan_kb();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -668,13 +675,13 @@ __attribute__ ((weak))
 | 
			
		|||
void backlight_set(uint8_t level)
 | 
			
		||||
{
 | 
			
		||||
  // Prevent backlight blink on lowest level
 | 
			
		||||
  #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
 | 
			
		||||
  // #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
 | 
			
		||||
 | 
			
		||||
  if ( level == 0 ) {
 | 
			
		||||
    #ifndef NO_BACKLIGHT_CLOCK
 | 
			
		||||
| 
						 | 
				
			
			@ -682,13 +689,13 @@ void backlight_set(uint8_t level)
 | 
			
		|||
      TCCR1A &= ~(_BV(COM1x1));
 | 
			
		||||
      OCR1x = 0x0;
 | 
			
		||||
    #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
 | 
			
		||||
      // #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
 | 
			
		||||
    #endif
 | 
			
		||||
  } 
 | 
			
		||||
  #ifndef NO_BACKLIGHT_CLOCK
 | 
			
		||||
| 
						 | 
				
			
			@ -711,6 +718,30 @@ void backlight_set(uint8_t level)
 | 
			
		|||
  #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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,6 +103,7 @@ void unregister_code16 (uint16_t code);
 | 
			
		|||
 | 
			
		||||
#ifdef BACKLIGHT_ENABLE
 | 
			
		||||
void backlight_init_ports(void);
 | 
			
		||||
void backlight_task(void);
 | 
			
		||||
 | 
			
		||||
#ifdef BACKLIGHT_BREATHING
 | 
			
		||||
void breathing_enable(void);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue