From 6b74dd6de5359da18e87b2d4894e3ffc3fc89d47 Mon Sep 17 00:00:00 2001 From: skullY Date: Sat, 26 Jan 2019 21:25:59 -0800 Subject: [PATCH] led_matrix works now --- common_features.mk | 5 +++- drivers/arm/i2c_master.c | 11 ++++---- drivers/arm/i2c_master.h | 10 +++++++ drivers/issi/is31fl3731-simple.c | 5 ---- quantum/led_matrix.c | 47 ++++++++++++++++---------------- quantum/led_matrix.h | 3 -- quantum/led_matrix_drivers.c | 3 +- 7 files changed, 45 insertions(+), 39 deletions(-) diff --git a/common_features.mk b/common_features.mk index 8c7043cb7..ff01ecb85 100644 --- a/common_features.mk +++ b/common_features.mk @@ -209,7 +209,10 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) ifeq ($(strip $(VISUALIZER_ENABLE)), yes) CIE1931_CURVE = yes endif - ifeq ($(strip $(BACKLIGHT_CUSTOM_DRIVER)), yes) + ifeq ($(strip $(BACKLIGHT_CUSTOM_DRIVER)), yes) + OPT_DEFS += -DBACKLIGHT_CUSTOM_DRIVER + endif + ifeq ($(filter $(LED_MATRIX_ENABLE),$(VALID_MATRIX_TYPES)),) OPT_DEFS += -DBACKLIGHT_CUSTOM_DRIVER endif endif diff --git a/drivers/arm/i2c_master.c b/drivers/arm/i2c_master.c index 385bd97cb..1c3da2a1a 100644 --- a/drivers/arm/i2c_master.c +++ b/drivers/arm/i2c_master.c @@ -46,13 +46,13 @@ __attribute__ ((weak)) void i2c_init(void) { // Try releasing special pins for a short time - palSetPadMode(GPIOB, 6, PAL_MODE_INPUT); - palSetPadMode(GPIOB, 7, PAL_MODE_INPUT); + palSetPadMode(I2C1_BANK, I2C1_SCL, PAL_MODE_INPUT); + palSetPadMode(I2C1_BANK, I2C1_SDA, PAL_MODE_INPUT); chThdSleepMilliseconds(10); - - palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); - palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); + + palSetPadMode(I2C1_BANK, I2C1_SCL, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); + palSetPadMode(I2C1_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); //i2cInit(); //This is invoked by halInit() so no need to redo it. } @@ -67,6 +67,7 @@ uint8_t i2c_start(uint8_t address) uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout) { + // FIXME: Next steps: Add a print here, copy this file to your rgb_matrix firmware. Compare both. i2c_address = address; i2cStart(&I2C_DRIVER, &i2cconfig); return i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, 0, 0, MS2ST(timeout)); diff --git a/drivers/arm/i2c_master.h b/drivers/arm/i2c_master.h index 392760328..7a9eb32eb 100644 --- a/drivers/arm/i2c_master.h +++ b/drivers/arm/i2c_master.h @@ -26,6 +26,16 @@ #include "ch.h" #include +#ifndef I2C1_BANK + #define I2C1_BANK GPIOB +#endif +#ifndef I2C1_SCL + #define I2C1_SCL 6 +#endif +#ifndef I2C1_SDA + #define I2C1_SDA 7 +#endif + #ifndef I2C_DRIVER #define I2C_DRIVER I2CD1 #endif diff --git a/drivers/issi/is31fl3731-simple.c b/drivers/issi/is31fl3731-simple.c index 9c31df209..ff6620b72 100644 --- a/drivers/issi/is31fl3731-simple.c +++ b/drivers/issi/is31fl3731-simple.c @@ -158,12 +158,7 @@ void IS31FL3731_init(uint8_t addr) { // enable software shutdown IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00); // this delay was copied from other drivers, might not be needed - // FIXME: Don't we have a wrapper for this already? - #ifdef __AVR__ - _delay_ms(10); - #else wait_ms(10); - #endif // picture mode IS31FL3731_write_register(addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE); diff --git a/quantum/led_matrix.c b/quantum/led_matrix.c index 3b284990d..f849d478d 100644 --- a/quantum/led_matrix.c +++ b/quantum/led_matrix.c @@ -55,6 +55,9 @@ led_config_t led_matrix_config; bool g_suspend_state = false; +// Last uniform brightness level. +uint8_t g_uniform_brightness = 0; + // Global tick at 20 Hz uint32_t g_tick = 0; @@ -118,6 +121,7 @@ void led_matrix_set_index_value_all(uint8_t value) { } bool process_led_matrix(uint16_t keycode, keyrecord_t *record) { +/* FIXME: Why you comment out skully? if (record->event.pressed) { uint8_t led[8], led_count; map_row_column_to_led(record->event.key.row, record->event.key.col, led, &led_count); @@ -141,6 +145,7 @@ bool process_led_matrix(uint16_t keycode, keyrecord_t *record) { g_any_key_hit = 255; #endif } +*/ return true; } @@ -155,22 +160,20 @@ void led_matrix_all_off(void) { // Uniform brightness void led_matrix_uniform_brightness(void) { - led_matrix_set_index_value_all(led_matrix_config.val); + uint8_t current_brightness = (LED_MATRIX_MAXIMUM_BRIGHTNESS / BACKLIGHT_LEVELS) * led_matrix_config.val; + if (current_brightness != g_uniform_brightness) { + g_uniform_brightness = current_brightness; + led_matrix_set_index_value_all(current_brightness); + } } void led_matrix_custom(void) {} void led_matrix_task(void) { - #ifdef TRACK_PREVIOUS_EFFECT - static uint8_t toggle_enable_last = 255; - #endif - if (!led_matrix_config.enable) { - led_matrix_all_off(); - led_matrix_indicators(); - #ifdef TRACK_PREVIOUS_EFFECT - toggle_enable_last = led_matrix_config.enable; - #endif - return; + if (!led_matrix_config.enable) { + led_matrix_all_off(); + led_matrix_indicators(); + return; } // delay 1 second before driving LEDs or doing anything else @@ -187,6 +190,7 @@ void led_matrix_task(void) { g_any_key_hit++; } +/* FIXME: WHY YOU COMMENT OUT?! for (int led = 0; led < LED_DRIVER_LED_COUNT; led++) { if (g_key_hit[led] < 255) { if (g_key_hit[led] == 254) @@ -200,24 +204,13 @@ void led_matrix_task(void) { led_matrix_uniform_brightness(); return; } - +*/ // Ideally we would also stop sending zeros to the LED driver PWM buffers // while suspended and just do a software shutdown. This is a cheap hack for now. bool suspend_backlight = ((g_suspend_state && LED_DISABLE_WHEN_USB_SUSPENDED) || (LED_DISABLE_AFTER_TIMEOUT > 0 && g_any_key_hit > LED_DISABLE_AFTER_TIMEOUT * 60 * 20)); uint8_t effect = suspend_backlight ? 0 : led_matrix_config.mode; - #ifdef TRACK_PREVIOUS_EFFECT - // Keep track of the effect used last time, - // detect change in effect, so each effect can - // have an optional initialization. - - static uint8_t effect_last = 255; - bool initialize = (effect != effect_last) || (led_matrix_config.enable != toggle_enable_last); - effect_last = effect; - toggle_enable_last = led_matrix_config.enable; - #endif - // this gets ticked at 20 Hz. // each effect can opt to do calculations // and/or request PWM buffer updates. @@ -230,10 +223,12 @@ void led_matrix_task(void) { break; } - if (! suspend_backlight) { + if (!suspend_backlight) { led_matrix_indicators(); } + // Tell the LED driver to update its state + led_matrix_driver.flush(); } void led_matrix_indicators(void) { @@ -404,3 +399,7 @@ void led_matrix_set_value(uint8_t val) { led_matrix_set_value_noeeprom(val); eeconfig_update_led_matrix(led_matrix_config.raw); } + +void backlight_set(uint8_t val) { + led_matrix_set_value(val); +} diff --git a/quantum/led_matrix.h b/quantum/led_matrix.h index 6db162963..9bf20d044 100644 --- a/quantum/led_matrix.h +++ b/quantum/led_matrix.h @@ -112,9 +112,6 @@ uint8_t led_matrix_get_mode(void); void led_matrix_set_value(uint8_t mode); void led_matrix_set_value_noeeprom(uint8_t mode); -// Hook into the existing backlight API -#define backlight_set(val) led_matrix_set_value(val) - typedef struct { /* Perform any initialisation required for the other driver functions to work. */ void (*init)(void); diff --git a/quantum/led_matrix_drivers.c b/quantum/led_matrix_drivers.c index e0f8b2094..21e8a14c6 100644 --- a/quantum/led_matrix_drivers.c +++ b/quantum/led_matrix_drivers.c @@ -64,7 +64,8 @@ static void init(void) { IS31FL3733_init(LED_DRIVER_ADDR_4); #endif #endif - for (int index = 0; index < LED_DRIVER_COUNT; index++) { + + for (int index = 0; index < LED_DRIVER_LED_COUNT; index++) { #ifdef IS31FL3731 IS31FL3731_set_led_control_register(index, true); #else -- 2.39.2