diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 68f9a1dd08a8..3a6f6f6579e1 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -340,7 +340,7 @@ LED_MATRIX_DRIVER := snled27351 endif LED_MATRIX_ENABLE ?= no -VALID_LED_MATRIX_TYPES := is31fl3218 is31fl3236 is31fl3729 is31fl3731 is31fl3733 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 custom +VALID_LED_MATRIX_TYPES := is31fl3218 is31fl3236 is31fl3729 is31fl3731 is31fl3733 is31fl3763 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 custom ifeq ($(strip $(LED_MATRIX_ENABLE)), yes) ifeq ($(filter $(LED_MATRIX_DRIVER),$(VALID_LED_MATRIX_TYPES)),) @@ -449,7 +449,7 @@ endif RGB_MATRIX_ENABLE ?= no -VALID_RGB_MATRIX_TYPES := aw20216s is31fl3218 is31fl3236 is31fl3729 is31fl3731 is31fl3733 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 ws2812 custom +VALID_RGB_MATRIX_TYPES := aw20216s is31fl3218 is31fl3236 is31fl3729 is31fl3731 is31fl3733 is31fl3763 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 ws2812 custom ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) ifeq ($(filter $(RGB_MATRIX_DRIVER),$(VALID_RGB_MATRIX_TYPES)),) $(call CATASTROPHIC_ERROR,Invalid RGB_MATRIX_DRIVER,RGB_MATRIX_DRIVER="$(RGB_MATRIX_DRIVER)" is not a valid matrix type) @@ -498,6 +498,12 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) SRC += is31fl3731.c endif + ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3763) + I2C_DRIVER_REQUIRED = yes + COMMON_VPATH += $(DRIVER_PATH)/led/issi + SRC += is31fl3763.c + endif + ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3733) I2C_DRIVER_REQUIRED = yes COMMON_VPATH += $(DRIVER_PATH)/led/issi diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index b699f862770b..9222cde0d16a 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -470,6 +470,7 @@ "is31fl3729", "is31fl3731", "is31fl3733", + "is31fl3763", "is31fl3736", "is31fl3737", "is31fl3741", @@ -553,6 +554,7 @@ "is31fl3729", "is31fl3731", "is31fl3733", + "is31fl3763", "is31fl3736", "is31fl3737", "is31fl3741", diff --git a/drivers/led/issi/is31fl3763.c b/drivers/led/issi/is31fl3763.c new file mode 100644 index 000000000000..11060b7e2686 --- /dev/null +++ b/drivers/led/issi/is31fl3763.c @@ -0,0 +1,295 @@ +/* Copyright 2017 Jason Williams + * Copyright 2018 Jack Humbert + * Copyright 2018 Yiancar + * Copyright 2021 Doni Crosby + * + * 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 "is31fl3763.h" +#include "i2c_master.h" +#include "gpio.h" +#include "wait.h" + + +#define ISSI_ADDR_DEFAULT 0x6C + +#define ISSI_COMMANDREGISTER 0xFE +#define ISSI_COMMANDREGISTER_WRITELOCK 0xFF +#define ISSI_INTERRUPTMASKREGISTER 0xF0 +#define ISSI_INTERRUPTSTATUSREGISTER 0xF1 + + +#define ISSI_PAGE_PWM 0x00 // PG0 +#define ISSI_PAGE_PWM_CONTROL 0x01 // PG1 + +#define ISSI_PAGE_AUTOBREATH 0x02 // PG2 +#define ISSI_PAGE_FUNCTION 0x03 // PG3 + +#define ISSI_REG_CONFIGURATION 0x00 // PG3 +#define ISSI_REG_GLOBALCURRENT 0x01 // PG3 +#define ISSI_REG_RESET 0x11 // PG3 +#define ISSI_REG_SWPULLUP 0x0F // PG3 +#define ISSI_REG_CSPULLUP 0x10 // PG3 + +#ifndef ISSI_TIMEOUT +# define ISSI_TIMEOUT 100 +#endif + +#ifndef ISSI_PERSISTENCE +# define ISSI_PERSISTENCE 0 +#endif + +#ifndef ISSI_PWM_FREQUENCY +# define ISSI_PWM_FREQUENCY 0b000 +#endif + +#ifndef ISSI_SWPULLUP +# define ISSI_SWPULLUP PUR_0R +#endif + +#ifndef ISSI_CSPULLUP +# define ISSI_CSPULLUP PUR_0R +#endif + +#ifndef ISSI_GLOBALCURRENT +# define ISSI_GLOBALCURRENT 0x80 +#endif + +const uint8_t i2c_addresses[DRIVER_COUNT] = { + DRIVER_ADDR_1,DRIVER_ADDR_2, +}; + +// Transfer buffer for TWITransmitData() +uint8_t g_twi_transfer_buffer[20]; + +// These buffers match the IS31FL3733 PWM registers. +// The control buffers match the PG0 LED On/Off registers. +// Storing them like this is optimal for I2C transfers to the registers. +// We could optimize this and take out the unused registers from these +// buffers and the transfers in is31fl3733_write_pwm_buffer() but it's +// probably not worth the extra complexity. +uint8_t g_pwm_buffer[DRIVER_COUNT][328]; +bool g_pwm_buffer_update_required[DRIVER_COUNT] = {false}; + +uint8_t g_led_control_registers[DRIVER_COUNT][24] = {0}; +bool g_led_control_registers_update_required[DRIVER_COUNT] = {false}; + + +// I2C +void is31fl3763_write_register(uint8_t index, uint8_t reg, uint8_t data) { + // If the transaction fails function returns false. +#if ISSI_PERSISTENCE > 0 + for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { + if (i2c_write_register(i2c_addresses[index] << 1, reg, &data, 1, ISSI_TIMEOUT) != 0) { + return false; + } + } +#else + i2c_write_register(i2c_addresses[index] << 1, reg, &data, 1, ISSI_TIMEOUT); +#endif +} + +uint8_t PWM_H_Tab[14][12] = +{ +//sw 1 2 3 4 5 6 7 8 9 10 11 12 + {0x01,0x02,0x04,0x05,0x07,0x08,0x0A,0x0B,0X0D,0X0E,0X10,0X11}, //CS01 | CS15 + {0X13,0X14,0X16,0X17,0X19,0X1A,0X1C,0X1D,0X1F,0X20,0X22,0X23}, //CS02 | CS16 + {0X25,0X26,0X28,0X29,0X2B,0X2C,0X2E,0X2F,0X31,0X32,0X34,0X35}, //CS03 | CS17 + {0X37,0X38,0X3A,0X3B,0X3D,0X3E,0X40,0X41,0X43,0X44,0X46,0X47}, //CS04 | CS18 + {0X49,0X4A,0X4C,0X4D,0X4F,0X50,0X52,0X53,0X55,0X56,0X58,0X59}, //CS05 + {0X5B,0X5C,0X5E,0X5F,0X61,0X62,0X64,0X65,0X67,0X68,0X6A,0X6B}, //CS06 + {0X6D,0X6E,0X70,0X71,0X73,0X74,0X76,0X77,0X79,0X7A,0X7C,0X7D}, //CS07 + {0X7F,0X80,0X82,0X83,0X85,0X86,0X88,0X89,0X8B,0X8C,0X8E,0X8F}, //CS08 + {0x91,0x92,0x94,0x95,0x97,0x98,0x9A,0x9B,0X9D,0X9E,0XA0,0XA1}, //CS09 + {0XA3,0XA4,0XA6,0XA7,0XA9,0XAA,0XAC,0XAD,0XAF,0XB0,0XB2,0XB3}, //CS10 + {0XB5,0XB6,0XB8,0XB9,0XBB,0XBC,0XBE,0XBF,0XC1,0XC2,0XC4,0XC5}, //CS11 + {0XC7,0XC8,0XCA,0XCB,0XCD,0XCE,0XD0,0XD1,0XD3,0XD4,0XD6,0XD7}, //CS12 + {0XD9,0XDA,0XDC,0XDD,0XDF,0XE0,0XE2,0XE3,0XE5,0XE6,0XE8,0XE9}, //CS13 + {0XEB,0XEC,0XEE,0XEF,0XF1,0XF2,0XF4,0XF5,0XF7,0XF8,0XFA,0XFB} //CS14 +}; + + +void is31fl3763_write_pwm_buffer(uint8_t index) { + + uint16_t addr_sart = 0; + + for (int i = 0; i < 18; i += 1) { + + if(i >= 14) { + is31fl3763_write_register(index, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5); + is31fl3763_write_register(index, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM_CONTROL); + + addr_sart = ((i-14)*18); + + i2c_write_register(i2c_addresses[index] << 1, addr_sart, &g_pwm_buffer[index][(addr_sart | 0X100)], 18, ISSI_TIMEOUT); + + } else { + is31fl3763_write_register(index, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5); + is31fl3763_write_register(index, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM); + + addr_sart = (i*18); + + i2c_write_register(i2c_addresses[index] << 1, addr_sart, &g_pwm_buffer[index][(addr_sart)], 18, ISSI_TIMEOUT); + } + } + + is31fl3763_write_register(index, 0xFD, 0x00); +} + + + +void is31fl3763_init_drivers(void) { + i2c_init(); + + for (uint8_t i = 0; i < DRIVER_COUNT; i++) { + is31fl3763_init(i); + } + + for (int i = 0; i < DRIVER_COUNT; i++) { + is31fl3763_set_led_control_register(i, true, true, true); + } + + for (uint8_t i = 0; i < DRIVER_COUNT; i++) { + is31fl3763_update_led_control_registers(i); + } +} + +void is31fl3763_init(uint8_t index) { + + uint8_t i, j; + + // Unlock the command register. + is31fl3763_write_register(index, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5); + is31fl3763_write_register(index, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM); + + // Turn off all LEDs. + for(i = 0;i < 14;i++) { + for(j = 0;j < 12; j++) { + is31fl3763_write_register(index, PWM_H_Tab[i][j], 0X00); + } + } + + // Unlock the command register. + is31fl3763_write_register(index, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5); + is31fl3763_write_register(index, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM_CONTROL); + + // Turn off all LEDs. + for(i = 0;i < 4;i++) { + for(j = 0;j < 12; j++) { + is31fl3763_write_register(index, PWM_H_Tab[i][j], 0X00); + } + } + + // Unlock the command register. + is31fl3763_write_register(index, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5); + // Select PG1 + is31fl3763_write_register(index, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM_CONTROL); + // Set de-ghost pull-up resistors (SWx)(CSx) + is31fl3763_write_register(index, 0x62, 0x66); // + // Set global current to maximum. + is31fl3763_write_register(index, 0x61, ISSI_GLOBALCURRENT); + // Disable software shutdown. + is31fl3763_write_register(index, 0x60,0x09); + + is31fl3763_write_register(index, 0x63, 0x00); + + uint8_t SL_Set; + for(SL_Set = 0x49;SL_Set <= 0x5A;SL_Set++) { + is31fl3763_write_register(index, SL_Set, 0x80); + } + is31fl3763_write_register(index, 0xFD, 0x00); //update + + // Wait 10ms to ensure the device has woken up. + wait_ms(10); +} + +void is31fl3763_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) { + is31_led led; + if (index >= 0 && index < RGB_MATRIX_LED_COUNT) { + memcpy_P(&led, (&g_is31_leds[index]), sizeof(led)); + + g_pwm_buffer[led.driver][led.r] = red; + g_pwm_buffer[led.driver][led.g] = green; + g_pwm_buffer[led.driver][led.b] = blue; + g_pwm_buffer_update_required[led.driver] = true; + } +} + +void is31fl3763_set_color_all(uint8_t red, uint8_t green, uint8_t blue) { + for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) { + is31fl3763_set_color(i, red, green, blue); + } +} + +void is31fl3763_set_led_control_register(uint8_t index, bool red, bool green, bool blue) { + is31_led led; + memcpy_P(&led, (&g_is31_leds[index]), sizeof(led)); + + uint8_t control_register_r = led.r / 8; + uint8_t control_register_g = led.g / 8; + uint8_t control_register_b = led.b / 8; + uint8_t bit_r = led.r % 8; + uint8_t bit_g = led.g % 8; + uint8_t bit_b = led.b % 8; + + if (red) { + g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r); + } else { + g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r); + } + if (green) { + g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g); + } else { + g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g); + } + if (blue) { + g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b); + } else { + g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b); + } + + g_led_control_registers_update_required[led.driver] = true; +} + +void is31fl3763_update_pwm_buffers(uint8_t index) { + if (g_pwm_buffer_update_required[index]) { + // Firstly we need to unlock the command register and select PG1. + is31fl3763_write_register(index, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5); + is31fl3763_write_register(index, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM); + + is31fl3763_write_pwm_buffer(index); + + g_pwm_buffer_update_required[index] = false; + } +} + + +void is31fl3763_update_led_control_registers(uint8_t index) { + if (g_led_control_registers_update_required[index]) { + // Firstly we need to unlock the command register and select PG0 + is31fl3763_write_register(index, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5); + is31fl3763_write_register(index, ISSI_COMMANDREGISTER, 0x01); + for (int i = 0; i < 24; i++) { + is31fl3763_write_register(index, i, g_led_control_registers[index][i]); + } + } + g_led_control_registers_update_required[index] = false; +} + +void is31fl3763_flush(void) { + for (uint8_t i = 0; i < DRIVER_COUNT; i++) { + is31fl3763_update_pwm_buffers(i); + } +} diff --git a/drivers/led/issi/is31fl3763.h b/drivers/led/issi/is31fl3763.h new file mode 100644 index 000000000000..5c7a3c1c8898 --- /dev/null +++ b/drivers/led/issi/is31fl3763.h @@ -0,0 +1,305 @@ +/* Copyright 2017 Jason Williams + * Copyright 2018 Jack Humbert + * Copyright 2018 Yiancar + * Copyright 2021 Doni Crosby + * + * 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 . + */ + +#pragma once + +#include +#include +#include "progmem.h" +#include "util.h" + +typedef struct is31_led { + uint8_t driver; + uint16_t r; + uint16_t g; + uint16_t b; +} __attribute__((packed)) is31_led; + +extern const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT]; + +void is31fl3763_init_drivers(void); +void is31fl3763_init(uint8_t index); +void is31fl3763_write_register(uint8_t index, uint8_t reg, uint8_t data); +void is31fl3763_select_page(uint8_t index, uint8_t page); + +void is31fl3763_set_color(int index, uint8_t red, uint8_t green, uint8_t blue); +void is31fl3763_set_color_all(uint8_t red, uint8_t green, uint8_t blue); + +void is31fl3763_set_led_control_register(uint8_t index, bool red, bool green, bool blue); + +// This should not be called from an interrupt +// (eg. from a timer interrupt). +// Call this while idle (in between matrix scans). +// If the buffer is dirty, it will update the driver with the buffer. +void is31fl3763_update_pwm_buffers(uint8_t index); +void is31fl3763_update_led_control_registers(uint8_t index); + +void is31fl3763_flush(void); + + +#define PUR_0R 0x00 // No PUR resistor +#define PUR_05KR 0x02 // 0.5k Ohm resistor in t_NOL +#define PUR_3KR 0x03 // 3.0k Ohm resistor on all the time +#define PUR_4KR 0x04 // 4.0k Ohm resistor on all the time +#define PUR_8KR 0x05 // 8.0k Ohm resistor on all the time +#define PUR_16KR 0x06 // 16k Ohm resistor on all the time +#define PUR_32KR 0x07 // 32k Ohm resistor in t_NOL + +//SW1 +#define A_1 0x01 +#define B_1 0x13 +#define C_1 0x25 +#define D_1 0x37 +#define E_1 0x49 +#define F_1 0x5B +#define G_1 0x6D +#define H_1 0x7F +#define I_1 0x91 +#define J_1 0xA3 +#define K_1 0xB5 +#define L_1 0xC7 +#define M_1 0xD9 +#define N_1 0xEB +#define O_1 0x101 +#define P_1 0x113 +#define Q_1 0x125 +#define R_1 0x137 + +//SW2 +#define A_2 0x02 +#define C_2 0x26 +#define F_2 0x5C +#define I_2 0x92 +#define L_2 0xC8 +#define B_2 0x14 +#define E_2 0x4A +#define H_2 0x80 +#define K_2 0xB6 +#define N_2 0xEC +#define D_2 0x38 +#define G_2 0x6E +#define J_2 0xA4 +#define M_2 0xDA +#define O_2 0x102 +#define P_2 0x114 +#define Q_2 0x126 +#define R_2 0x138 + +//SW3 +#define C_3 0x28 +#define F_3 0x5E +#define I_3 0x94 +#define L_3 0xCA +#define B_3 0x16 +#define E_3 0x4C +#define H_3 0x82 +#define K_3 0xB8 +#define N_3 0xEE +#define A_3 0x04 +#define D_3 0x3A +#define G_3 0x70 +#define J_3 0xA6 +#define M_3 0xDC +#define O_3 0x104 +#define P_3 0x116 +#define Q_3 0x128 +#define R_3 0x13A + +//SW4 +#define C_4 0x29 +#define F_4 0x5F +#define I_4 0x95 +#define L_4 0xCB +#define B_4 0x17 +#define E_4 0x4D +#define H_4 0x83 +#define K_4 0xB9 +#define N_4 0xEF +#define A_4 0x05 +#define D_4 0x3B +#define G_4 0x71 +#define J_4 0xA7 +#define M_4 0xDD +#define O_4 0x105 +#define P_4 0x117 +#define Q_4 0x129 +#define R_4 0x13B + +//SW5 +#define C_5 0x2B +#define F_5 0x61 +#define I_5 0x97 +#define L_5 0xCD +#define B_5 0x19 +#define E_5 0x4F +#define H_5 0x85 +#define K_5 0xBB +#define N_5 0xF1 +#define A_5 0x07 +#define D_5 0x3D +#define G_5 0x73 +#define J_5 0xA9 +#define M_5 0xDF +#define O_5 0x107 +#define P_5 0x119 +#define Q_5 0x12B +#define R_5 0x13D + +//SW6 +#define C_6 0x2C +#define F_6 0x62 +#define I_6 0x98 +#define L_6 0xCE +#define B_6 0x1A +#define E_6 0x50 +#define H_6 0x86 +#define K_6 0xBC +#define N_6 0xF2 +#define A_6 0x08 +#define D_6 0x3E +#define G_6 0x74 +#define J_6 0xAA +#define M_6 0xE0 +#define O_6 0x108 +#define P_6 0x11A +#define Q_6 0x12C +#define R_6 0x13E + +//SW7 +#define C_7 0x2E +#define F_7 0x64 +#define I_7 0x9A +#define L_7 0xD0 +#define B_7 0x1C +#define E_7 0x52 +#define H_7 0x88 +#define K_7 0xBE +#define N_7 0xF4 +#define A_7 0x0A +#define D_7 0x40 +#define G_7 0x76 +#define J_7 0xAC +#define M_7 0xE2 +#define O_7 0x10A +#define P_7 0x11C +#define Q_7 0x12E +#define R_7 0x140 + +//SW8 +#define C_8 0x2F +#define F_8 0x65 +#define I_8 0x9B +#define L_8 0xD1 +#define B_8 0x1D +#define E_8 0x53 +#define H_8 0x89 +#define K_8 0xBF +#define N_8 0xF5 +#define A_8 0x0B +#define D_8 0x41 +#define G_8 0x77 +#define J_8 0xAD +#define M_8 0xE3 +#define O_8 0x10B +#define P_8 0x11D +#define Q_8 0x12F +#define R_8 0x141 + +//SW9 +#define C_9 0x31 +#define F_9 0x67 +#define I_9 0x9D +#define L_9 0xD3 +#define B_9 0x1F +#define E_9 0x55 +#define H_9 0x8B +#define K_9 0xC1 +#define N_9 0xF7 +#define A_9 0x0D +#define D_9 0x43 +#define G_9 0x79 +#define J_9 0xAF +#define M_9 0xE5 +#define O_9 0x10D +#define P_9 0x11F +#define Q_9 0x131 +#define R_9 0x143 + +//SW10 +#define C_10 0x32 +#define F_10 0x68 +#define I_10 0x9E +#define L_10 0xD4 +#define B_10 0x20 +#define E_10 0x56 +#define H_10 0x8C +#define K_10 0xC2 +#define N_10 0xF8 +#define A_10 0x0E +#define D_10 0x44 +#define G_10 0x7A +#define J_10 0xB0 +#define M_10 0xE6 +#define O_10 0x10E +#define P_10 0x120 +#define Q_10 0x132 +#define R_10 0x144 + +//SW11 +#define C_11 0x34 +#define F_11 0x6A +#define I_11 0xA0 +#define L_11 0xD6 +#define B_11 0x22 +#define E_11 0x58 +#define H_11 0x8E +#define K_11 0xC4 +#define N_11 0xFA +#define A_11 0x10 +#define D_11 0x46 +#define G_11 0x7C +#define J_11 0xB2 +#define M_11 0xE8 +#define O_11 0x110 +#define P_11 0x122 +#define Q_11 0x134 +#define R_11 0x146 + +//SW12 +#define C_12 0x35 +#define F_12 0x6B +#define I_12 0xA1 +#define L_12 0xD7 +#define B_12 0x23 +#define E_12 0x59 +#define H_12 0x8F +#define K_12 0xC5 +#define N_12 0xFB +#define A_12 0x11 +#define D_12 0x47 +#define G_12 0x7D +#define J_12 0xB3 +#define M_12 0xE9 +#define O_12 0x111 +#define P_12 0x123 +#define Q_12 0x135 +#define R_12 0x147 + + + diff --git a/keyboards/nuphy/halo96_v2/ansi/keymaps/via/keymap.c b/keyboards/nuphy/halo96_v2/ansi/keymaps/via/keymap.c index 7291dcafcc28..33502f08d8e9 100644 --- a/keyboards/nuphy/halo96_v2/ansi/keymaps/via/keymap.c +++ b/keyboards/nuphy/halo96_v2/ansi/keymaps/via/keymap.c @@ -178,7 +178,7 @@ const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = { {0, G_3, H_3, I_3}, // 2 {0, D_3, E_3, F_3}, // 2 {0, D_2, E_2, F_2}, // 2 -= + {0, D_1, E_1, F_1}, // 3 123 {0, A_1, B_1, C_1}, // 3 {0, A_2, B_2, C_2}, // 3 diff --git a/keyboards/nuphy/halo96_v2/ansi/side.c b/keyboards/nuphy/halo96_v2/ansi/side.c index f4172cfe330d..e4f42b572b4b 100644 --- a/keyboards/nuphy/halo96_v2/ansi/side.c +++ b/keyboards/nuphy/halo96_v2/ansi/side.c @@ -993,7 +993,6 @@ void bat_percent_led(uint8_t bat_percent) } } -bool low_bat_flag = 0; /** * @brief battery state indicate */ diff --git a/quantum/rgb_matrix/rgb_matrix_drivers.c b/quantum/rgb_matrix/rgb_matrix_drivers.c index bf5209a9d322..0c13bc36a215 100644 --- a/quantum/rgb_matrix/rgb_matrix_drivers.c +++ b/quantum/rgb_matrix/rgb_matrix_drivers.c @@ -60,6 +60,14 @@ const rgb_matrix_driver_t rgb_matrix_driver = { .set_color_all = is31fl3731_set_color_all, }; +#elif defined(RGB_MATRIX_IS31FL3763) +const rgb_matrix_driver_t rgb_matrix_driver = { + .init = is31fl3763_init_drivers, + .flush = is31fl3763_flush, + .set_color = is31fl3763_set_color, + .set_color_all = is31fl3763_set_color_all, +}; + #elif defined(RGB_MATRIX_IS31FL3733) const rgb_matrix_driver_t rgb_matrix_driver = { .init = is31fl3733_init_drivers, diff --git a/quantum/rgb_matrix/rgb_matrix_drivers.h b/quantum/rgb_matrix/rgb_matrix_drivers.h index 1ea5f0817d31..7248655507e6 100644 --- a/quantum/rgb_matrix/rgb_matrix_drivers.h +++ b/quantum/rgb_matrix/rgb_matrix_drivers.h @@ -17,6 +17,8 @@ # include "is31fl3731.h" #elif defined(RGB_MATRIX_IS31FL3733) # include "is31fl3733.h" +#elif defined(RGB_MATRIX_IS31FL3763) +# include "is31fl3763.h" #elif defined(RGB_MATRIX_IS31FL3736) # include "is31fl3736.h" #elif defined(RGB_MATRIX_IS31FL3737)