| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /* Copyright 2018 Jason Williams (Wilba)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- #include "wt_mono_backlight.h"
- #include "drivers/avr/i2c_master.h"
- #include "drivers/issi/is31fl3736.h"
- #include <avr/interrupt.h>
- #define ISSI_ADDR_DEFAULT 0x50
- bool g_suspend_state = false;
- // Global tick at 20 Hz
- uint32_t g_tick = 0;
- uint8_t g_config_effect_speed = 0;
- uint8_t g_config_brightness = 255;
- void backlight_init_drivers(void)
- {
- // Initialize I2C
- i2c_init();
- IS31FL3736_init( ISSI_ADDR_DEFAULT );
- for ( uint8_t index = 0; index < 96; index++ ) {
- IS31FL3736_mono_set_led_control_register( index, true );
- }
- IS31FL3736_update_led_control_registers( ISSI_ADDR_DEFAULT, 0x00 );
- }
- // This is (F_CPU/1024) / 20 Hz
- // = 15625 Hz / 20 Hz
- // = 781
- #define TIMER3_TOP 781
- void backlight_timer_init(void)
- {
- static uint8_t backlight_timer_is_init = 0;
- if ( backlight_timer_is_init ) {
- return;
- }
- backlight_timer_is_init = 1;
- // Timer 3 setup
- TCCR3B = _BV(WGM32) | // CTC mode OCR3A as TOP
- _BV(CS32) | _BV(CS30); // prescale by /1024
- // Set TOP value
- uint8_t sreg = SREG;
- cli();
- OCR3AH = (TIMER3_TOP >> 8) & 0xff;
- OCR3AL = TIMER3_TOP & 0xff;
- SREG = sreg;
- }
- void backlight_timer_enable(void)
- {
- TIMSK3 |= _BV(OCIE3A);
- }
- void backlight_timer_disable(void)
- {
- TIMSK3 &= ~_BV(OCIE3A);
- }
- void backlight_set_suspend_state(bool state)
- {
- g_suspend_state = state;
- }
- void backlight_effect_cycle_all(void)
- {
- uint8_t offset = ( g_tick << g_config_effect_speed ) & 0xFF;
- backlight_set_brightness_all( offset );
- }
- ISR(TIMER3_COMPA_vect)
- {
- // delay 1 second before driving LEDs or doing anything else
- static uint8_t startup_tick = 0;
- if ( startup_tick < 20 ) {
- startup_tick++;
- return;
- }
- g_tick++;
- //backlight_effect_cycle_all();
- backlight_set_brightness_all( 255 );
- }
- void backlight_update_pwm_buffers(void)
- {
- IS31FL3736_update_pwm_buffers(ISSI_ADDR_DEFAULT,0x00);
- }
- void backlight_set_brightness_all( uint8_t value )
- {
- IS31FL3736_mono_set_brightness_all( value );
- }
|