From 23b7a02ebe2e6df738baa624c17e821c1573b69b Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 17 Mar 2024 19:23:14 +1100 Subject: LED drivers: add support for IS31FL3236 (#23264) --- drivers/led/issi/is31fl3236-mono.c | 168 ++++++++++++++++++++++++++++++++++++ drivers/led/issi/is31fl3236-mono.h | 101 ++++++++++++++++++++++ drivers/led/issi/is31fl3236.c | 172 +++++++++++++++++++++++++++++++++++++ drivers/led/issi/is31fl3236.h | 103 ++++++++++++++++++++++ 4 files changed, 544 insertions(+) create mode 100644 drivers/led/issi/is31fl3236-mono.c create mode 100644 drivers/led/issi/is31fl3236-mono.h create mode 100644 drivers/led/issi/is31fl3236.c create mode 100644 drivers/led/issi/is31fl3236.h (limited to 'drivers') diff --git a/drivers/led/issi/is31fl3236-mono.c b/drivers/led/issi/is31fl3236-mono.c new file mode 100644 index 0000000000..b80245a1dc --- /dev/null +++ b/drivers/led/issi/is31fl3236-mono.c @@ -0,0 +1,168 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "is31fl3236-mono.h" +#include "i2c_master.h" +#include "gpio.h" + +#define IS31FL3236_PWM_REGISTER_COUNT 36 +#define IS31FL3236_LED_CONTROL_REGISTER_COUNT 36 + +#ifndef IS31FL3236_I2C_TIMEOUT +# define IS31FL3236_I2C_TIMEOUT 100 +#endif + +#ifndef IS31FL3236_I2C_PERSISTENCE +# define IS31FL3236_I2C_PERSISTENCE 0 +#endif + +#ifndef IS31FL3236_PWM_FREQUENCY +# define IS31FL3236_PWM_FREQUENCY IS31FL3236_PWM_FREQUENCY_3K_HZ // OFS - IS31FL3236A only +#endif + +const uint8_t i2c_addresses[IS31FL3236_DRIVER_COUNT] = { + IS31FL3236_I2C_ADDRESS_1, +#ifdef IS31FL3236_I2C_ADDRESS_2 + IS31FL3236_I2C_ADDRESS_2, +# ifdef IS31FL3236_I2C_ADDRESS_3 + IS31FL3236_I2C_ADDRESS_3, +# ifdef IS31FL3236_I2C_ADDRESS_4 + IS31FL3236_I2C_ADDRESS_4, +# endif +# endif +#endif +}; + +typedef struct is31fl3236_driver_t { + uint8_t pwm_buffer[IS31FL3236_PWM_REGISTER_COUNT]; + bool pwm_buffer_dirty; + uint8_t led_control_buffer[IS31FL3236_LED_CONTROL_REGISTER_COUNT]; + bool led_control_buffer_dirty; +} PACKED is31fl3236_driver_t; + +is31fl3236_driver_t driver_buffers[IS31FL3236_DRIVER_COUNT] = {{ + .pwm_buffer = {0}, + .pwm_buffer_dirty = false, + .led_control_buffer = {0}, + .led_control_buffer_dirty = false, +}}; + +void is31fl3236_write_register(uint8_t index, uint8_t reg, uint8_t data) { +#if IS31FL3236_I2C_PERSISTENCE > 0 + for (uint8_t i = 0; i < IS31FL3236_I2C_PERSISTENCE; i++) { + if (i2c_write_register(i2c_addresses[index] << 1, reg, &data, 1, IS31FL3236_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break; + } +#else + i2c_write_register(i2c_addresses[index] << 1, reg, &data, 1, IS31FL3236_I2C_TIMEOUT); +#endif +} + +void is31fl3236_write_pwm_buffer(uint8_t index) { +#if IS31FL3236_I2C_PERSISTENCE > 0 + for (uint8_t i = 0; i < IS31FL3236_I2C_PERSISTENCE; i++) { + if (i2c_write_register(i2c_addresses[index] << 1, IS31FL3236_REG_PWM, driver_buffers[index].pwm_buffer, 36, IS31FL3236_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break; + } +#else + i2c_write_register(i2c_addresses[index] << 1, IS31FL3236_REG_PWM, driver_buffers[index].pwm_buffer, 36, IS31FL3236_I2C_TIMEOUT); +#endif +} + +void is31fl3236_init_drivers(void) { + i2c_init(); + +#if defined(IS31FL3236_SDB_PIN) + gpio_set_pin_output(IS31FL3236_SDB_PIN); + gpio_write_pin_high(IS31FL3236_SDB_PIN); +#endif + + for (uint8_t i = 0; i < IS31FL3236_DRIVER_COUNT; i++) { + is31fl3236_init(i); + } + + for (uint8_t i = 0; i < IS31FL3236_LED_COUNT; i++) { + is31fl3236_set_led_control_register(i, true); + } + + for (uint8_t i = 0; i < IS31FL3236_DRIVER_COUNT; i++) { + is31fl3236_update_led_control_registers(i); + } +} + +void is31fl3236_init(uint8_t index) { + // In case we ever want to reinitialize (?) + is31fl3236_write_register(index, IS31FL3236_REG_RESET, 0x00); + + // Turn off software shutdown + is31fl3236_write_register(index, IS31FL3236_REG_SHUTDOWN, 0x01); + + // Set all PWM values to zero + for (uint8_t i = 0; i < IS31FL3236_PWM_REGISTER_COUNT; i++) { + is31fl3236_write_register(index, IS31FL3236_REG_PWM + i, 0x00); + } + + // turn off all LEDs in the LED control register + for (uint8_t i = 0; i < IS31FL3236_LED_CONTROL_REGISTER_COUNT; i++) { + is31fl3236_write_register(index, IS31FL3236_REG_LED_CONTROL + i, 0x00); + } + + // Set PWM frequency (IS31FL3236A) + is31fl3236_write_register(index, IS31FL3236_REG_PWM_FREQUENCY, IS31FL3236_PWM_FREQUENCY); + + // Load PWM registers and LED Control register data + is31fl3236_write_register(index, IS31FL3236_REG_UPDATE, 0x01); +} + +void is31fl3236_set_value(int index, uint8_t value) { + is31fl3236_led_t led; + + if (index < IS31FL3236_LED_COUNT) { + memcpy_P(&led, (&g_is31fl3236_leds[index]), sizeof(led)); + + if (driver_buffers[led.driver].pwm_buffer[led.v] == value) { + return; + } + + driver_buffers[led.driver].pwm_buffer[led.v] = value; + driver_buffers[led.driver].pwm_buffer_dirty = true; + } +} + +void is31fl3236_set_value_all(uint8_t value) { + for (uint8_t i = 0; i < IS31FL3236_LED_COUNT; i++) { + is31fl3236_set_value(i, value); + } +} + +void is31fl3236_set_led_control_register(uint8_t index, bool value) { + is31fl3236_led_t led; + memcpy_P(&led, (&g_is31fl3236_leds[index]), sizeof(led)); + + driver_buffers[led.driver].led_control_buffer[led.v] = value ? 0x01 : 0x00; + driver_buffers[led.driver].led_control_buffer_dirty = true; +} + +void is31fl3236_update_pwm_buffers(uint8_t index) { + if (driver_buffers[index].pwm_buffer_dirty) { + is31fl3236_write_pwm_buffer(index); + // Load PWM registers and LED Control register data + is31fl3236_write_register(index, IS31FL3236_REG_UPDATE, 0x01); + + driver_buffers[index].pwm_buffer_dirty = false; + } +} + +void is31fl3236_update_led_control_registers(uint8_t index) { + if (driver_buffers[index].led_control_buffer_dirty) { + for (uint8_t i = 0; i < IS31FL3236_LED_CONTROL_REGISTER_COUNT; i++) { + is31fl3236_write_register(index, IS31FL3236_REG_LED_CONTROL + i, driver_buffers[index].led_control_buffer[i]); + } + + driver_buffers[index].led_control_buffer_dirty = false; + } +} + +void is31fl3236_flush(void) { + for (uint8_t i = 0; i < IS31FL3236_DRIVER_COUNT; i++) { + is31fl3236_update_pwm_buffers(i); + } +} diff --git a/drivers/led/issi/is31fl3236-mono.h b/drivers/led/issi/is31fl3236-mono.h new file mode 100644 index 0000000000..90735bb1aa --- /dev/null +++ b/drivers/led/issi/is31fl3236-mono.h @@ -0,0 +1,101 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include "progmem.h" +#include "util.h" + +#define IS31FL3236_REG_SHUTDOWN 0x00 +#define IS31FL3236_REG_PWM 0x01 +#define IS31FL3236_REG_UPDATE 0x25 +#define IS31FL3236_REG_LED_CONTROL 0x26 +#define IS31FL3236_REG_GLOBAL_CONTROL 0x4A +#define IS31FL3236_REG_PWM_FREQUENCY 0x4B +#define IS31FL3236_REG_RESET 0x4F + +#define IS31FL3236_I2C_ADDRESS_GND 0x3C +#define IS31FL3236_I2C_ADDRESS_SCL 0x3D +#define IS31FL3236_I2C_ADDRESS_SDA 0x3E +#define IS31FL3236_I2C_ADDRESS_VCC 0x3F + +#if defined(LED_MATRIX_IS31FL3236) +# define IS31FL3236_LED_COUNT LED_MATRIX_LED_COUNT +#endif + +#if defined(IS31FL3236_I2C_ADDRESS_4) +# define IS31FL3236_DRIVER_COUNT 4 +#elif defined(IS31FL3236_I2C_ADDRESS_3) +# define IS31FL3236_DRIVER_COUNT 3 +#elif defined(IS31FL3236_I2C_ADDRESS_2) +# define IS31FL3236_DRIVER_COUNT 2 +#elif defined(IS31FL3236_I2C_ADDRESS_1) +# define IS31FL3236_DRIVER_COUNT 1 +#endif + +typedef struct is31fl3236_led_t { + uint8_t driver : 2; + uint8_t v; +} PACKED is31fl3236_led_t; + +extern const is31fl3236_led_t PROGMEM g_is31fl3236_leds[IS31FL3236_LED_COUNT]; + +void is31fl3236_init_drivers(void); + +void is31fl3236_init(uint8_t index); + +void is31fl3236_write_register(uint8_t index, uint8_t reg, uint8_t data); + +void is31fl3236_set_value(int index, uint8_t value); + +void is31fl3236_set_value_all(uint8_t value); + +void is31fl3236_set_led_control_register(uint8_t index, bool value); + +void is31fl3236_update_pwm_buffers(uint8_t index); + +void is31fl3236_update_led_control_registers(uint8_t index); + +void is31fl3236_flush(void); + +#define IS31FL3236_PWM_FREQUENCY_3K_HZ 0b0 +#define IS31FL3236_PWM_FREQUENCY_22K_HZ 0b1 + +#define OUT1 0x00 +#define OUT2 0x01 +#define OUT3 0x02 +#define OUT4 0x03 +#define OUT5 0x04 +#define OUT6 0x05 +#define OUT7 0x06 +#define OUT8 0x07 +#define OUT9 0x08 +#define OUT10 0x09 +#define OUT11 0x0A +#define OUT12 0x0B +#define OUT13 0x0C +#define OUT14 0x0D +#define OUT15 0x0E +#define OUT16 0x0F +#define OUT17 0x10 +#define OUT18 0x11 +#define OUT19 0x12 +#define OUT20 0x13 +#define OUT21 0x14 +#define OUT22 0x15 +#define OUT23 0x16 +#define OUT24 0x17 +#define OUT25 0x18 +#define OUT26 0x19 +#define OUT27 0x1A +#define OUT28 0x1B +#define OUT29 0x1C +#define OUT30 0x1D +#define OUT31 0x1E +#define OUT32 0x1F +#define OUT33 0x20 +#define OUT34 0x21 +#define OUT35 0x22 +#define OUT36 0x23 diff --git a/drivers/led/issi/is31fl3236.c b/drivers/led/issi/is31fl3236.c new file mode 100644 index 0000000000..b8aa9c34b1 --- /dev/null +++ b/drivers/led/issi/is31fl3236.c @@ -0,0 +1,172 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "is31fl3236.h" +#include "i2c_master.h" +#include "gpio.h" + +#define IS31FL3236_PWM_REGISTER_COUNT 36 +#define IS31FL3236_LED_CONTROL_REGISTER_COUNT 36 + +#ifndef IS31FL3236_I2C_TIMEOUT +# define IS31FL3236_I2C_TIMEOUT 100 +#endif + +#ifndef IS31FL3236_I2C_PERSISTENCE +# define IS31FL3236_I2C_PERSISTENCE 0 +#endif + +#ifndef IS31FL3236_PWM_FREQUENCY +# define IS31FL3236_PWM_FREQUENCY IS31FL3236_PWM_FREQUENCY_3K_HZ // OFS - IS31FL3236A only +#endif + +const uint8_t i2c_addresses[IS31FL3236_DRIVER_COUNT] = { + IS31FL3236_I2C_ADDRESS_1, +#ifdef IS31FL3236_I2C_ADDRESS_2 + IS31FL3236_I2C_ADDRESS_2, +# ifdef IS31FL3236_I2C_ADDRESS_3 + IS31FL3236_I2C_ADDRESS_3, +# ifdef IS31FL3236_I2C_ADDRESS_4 + IS31FL3236_I2C_ADDRESS_4, +# endif +# endif +#endif +}; + +typedef struct is31fl3236_driver_t { + uint8_t pwm_buffer[IS31FL3236_PWM_REGISTER_COUNT]; + bool pwm_buffer_dirty; + uint8_t led_control_buffer[IS31FL3236_LED_CONTROL_REGISTER_COUNT]; + bool led_control_buffer_dirty; +} PACKED is31fl3236_driver_t; + +is31fl3236_driver_t driver_buffers[IS31FL3236_DRIVER_COUNT] = {{ + .pwm_buffer = {0}, + .pwm_buffer_dirty = false, + .led_control_buffer = {0}, + .led_control_buffer_dirty = false, +}}; + +void is31fl3236_write_register(uint8_t index, uint8_t reg, uint8_t data) { +#if IS31FL3236_I2C_PERSISTENCE > 0 + for (uint8_t i = 0; i < IS31FL3236_I2C_PERSISTENCE; i++) { + if (i2c_write_register(i2c_addresses[index] << 1, reg, &data, 1, IS31FL3236_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break; + } +#else + i2c_write_register(i2c_addresses[index] << 1, reg, &data, 1, IS31FL3236_I2C_TIMEOUT); +#endif +} + +void is31fl3236_write_pwm_buffer(uint8_t index) { +#if IS31FL3236_I2C_PERSISTENCE > 0 + for (uint8_t i = 0; i < IS31FL3236_I2C_PERSISTENCE; i++) { + if (i2c_write_register(i2c_addresses[index] << 1, IS31FL3236_REG_PWM, driver_buffers[index].pwm_buffer, 36, IS31FL3236_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break; + } +#else + i2c_write_register(i2c_addresses[index] << 1, IS31FL3236_REG_PWM, driver_buffers[index].pwm_buffer, 36, IS31FL3236_I2C_TIMEOUT); +#endif +} + +void is31fl3236_init_drivers(void) { + i2c_init(); + +#if defined(IS31FL3236_SDB_PIN) + gpio_set_pin_output(IS31FL3236_SDB_PIN); + gpio_write_pin_high(IS31FL3236_SDB_PIN); +#endif + + for (uint8_t i = 0; i < IS31FL3236_DRIVER_COUNT; i++) { + is31fl3236_init(i); + } + + for (uint8_t i = 0; i < IS31FL3236_LED_COUNT; i++) { + is31fl3236_set_led_control_register(i, true, true, true); + } + + for (uint8_t i = 0; i < IS31FL3236_DRIVER_COUNT; i++) { + is31fl3236_update_led_control_registers(i); + } +} + +void is31fl3236_init(uint8_t index) { + // In case we ever want to reinitialize (?) + is31fl3236_write_register(index, IS31FL3236_REG_RESET, 0x00); + + // Turn off software shutdown + is31fl3236_write_register(index, IS31FL3236_REG_SHUTDOWN, 0x01); + + // Set all PWM values to zero + for (uint8_t i = 0; i < IS31FL3236_PWM_REGISTER_COUNT; i++) { + is31fl3236_write_register(index, IS31FL3236_REG_PWM + i, 0x00); + } + + // turn off all LEDs in the LED control register + for (uint8_t i = 0; i < IS31FL3236_LED_CONTROL_REGISTER_COUNT; i++) { + is31fl3236_write_register(index, IS31FL3236_REG_LED_CONTROL + i, 0x00); + } + + // Set PWM frequency (IS31FL3236A) + is31fl3236_write_register(index, IS31FL3236_REG_PWM_FREQUENCY, IS31FL3236_PWM_FREQUENCY); + + // Load PWM registers and LED Control register data + is31fl3236_write_register(index, IS31FL3236_REG_UPDATE, 0x01); +} + +void is31fl3236_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) { + is31fl3236_led_t led; + + if (index < IS31FL3236_LED_COUNT) { + memcpy_P(&led, (&g_is31fl3236_leds[index]), sizeof(led)); + + if (driver_buffers[led.driver].pwm_buffer[led.r] == red && driver_buffers[led.driver].pwm_buffer[led.g] == green && driver_buffers[led.driver].pwm_buffer[led.b] == blue) { + return; + } + + driver_buffers[led.driver].pwm_buffer[led.r] = red; + driver_buffers[led.driver].pwm_buffer[led.g] = green; + driver_buffers[led.driver].pwm_buffer[led.b] = blue; + driver_buffers[led.driver].pwm_buffer_dirty = true; + } +} + +void is31fl3236_set_color_all(uint8_t red, uint8_t green, uint8_t blue) { + for (uint8_t i = 0; i < IS31FL3236_LED_COUNT; i++) { + is31fl3236_set_color(i, red, green, blue); + } +} + +void is31fl3236_set_led_control_register(uint8_t index, bool red, bool green, bool blue) { + is31fl3236_led_t led; + memcpy_P(&led, (&g_is31fl3236_leds[index]), sizeof(led)); + + driver_buffers[led.driver].led_control_buffer[led.r] = red ? 0x01 : 0x00; + driver_buffers[led.driver].led_control_buffer[led.g] = green ? 0x01 : 0x00; + driver_buffers[led.driver].led_control_buffer[led.b] = blue ? 0x01 : 0x00; + driver_buffers[led.driver].led_control_buffer_dirty = true; +} + +void is31fl3236_update_pwm_buffers(uint8_t index) { + if (driver_buffers[index].pwm_buffer_dirty) { + is31fl3236_write_pwm_buffer(index); + // Load PWM registers and LED Control register data + is31fl3236_write_register(index, IS31FL3236_REG_UPDATE, 0x01); + + driver_buffers[index].pwm_buffer_dirty = false; + } +} + +void is31fl3236_update_led_control_registers(uint8_t index) { + if (driver_buffers[index].led_control_buffer_dirty) { + for (uint8_t i = 0; i < IS31FL3236_LED_CONTROL_REGISTER_COUNT; i++) { + is31fl3236_write_register(index, IS31FL3236_REG_LED_CONTROL + i, driver_buffers[index].led_control_buffer[i]); + } + + driver_buffers[index].led_control_buffer_dirty = false; + } +} + +void is31fl3236_flush(void) { + for (uint8_t i = 0; i < IS31FL3236_DRIVER_COUNT; i++) { + is31fl3236_update_pwm_buffers(i); + } +} diff --git a/drivers/led/issi/is31fl3236.h b/drivers/led/issi/is31fl3236.h new file mode 100644 index 0000000000..1e490796b2 --- /dev/null +++ b/drivers/led/issi/is31fl3236.h @@ -0,0 +1,103 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include "progmem.h" +#include "util.h" + +#define IS31FL3236_REG_SHUTDOWN 0x00 +#define IS31FL3236_REG_PWM 0x01 +#define IS31FL3236_REG_UPDATE 0x25 +#define IS31FL3236_REG_LED_CONTROL 0x26 +#define IS31FL3236_REG_GLOBAL_CONTROL 0x4A +#define IS31FL3236_REG_PWM_FREQUENCY 0x4B +#define IS31FL3236_REG_RESET 0x4F + +#define IS31FL3236_I2C_ADDRESS_GND 0x3C +#define IS31FL3236_I2C_ADDRESS_SCL 0x3D +#define IS31FL3236_I2C_ADDRESS_SDA 0x3E +#define IS31FL3236_I2C_ADDRESS_VCC 0x3F + +#if defined(RGB_MATRIX_IS31FL3236) +# define IS31FL3236_LED_COUNT RGB_MATRIX_LED_COUNT +#endif + +#if defined(IS31FL3236_I2C_ADDRESS_4) +# define IS31FL3236_DRIVER_COUNT 4 +#elif defined(IS31FL3236_I2C_ADDRESS_3) +# define IS31FL3236_DRIVER_COUNT 3 +#elif defined(IS31FL3236_I2C_ADDRESS_2) +# define IS31FL3236_DRIVER_COUNT 2 +#elif defined(IS31FL3236_I2C_ADDRESS_1) +# define IS31FL3236_DRIVER_COUNT 1 +#endif + +typedef struct is31fl3236_led_t { + uint8_t driver : 2; + uint8_t r; + uint8_t g; + uint8_t b; +} PACKED is31fl3236_led_t; + +extern const is31fl3236_led_t PROGMEM g_is31fl3236_leds[IS31FL3236_LED_COUNT]; + +void is31fl3236_init_drivers(void); + +void is31fl3236_init(uint8_t index); + +void is31fl3236_write_register(uint8_t index, uint8_t reg, uint8_t data); + +void is31fl3236_set_color(int index, uint8_t red, uint8_t green, uint8_t blue); + +void is31fl3236_set_color_all(uint8_t red, uint8_t green, uint8_t blue); + +void is31fl3236_set_led_control_register(uint8_t index, bool red, bool green, bool blue); + +void is31fl3236_update_pwm_buffers(uint8_t index); + +void is31fl3236_update_led_control_registers(uint8_t index); + +void is31fl3236_flush(void); + +#define IS31FL3236_PWM_FREQUENCY_3K_HZ 0b0 +#define IS31FL3236_PWM_FREQUENCY_22K_HZ 0b1 + +#define OUT1 0x00 +#define OUT2 0x01 +#define OUT3 0x02 +#define OUT4 0x03 +#define OUT5 0x04 +#define OUT6 0x05 +#define OUT7 0x06 +#define OUT8 0x07 +#define OUT9 0x08 +#define OUT10 0x09 +#define OUT11 0x0A +#define OUT12 0x0B +#define OUT13 0x0C +#define OUT14 0x0D +#define OUT15 0x0E +#define OUT16 0x0F +#define OUT17 0x10 +#define OUT18 0x11 +#define OUT19 0x12 +#define OUT20 0x13 +#define OUT21 0x14 +#define OUT22 0x15 +#define OUT23 0x16 +#define OUT24 0x17 +#define OUT25 0x18 +#define OUT26 0x19 +#define OUT27 0x1A +#define OUT28 0x1B +#define OUT29 0x1C +#define OUT30 0x1D +#define OUT31 0x1E +#define OUT32 0x1F +#define OUT33 0x20 +#define OUT34 0x21 +#define OUT35 0x22 +#define OUT36 0x23 -- cgit v1.2.3 From f7cf40fa77164d7be9358ce83f7f5939d71b38bc Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 18 Mar 2024 22:03:27 +1100 Subject: Add init function to RGBLight driver struct (#23076) --- drivers/led/apa102.c | 10 +- drivers/ws2812.h | 2 + keyboards/1k/keymaps/default/keymap.c | 1 + keyboards/1k/keymaps/default/rgblite.h | 4 + keyboards/ergodox_ez/glow/keymaps/default/keymap.c | 200 +++++++++++++++++++++ keyboards/ergodox_ez/glow/keymaps/default/rules.mk | 2 + keyboards/ergodox_ez/keymaps/default_glow/keymap.c | 1 - keyboards/ergodox_ez/keymaps/default_glow/rules.mk | 4 - keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c | 37 ++-- keyboards/ergodox_ez/keymaps/testing/keymap.c | 27 +-- keyboards/ergodox_ez/led_i2c.c | 70 -------- keyboards/ergodox_ez/rules.mk | 3 +- keyboards/ergodox_ez/shine/rgblight_custom.c | 67 +++++++ keyboards/ergodox_ez/shine/rules.mk | 1 + keyboards/handwired/promethium/rgbsps.c | 7 + keyboards/ibm/model_m/mschwingen/mschwingen.c | 1 + keyboards/kprepublic/bm60hsrgb/rev2/rev2.c | 1 + keyboards/kprepublic/bm60hsrgb_iso/rev2/rev2.c | 1 + keyboards/kprepublic/bm60hsrgb_poker/rev2/rev2.c | 1 + keyboards/matrix/abelx/abelx.c | 1 + keyboards/matrix/noah/noah.c | 1 + keyboards/neson_design/700e/700e.c | 1 + keyboards/neson_design/n6/n6.c | 1 + keyboards/neson_design/nico/nico.c | 1 + keyboards/oddforge/vea/ws2812_custom.c | 6 - keyboards/rgbkb/pan/pan.c | 4 +- keyboards/wilba_tech/wt_rgb_backlight.c | 3 + keyboards/work_louder/rgb_functions.c | 2 + keyboards/xelus/dawn60/rev1_qmk/rev1_qmk.c | 2 +- .../xiudi/xd002/keymaps/multilayer_rgb/keymap.c | 1 + .../xiudi/xd002/keymaps/multilayer_rgb/rgblite.h | 8 +- keyboards/xiudi/xd002/keymaps/rgb_lite/keymap.c | 1 + keyboards/xiudi/xd002/keymaps/rgb_lite/rgblite.h | 8 +- platforms/avr/drivers/ws2812_bitbang.c | 4 +- platforms/avr/drivers/ws2812_i2c.c | 6 - .../drivers/vendor/RP/RP2040/ws2812_vendor.c | 11 +- platforms/chibios/drivers/ws2812_bitbang.c | 6 - platforms/chibios/drivers/ws2812_pwm.c | 6 - platforms/chibios/drivers/ws2812_spi.c | 6 - quantum/rgb_matrix/rgb_matrix_drivers.c | 1 + quantum/rgblight/rgblight.c | 2 + quantum/rgblight/rgblight_drivers.c | 2 + quantum/rgblight/rgblight_drivers.h | 1 + 43 files changed, 369 insertions(+), 156 deletions(-) create mode 100644 keyboards/ergodox_ez/glow/keymaps/default/keymap.c create mode 100644 keyboards/ergodox_ez/glow/keymaps/default/rules.mk delete mode 100644 keyboards/ergodox_ez/keymaps/default_glow/keymap.c delete mode 100644 keyboards/ergodox_ez/keymaps/default_glow/rules.mk delete mode 100644 keyboards/ergodox_ez/led_i2c.c create mode 100644 keyboards/ergodox_ez/shine/rgblight_custom.c (limited to 'drivers') diff --git a/drivers/led/apa102.c b/drivers/led/apa102.c index d6d4327495..b171b07b12 100644 --- a/drivers/led/apa102.c +++ b/drivers/led/apa102.c @@ -67,7 +67,9 @@ static void apa102_send_byte(uint8_t byte) { } static void apa102_start_frame(void) { - apa102_init(); + gpio_write_pin_low(APA102_DI_PIN); + gpio_write_pin_low(APA102_CI_PIN); + for (uint16_t i = 0; i < 4; i++) { apa102_send_byte(0); } @@ -103,7 +105,8 @@ static void apa102_end_frame(uint16_t num_leds) { apa102_send_byte(0); } - apa102_init(); + gpio_write_pin_low(APA102_DI_PIN); + gpio_write_pin_low(APA102_CI_PIN); } static void apa102_send_frame(uint8_t red, uint8_t green, uint8_t blue, uint8_t brightness) { @@ -116,9 +119,6 @@ static void apa102_send_frame(uint8_t red, uint8_t green, uint8_t blue, uint8_t void apa102_init(void) { gpio_set_pin_output(APA102_DI_PIN); gpio_set_pin_output(APA102_CI_PIN); - - gpio_write_pin_low(APA102_DI_PIN); - gpio_write_pin_low(APA102_CI_PIN); } void apa102_setleds(rgb_led_t *start_led, uint16_t num_leds) { diff --git a/drivers/ws2812.h b/drivers/ws2812.h index 134de51c50..993cce8ce4 100644 --- a/drivers/ws2812.h +++ b/drivers/ws2812.h @@ -62,6 +62,8 @@ # define WS2812_LED_COUNT RGB_MATRIX_LED_COUNT #endif +void ws2812_init(void); + /* User Interface * * Input: diff --git a/keyboards/1k/keymaps/default/keymap.c b/keyboards/1k/keymaps/default/keymap.c index b64d4d8c76..3261a9f922 100644 --- a/keyboards/1k/keymaps/default/keymap.c +++ b/keyboards/1k/keymaps/default/keymap.c @@ -21,5 +21,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } void keyboard_post_init_user(void) { + rgblite_init(); rgblite_increase_hue(); } diff --git a/keyboards/1k/keymaps/default/rgblite.h b/keyboards/1k/keymaps/default/rgblite.h index 9a7761e30d..2e0b898699 100644 --- a/keyboards/1k/keymaps/default/rgblite.h +++ b/keyboards/1k/keymaps/default/rgblite.h @@ -6,6 +6,10 @@ #include "ws2812.h" #include "color.h" +static inline void rgblite_init(void) { + ws2812_init(); +} + static inline void rgblite_setrgb(RGB rgb) { rgb_led_t leds[RGBLIGHT_LED_COUNT] = {{.r = rgb.r, .g = rgb.g, .b = rgb.b}}; ws2812_setleds(leds, RGBLIGHT_LED_COUNT); diff --git a/keyboards/ergodox_ez/glow/keymaps/default/keymap.c b/keyboards/ergodox_ez/glow/keymaps/default/keymap.c new file mode 100644 index 0000000000..94d68cb870 --- /dev/null +++ b/keyboards/ergodox_ez/glow/keymaps/default/keymap.c @@ -0,0 +1,200 @@ +#include QMK_KEYBOARD_H +#include "version.h" + +enum layers { + BASE, // default layer + SYMB, // symbols + MDIA, // media keys +}; + +enum custom_keycodes { + VRSN = SAFE_RANGE, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | BkSp | A | S | D | F | G |------| |------| H | J | K | L |; / L2|' / Cmd | + * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| + * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | App | LGui | | Alt |Ctrl/Esc| + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +[BASE] = LAYOUT_ergodox_pretty( + // left hand + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN), GUI_T(KC_QUOT), + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + LT(SYMB,KC_GRV), KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, TT(SYMB), + ALT_T(KC_APP), KC_LGUI, KC_LALT, CTL_T(KC_ESC), + KC_HOME, KC_PGUP, + KC_SPC, KC_BSPC, KC_END, KC_PGDN, KC_TAB, KC_ENT +), +/* Keymap 1: Symbol Layer + * + * ,---------------------------------------------------. ,--------------------------------------------------. + * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | EPRM | | | | | | | . | 0 | = | | + * `-----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * |Animat| | |Toggle|Solid | + * ,------|------|------| |------+------+------. + * |Bright|Bright| | | |Hue- |Hue+ | + * |ness- |ness+ |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[SYMB] = LAYOUT_ergodox_pretty( + // left hand + VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_TRNS, KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + EE_CLR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DOT, KC_0, KC_EQL, KC_TRNS, + RGB_MOD, KC_TRNS, RGB_TOG, RGB_M_P, + KC_TRNS, KC_TRNS, + RGB_VAD, RGB_VAI, KC_TRNS, KC_TRNS, RGB_HUD, RGB_HUI +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[MDIA] = LAYOUT_ergodox_pretty( + // left hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WBAK +), +}; +// clang-format on + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch (keycode) { + case VRSN: + SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + return false; + } + } + return true; +} + +// Runs just one time when the keyboard initializes. +void keyboard_post_init_user(void) { +#ifdef RGBLIGHT_COLOR_LAYER_0 + rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0); +#endif +}; + +// Runs whenever there is a layer state change. +layer_state_t layer_state_set_user(layer_state_t state) { + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + + uint8_t layer = get_highest_layer(state); + switch (layer) { + case 0: +#ifdef RGBLIGHT_COLOR_LAYER_0 + rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0); +#endif + break; + case 1: + ergodox_right_led_1_on(); +#ifdef RGBLIGHT_COLOR_LAYER_1 + rgblight_setrgb(RGBLIGHT_COLOR_LAYER_1); +#endif + break; + case 2: + ergodox_right_led_2_on(); +#ifdef RGBLIGHT_COLOR_LAYER_2 + rgblight_setrgb(RGBLIGHT_COLOR_LAYER_2); +#endif + break; + case 3: + ergodox_right_led_3_on(); +#ifdef RGBLIGHT_COLOR_LAYER_3 + rgblight_setrgb(RGBLIGHT_COLOR_LAYER_3); +#endif + break; + case 4: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); +#ifdef RGBLIGHT_COLOR_LAYER_4 + rgblight_setrgb(RGBLIGHT_COLOR_LAYER_4); +#endif + break; + case 5: + ergodox_right_led_1_on(); + ergodox_right_led_3_on(); +#ifdef RGBLIGHT_COLOR_LAYER_5 + rgblight_setrgb(RGBLIGHT_COLOR_LAYER_5); +#endif + break; + case 6: + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); +#ifdef RGBLIGHT_COLOR_LAYER_6 + rgblight_setrgb(RGBLIGHT_COLOR_LAYER_6); +#endif + break; + case 7: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); +#ifdef RGBLIGHT_COLOR_LAYER_7 + rgblight_setrgb(RGBLIGHT_COLOR_LAYER_7); +#endif + break; + default: + break; + } + + return state; +}; diff --git a/keyboards/ergodox_ez/glow/keymaps/default/rules.mk b/keyboards/ergodox_ez/glow/keymaps/default/rules.mk new file mode 100644 index 0000000000..1a840036e2 --- /dev/null +++ b/keyboards/ergodox_ez/glow/keymaps/default/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = no +RGB_MATRIX_ENABLE = yes diff --git a/keyboards/ergodox_ez/keymaps/default_glow/keymap.c b/keyboards/ergodox_ez/keymaps/default_glow/keymap.c deleted file mode 100644 index 526c364029..0000000000 --- a/keyboards/ergodox_ez/keymaps/default_glow/keymap.c +++ /dev/null @@ -1 +0,0 @@ -// Placeholder. See ../default/keymap.c for details diff --git a/keyboards/ergodox_ez/keymaps/default_glow/rules.mk b/keyboards/ergodox_ez/keymaps/default_glow/rules.mk deleted file mode 100644 index 20bac4ab9d..0000000000 --- a/keyboards/ergodox_ez/keymaps/default_glow/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -RGBLIGHT_ENABLE = no -RGB_MATRIX_ENABLE = yes # enable later - -SRC += keymaps/default/keymap.c diff --git a/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c index 6ed204a357..b033c0ca1c 100644 --- a/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c +++ b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c @@ -151,6 +151,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; +#ifdef RGBLIGHT_ENABLE void eeconfig_init_user(void) { rgblight_enable(); rgblight_sethsv(HSV_CYAN); @@ -158,7 +159,7 @@ void eeconfig_init_user(void) { user_config.rgb_layer_change = true; eeconfig_update_user(user_config.raw); } - +#endif bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { @@ -168,21 +169,17 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { eeconfig_init(); } return false; - break; case VRSN: if (record->event.pressed) { SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); } return false; - break; +#ifdef RGBLIGHT_ENABLE case RGB_SLD: if (record->event.pressed) { - #ifdef RGBLIGHT_ENABLE rgblight_mode(1); - #endif } return false; - break; case RGB_LYR: // This allows me to use underglow as layer indication, or as normal if (record->event.pressed) { user_config.rgb_layer_change ^= 1; // Toggles the status @@ -191,7 +188,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { layer_state_set(layer_state); // then immediately update the layer color } } - return false; break; + return false; case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // For any of the RGB codes (see quantum_keycodes.h, L400 for reference) if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled if (user_config.rgb_layer_change) { // only if this is enabled @@ -199,11 +196,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { eeconfig_update_user(user_config.raw); // write the setings to EEPROM } } - return true; break; + return true; +#endif } return true; } +#ifdef RGBLIGHT_ENABLE void matrix_init_user(void) { // Call the keymap level matrix init. @@ -217,11 +216,7 @@ void matrix_init_user(void) { rgblight_mode_noeeprom(1); } } - -// Runs constantly in the background, in a loop. -void matrix_scan_user(void) { - -}; +#endif layer_state_t layer_state_set_user(layer_state_t state) { ergodox_board_led_off(); @@ -231,39 +226,55 @@ layer_state_t layer_state_set_user(layer_state_t state) { switch (get_highest_layer(state)) { case SYMB: ergodox_right_led_1_on(); +#ifdef RGBLIGHT_ENABLE if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_RED); rgblight_mode_noeeprom(1); } +#endif break; case MDIA: ergodox_right_led_2_on(); +#ifdef RGBLIGHT_ENABLE if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_GREEN); rgblight_mode_noeeprom(1); } +#endif break; case 3: ergodox_right_led_3_on(); +#ifdef RGBLIGHT_ENABLE if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_BLUE); rgblight_mode_noeeprom(1); } +#endif break; case 4: ergodox_right_led_1_on(); ergodox_right_led_2_on(); +#ifdef RGBLIGHT_ENABLE if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_ORANGE); rgblight_mode_noeeprom(1); } +#endif break; case 5: ergodox_right_led_1_on(); ergodox_right_led_3_on(); +#ifdef RGBLIGHT_ENABLE if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_YELLOW); rgblight_mode_noeeprom(1); } +#endif break; case 6: ergodox_right_led_2_on(); ergodox_right_led_3_on(); +#ifdef RGBLIGHT_ENABLE if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_PINK); rgblight_mode_noeeprom(1); } +#endif break; case 7: ergodox_right_led_1_on(); ergodox_right_led_2_on(); ergodox_right_led_3_on(); +#ifdef RGBLIGHT_ENABLE if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_WHITE); rgblight_mode_noeeprom(1); } +#endif break; default: // for any other layers, or the default layer +#ifdef RGBLIGHT_ENABLE if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_CYAN); rgblight_mode_noeeprom(1); } +#endif break; } return state; diff --git a/keyboards/ergodox_ez/keymaps/testing/keymap.c b/keyboards/ergodox_ez/keymaps/testing/keymap.c index ef8ca63e3b..ee07f264b9 100644 --- a/keyboards/ergodox_ez/keymaps/testing/keymap.c +++ b/keyboards/ergodox_ez/keymaps/testing/keymap.c @@ -29,7 +29,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; void matrix_init_user(void) { -#ifdef RGBLIGHT_COLOR_LAYER_0 +#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_COLOR_LAYER_0) rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0); #endif }; @@ -42,19 +42,18 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { eeconfig_init(); } return false; - break; case VRSN: if (record->event.pressed) { SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); } return false; - break; +#ifdef RGBLIGHT_ENABLE case RGB_SLD: if (record->event.pressed) { rgblight_mode(1); } return false; - break; +#endif } return true; @@ -70,48 +69,50 @@ layer_state_t layer_state_set_user(layer_state_t state) { ergodox_right_led_3_off(); switch (layer) { case 0: - #ifdef RGBLIGHT_COLOR_LAYER_0 + #ifdef RGBLIGHT_ENABLE + #ifdef RGBLIGHT_COLOR_LAYER_0 rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0); - #else + #else rgblight_init(); + #endif #endif break; case 1: ergodox_right_led_1_on(); - #ifdef RGBLIGHT_COLOR_LAYER_1 + #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_COLOR_LAYER_1) rgblight_setrgb(RGBLIGHT_COLOR_LAYER_1); #endif break; case 2: ergodox_right_led_2_on(); - #ifdef RGBLIGHT_COLOR_LAYER_2 + #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_COLOR_LAYER_2) rgblight_setrgb(RGBLIGHT_COLOR_LAYER_2); #endif break; case 3: ergodox_right_led_3_on(); - #ifdef RGBLIGHT_COLOR_LAYER_3 + #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_COLOR_LAYER_3) rgblight_setrgb(RGBLIGHT_COLOR_LAYER_3); #endif break; case 4: ergodox_right_led_1_on(); ergodox_right_led_2_on(); - #ifdef RGBLIGHT_COLOR_LAYER_4 + #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_COLOR_LAYER_4) rgblight_setrgb(RGBLIGHT_COLOR_LAYER_4); #endif break; case 5: ergodox_right_led_1_on(); ergodox_right_led_3_on(); - #ifdef RGBLIGHT_COLOR_LAYER_5 + #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_COLOR_LAYER_5) rgblight_setrgb(RGBLIGHT_COLOR_LAYER_5); #endif break; case 6: ergodox_right_led_2_on(); ergodox_right_led_3_on(); - #ifdef RGBLIGHT_COLOR_LAYER_6 + #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_COLOR_LAYER_6) rgblight_setrgb(RGBLIGHT_COLOR_LAYER_6); #endif break; @@ -119,7 +120,7 @@ layer_state_t layer_state_set_user(layer_state_t state) { ergodox_right_led_1_on(); ergodox_right_led_2_on(); ergodox_right_led_3_on(); - #ifdef RGBLIGHT_COLOR_LAYER_7 + #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_COLOR_LAYER_7) rgblight_setrgb(RGBLIGHT_COLOR_LAYER_6); #endif break; diff --git a/keyboards/ergodox_ez/led_i2c.c b/keyboards/ergodox_ez/led_i2c.c deleted file mode 100644 index 80dabf4815..0000000000 --- a/keyboards/ergodox_ez/led_i2c.c +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright 2012 Jun Wako -Copyright 2013 Oleg Kostyuk -Copyright 2015 ZSA Technology Labs Inc (@zsa) -Copyright 2020 Christopher Courtney (@drashna) - -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 . -*/ - -#ifdef RGBLIGHT_ENABLE - -# include "ergodox_ez.h" -# include "ws2812.h" - -void setleds_custom(rgb_led_t *led, uint16_t led_num) { - uint16_t length = 0; - int i = 0; - int j = 0; -# ifdef RGBW - int bytes_per_led = 4; -# else - int bytes_per_led = 3; -# endif -# if defined(ERGODOX_LED_30) - // prevent right-half code from trying to bitbang all 30 - // so with 30 LEDs, we count from 29 to 15 here, and the - // other half does 0 to 14. - uint8_t half_led_num = RGBLIGHT_LED_COUNT / 2; - length = half_led_num * bytes_per_led; - uint8_t data[length]; - for (i = half_led_num + half_led_num - 1; i >= half_led_num; --i) -# elif defined(ERGODOX_LED_15_MIRROR) - length = led_num * bytes_per_led; - uint8_t data[length]; - for (i = 0; i < led_num; ++i) -# else // ERGDOX_LED_15 non-mirrored - length = led_num * bytes_per_led; - uint8_t data[length]; - for (i = led_num - 1; i >= 0; --i) -# endif - { - uint8_t *data_byte = (uint8_t *)(led + i); - data[j++] = data_byte[0]; - data[j++] = data_byte[1]; - data[j++] = data_byte[2]; -#ifdef RGBW - data[j++] = data_byte[3]; -#endif - } - i2c_transmit(0x84, data, sizeof(data), ERGODOX_EZ_I2C_TIMEOUT); - - ws2812_setleds(led, led_num); -} - -const rgblight_driver_t rgblight_driver = { - .setleds = setleds_custom, -}; - -#endif // RGBLIGHT_ENABLE diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk index bba3bd86ae..68f785f3cc 100644 --- a/keyboards/ergodox_ez/rules.mk +++ b/keyboards/ergodox_ez/rules.mk @@ -19,8 +19,7 @@ SWAP_HANDS_ENABLE= no # Allow swapping hands of keyboard RGB_MATRIX_ENABLE = no # enable later # project specific files -SRC += matrix.c \ - led_i2c.c +SRC += matrix.c I2C_DRIVER_REQUIRED = yes # Disable unsupported hardware diff --git a/keyboards/ergodox_ez/shine/rgblight_custom.c b/keyboards/ergodox_ez/shine/rgblight_custom.c new file mode 100644 index 0000000000..feac50cba0 --- /dev/null +++ b/keyboards/ergodox_ez/shine/rgblight_custom.c @@ -0,0 +1,67 @@ +/* +Copyright 2012 Jun Wako +Copyright 2013 Oleg Kostyuk +Copyright 2015 ZSA Technology Labs Inc (@zsa) +Copyright 2020 Christopher Courtney (@drashna) + +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 . +*/ + +#include "ergodox_ez.h" +#include "ws2812.h" + +void setleds_custom(rgb_led_t *led, uint16_t led_num) { + uint16_t length = 0; + int i = 0; + int j = 0; +# ifdef RGBW + int bytes_per_led = 4; +# else + int bytes_per_led = 3; +# endif +# if defined(ERGODOX_LED_30) + // prevent right-half code from trying to bitbang all 30 + // so with 30 LEDs, we count from 29 to 15 here, and the + // other half does 0 to 14. + uint8_t half_led_num = RGBLIGHT_LED_COUNT / 2; + length = half_led_num * bytes_per_led; + uint8_t data[length]; + for (i = half_led_num + half_led_num - 1; i >= half_led_num; --i) +# elif defined(ERGODOX_LED_15_MIRROR) + length = led_num * bytes_per_led; + uint8_t data[length]; + for (i = 0; i < led_num; ++i) +# else // ERGDOX_LED_15 non-mirrored + length = led_num * bytes_per_led; + uint8_t data[length]; + for (i = led_num - 1; i >= 0; --i) +# endif + { + uint8_t *data_byte = (uint8_t *)(led + i); + data[j++] = data_byte[0]; + data[j++] = data_byte[1]; + data[j++] = data_byte[2]; +#ifdef RGBW + data[j++] = data_byte[3]; +#endif + } + i2c_transmit(0x84, data, sizeof(data), ERGODOX_EZ_I2C_TIMEOUT); + + ws2812_setleds(led, led_num); +} + +const rgblight_driver_t rgblight_driver = { + .init = ws2812_init, + .setleds = setleds_custom, +}; diff --git a/keyboards/ergodox_ez/shine/rules.mk b/keyboards/ergodox_ez/shine/rules.mk index b035c36850..4ab494d1aa 100644 --- a/keyboards/ergodox_ez/shine/rules.mk +++ b/keyboards/ergodox_ez/shine/rules.mk @@ -1,2 +1,3 @@ RGBLIGHT_ENABLE = yes WS2812_DRIVER_REQUIRED = yes +SRC += rgblight_custom.c diff --git a/keyboards/handwired/promethium/rgbsps.c b/keyboards/handwired/promethium/rgbsps.c index 957726e775..7dc26f4a5e 100644 --- a/keyboards/handwired/promethium/rgbsps.c +++ b/keyboards/handwired/promethium/rgbsps.c @@ -1,8 +1,15 @@ +#include "keyboard.h" #include "ws2812.h" #include "rgbsps.h" rgb_led_t led[RGBSPS_NUM]; +void keyboard_pre_init_kb(void) { + ws2812_init(); + + keyboard_pre_init_user(); +} + void rgbsps_set(uint8_t index, uint8_t r, uint8_t g, uint8_t b) { led[index].r = r; led[index].g = g; diff --git a/keyboards/ibm/model_m/mschwingen/mschwingen.c b/keyboards/ibm/model_m/mschwingen/mschwingen.c index 03dfcdc2f2..6a8a0ec8fc 100644 --- a/keyboards/ibm/model_m/mschwingen/mschwingen.c +++ b/keyboards/ibm/model_m/mschwingen/mschwingen.c @@ -90,6 +90,7 @@ void sleep_led_enable(void) { void keyboard_pre_init_kb(void) { #ifdef KEYBOARD_ibm_model_m_mschwingen_led_ws2812 + ws2812_init(); ws2812_setleds(led, RGBLIGHT_LED_COUNT); #else /* Set status LEDs pins to output and Low (on) */ diff --git a/keyboards/kprepublic/bm60hsrgb/rev2/rev2.c b/keyboards/kprepublic/bm60hsrgb/rev2/rev2.c index 3ee74755fa..5bd23a12b8 100644 --- a/keyboards/kprepublic/bm60hsrgb/rev2/rev2.c +++ b/keyboards/kprepublic/bm60hsrgb/rev2/rev2.c @@ -154,6 +154,7 @@ rgb_led_t rgb_matrix_ws2812_array[WS2812_LED_TOTAL]; static void rgb_matrix_driver_init(void) { i2c_init(); is31fl3733_init(0); + ws2812_init(); for (uint8_t index = 0; index < IS31FL3733_LED_COUNT; index++) { bool enabled = true; is31fl3733_set_led_control_register(index, enabled, enabled, enabled); diff --git a/keyboards/kprepublic/bm60hsrgb_iso/rev2/rev2.c b/keyboards/kprepublic/bm60hsrgb_iso/rev2/rev2.c index e7641bf4e5..794dea5176 100644 --- a/keyboards/kprepublic/bm60hsrgb_iso/rev2/rev2.c +++ b/keyboards/kprepublic/bm60hsrgb_iso/rev2/rev2.c @@ -154,6 +154,7 @@ rgb_led_t rgb_matrix_ws2812_array[WS2812_LED_TOTAL]; static void rgb_matrix_driver_init(void) { i2c_init(); is31fl3733_init(0); + ws2812_init(); for (uint8_t index = 0; index < IS31FL3733_LED_COUNT; index++) { bool enabled = true; is31fl3733_set_led_control_register(index, enabled, enabled, enabled); diff --git a/keyboards/kprepublic/bm60hsrgb_poker/rev2/rev2.c b/keyboards/kprepublic/bm60hsrgb_poker/rev2/rev2.c index 5cb6d850c9..3586dc8e80 100644 --- a/keyboards/kprepublic/bm60hsrgb_poker/rev2/rev2.c +++ b/keyboards/kprepublic/bm60hsrgb_poker/rev2/rev2.c @@ -150,6 +150,7 @@ rgb_led_t rgb_matrix_ws2812_array[WS2812_LED_TOTAL]; static void rgb_matrix_driver_init(void) { i2c_init(); is31fl3733_init(0); + ws2812_init(); for (uint8_t index = 0; index < IS31FL3733_LED_COUNT; index++) { bool enabled = true; is31fl3733_set_led_control_register(index, enabled, enabled, enabled); diff --git a/keyboards/matrix/abelx/abelx.c b/keyboards/matrix/abelx/abelx.c index 0a3071a402..ee7ffde134 100644 --- a/keyboards/matrix/abelx/abelx.c +++ b/keyboards/matrix/abelx/abelx.c @@ -79,6 +79,7 @@ void setleds_custom(rgb_led_t *start_led, uint16_t num_leds) } const rgblight_driver_t rgblight_driver = { + .init = ws2812_init, .setleds = setleds_custom, }; diff --git a/keyboards/matrix/noah/noah.c b/keyboards/matrix/noah/noah.c index b5c52f9952..a01d1b11bc 100644 --- a/keyboards/matrix/noah/noah.c +++ b/keyboards/matrix/noah/noah.c @@ -55,6 +55,7 @@ void setleds_custom(rgb_led_t *ledarray, uint16_t num_leds) { } const rgblight_driver_t rgblight_driver = { + .init = ws2812_init, .setleds = setleds_custom, }; #endif diff --git a/keyboards/neson_design/700e/700e.c b/keyboards/neson_design/700e/700e.c index 31f88a71f9..a9bcbee288 100644 --- a/keyboards/neson_design/700e/700e.c +++ b/keyboards/neson_design/700e/700e.c @@ -355,6 +355,7 @@ void setleds_custom(rgb_led_t *start_led, uint16_t num_leds) } const rgblight_driver_t rgblight_driver = { + .init = ws2812_init, .setleds = setleds_custom, }; diff --git a/keyboards/neson_design/n6/n6.c b/keyboards/neson_design/n6/n6.c index b878b9368d..f257735acc 100644 --- a/keyboards/neson_design/n6/n6.c +++ b/keyboards/neson_design/n6/n6.c @@ -350,6 +350,7 @@ void setleds_custom(rgb_led_t *start_led, uint16_t num_leds) } const rgblight_driver_t rgblight_driver = { + .init = ws2812_init, .setleds = setleds_custom, }; diff --git a/keyboards/neson_design/nico/nico.c b/keyboards/neson_design/nico/nico.c index bf8eeb87dd..0738a3ee98 100644 --- a/keyboards/neson_design/nico/nico.c +++ b/keyboards/neson_design/nico/nico.c @@ -84,6 +84,7 @@ void setleds_custom(rgb_led_t *start_led, uint16_t num_leds) } const rgblight_driver_t rgblight_driver = { + .init = ws2812_init, .setleds = setleds_custom, }; #endif \ No newline at end of file diff --git a/keyboards/oddforge/vea/ws2812_custom.c b/keyboards/oddforge/vea/ws2812_custom.c index f52c8d06a8..a037b88b3e 100644 --- a/keyboards/oddforge/vea/ws2812_custom.c +++ b/keyboards/oddforge/vea/ws2812_custom.c @@ -23,12 +23,6 @@ void ws2812_init(void) { // Setleds for standard RGB void ws2812_setleds(rgb_led_t *ledarray, uint16_t leds) { - static bool s_init = false; - if (!s_init) { - ws2812_init(); - s_init = true; - } - i2c_transmit(WS2812_I2C_ADDRESS, (uint8_t *)ledarray, sizeof(rgb_led_t) * (leds >> 1), WS2812_I2C_TIMEOUT); i2c_transmit(WS2812_I2C_ADDRESS_RIGHT, (uint8_t *)ledarray+(sizeof(rgb_led_t) * (leds >> 1)), sizeof(rgb_led_t) * (leds - (leds >> 1)), WS2812_I2C_TIMEOUT); } diff --git a/keyboards/rgbkb/pan/pan.c b/keyboards/rgbkb/pan/pan.c index d175be3641..191ff1ac1f 100644 --- a/keyboards/rgbkb/pan/pan.c +++ b/keyboards/rgbkb/pan/pan.c @@ -24,8 +24,6 @@ // LED color buffer rgb_led_t rgb_matrix_ws2812_array[RGB_MATRIX_LED_COUNT]; -static void init(void) {} - static void flush(void) { ws2812_setleds(rgb_matrix_ws2812_array, RGB_MATRIX_LED_COUNT); } @@ -56,7 +54,7 @@ static void setled_all(uint8_t r, uint8_t g, uint8_t b) { } const rgb_matrix_driver_t rgb_matrix_driver = { - .init = init, + .init = ws2812_init, .flush = flush, .set_color = setled, .set_color_all = setled_all, diff --git a/keyboards/wilba_tech/wt_rgb_backlight.c b/keyboards/wilba_tech/wt_rgb_backlight.c index cf36288705..d03d189b29 100644 --- a/keyboards/wilba_tech/wt_rgb_backlight.c +++ b/keyboards/wilba_tech/wt_rgb_backlight.c @@ -2237,6 +2237,9 @@ void backlight_init_drivers(void) is31fl3733_update_led_control_registers( 0 ); is31fl3733_update_led_control_registers( 1 ); #else +#if defined(RGB_BACKLIGHT_DAWN60) + ws2812_init(); +#endif // Init the #1 driver is31fl3731_init( 0 ); // Init the #2 driver (if used) diff --git a/keyboards/work_louder/rgb_functions.c b/keyboards/work_louder/rgb_functions.c index 9b39555971..36f9da013e 100644 --- a/keyboards/work_louder/rgb_functions.c +++ b/keyboards/work_louder/rgb_functions.c @@ -20,11 +20,13 @@ #undef WS2812_DI_PIN #define WS2812_DI_PIN RGBLIGHT_DI_PIN +#define ws2812_init ws2812_rgb_init #define ws2812_setleds ws2812_rgb_setleds #include "ws2812_bitbang.c" const rgblight_driver_t rgblight_driver = { + .init = ws2812_init, .setleds = ws2812_setleds, }; #endif diff --git a/keyboards/xelus/dawn60/rev1_qmk/rev1_qmk.c b/keyboards/xelus/dawn60/rev1_qmk/rev1_qmk.c index 6b8f91bc2f..a153a7cf83 100644 --- a/keyboards/xelus/dawn60/rev1_qmk/rev1_qmk.c +++ b/keyboards/xelus/dawn60/rev1_qmk/rev1_qmk.c @@ -155,7 +155,7 @@ static void init(void) { is31fl3731_update_led_control_registers(1); //RGB Underglow ws2812 - + ws2812_init(); } static void flush(void) { diff --git a/keyboards/xiudi/xd002/keymaps/multilayer_rgb/keymap.c b/keyboards/xiudi/xd002/keymaps/multilayer_rgb/keymap.c index 4ae28fd91b..d74678d76a 100644 --- a/keyboards/xiudi/xd002/keymaps/multilayer_rgb/keymap.c +++ b/keyboards/xiudi/xd002/keymaps/multilayer_rgb/keymap.c @@ -169,5 +169,6 @@ layer_state_t layer_state_set_user(layer_state_t state) { // default color void keyboard_post_init_user(void) { + rgblite_init(); rgblite_setrgb(RGB_GREEN); } diff --git a/keyboards/xiudi/xd002/keymaps/multilayer_rgb/rgblite.h b/keyboards/xiudi/xd002/keymaps/multilayer_rgb/rgblite.h index 1fa6f899b9..103b228d33 100644 --- a/keyboards/xiudi/xd002/keymaps/multilayer_rgb/rgblite.h +++ b/keyboards/xiudi/xd002/keymaps/multilayer_rgb/rgblite.h @@ -3,7 +3,11 @@ #include "ws2812.h" #include "color.h" +static inline void rgblite_init(void) { + ws2812_init(); +} + static inline void rgblite_setrgb(uint8_t _r, uint8_t _g, uint8_t _b) { - rgb_led_t leds[RGBLED_NUM] = {{.r = _r, .g = _g, .b = _b}, {.r = _r, .g = _g, .b = _b}}; - ws2812_setleds(leds, RGBLED_NUM); + rgb_led_t leds[RGBLIGHT_LED_COUNT] = {{.r = _r, .g = _g, .b = _b}, {.r = _r, .g = _g, .b = _b}}; + ws2812_setleds(leds, RGBLIGHT_LED_COUNT); } diff --git a/keyboards/xiudi/xd002/keymaps/rgb_lite/keymap.c b/keyboards/xiudi/xd002/keymaps/rgb_lite/keymap.c index a795ca8a6d..aac4dc6fde 100644 --- a/keyboards/xiudi/xd002/keymaps/rgb_lite/keymap.c +++ b/keyboards/xiudi/xd002/keymaps/rgb_lite/keymap.c @@ -27,5 +27,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } void keyboard_post_init_user(void) { + rgblite_init(); rgblite_increase_hue(); } diff --git a/keyboards/xiudi/xd002/keymaps/rgb_lite/rgblite.h b/keyboards/xiudi/xd002/keymaps/rgb_lite/rgblite.h index 15ee0c0f6b..0bb0582415 100644 --- a/keyboards/xiudi/xd002/keymaps/rgb_lite/rgblite.h +++ b/keyboards/xiudi/xd002/keymaps/rgb_lite/rgblite.h @@ -3,9 +3,13 @@ #include "ws2812.h" #include "color.h" +static inline void rgblite_init(void) { + ws2812_init(); +} + static inline void rgblite_setrgb(uint8_t _r, uint8_t _g, uint8_t _b) { - rgb_led_t leds[RGBLED_NUM] = {{.r = _r, .g = _g, .b = _b}, {.r = _r, .g = _g, .b = _b}}; - ws2812_setleds(leds, RGBLED_NUM); + rgb_led_t leds[RGBLIGHT_LED_COUNT] = {{.r = _r, .g = _g, .b = _b}, {.r = _r, .g = _g, .b = _b}}; + ws2812_setleds(leds, RGBLIGHT_LED_COUNT); } static void rgblite_increase_hue(void) { diff --git a/platforms/avr/drivers/ws2812_bitbang.c b/platforms/avr/drivers/ws2812_bitbang.c index 116053591f..be127e501c 100644 --- a/platforms/avr/drivers/ws2812_bitbang.c +++ b/platforms/avr/drivers/ws2812_bitbang.c @@ -37,9 +37,11 @@ static inline void ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t masklo, uint8_t maskhi); -void ws2812_setleds(rgb_led_t *ledarray, uint16_t number_of_leds) { +void ws2812_init(void) { DDRx_ADDRESS(WS2812_DI_PIN) |= pinmask(WS2812_DI_PIN); +} +void ws2812_setleds(rgb_led_t *ledarray, uint16_t number_of_leds) { uint8_t masklo = ~(pinmask(WS2812_DI_PIN)) & PORTx_ADDRESS(WS2812_DI_PIN); uint8_t maskhi = pinmask(WS2812_DI_PIN) | PORTx_ADDRESS(WS2812_DI_PIN); diff --git a/platforms/avr/drivers/ws2812_i2c.c b/platforms/avr/drivers/ws2812_i2c.c index f52a037b8e..60b466c32a 100644 --- a/platforms/avr/drivers/ws2812_i2c.c +++ b/platforms/avr/drivers/ws2812_i2c.c @@ -19,11 +19,5 @@ void ws2812_init(void) { // Setleds for standard RGB void ws2812_setleds(rgb_led_t *ledarray, uint16_t leds) { - static bool s_init = false; - if (!s_init) { - ws2812_init(); - s_init = true; - } - i2c_transmit(WS2812_I2C_ADDRESS, (uint8_t *)ledarray, sizeof(rgb_led_t) * leds, WS2812_I2C_TIMEOUT); } diff --git a/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c b/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c index 799d96b3c6..95a827e4b8 100644 --- a/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c +++ b/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c @@ -177,7 +177,7 @@ static void ws2812_dma_callback(void* p, uint32_t ct) { osalSysUnlockFromISR(); } -bool ws2812_init(void) { +void ws2812_init(void) { uint pio_idx = pio_get_index(pio); /* Get PIOx peripheral out of reset state. */ hal_lld_peripheral_unreset(pio_idx == 0 ? RESETS_ALLREG_PIO0 : RESETS_ALLREG_PIO1); @@ -196,7 +196,7 @@ bool ws2812_init(void) { STATE_MACHINE = pio_claim_unused_sm(pio, true); if (STATE_MACHINE < 0) { dprintln("ERROR: Failed to acquire state machine for WS2812 output!"); - return false; + return; } uint offset = pio_add_program(pio, &ws2812_program); @@ -246,8 +246,6 @@ bool ws2812_init(void) { DMA_CTRL_TRIG_TREQ_SEL(pio == pio0 ? STATE_MACHINE : STATE_MACHINE + 8) | DMA_CTRL_TRIG_PRIORITY(RP_DMA_PRIORITY_WS2812); // clang-format on - - return true; } static inline void sync_ws2812_transfer(void) { @@ -269,11 +267,6 @@ static inline void sync_ws2812_transfer(void) { } void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { - static bool is_initialized = false; - if (unlikely(!is_initialized)) { - is_initialized = ws2812_init(); - } - sync_ws2812_transfer(); for (int i = 0; i < leds; i++) { diff --git a/platforms/chibios/drivers/ws2812_bitbang.c b/platforms/chibios/drivers/ws2812_bitbang.c index 1ed87c4381..9ed6bacd5a 100644 --- a/platforms/chibios/drivers/ws2812_bitbang.c +++ b/platforms/chibios/drivers/ws2812_bitbang.c @@ -82,12 +82,6 @@ void ws2812_init(void) { // Setleds for standard RGB void ws2812_setleds(rgb_led_t *ledarray, uint16_t leds) { - static bool s_init = false; - if (!s_init) { - ws2812_init(); - s_init = true; - } - // this code is very time dependent, so we need to disable interrupts chSysLock(); diff --git a/platforms/chibios/drivers/ws2812_pwm.c b/platforms/chibios/drivers/ws2812_pwm.c index e0b3bfd5b5..7dc3414ead 100644 --- a/platforms/chibios/drivers/ws2812_pwm.c +++ b/platforms/chibios/drivers/ws2812_pwm.c @@ -389,12 +389,6 @@ void ws2812_write_led_rgbw(uint16_t led_number, uint8_t r, uint8_t g, uint8_t b, // Setleds for standard RGB void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { - static bool s_init = false; - if (!s_init) { - ws2812_init(); - s_init = true; - } - for (uint16_t i = 0; i < leds; i++) { #ifdef RGBW ws2812_write_led_rgbw(i, ledarray[i].r, ledarray[i].g, ledarray[i].b, ledarray[i].w); diff --git a/platforms/chibios/drivers/ws2812_spi.c b/platforms/chibios/drivers/ws2812_spi.c index 01162f07f4..5b990ccaa0 100644 --- a/platforms/chibios/drivers/ws2812_spi.c +++ b/platforms/chibios/drivers/ws2812_spi.c @@ -188,12 +188,6 @@ void ws2812_init(void) { } void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { - static bool s_init = false; - if (!s_init) { - ws2812_init(); - s_init = true; - } - for (uint8_t i = 0; i < leds; i++) { set_led_color_rgb(ledarray[i], i); } diff --git a/quantum/rgb_matrix/rgb_matrix_drivers.c b/quantum/rgb_matrix/rgb_matrix_drivers.c index 729dcdb439..4370996d0e 100644 --- a/quantum/rgb_matrix/rgb_matrix_drivers.c +++ b/quantum/rgb_matrix/rgb_matrix_drivers.c @@ -151,6 +151,7 @@ rgb_led_t rgb_matrix_ws2812_array[WS2812_LED_COUNT]; bool ws2812_dirty = false; static void init(void) { + ws2812_init(); ws2812_dirty = false; } diff --git a/quantum/rgblight/rgblight.c b/quantum/rgblight/rgblight.c index 530cb04688..28b58feea6 100644 --- a/quantum/rgblight/rgblight.c +++ b/quantum/rgblight/rgblight.c @@ -247,6 +247,8 @@ void rgblight_init(void) { rgblight_mode_noeeprom(rgblight_config.mode); } + rgblight_driver.init(); + is_rgblight_initialized = true; } diff --git a/quantum/rgblight/rgblight_drivers.c b/quantum/rgblight/rgblight_drivers.c index 45b60e1a5f..8902b8f842 100644 --- a/quantum/rgblight/rgblight_drivers.c +++ b/quantum/rgblight/rgblight_drivers.c @@ -7,6 +7,7 @@ # include "ws2812.h" const rgblight_driver_t rgblight_driver = { + .init = ws2812_init, .setleds = ws2812_setleds, }; @@ -14,6 +15,7 @@ const rgblight_driver_t rgblight_driver = { # include "apa102.h" const rgblight_driver_t rgblight_driver = { + .init = apa102_init, .setleds = apa102_setleds, }; diff --git a/quantum/rgblight/rgblight_drivers.h b/quantum/rgblight/rgblight_drivers.h index f7125a6f3d..af28b918e1 100644 --- a/quantum/rgblight/rgblight_drivers.h +++ b/quantum/rgblight/rgblight_drivers.h @@ -7,6 +7,7 @@ #include "color.h" typedef struct { + void (*init)(void); void (*setleds)(rgb_led_t *ledarray, uint16_t number_of_leds); } rgblight_driver_t; -- cgit v1.2.3 From d0cf7b85192ce4431bb4c8c57e2d7501df83ac43 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 30 Mar 2024 03:57:21 +1100 Subject: Update GPIO expander API naming (#23375) --- drivers/gpio/mcp23018.c | 8 ++++---- drivers/gpio/mcp23018.h | 9 +++++++-- drivers/gpio/pca9505.c | 4 ++-- drivers/gpio/pca9505.h | 6 +++++- drivers/gpio/pca9555.c | 8 ++++---- drivers/gpio/pca9555.h | 9 +++++++-- keyboards/geistmaschine/macropod/matrix.c | 2 +- keyboards/ktec/ergodone/matrix.c | 2 +- keyboards/mechwild/sugarglider/matrix.c | 2 +- keyboards/moon/matrix.c | 4 ++-- keyboards/switchplate/southpaw_65/matrix.c | 6 +++--- keyboards/viktus/sp111/matrix.c | 2 +- keyboards/xiudi/xd84/matrix.c | 6 +++--- keyboards/xiudi/xd96/matrix.c | 6 +++--- 14 files changed, 44 insertions(+), 30 deletions(-) (limited to 'drivers') diff --git a/drivers/gpio/mcp23018.c b/drivers/gpio/mcp23018.c index 3eca4f9d34..0791db08dd 100644 --- a/drivers/gpio/mcp23018.c +++ b/drivers/gpio/mcp23018.c @@ -74,20 +74,20 @@ bool mcp23018_set_output_all(uint8_t slave_addr, uint8_t confA, uint8_t confB) { return true; } -bool mcp23018_readPins(uint8_t slave_addr, mcp23018_port_t port, uint8_t* out) { +bool mcp23018_read_pins(uint8_t slave_addr, mcp23018_port_t port, uint8_t* out) { uint8_t addr = SLAVE_TO_ADDR(slave_addr); uint8_t cmd = port ? CMD_GPIOB : CMD_GPIOA; i2c_status_t ret = i2c_read_register(addr, cmd, out, sizeof(uint8_t), TIMEOUT); if (ret != I2C_STATUS_SUCCESS) { - dprintf("mcp23018_readPins::FAILED::%u\n", ret); + dprintf("mcp23018_read_pins::FAILED::%u\n", ret); return false; } return true; } -bool mcp23018_readPins_all(uint8_t slave_addr, uint16_t* out) { +bool mcp23018_read_pins_all(uint8_t slave_addr, uint16_t* out) { uint8_t addr = SLAVE_TO_ADDR(slave_addr); typedef union { @@ -99,7 +99,7 @@ bool mcp23018_readPins_all(uint8_t slave_addr, uint16_t* out) { i2c_status_t ret = i2c_read_register(addr, CMD_GPIOA, &data.u8[0], sizeof(data), TIMEOUT); if (ret != I2C_STATUS_SUCCESS) { - dprintf("mcp23018_readPins::FAILED::%u\n", ret); + dprintf("mcp23018_read_pins_all::FAILED::%u\n", ret); return false; } diff --git a/drivers/gpio/mcp23018.h b/drivers/gpio/mcp23018.h index e7c2730dd1..98c818fb8d 100644 --- a/drivers/gpio/mcp23018.h +++ b/drivers/gpio/mcp23018.h @@ -55,11 +55,16 @@ bool mcp23018_set_output_all(uint8_t slave_addr, uint8_t confA, uint8_t confB); /** * Read state of a given port */ -bool mcp23018_readPins(uint8_t slave_addr, mcp23018_port_t port, uint8_t* ret); +bool mcp23018_read_pins(uint8_t slave_addr, mcp23018_port_t port, uint8_t* ret); /** * Read state of both ports sequentially * * - slightly faster than multiple readPins */ -bool mcp23018_readPins_all(uint8_t slave_addr, uint16_t* ret); +bool mcp23018_read_pins_all(uint8_t slave_addr, uint16_t* ret); + +// DEPRECATED - DO NOT USE + +#define mcp23018_readPins mcp23018_read_pins +#define mcp23018_readPins_all mcp23018_read_pins_all diff --git a/drivers/gpio/pca9505.c b/drivers/gpio/pca9505.c index 5617a14a8b..d1adc61a23 100644 --- a/drivers/gpio/pca9505.c +++ b/drivers/gpio/pca9505.c @@ -133,7 +133,7 @@ bool pca9505_set_output(uint8_t slave_addr, pca9505_port_t port, uint8_t conf) { return true; } -bool pca9505_readPins(uint8_t slave_addr, pca9505_port_t port, uint8_t* out) { +bool pca9505_read_pins(uint8_t slave_addr, pca9505_port_t port, uint8_t* out) { uint8_t addr = SLAVE_TO_ADDR(slave_addr); uint8_t cmd = 0; switch (port) { @@ -156,7 +156,7 @@ bool pca9505_readPins(uint8_t slave_addr, pca9505_port_t port, uint8_t* out) { i2c_status_t ret = i2c_read_register(addr, cmd, out, sizeof(uint8_t), TIMEOUT); if (ret != I2C_STATUS_SUCCESS) { - print("pca9505_readPins::FAILED\n"); + print("pca9505_read_pins::FAILED\n"); return false; } diff --git a/drivers/gpio/pca9505.h b/drivers/gpio/pca9505.h index 732ddb88ea..0cec8610d9 100644 --- a/drivers/gpio/pca9505.h +++ b/drivers/gpio/pca9505.h @@ -64,4 +64,8 @@ bool pca9505_set_output(uint8_t slave_addr, pca9505_port_t port, uint8_t conf); /** * Read state of a given port */ -bool pca9505_readPins(uint8_t slave_addr, pca9505_port_t port, uint8_t* ret); +bool pca9505_read_pins(uint8_t slave_addr, pca9505_port_t port, uint8_t* ret); + +// DEPRECATED - DO NOT USE + +#define pca9505_readPins pca9505_read_pins diff --git a/drivers/gpio/pca9555.c b/drivers/gpio/pca9555.c index 0fc30099ac..28b74e1a70 100644 --- a/drivers/gpio/pca9555.c +++ b/drivers/gpio/pca9555.c @@ -70,20 +70,20 @@ bool pca9555_set_output_all(uint8_t slave_addr, uint8_t confA, uint8_t confB) { return true; } -bool pca9555_readPins(uint8_t slave_addr, pca9555_port_t port, uint8_t* out) { +bool pca9555_read_pins(uint8_t slave_addr, pca9555_port_t port, uint8_t* out) { uint8_t addr = SLAVE_TO_ADDR(slave_addr); uint8_t cmd = port ? CMD_INPUT_1 : CMD_INPUT_0; i2c_status_t ret = i2c_read_register(addr, cmd, out, sizeof(uint8_t), TIMEOUT); if (ret != I2C_STATUS_SUCCESS) { - print("pca9555_readPins::FAILED\n"); + print("pca9555_read_pins::FAILED\n"); return false; } return true; } -bool pca9555_readPins_all(uint8_t slave_addr, uint16_t* out) { +bool pca9555_read_pins_all(uint8_t slave_addr, uint16_t* out) { uint8_t addr = SLAVE_TO_ADDR(slave_addr); typedef union { @@ -95,7 +95,7 @@ bool pca9555_readPins_all(uint8_t slave_addr, uint16_t* out) { i2c_status_t ret = i2c_read_register(addr, CMD_INPUT_0, &data.u8[0], sizeof(data), TIMEOUT); if (ret != I2C_STATUS_SUCCESS) { - print("pca9555_readPins_all::FAILED\n"); + print("pca9555_read_pins_all::FAILED\n"); return false; } diff --git a/drivers/gpio/pca9555.h b/drivers/gpio/pca9555.h index 6362ab68ae..f089022e84 100644 --- a/drivers/gpio/pca9555.h +++ b/drivers/gpio/pca9555.h @@ -78,11 +78,16 @@ bool pca9555_set_output_all(uint8_t slave_addr, uint8_t confA, uint8_t confB); /** * Read state of a given port */ -bool pca9555_readPins(uint8_t slave_addr, pca9555_port_t port, uint8_t* ret); +bool pca9555_read_pins(uint8_t slave_addr, pca9555_port_t port, uint8_t* ret); /** * Read state of both ports sequentially * * - slightly faster than multiple readPins */ -bool pca9555_readPins_all(uint8_t slave_addr, uint16_t* ret); +bool pca9555_read_pins_all(uint8_t slave_addr, uint16_t* ret); + +// DEPRECATED - DO NOT USE + +#define pca9555_readPins pca9555_read_pins +#define pca9555_readPins_all pca9555_read_pins_all diff --git a/keyboards/geistmaschine/macropod/matrix.c b/keyboards/geistmaschine/macropod/matrix.c index 60b1dafe63..ebc10e2e5a 100644 --- a/keyboards/geistmaschine/macropod/matrix.c +++ b/keyboards/geistmaschine/macropod/matrix.c @@ -55,7 +55,7 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) { pca9555_setup(); } // Read the entire port into this byte, 1 = not pressed, 0 = pressed - bool ret = pca9555_readPins(IC1, PCA9555_PORT0, &pin_states); + bool ret = pca9555_read_pins(IC1, PCA9555_PORT0, &pin_states); // Update state if (ret) { diff --git a/keyboards/ktec/ergodone/matrix.c b/keyboards/ktec/ergodone/matrix.c index cb845db1bc..a9a517f2f1 100644 --- a/keyboards/ktec/ergodone/matrix.c +++ b/keyboards/ktec/ergodone/matrix.c @@ -49,7 +49,7 @@ static matrix_row_t expander_read_row(void) { } uint8_t ret = 0xFF; - mcp23018_errors += !mcp23018_readPins(I2C_ADDR, mcp23018_PORTA, &ret); + mcp23018_errors += !mcp23018_read_pins(I2C_ADDR, mcp23018_PORTA, &ret); ret = bitrev(~ret); ret = ((ret & 0b11111000) >> 1) | (ret & 0b00000011); diff --git a/keyboards/mechwild/sugarglider/matrix.c b/keyboards/mechwild/sugarglider/matrix.c index c76a8345d3..2fa384ed22 100644 --- a/keyboards/mechwild/sugarglider/matrix.c +++ b/keyboards/mechwild/sugarglider/matrix.c @@ -38,7 +38,7 @@ static matrix_row_t read_cols(void) { } uint8_t ret = 0xFF; // sets all to 1 - mcp23018_errors += !mcp23018_readPins(I2C_ADDR, mcp23018_PORTB, &ret); // will update with values 0 = pulled down by connection, 1 = pulled up by pullup resistors + mcp23018_errors += !mcp23018_read_pins(I2C_ADDR, mcp23018_PORTB, &ret); // will update with values 0 = pulled down by connection, 1 = pulled up by pullup resistors return (~ret) & 0b00111111; // Clears out the two row bits in the B buffer. } diff --git a/keyboards/moon/matrix.c b/keyboards/moon/matrix.c index bb46e1b576..8c9b6214db 100644 --- a/keyboards/moon/matrix.c +++ b/keyboards/moon/matrix.c @@ -145,8 +145,8 @@ static void select_row(uint8_t row) { static uint16_t read_cols(void) { uint8_t state_1 = 0; uint8_t state_2 = 0; - pca9555_readPins(IC2, PCA9555_PORT0, &state_1); - pca9555_readPins(IC2, PCA9555_PORT1, &state_2); + pca9555_read_pins(IC2, PCA9555_PORT0, &state_1); + pca9555_read_pins(IC2, PCA9555_PORT1, &state_2); uint16_t state = (((uint16_t)state_1 & PORT0_COLS_MASK) << 3) | (((uint16_t)state_2 & PORT1_COLS_MASK)); diff --git a/keyboards/switchplate/southpaw_65/matrix.c b/keyboards/switchplate/southpaw_65/matrix.c index e24dcef853..a7008e9c7d 100644 --- a/keyboards/switchplate/southpaw_65/matrix.c +++ b/keyboards/switchplate/southpaw_65/matrix.c @@ -54,9 +54,9 @@ static uint32_t read_cols(void) { uint8_t state_1 = 0; uint8_t state_2 = 0; uint8_t state_3 = 0; - pca9555_readPins(IC1, PCA9555_PORT1, &state_1); - pca9555_readPins(IC2, PCA9555_PORT0, &state_2); - pca9555_readPins(IC2, PCA9555_PORT1, &state_3); + pca9555_read_pins(IC1, PCA9555_PORT1, &state_1); + pca9555_read_pins(IC2, PCA9555_PORT0, &state_2); + pca9555_read_pins(IC2, PCA9555_PORT1, &state_3); uint32_t state = ((((uint32_t)state_3 & 0b01111111) << 12) | ((uint32_t)state_2 << 4) | (((uint32_t)state_1 & 0b11110000) >> 4)); return ~state; diff --git a/keyboards/viktus/sp111/matrix.c b/keyboards/viktus/sp111/matrix.c index 33b232dca7..a39365cef6 100644 --- a/keyboards/viktus/sp111/matrix.c +++ b/keyboards/viktus/sp111/matrix.c @@ -117,7 +117,7 @@ static void select_row_MCP23018(uint8_t row) { static uint16_t read_cols_MCP23018(void) { uint16_t tmp = 0xFFFF; - mcp23018_errors += !mcp23018_readPins_all(I2C_ADDR, &tmp); + mcp23018_errors += !mcp23018_read_pins_all(I2C_ADDR, &tmp); uint16_t state = ((tmp & 0b11111111) << 2) | ((tmp & 0b0110000000000000) >> 13); return (~state) & 0b1111111111; diff --git a/keyboards/xiudi/xd84/matrix.c b/keyboards/xiudi/xd84/matrix.c index 04128561ee..d92ac83b4a 100644 --- a/keyboards/xiudi/xd84/matrix.c +++ b/keyboards/xiudi/xd84/matrix.c @@ -51,10 +51,10 @@ static void select_row(uint8_t row) { } static uint16_t read_cols(void) { - // uint16_t state_1 = pca9555_readPins(IC2, PCA9555_PORT0); - // uint16_t state_2 = pca9555_readPins(IC2, PCA9555_PORT1); + // uint16_t state_1 = pca9555_read_pins(IC2, PCA9555_PORT0); + // uint16_t state_2 = pca9555_read_pins(IC2, PCA9555_PORT1); uint16_t state = 0; - pca9555_readPins_all(IC2, &state); + pca9555_read_pins_all(IC2, &state); // For the XD84 all cols are on the same IC and mapped sequentially // while this technically gives 16 column reads, diff --git a/keyboards/xiudi/xd96/matrix.c b/keyboards/xiudi/xd96/matrix.c index beef7fae12..641202ca2c 100644 --- a/keyboards/xiudi/xd96/matrix.c +++ b/keyboards/xiudi/xd96/matrix.c @@ -53,9 +53,9 @@ static uint32_t read_cols(void) { uint8_t state_1 = 0; uint8_t state_2 = 0; uint8_t state_3 = 0; - pca9555_readPins(IC2, PCA9555_PORT0, &state_1); - pca9555_readPins(IC2, PCA9555_PORT1, &state_2); - pca9555_readPins(IC1, PCA9555_PORT1, &state_3); + pca9555_read_pins(IC2, PCA9555_PORT0, &state_1); + pca9555_read_pins(IC2, PCA9555_PORT1, &state_2); + pca9555_read_pins(IC1, PCA9555_PORT1, &state_3); // For the XD96 the pins are mapped to port expanders as follows: // all 8 pins port 0 IC2, first 6 pins port 1 IC2, first 4 pins port 1 IC1 -- cgit v1.2.3 From a850f7d69509a99ef46dd2790c2e55171db16e7a Mon Sep 17 00:00:00 2001 From: Michael Büchler Date: Tue, 21 May 2024 01:36:48 +0200 Subject: Fix PS/2 Trackpoint mouse clicks (#22265) (#23694) --- drivers/ps2/ps2_mouse.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'drivers') diff --git a/drivers/ps2/ps2_mouse.c b/drivers/ps2/ps2_mouse.c index 88c9bdcebe..ef1a0e26f9 100644 --- a/drivers/ps2/ps2_mouse.c +++ b/drivers/ps2/ps2_mouse.c @@ -88,6 +88,8 @@ void ps2_mouse_task(void) { # endif } else { if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n"); + /* return here to avoid updating the mouse button state */ + return; } #else if (pbuf_has_data()) { @@ -99,6 +101,8 @@ void ps2_mouse_task(void) { # endif } else { if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n"); + /* return here to avoid updating the mouse button state */ + return; } #endif -- cgit v1.2.3