RGB Matrix: driver naming cleanups (#21594)
This commit is contained in:
		
							parent
							
								
									dfb6d38f08
								
							
						
					
					
						commit
						37bc949945
					
				
					 513 changed files with 1166 additions and 1170 deletions
				
			
		| 
						 | 
				
			
			@ -71,7 +71,7 @@
 | 
			
		|||
uint8_t g_pwm_buffer[DRIVER_COUNT][AW_PWM_REGISTER_COUNT];
 | 
			
		||||
bool    g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
 | 
			
		||||
 | 
			
		||||
bool AW20216_write(pin_t cs_pin, uint8_t page, uint8_t reg, uint8_t* data, uint8_t len) {
 | 
			
		||||
bool aw20216_write(pin_t cs_pin, uint8_t page, uint8_t reg, uint8_t* data, uint8_t len) {
 | 
			
		||||
    static uint8_t s_spi_transfer_buffer[2] = {0};
 | 
			
		||||
 | 
			
		||||
    if (!spi_start(cs_pin, false, AW_SPI_MODE, AW_SPI_DIVISOR)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -96,52 +96,52 @@ bool AW20216_write(pin_t cs_pin, uint8_t page, uint8_t reg, uint8_t* data, uint8
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline bool AW20216_write_register(pin_t cs_pin, uint8_t page, uint8_t reg, uint8_t value) {
 | 
			
		||||
static inline bool aw20216_write_register(pin_t cs_pin, uint8_t page, uint8_t reg, uint8_t value) {
 | 
			
		||||
    // Little wrapper so callers need not care about sending a buffer
 | 
			
		||||
    return AW20216_write(cs_pin, page, reg, &value, 1);
 | 
			
		||||
    return aw20216_write(cs_pin, page, reg, &value, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AW20216_soft_reset(pin_t cs_pin) {
 | 
			
		||||
    AW20216_write_register(cs_pin, AW_PAGE_FUNCTION, AW_REG_RESET, AW_RESET_CMD);
 | 
			
		||||
void aw20216_soft_reset(pin_t cs_pin) {
 | 
			
		||||
    aw20216_write_register(cs_pin, AW_PAGE_FUNCTION, AW_REG_RESET, AW_RESET_CMD);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void AW20216_init_scaling(pin_t cs_pin) {
 | 
			
		||||
static void aw20216_init_scaling(pin_t cs_pin) {
 | 
			
		||||
    // Set constant current to the max, control brightness with PWM
 | 
			
		||||
    for (uint8_t i = 0; i < AW_PWM_REGISTER_COUNT; i++) {
 | 
			
		||||
        AW20216_write_register(cs_pin, AW_PAGE_SCALING, i, AW_SCALING_MAX);
 | 
			
		||||
        aw20216_write_register(cs_pin, AW_PAGE_SCALING, i, AW_SCALING_MAX);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void AW20216_init_current_limit(pin_t cs_pin) {
 | 
			
		||||
static inline void aw20216_init_current_limit(pin_t cs_pin) {
 | 
			
		||||
    // Push config
 | 
			
		||||
    AW20216_write_register(cs_pin, AW_PAGE_FUNCTION, AW_REG_GLOBALCURRENT, AW_GLOBAL_CURRENT_MAX);
 | 
			
		||||
    aw20216_write_register(cs_pin, AW_PAGE_FUNCTION, AW_REG_GLOBALCURRENT, AW_GLOBAL_CURRENT_MAX);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void AW20216_soft_enable(pin_t cs_pin) {
 | 
			
		||||
static inline void aw20216_soft_enable(pin_t cs_pin) {
 | 
			
		||||
    // Push config
 | 
			
		||||
    AW20216_write_register(cs_pin, AW_PAGE_FUNCTION, AW_REG_CONFIGURATION, AW_CONFIG_DEFAULT | AW_CHIPEN);
 | 
			
		||||
    aw20216_write_register(cs_pin, AW_PAGE_FUNCTION, AW_REG_CONFIGURATION, AW_CONFIG_DEFAULT | AW_CHIPEN);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void AW20216_auto_lowpower(pin_t cs_pin) {
 | 
			
		||||
    AW20216_write_register(cs_pin, AW_PAGE_FUNCTION, AW_REG_MIXFUNCTION, AW_MIXCR_DEFAULT | AW_LPEN);
 | 
			
		||||
static inline void aw20216_auto_lowpower(pin_t cs_pin) {
 | 
			
		||||
    aw20216_write_register(cs_pin, AW_PAGE_FUNCTION, AW_REG_MIXFUNCTION, AW_MIXCR_DEFAULT | AW_LPEN);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AW20216_init(pin_t cs_pin, pin_t en_pin) {
 | 
			
		||||
void aw20216_init(pin_t cs_pin, pin_t en_pin) {
 | 
			
		||||
    setPinOutput(en_pin);
 | 
			
		||||
    writePinHigh(en_pin);
 | 
			
		||||
 | 
			
		||||
    AW20216_soft_reset(cs_pin);
 | 
			
		||||
    aw20216_soft_reset(cs_pin);
 | 
			
		||||
    wait_ms(2);
 | 
			
		||||
 | 
			
		||||
    // Drivers should start with all scaling and PWM registers as off
 | 
			
		||||
    AW20216_init_current_limit(cs_pin);
 | 
			
		||||
    AW20216_init_scaling(cs_pin);
 | 
			
		||||
    aw20216_init_current_limit(cs_pin);
 | 
			
		||||
    aw20216_init_scaling(cs_pin);
 | 
			
		||||
 | 
			
		||||
    AW20216_soft_enable(cs_pin);
 | 
			
		||||
    AW20216_auto_lowpower(cs_pin);
 | 
			
		||||
    aw20216_soft_enable(cs_pin);
 | 
			
		||||
    aw20216_auto_lowpower(cs_pin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AW20216_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void aw20216_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    aw_led led;
 | 
			
		||||
    memcpy_P(&led, (&g_aw_leds[index]), sizeof(led));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -154,15 +154,15 @@ void AW20216_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		|||
    g_pwm_buffer_update_required[led.driver] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AW20216_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void aw20216_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    for (uint8_t i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
 | 
			
		||||
        AW20216_set_color(i, red, green, blue);
 | 
			
		||||
        aw20216_set_color(i, red, green, blue);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AW20216_update_pwm_buffers(pin_t cs_pin, uint8_t index) {
 | 
			
		||||
void aw20216_update_pwm_buffers(pin_t cs_pin, uint8_t index) {
 | 
			
		||||
    if (g_pwm_buffer_update_required[index]) {
 | 
			
		||||
        AW20216_write(cs_pin, AW_PAGE_PWM, 0, g_pwm_buffer[index], AW_PWM_REGISTER_COUNT);
 | 
			
		||||
        aw20216_write(cs_pin, AW_PAGE_PWM, 0, g_pwm_buffer[index], AW_PWM_REGISTER_COUNT);
 | 
			
		||||
    }
 | 
			
		||||
    g_pwm_buffer_update_required[index] = false;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,10 +30,10 @@ typedef struct aw_led {
 | 
			
		|||
 | 
			
		||||
extern const aw_led PROGMEM g_aw_leds[RGB_MATRIX_LED_COUNT];
 | 
			
		||||
 | 
			
		||||
void AW20216_init(pin_t cs_pin, pin_t en_pin);
 | 
			
		||||
void AW20216_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void AW20216_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void AW20216_update_pwm_buffers(pin_t cs_pin, uint8_t index);
 | 
			
		||||
void aw20216_init(pin_t cs_pin, pin_t en_pin);
 | 
			
		||||
void aw20216_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void aw20216_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void aw20216_update_pwm_buffers(pin_t cs_pin, uint8_t index);
 | 
			
		||||
 | 
			
		||||
#define CS1_SW1 0x00
 | 
			
		||||
#define CS2_SW1 0x01
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,7 +42,7 @@ uint8_t g_twi_transfer_buffer[65];
 | 
			
		|||
// 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 CKLED2001_write_pwm_buffer() but it's
 | 
			
		||||
// buffers and the transfers in ckled2001_write_pwm_buffer() but it's
 | 
			
		||||
// probably not worth the extra complexity.
 | 
			
		||||
uint8_t g_pwm_buffer[DRIVER_COUNT][192];
 | 
			
		||||
bool    g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
 | 
			
		||||
| 
						 | 
				
			
			@ -50,7 +50,7 @@ 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};
 | 
			
		||||
 | 
			
		||||
bool CKLED2001_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
bool ckled2001_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
    // If the transaction fails function returns false.
 | 
			
		||||
    g_twi_transfer_buffer[0] = reg;
 | 
			
		||||
    g_twi_transfer_buffer[1] = data;
 | 
			
		||||
| 
						 | 
				
			
			@ -69,7 +69,7 @@ bool CKLED2001_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool CKLED2001_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
bool ckled2001_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // Assumes PG1 is already selected.
 | 
			
		||||
    // If any of the transactions fails function returns false.
 | 
			
		||||
    // Transmit PWM registers in 3 transfers of 64 bytes.
 | 
			
		||||
| 
						 | 
				
			
			@ -99,53 +99,53 @@ bool CKLED2001_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CKLED2001_init(uint8_t addr) {
 | 
			
		||||
void ckled2001_init(uint8_t addr) {
 | 
			
		||||
    // Select to function page
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURE_CMD_PAGE, FUNCTION_PAGE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURE_CMD_PAGE, FUNCTION_PAGE);
 | 
			
		||||
    // Setting LED driver to shutdown mode
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURATION_REG, MSKSW_SHUT_DOWN_MODE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURATION_REG, MSKSW_SHUT_DOWN_MODE);
 | 
			
		||||
    // Setting internal channel pulldown/pullup
 | 
			
		||||
    CKLED2001_write_register(addr, PDU_REG, MSKSET_CA_CB_CHANNEL);
 | 
			
		||||
    ckled2001_write_register(addr, PDU_REG, MSKSET_CA_CB_CHANNEL);
 | 
			
		||||
    // Select number of scan phase
 | 
			
		||||
    CKLED2001_write_register(addr, SCAN_PHASE_REG, PHASE_CHANNEL);
 | 
			
		||||
    ckled2001_write_register(addr, SCAN_PHASE_REG, PHASE_CHANNEL);
 | 
			
		||||
    // Setting PWM Delay Phase
 | 
			
		||||
    CKLED2001_write_register(addr, SLEW_RATE_CONTROL_MODE1_REG, MSKPWM_DELAY_PHASE_ENABLE);
 | 
			
		||||
    ckled2001_write_register(addr, SLEW_RATE_CONTROL_MODE1_REG, MSKPWM_DELAY_PHASE_ENABLE);
 | 
			
		||||
    // Setting Driving/Sinking Channel Slew Rate
 | 
			
		||||
    CKLED2001_write_register(addr, SLEW_RATE_CONTROL_MODE2_REG, MSKDRIVING_SINKING_CHHANNEL_SLEWRATE_ENABLE);
 | 
			
		||||
    ckled2001_write_register(addr, SLEW_RATE_CONTROL_MODE2_REG, MSKDRIVING_SINKING_CHHANNEL_SLEWRATE_ENABLE);
 | 
			
		||||
    // Setting Iref
 | 
			
		||||
    CKLED2001_write_register(addr, SOFTWARE_SLEEP_REG, MSKSLEEP_DISABLE);
 | 
			
		||||
    ckled2001_write_register(addr, SOFTWARE_SLEEP_REG, MSKSLEEP_DISABLE);
 | 
			
		||||
    // Set LED CONTROL PAGE (Page 0)
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURE_CMD_PAGE, LED_CONTROL_PAGE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURE_CMD_PAGE, LED_CONTROL_PAGE);
 | 
			
		||||
    for (int i = 0; i < LED_CONTROL_ON_OFF_LENGTH; i++) {
 | 
			
		||||
        CKLED2001_write_register(addr, i, 0x00);
 | 
			
		||||
        ckled2001_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Set PWM PAGE (Page 1)
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURE_CMD_PAGE, LED_PWM_PAGE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURE_CMD_PAGE, LED_PWM_PAGE);
 | 
			
		||||
    for (int i = 0; i < LED_CURRENT_TUNE_LENGTH; i++) {
 | 
			
		||||
        CKLED2001_write_register(addr, i, 0x00);
 | 
			
		||||
        ckled2001_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Set CURRENT PAGE (Page 4)
 | 
			
		||||
    uint8_t current_tuen_reg_list[LED_CURRENT_TUNE_LENGTH] = CKLED2001_CURRENT_TUNE;
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURE_CMD_PAGE, CURRENT_TUNE_PAGE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURE_CMD_PAGE, CURRENT_TUNE_PAGE);
 | 
			
		||||
    for (int i = 0; i < LED_CURRENT_TUNE_LENGTH; i++) {
 | 
			
		||||
        CKLED2001_write_register(addr, i, current_tuen_reg_list[i]);
 | 
			
		||||
        ckled2001_write_register(addr, i, current_tuen_reg_list[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Enable LEDs ON/OFF
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURE_CMD_PAGE, LED_CONTROL_PAGE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURE_CMD_PAGE, LED_CONTROL_PAGE);
 | 
			
		||||
    for (int i = 0; i < LED_CONTROL_ON_OFF_LENGTH; i++) {
 | 
			
		||||
        CKLED2001_write_register(addr, i, 0xFF);
 | 
			
		||||
        ckled2001_write_register(addr, i, 0xFF);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Select to function page
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURE_CMD_PAGE, FUNCTION_PAGE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURE_CMD_PAGE, FUNCTION_PAGE);
 | 
			
		||||
    // Setting LED driver to normal mode
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURATION_REG, MSKSW_NORMAL_MODE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURATION_REG, MSKSW_NORMAL_MODE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CKLED2001_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void ckled2001_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    ckled2001_led led;
 | 
			
		||||
    if (index >= 0 && index < RGB_MATRIX_LED_COUNT) {
 | 
			
		||||
        memcpy_P(&led, (&g_ckled2001_leds[index]), sizeof(led));
 | 
			
		||||
| 
						 | 
				
			
			@ -160,13 +160,13 @@ void CKLED2001_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CKLED2001_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void ckled2001_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
 | 
			
		||||
        CKLED2001_set_color(i, red, green, blue);
 | 
			
		||||
        ckled2001_set_color(i, red, green, blue);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CKLED2001_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
 | 
			
		||||
void ckled2001_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
 | 
			
		||||
    ckled2001_led led;
 | 
			
		||||
    memcpy_P(&led, (&g_ckled2001_leds[index]), sizeof(led));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -196,41 +196,41 @@ void CKLED2001_set_led_control_register(uint8_t index, bool red, bool green, boo
 | 
			
		|||
    g_led_control_registers_update_required[led.driver] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CKLED2001_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
void ckled2001_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
    if (g_pwm_buffer_update_required[index]) {
 | 
			
		||||
        CKLED2001_write_register(addr, CONFIGURE_CMD_PAGE, LED_PWM_PAGE);
 | 
			
		||||
        ckled2001_write_register(addr, CONFIGURE_CMD_PAGE, LED_PWM_PAGE);
 | 
			
		||||
 | 
			
		||||
        // If any of the transactions fail we risk writing dirty PG0,
 | 
			
		||||
        // refresh page 0 just in case.
 | 
			
		||||
        if (!CKLED2001_write_pwm_buffer(addr, g_pwm_buffer[index])) {
 | 
			
		||||
        if (!ckled2001_write_pwm_buffer(addr, g_pwm_buffer[index])) {
 | 
			
		||||
            g_led_control_registers_update_required[index] = true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    g_pwm_buffer_update_required[index] = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CKLED2001_update_led_control_registers(uint8_t addr, uint8_t index) {
 | 
			
		||||
void ckled2001_update_led_control_registers(uint8_t addr, uint8_t index) {
 | 
			
		||||
    if (g_led_control_registers_update_required[index]) {
 | 
			
		||||
        CKLED2001_write_register(addr, CONFIGURE_CMD_PAGE, LED_CONTROL_PAGE);
 | 
			
		||||
        ckled2001_write_register(addr, CONFIGURE_CMD_PAGE, LED_CONTROL_PAGE);
 | 
			
		||||
        for (int i = 0; i < 24; i++) {
 | 
			
		||||
            CKLED2001_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
            ckled2001_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    g_led_control_registers_update_required[index] = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CKLED2001_sw_return_normal(uint8_t addr) {
 | 
			
		||||
void ckled2001_sw_return_normal(uint8_t addr) {
 | 
			
		||||
    // Select to function page
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURE_CMD_PAGE, FUNCTION_PAGE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURE_CMD_PAGE, FUNCTION_PAGE);
 | 
			
		||||
    // Setting LED driver to normal mode
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURATION_REG, MSKSW_NORMAL_MODE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURATION_REG, MSKSW_NORMAL_MODE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CKLED2001_sw_shutdown(uint8_t addr) {
 | 
			
		||||
void ckled2001_sw_shutdown(uint8_t addr) {
 | 
			
		||||
    // Select to function page
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURE_CMD_PAGE, FUNCTION_PAGE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURE_CMD_PAGE, FUNCTION_PAGE);
 | 
			
		||||
    // Setting LED driver to shutdown mode
 | 
			
		||||
    CKLED2001_write_register(addr, CONFIGURATION_REG, MSKSW_SHUT_DOWN_MODE);
 | 
			
		||||
    ckled2001_write_register(addr, CONFIGURATION_REG, MSKSW_SHUT_DOWN_MODE);
 | 
			
		||||
    // Write SW Sleep Register
 | 
			
		||||
    CKLED2001_write_register(addr, SOFTWARE_SLEEP_REG, MSKSLEEP_ENABLE);
 | 
			
		||||
    ckled2001_write_register(addr, SOFTWARE_SLEEP_REG, MSKSLEEP_ENABLE);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,24 +29,24 @@ typedef struct ckled2001_led {
 | 
			
		|||
 | 
			
		||||
extern const ckled2001_led PROGMEM g_ckled2001_leds[RGB_MATRIX_LED_COUNT];
 | 
			
		||||
 | 
			
		||||
void CKLED2001_init(uint8_t addr);
 | 
			
		||||
bool CKLED2001_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
bool CKLED2001_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
void ckled2001_init(uint8_t addr);
 | 
			
		||||
bool ckled2001_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
bool ckled2001_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
 | 
			
		||||
void CKLED2001_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void CKLED2001_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void ckled2001_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void ckled2001_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
 | 
			
		||||
void CKLED2001_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
 | 
			
		||||
void ckled2001_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 CKLED2001_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void CKLED2001_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
void ckled2001_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void ckled2001_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
 | 
			
		||||
void CKLED2001_sw_return_normal(uint8_t addr);
 | 
			
		||||
void CKLED2001_sw_shutdown(uint8_t addr);
 | 
			
		||||
void ckled2001_sw_return_normal(uint8_t addr);
 | 
			
		||||
void ckled2001_sw_shutdown(uint8_t addr);
 | 
			
		||||
 | 
			
		||||
// Registers Page Define
 | 
			
		||||
#define CONFIGURE_CMD_PAGE 0xFD
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,41 +37,41 @@ uint8_t g_twi_transfer_buffer[20];
 | 
			
		|||
uint8_t g_pwm_buffer[18];
 | 
			
		||||
bool    g_pwm_buffer_update_required = false;
 | 
			
		||||
 | 
			
		||||
void IS31FL3218_write_register(uint8_t reg, uint8_t data) {
 | 
			
		||||
void is31fl3218_write_register(uint8_t reg, uint8_t data) {
 | 
			
		||||
    g_twi_transfer_buffer[0] = reg;
 | 
			
		||||
    g_twi_transfer_buffer[1] = data;
 | 
			
		||||
    i2c_transmit(ISSI_ADDRESS, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3218_write_pwm_buffer(uint8_t *pwm_buffer) {
 | 
			
		||||
void is31fl3218_write_pwm_buffer(uint8_t *pwm_buffer) {
 | 
			
		||||
    g_twi_transfer_buffer[0] = ISSI_REG_PWM;
 | 
			
		||||
    memcpy(g_twi_transfer_buffer + 1, pwm_buffer, 18);
 | 
			
		||||
 | 
			
		||||
    i2c_transmit(ISSI_ADDRESS, g_twi_transfer_buffer, 19, ISSI_TIMEOUT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3218_init(void) {
 | 
			
		||||
void is31fl3218_init(void) {
 | 
			
		||||
    // In case we ever want to reinitialize (?)
 | 
			
		||||
    IS31FL3218_write_register(ISSI_REG_RESET, 0x00);
 | 
			
		||||
    is31fl3218_write_register(ISSI_REG_RESET, 0x00);
 | 
			
		||||
 | 
			
		||||
    // Turn off software shutdown
 | 
			
		||||
    IS31FL3218_write_register(ISSI_REG_SHUTDOWN, 0x01);
 | 
			
		||||
    is31fl3218_write_register(ISSI_REG_SHUTDOWN, 0x01);
 | 
			
		||||
 | 
			
		||||
    // Set all PWM values to zero
 | 
			
		||||
    for (uint8_t i = 0; i < 18; i++) {
 | 
			
		||||
        IS31FL3218_write_register(ISSI_REG_PWM + i, 0x00);
 | 
			
		||||
        is31fl3218_write_register(ISSI_REG_PWM + i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Enable all channels
 | 
			
		||||
    for (uint8_t i = 0; i < 3; i++) {
 | 
			
		||||
        IS31FL3218_write_register(ISSI_REG_CONTROL + i, 0b00111111);
 | 
			
		||||
        is31fl3218_write_register(ISSI_REG_CONTROL + i, 0b00111111);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Load PWM registers and LED Control register data
 | 
			
		||||
    IS31FL3218_write_register(ISSI_REG_UPDATE, 0x01);
 | 
			
		||||
    is31fl3218_write_register(ISSI_REG_UPDATE, 0x01);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    if (g_pwm_buffer[index * 3 + 0] == red && g_pwm_buffer[index * 3 + 1] == green && g_pwm_buffer[index * 3 + 2] == blue) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -81,17 +81,17 @@ void IS31FL3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		|||
    g_pwm_buffer_update_required = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3218_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3218_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    for (int i = 0; i < 6; i++) {
 | 
			
		||||
        IS31FL3218_set_color(i, red, green, blue);
 | 
			
		||||
        is31fl3218_set_color(i, red, green, blue);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3218_update_pwm_buffers(void) {
 | 
			
		||||
void is31fl3218_update_pwm_buffers(void) {
 | 
			
		||||
    if (g_pwm_buffer_update_required) {
 | 
			
		||||
        IS31FL3218_write_pwm_buffer(g_pwm_buffer);
 | 
			
		||||
        is31fl3218_write_pwm_buffer(g_pwm_buffer);
 | 
			
		||||
        // Load PWM registers and LED Control register data
 | 
			
		||||
        IS31FL3218_write_register(ISSI_REG_UPDATE, 0x01);
 | 
			
		||||
        is31fl3218_write_register(ISSI_REG_UPDATE, 0x01);
 | 
			
		||||
    }
 | 
			
		||||
    g_pwm_buffer_update_required = false;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@
 | 
			
		|||
#include <stdbool.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
void IS31FL3218_init(void);
 | 
			
		||||
void IS31FL3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void IS31FL3218_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void IS31FL3218_update_pwm_buffers(void);
 | 
			
		||||
void is31fl3218_init(void);
 | 
			
		||||
void is31fl3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3218_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3218_update_pwm_buffers(void);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,7 +63,7 @@ uint8_t g_twi_transfer_buffer[20];
 | 
			
		|||
// These buffers match the IS31FL3731 PWM registers 0x24-0xB3.
 | 
			
		||||
// 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 IS31FL3731_write_pwm_buffer() but it's
 | 
			
		||||
// buffers and the transfers in is31fl3731_write_pwm_buffer() but it's
 | 
			
		||||
// probably not worth the extra complexity.
 | 
			
		||||
uint8_t g_pwm_buffer[DRIVER_COUNT][144];
 | 
			
		||||
bool    g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
 | 
			
		||||
| 
						 | 
				
			
			@ -85,7 +85,7 @@ bool    g_led_control_registers_update_required[DRIVER_COUNT] = {false};
 | 
			
		|||
// 0x0E - R17,G15,G14,G13,G12,G11,G10,G09
 | 
			
		||||
// 0x10 - R16,R15,R14,R13,R12,R11,R10,R09
 | 
			
		||||
 | 
			
		||||
void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
void is31fl3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
    g_twi_transfer_buffer[0] = reg;
 | 
			
		||||
    g_twi_transfer_buffer[1] = data;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +98,7 @@ void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
void is31fl3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // assumes bank is already selected
 | 
			
		||||
 | 
			
		||||
    // transmit PWM registers in 9 transfers of 16 bytes
 | 
			
		||||
| 
						 | 
				
			
			@ -123,62 +123,62 @@ void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3731_init(uint8_t addr) {
 | 
			
		||||
void is31fl3731_init(uint8_t addr) {
 | 
			
		||||
    // In order to avoid the LEDs being driven with garbage data
 | 
			
		||||
    // in the LED driver's PWM registers, first enable software shutdown,
 | 
			
		||||
    // then set up the mode and other settings, clear the PWM registers,
 | 
			
		||||
    // then disable software shutdown.
 | 
			
		||||
 | 
			
		||||
    // select "function register" bank
 | 
			
		||||
    IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG);
 | 
			
		||||
    is31fl3731_write_register(addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG);
 | 
			
		||||
 | 
			
		||||
    // enable software shutdown
 | 
			
		||||
    IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00);
 | 
			
		||||
    is31fl3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00);
 | 
			
		||||
#ifdef ISSI_3731_DEGHOST // set to enable de-ghosting of the array
 | 
			
		||||
    IS31FL3731_write_register(addr, ISSI_REG_GHOST_IMAGE_PREVENTION, 0x10);
 | 
			
		||||
    is31fl3731_write_register(addr, ISSI_REG_GHOST_IMAGE_PREVENTION, 0x10);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // this delay was copied from other drivers, might not be needed
 | 
			
		||||
    wait_ms(10);
 | 
			
		||||
 | 
			
		||||
    // picture mode
 | 
			
		||||
    IS31FL3731_write_register(addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE);
 | 
			
		||||
    is31fl3731_write_register(addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE);
 | 
			
		||||
    // display frame 0
 | 
			
		||||
    IS31FL3731_write_register(addr, ISSI_REG_PICTUREFRAME, 0x00);
 | 
			
		||||
    is31fl3731_write_register(addr, ISSI_REG_PICTUREFRAME, 0x00);
 | 
			
		||||
    // audio sync off
 | 
			
		||||
    IS31FL3731_write_register(addr, ISSI_REG_AUDIOSYNC, 0x00);
 | 
			
		||||
    is31fl3731_write_register(addr, ISSI_REG_AUDIOSYNC, 0x00);
 | 
			
		||||
 | 
			
		||||
    // select bank 0
 | 
			
		||||
    IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
 | 
			
		||||
    is31fl3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
 | 
			
		||||
 | 
			
		||||
    // turn off all LEDs in the LED control register
 | 
			
		||||
    for (int i = 0x00; i <= 0x11; i++) {
 | 
			
		||||
        IS31FL3731_write_register(addr, i, 0x00);
 | 
			
		||||
        is31fl3731_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // turn off all LEDs in the blink control register (not really needed)
 | 
			
		||||
    for (int i = 0x12; i <= 0x23; i++) {
 | 
			
		||||
        IS31FL3731_write_register(addr, i, 0x00);
 | 
			
		||||
        is31fl3731_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // set PWM on all LEDs to 0
 | 
			
		||||
    for (int i = 0x24; i <= 0xB3; i++) {
 | 
			
		||||
        IS31FL3731_write_register(addr, i, 0x00);
 | 
			
		||||
        is31fl3731_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // select "function register" bank
 | 
			
		||||
    IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG);
 | 
			
		||||
    is31fl3731_write_register(addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG);
 | 
			
		||||
 | 
			
		||||
    // disable software shutdown
 | 
			
		||||
    IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x01);
 | 
			
		||||
    is31fl3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x01);
 | 
			
		||||
 | 
			
		||||
    // select bank 0 and leave it selected.
 | 
			
		||||
    // most usage after initialization is just writing PWM buffers in bank 0
 | 
			
		||||
    // as there's not much point in double-buffering
 | 
			
		||||
    IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
 | 
			
		||||
    is31fl3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3731_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));
 | 
			
		||||
| 
						 | 
				
			
			@ -194,13 +194,13 @@ void IS31FL3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3731_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3731_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
 | 
			
		||||
        IS31FL3731_set_color(i, red, green, blue);
 | 
			
		||||
        is31fl3731_set_color(i, red, green, blue);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3731_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
 | 
			
		||||
void is31fl3731_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));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -230,17 +230,17 @@ void IS31FL3731_set_led_control_register(uint8_t index, bool red, bool green, bo
 | 
			
		|||
    g_led_control_registers_update_required[led.driver] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3731_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
void is31fl3731_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
    if (g_pwm_buffer_update_required[index]) {
 | 
			
		||||
        IS31FL3731_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
        is31fl3731_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
    }
 | 
			
		||||
    g_pwm_buffer_update_required[index] = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index) {
 | 
			
		||||
void is31fl3731_update_led_control_registers(uint8_t addr, uint8_t index) {
 | 
			
		||||
    if (g_led_control_registers_update_required[index]) {
 | 
			
		||||
        for (int i = 0; i < 18; i++) {
 | 
			
		||||
            IS31FL3731_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
            is31fl3731_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    g_led_control_registers_update_required[index] = false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,21 +31,21 @@ typedef struct is31_led {
 | 
			
		|||
 | 
			
		||||
extern const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT];
 | 
			
		||||
 | 
			
		||||
void IS31FL3731_init(uint8_t addr);
 | 
			
		||||
void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
void is31fl3731_init(uint8_t addr);
 | 
			
		||||
void is31fl3731_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
 | 
			
		||||
void IS31FL3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void IS31FL3731_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3731_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
 | 
			
		||||
void IS31FL3731_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
 | 
			
		||||
void is31fl3731_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 IS31FL3731_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
void is31fl3731_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void is31fl3731_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
 | 
			
		||||
#define C1_1 0x24
 | 
			
		||||
#define C1_2 0x25
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -80,7 +80,7 @@ uint8_t g_twi_transfer_buffer[20];
 | 
			
		|||
// 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
 | 
			
		||||
// 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][192];
 | 
			
		||||
bool    g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
 | 
			
		||||
| 
						 | 
				
			
			@ -88,7 +88,7 @@ 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};
 | 
			
		||||
 | 
			
		||||
bool IS31FL3733_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
bool is31fl3733_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
    // If the transaction fails function returns false.
 | 
			
		||||
    g_twi_transfer_buffer[0] = reg;
 | 
			
		||||
    g_twi_transfer_buffer[1] = data;
 | 
			
		||||
| 
						 | 
				
			
			@ -107,7 +107,7 @@ bool IS31FL3733_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool IS31FL3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
bool is31fl3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // Assumes PG1 is already selected.
 | 
			
		||||
    // If any of the transactions fails function returns false.
 | 
			
		||||
    // Transmit PWM registers in 12 transfers of 16 bytes.
 | 
			
		||||
| 
						 | 
				
			
			@ -138,7 +138,7 @@ bool IS31FL3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3733_init(uint8_t addr, uint8_t sync) {
 | 
			
		||||
void is31fl3733_init(uint8_t addr, uint8_t sync) {
 | 
			
		||||
    // In order to avoid the LEDs being driven with garbage data
 | 
			
		||||
    // in the LED driver's PWM registers, shutdown is enabled last.
 | 
			
		||||
    // Set up the mode and other settings, clear the PWM registers,
 | 
			
		||||
| 
						 | 
				
			
			@ -146,45 +146,45 @@ void IS31FL3733_init(uint8_t addr, uint8_t sync) {
 | 
			
		|||
    // Sync is passed so set it according to the datasheet.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
    is31fl3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
 | 
			
		||||
    // Select PG0
 | 
			
		||||
    IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
    is31fl3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
    // Turn off all LEDs.
 | 
			
		||||
    for (int i = 0x00; i <= 0x17; i++) {
 | 
			
		||||
        IS31FL3733_write_register(addr, i, 0x00);
 | 
			
		||||
        is31fl3733_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
    is31fl3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
 | 
			
		||||
    // Select PG1
 | 
			
		||||
    IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
    is31fl3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
    // Set PWM on all LEDs to 0
 | 
			
		||||
    // No need to setup Breath registers to PWM as that is the default.
 | 
			
		||||
    for (int i = 0x00; i <= 0xBF; i++) {
 | 
			
		||||
        IS31FL3733_write_register(addr, i, 0x00);
 | 
			
		||||
        is31fl3733_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
    is31fl3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
 | 
			
		||||
    // Select PG3
 | 
			
		||||
    IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
 | 
			
		||||
    is31fl3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
 | 
			
		||||
    // Set de-ghost pull-up resistors (SWx)
 | 
			
		||||
    IS31FL3733_write_register(addr, ISSI_REG_SWPULLUP, ISSI_SWPULLUP);
 | 
			
		||||
    is31fl3733_write_register(addr, ISSI_REG_SWPULLUP, ISSI_SWPULLUP);
 | 
			
		||||
    // Set de-ghost pull-down resistors (CSx)
 | 
			
		||||
    IS31FL3733_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
 | 
			
		||||
    is31fl3733_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
 | 
			
		||||
    // Set global current to maximum.
 | 
			
		||||
    IS31FL3733_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT);
 | 
			
		||||
    is31fl3733_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT);
 | 
			
		||||
    // Disable software shutdown.
 | 
			
		||||
    IS31FL3733_write_register(addr, ISSI_REG_CONFIGURATION, ((sync & 0b11) << 6) | ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01);
 | 
			
		||||
    is31fl3733_write_register(addr, ISSI_REG_CONFIGURATION, ((sync & 0b11) << 6) | ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01);
 | 
			
		||||
 | 
			
		||||
    // Wait 10ms to ensure the device has woken up.
 | 
			
		||||
    wait_ms(10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3733_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));
 | 
			
		||||
| 
						 | 
				
			
			@ -199,13 +199,13 @@ void IS31FL3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3733_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3733_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
 | 
			
		||||
        IS31FL3733_set_color(i, red, green, blue);
 | 
			
		||||
        is31fl3733_set_color(i, red, green, blue);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3733_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
 | 
			
		||||
void is31fl3733_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));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -235,28 +235,28 @@ void IS31FL3733_set_led_control_register(uint8_t index, bool red, bool green, bo
 | 
			
		|||
    g_led_control_registers_update_required[led.driver] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
void is31fl3733_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
    if (g_pwm_buffer_update_required[index]) {
 | 
			
		||||
        // Firstly we need to unlock the command register and select PG1.
 | 
			
		||||
        IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
        is31fl3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        is31fl3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
 | 
			
		||||
        // If any of the transactions fail we risk writing dirty PG0,
 | 
			
		||||
        // refresh page 0 just in case.
 | 
			
		||||
        if (!IS31FL3733_write_pwm_buffer(addr, g_pwm_buffer[index])) {
 | 
			
		||||
        if (!is31fl3733_write_pwm_buffer(addr, g_pwm_buffer[index])) {
 | 
			
		||||
            g_led_control_registers_update_required[index] = true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    g_pwm_buffer_update_required[index] = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index) {
 | 
			
		||||
void is31fl3733_update_led_control_registers(uint8_t addr, uint8_t index) {
 | 
			
		||||
    if (g_led_control_registers_update_required[index]) {
 | 
			
		||||
        // Firstly we need to unlock the command register and select PG0
 | 
			
		||||
        IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
        is31fl3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        is31fl3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
        for (int i = 0; i < 24; i++) {
 | 
			
		||||
            IS31FL3733_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
            is31fl3733_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    g_led_control_registers_update_required[index] = false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,21 +32,21 @@ typedef struct is31_led {
 | 
			
		|||
 | 
			
		||||
extern const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT];
 | 
			
		||||
 | 
			
		||||
void IS31FL3733_init(uint8_t addr, uint8_t sync);
 | 
			
		||||
bool IS31FL3733_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
bool IS31FL3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
void is31fl3733_init(uint8_t addr, uint8_t sync);
 | 
			
		||||
bool is31fl3733_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
bool is31fl3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
 | 
			
		||||
void IS31FL3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void IS31FL3733_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3733_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
 | 
			
		||||
void IS31FL3733_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
 | 
			
		||||
void is31fl3733_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 IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
void is31fl3733_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void is31fl3733_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
 | 
			
		||||
#define PUR_0R 0x00   // No PUR resistor
 | 
			
		||||
#define PUR_05KR 0x02 // 0.5k Ohm resistor in t_NOL
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -74,7 +74,7 @@ uint8_t g_twi_transfer_buffer[20];
 | 
			
		|||
// 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 IS31FL3736_write_pwm_buffer() but it's
 | 
			
		||||
// buffers and the transfers in is31fl3736_write_pwm_buffer() but it's
 | 
			
		||||
// probably not worth the extra complexity.
 | 
			
		||||
uint8_t g_pwm_buffer[DRIVER_COUNT][192];
 | 
			
		||||
bool    g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
 | 
			
		||||
| 
						 | 
				
			
			@ -82,7 +82,7 @@ bool    g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
 | 
			
		|||
uint8_t g_led_control_registers[DRIVER_COUNT][24] = {{0}, {0}};
 | 
			
		||||
bool    g_led_control_registers_update_required   = false;
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
void is31fl3736_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
    g_twi_transfer_buffer[0] = reg;
 | 
			
		||||
    g_twi_transfer_buffer[1] = data;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -95,7 +95,7 @@ void IS31FL3736_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
void is31fl3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // assumes PG1 is already selected
 | 
			
		||||
 | 
			
		||||
    // transmit PWM registers in 12 transfers of 16 bytes
 | 
			
		||||
| 
						 | 
				
			
			@ -119,52 +119,52 @@ void IS31FL3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_init(uint8_t addr) {
 | 
			
		||||
void is31fl3736_init(uint8_t addr) {
 | 
			
		||||
    // In order to avoid the LEDs being driven with garbage data
 | 
			
		||||
    // in the LED driver's PWM registers, shutdown is enabled last.
 | 
			
		||||
    // Set up the mode and other settings, clear the PWM registers,
 | 
			
		||||
    // then disable software shutdown.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
    is31fl3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
 | 
			
		||||
    // Select PG0
 | 
			
		||||
    IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
    is31fl3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
    // Turn off all LEDs.
 | 
			
		||||
    for (int i = 0x00; i <= 0x17; i++) {
 | 
			
		||||
        IS31FL3736_write_register(addr, i, 0x00);
 | 
			
		||||
        is31fl3736_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
    is31fl3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
 | 
			
		||||
    // Select PG1
 | 
			
		||||
    IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
    is31fl3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
    // Set PWM on all LEDs to 0
 | 
			
		||||
    // No need to setup Breath registers to PWM as that is the default.
 | 
			
		||||
    for (int i = 0x00; i <= 0xBF; i++) {
 | 
			
		||||
        IS31FL3736_write_register(addr, i, 0x00);
 | 
			
		||||
        is31fl3736_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
    is31fl3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
 | 
			
		||||
    // Select PG3
 | 
			
		||||
    IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
 | 
			
		||||
    is31fl3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
 | 
			
		||||
    // Set de-ghost pull-up resistors (SWx)
 | 
			
		||||
    IS31FL3736_write_register(addr, ISSI_REG_SWPULLUP, ISSI_SWPULLUP);
 | 
			
		||||
    is31fl3736_write_register(addr, ISSI_REG_SWPULLUP, ISSI_SWPULLUP);
 | 
			
		||||
    // Set de-ghost pull-down resistors (CSx)
 | 
			
		||||
    IS31FL3736_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
 | 
			
		||||
    is31fl3736_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
 | 
			
		||||
    // Set global current to maximum.
 | 
			
		||||
    IS31FL3736_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT);
 | 
			
		||||
    is31fl3736_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT);
 | 
			
		||||
    // Disable software shutdown.
 | 
			
		||||
    IS31FL3736_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
 | 
			
		||||
    is31fl3736_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
 | 
			
		||||
 | 
			
		||||
    // Wait 10ms to ensure the device has woken up.
 | 
			
		||||
    wait_ms(10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3736_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));
 | 
			
		||||
| 
						 | 
				
			
			@ -179,13 +179,13 @@ void IS31FL3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3736_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
 | 
			
		||||
        IS31FL3736_set_color(i, red, green, blue);
 | 
			
		||||
        is31fl3736_set_color(i, red, green, blue);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
 | 
			
		||||
void is31fl3736_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));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -229,7 +229,7 @@ void IS31FL3736_set_led_control_register(uint8_t index, bool red, bool green, bo
 | 
			
		|||
    g_led_control_registers_update_required = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_mono_set_brightness(int index, uint8_t value) {
 | 
			
		||||
void is31fl3736_mono_set_brightness(int index, uint8_t value) {
 | 
			
		||||
    if (index >= 0 && index < 96) {
 | 
			
		||||
        // Index in range 0..95 -> A1..A8, B1..B8, etc.
 | 
			
		||||
        // Map index 0..95 to registers 0x00..0xBE (interleaved)
 | 
			
		||||
| 
						 | 
				
			
			@ -239,13 +239,13 @@ void IS31FL3736_mono_set_brightness(int index, uint8_t value) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_mono_set_brightness_all(uint8_t value) {
 | 
			
		||||
void is31fl3736_mono_set_brightness_all(uint8_t value) {
 | 
			
		||||
    for (int i = 0; i < 96; i++) {
 | 
			
		||||
        IS31FL3736_mono_set_brightness(i, value);
 | 
			
		||||
        is31fl3736_mono_set_brightness(i, value);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_mono_set_led_control_register(uint8_t index, bool enabled) {
 | 
			
		||||
void is31fl3736_mono_set_led_control_register(uint8_t index, bool enabled) {
 | 
			
		||||
    // Index in range 0..95 -> A1..A8, B1..B8, etc.
 | 
			
		||||
 | 
			
		||||
    // Map index 0..95 to registers 0x00..0xBE (interleaved)
 | 
			
		||||
| 
						 | 
				
			
			@ -263,25 +263,25 @@ void IS31FL3736_mono_set_led_control_register(uint8_t index, bool enabled) {
 | 
			
		|||
    g_led_control_registers_update_required = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
void is31fl3736_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
    if (g_pwm_buffer_update_required[index]) {
 | 
			
		||||
        // Firstly we need to unlock the command register and select PG1
 | 
			
		||||
        IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
        is31fl3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        is31fl3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
 | 
			
		||||
        IS31FL3736_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
        is31fl3736_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
    }
 | 
			
		||||
    g_pwm_buffer_update_required[index] = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_update_led_control_registers(uint8_t addr1, uint8_t addr2) {
 | 
			
		||||
void is31fl3736_update_led_control_registers(uint8_t addr1, uint8_t addr2) {
 | 
			
		||||
    if (g_led_control_registers_update_required) {
 | 
			
		||||
        // Firstly we need to unlock the command register and select PG0
 | 
			
		||||
        IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
        is31fl3736_write_register(addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        is31fl3736_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
        for (int i = 0; i < 24; i++) {
 | 
			
		||||
            IS31FL3736_write_register(addr1, i, g_led_control_registers[0][i]);
 | 
			
		||||
            // IS31FL3736_write_register(addr2, i, g_led_control_registers[1][i]);
 | 
			
		||||
            is31fl3736_write_register(addr1, i, g_led_control_registers[0][i]);
 | 
			
		||||
            // is31fl3736_write_register(addr2, i, g_led_control_registers[1][i]);
 | 
			
		||||
        }
 | 
			
		||||
        g_led_control_registers_update_required = false;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,25 +42,25 @@ typedef struct is31_led {
 | 
			
		|||
 | 
			
		||||
extern const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT];
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_init(uint8_t addr);
 | 
			
		||||
void IS31FL3736_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void IS31FL3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
void is31fl3736_init(uint8_t addr);
 | 
			
		||||
void is31fl3736_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void IS31FL3736_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3736_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
 | 
			
		||||
void is31fl3736_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
 | 
			
		||||
 | 
			
		||||
void IS31FL3736_mono_set_brightness(int index, uint8_t value);
 | 
			
		||||
void IS31FL3736_mono_set_brightness_all(uint8_t value);
 | 
			
		||||
void IS31FL3736_mono_set_led_control_register(uint8_t index, bool enabled);
 | 
			
		||||
void is31fl3736_mono_set_brightness(int index, uint8_t value);
 | 
			
		||||
void is31fl3736_mono_set_brightness_all(uint8_t value);
 | 
			
		||||
void is31fl3736_mono_set_led_control_register(uint8_t index, bool enabled);
 | 
			
		||||
 | 
			
		||||
// 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 IS31FL3736_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void IS31FL3736_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
void is31fl3736_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void is31fl3736_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
 | 
			
		||||
#define PUR_0R 0x00   // No PUR resistor
 | 
			
		||||
#define PUR_05KR 0x01 // 0.5k Ohm resistor
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -80,7 +80,7 @@ uint8_t g_twi_transfer_buffer[20];
 | 
			
		|||
// 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 IS31FL3737_write_pwm_buffer() but it's
 | 
			
		||||
// buffers and the transfers in is31fl3737_write_pwm_buffer() but it's
 | 
			
		||||
// probably not worth the extra complexity.
 | 
			
		||||
 | 
			
		||||
uint8_t g_pwm_buffer[DRIVER_COUNT][192];
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +89,7 @@ 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};
 | 
			
		||||
 | 
			
		||||
void IS31FL3737_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
void is31fl3737_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
    g_twi_transfer_buffer[0] = reg;
 | 
			
		||||
    g_twi_transfer_buffer[1] = data;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -102,7 +102,7 @@ void IS31FL3737_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
void is31fl3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // assumes PG1 is already selected
 | 
			
		||||
 | 
			
		||||
    // transmit PWM registers in 12 transfers of 16 bytes
 | 
			
		||||
| 
						 | 
				
			
			@ -126,52 +126,52 @@ void IS31FL3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3737_init(uint8_t addr) {
 | 
			
		||||
void is31fl3737_init(uint8_t addr) {
 | 
			
		||||
    // In order to avoid the LEDs being driven with garbage data
 | 
			
		||||
    // in the LED driver's PWM registers, shutdown is enabled last.
 | 
			
		||||
    // Set up the mode and other settings, clear the PWM registers,
 | 
			
		||||
    // then disable software shutdown.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
    is31fl3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
 | 
			
		||||
    // Select PG0
 | 
			
		||||
    IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
    is31fl3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
    // Turn off all LEDs.
 | 
			
		||||
    for (int i = 0x00; i <= 0x17; i++) {
 | 
			
		||||
        IS31FL3737_write_register(addr, i, 0x00);
 | 
			
		||||
        is31fl3737_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
    is31fl3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
 | 
			
		||||
    // Select PG1
 | 
			
		||||
    IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
    is31fl3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
    // Set PWM on all LEDs to 0
 | 
			
		||||
    // No need to setup Breath registers to PWM as that is the default.
 | 
			
		||||
    for (int i = 0x00; i <= 0xBF; i++) {
 | 
			
		||||
        IS31FL3737_write_register(addr, i, 0x00);
 | 
			
		||||
        is31fl3737_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
    is31fl3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
 | 
			
		||||
    // Select PG3
 | 
			
		||||
    IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
 | 
			
		||||
    is31fl3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
 | 
			
		||||
    // Set de-ghost pull-up resistors (SWx)
 | 
			
		||||
    IS31FL3737_write_register(addr, ISSI_REG_SWPULLUP, ISSI_SWPULLUP);
 | 
			
		||||
    is31fl3737_write_register(addr, ISSI_REG_SWPULLUP, ISSI_SWPULLUP);
 | 
			
		||||
    // Set de-ghost pull-down resistors (CSx)
 | 
			
		||||
    IS31FL3737_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
 | 
			
		||||
    is31fl3737_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
 | 
			
		||||
    // Set global current to maximum.
 | 
			
		||||
    IS31FL3737_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT);
 | 
			
		||||
    is31fl3737_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT);
 | 
			
		||||
    // Disable software shutdown.
 | 
			
		||||
    IS31FL3737_write_register(addr, ISSI_REG_CONFIGURATION, ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01);
 | 
			
		||||
    is31fl3737_write_register(addr, ISSI_REG_CONFIGURATION, ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01);
 | 
			
		||||
 | 
			
		||||
    // Wait 10ms to ensure the device has woken up.
 | 
			
		||||
    wait_ms(10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3737_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));
 | 
			
		||||
| 
						 | 
				
			
			@ -186,13 +186,13 @@ void IS31FL3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
 | 
			
		||||
        IS31FL3737_set_color(i, red, green, blue);
 | 
			
		||||
        is31fl3737_set_color(i, red, green, blue);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3737_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
 | 
			
		||||
void is31fl3737_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));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -222,24 +222,24 @@ void IS31FL3737_set_led_control_register(uint8_t index, bool red, bool green, bo
 | 
			
		|||
    g_led_control_registers_update_required[led.driver] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3737_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
void is31fl3737_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
    if (g_pwm_buffer_update_required[index]) {
 | 
			
		||||
        // Firstly we need to unlock the command register and select PG1
 | 
			
		||||
        IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
        is31fl3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        is31fl3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
 | 
			
		||||
 | 
			
		||||
        IS31FL3737_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
        is31fl3737_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
    }
 | 
			
		||||
    g_pwm_buffer_update_required[index] = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3737_update_led_control_registers(uint8_t addr, uint8_t index) {
 | 
			
		||||
void is31fl3737_update_led_control_registers(uint8_t addr, uint8_t index) {
 | 
			
		||||
    if (g_led_control_registers_update_required[index]) {
 | 
			
		||||
        // Firstly we need to unlock the command register and select PG0
 | 
			
		||||
        IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
        is31fl3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        is31fl3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
 | 
			
		||||
        for (int i = 0; i < 24; i++) {
 | 
			
		||||
            IS31FL3737_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
            is31fl3737_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    g_led_control_registers_update_required[index] = false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,21 +33,21 @@ typedef struct is31_led {
 | 
			
		|||
 | 
			
		||||
extern const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT];
 | 
			
		||||
 | 
			
		||||
void IS31FL3737_init(uint8_t addr);
 | 
			
		||||
void IS31FL3737_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void IS31FL3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
void is31fl3737_init(uint8_t addr);
 | 
			
		||||
void is31fl3737_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
 | 
			
		||||
void IS31FL3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void IS31FL3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
 | 
			
		||||
void IS31FL3737_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
 | 
			
		||||
void is31fl3737_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 IS31FL3737_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void IS31FL3737_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
void is31fl3737_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void is31fl3737_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
 | 
			
		||||
#define PUR_0R 0x00   // No PUR resistor
 | 
			
		||||
#define PUR_05KR 0x01 // 0.5k Ohm resistor in t_NOL
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -82,7 +82,7 @@ uint8_t g_twi_transfer_buffer[20] = {0xFF};
 | 
			
		|||
// The scaling buffers match the PG2 and PG3 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 IS31FL3741_write_pwm_buffer() but it's
 | 
			
		||||
// buffers and the transfers in is31fl3741_write_pwm_buffer() but it's
 | 
			
		||||
// probably not worth the extra complexity.
 | 
			
		||||
uint8_t g_pwm_buffer[DRIVER_COUNT][ISSI_MAX_LEDS];
 | 
			
		||||
bool    g_pwm_buffer_update_required[DRIVER_COUNT]        = {false};
 | 
			
		||||
| 
						 | 
				
			
			@ -90,7 +90,7 @@ bool    g_scaling_registers_update_required[DRIVER_COUNT] = {false};
 | 
			
		|||
 | 
			
		||||
uint8_t g_scaling_registers[DRIVER_COUNT][ISSI_MAX_LEDS];
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
void is31fl3741_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		||||
    g_twi_transfer_buffer[0] = reg;
 | 
			
		||||
    g_twi_transfer_buffer[1] = data;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -103,14 +103,14 @@ void IS31FL3741_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool IS31FL3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
bool is31fl3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // Assume PG0 is already selected
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 342; i += 18) {
 | 
			
		||||
        if (i == 180) {
 | 
			
		||||
            // unlock the command register and select PG1
 | 
			
		||||
            IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
            IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM1);
 | 
			
		||||
            is31fl3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
            is31fl3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        g_twi_transfer_buffer[0] = i % 180;
 | 
			
		||||
| 
						 | 
				
			
			@ -148,7 +148,7 @@ bool IS31FL3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_init(uint8_t addr) {
 | 
			
		||||
void is31fl3741_init(uint8_t addr) {
 | 
			
		||||
    // In order to avoid the LEDs being driven with garbage data
 | 
			
		||||
    // in the LED driver's PWM registers, shutdown is enabled last.
 | 
			
		||||
    // Set up the mode and other settings, clear the PWM registers,
 | 
			
		||||
| 
						 | 
				
			
			@ -156,26 +156,26 @@ void IS31FL3741_init(uint8_t addr) {
 | 
			
		|||
    // Unlock the command register.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
    is31fl3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
 | 
			
		||||
    // Select PG4
 | 
			
		||||
    IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
 | 
			
		||||
    is31fl3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // Set to Normal operation
 | 
			
		||||
    IS31FL3741_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
 | 
			
		||||
    is31fl3741_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
 | 
			
		||||
 | 
			
		||||
    // Set Golbal Current Control Register
 | 
			
		||||
    IS31FL3741_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT);
 | 
			
		||||
    is31fl3741_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT);
 | 
			
		||||
    // Set Pull up & Down for SWx CSy
 | 
			
		||||
    IS31FL3741_write_register(addr, ISSI_REG_PULLDOWNUP, ((ISSI_CSPULLUP << 4) | ISSI_SWPULLUP));
 | 
			
		||||
    is31fl3741_write_register(addr, ISSI_REG_PULLDOWNUP, ((ISSI_CSPULLUP << 4) | ISSI_SWPULLUP));
 | 
			
		||||
 | 
			
		||||
    // IS31FL3741_update_led_scaling_registers(addr, 0xFF, 0xFF, 0xFF);
 | 
			
		||||
    // is31fl3741_update_led_scaling_registers(addr, 0xFF, 0xFF, 0xFF);
 | 
			
		||||
 | 
			
		||||
    // Wait 10ms to ensure the device has woken up.
 | 
			
		||||
    wait_ms(10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3741_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));
 | 
			
		||||
| 
						 | 
				
			
			@ -190,13 +190,13 @@ void IS31FL3741_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3741_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
 | 
			
		||||
        IS31FL3741_set_color(i, red, green, blue);
 | 
			
		||||
        is31fl3741_set_color(i, red, green, blue);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
 | 
			
		||||
void is31fl3741_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));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -221,19 +221,19 @@ void IS31FL3741_set_led_control_register(uint8_t index, bool red, bool green, bo
 | 
			
		|||
    g_scaling_registers_update_required[led.driver] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
void is31fl3741_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		||||
    if (g_pwm_buffer_update_required[index]) {
 | 
			
		||||
        // unlock the command register and select PG2
 | 
			
		||||
        IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM0);
 | 
			
		||||
        is31fl3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        is31fl3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM0);
 | 
			
		||||
 | 
			
		||||
        IS31FL3741_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
        is31fl3741_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    g_pwm_buffer_update_required[index] = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_set_pwm_buffer(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3741_set_pwm_buffer(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    g_pwm_buffer[pled->driver][pled->r] = red;
 | 
			
		||||
    g_pwm_buffer[pled->driver][pled->g] = green;
 | 
			
		||||
    g_pwm_buffer[pled->driver][pled->b] = blue;
 | 
			
		||||
| 
						 | 
				
			
			@ -241,31 +241,31 @@ void IS31FL3741_set_pwm_buffer(const is31_led *pled, uint8_t red, uint8_t green,
 | 
			
		|||
    g_pwm_buffer_update_required[pled->driver] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_update_led_control_registers(uint8_t addr, uint8_t index) {
 | 
			
		||||
void is31fl3741_update_led_control_registers(uint8_t addr, uint8_t index) {
 | 
			
		||||
    if (g_scaling_registers_update_required[index]) {
 | 
			
		||||
        // unlock the command register and select PG2
 | 
			
		||||
        IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_SCALING_0);
 | 
			
		||||
        is31fl3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        is31fl3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_SCALING_0);
 | 
			
		||||
 | 
			
		||||
        // CS1_SW1 to CS30_SW6 are on PG2
 | 
			
		||||
        for (int i = CS1_SW1; i <= CS30_SW6; ++i) {
 | 
			
		||||
            IS31FL3741_write_register(addr, i, g_scaling_registers[index][i]);
 | 
			
		||||
            is31fl3741_write_register(addr, i, g_scaling_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // unlock the command register and select PG3
 | 
			
		||||
        IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_SCALING_1);
 | 
			
		||||
        is31fl3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
 | 
			
		||||
        is31fl3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_SCALING_1);
 | 
			
		||||
 | 
			
		||||
        // CS1_SW7 to CS39_SW9 are on PG3
 | 
			
		||||
        for (int i = CS1_SW7; i <= CS39_SW9; ++i) {
 | 
			
		||||
            IS31FL3741_write_register(addr, i - CS1_SW7, g_scaling_registers[index][i]);
 | 
			
		||||
            is31fl3741_write_register(addr, i - CS1_SW7, g_scaling_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        g_scaling_registers_update_required[index] = false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_set_scaling_registers(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
void is31fl3741_set_scaling_registers(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
    g_scaling_registers[pled->driver][pled->r] = red;
 | 
			
		||||
    g_scaling_registers[pled->driver][pled->g] = green;
 | 
			
		||||
    g_scaling_registers[pled->driver][pled->b] = blue;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,24 +32,24 @@ typedef struct is31_led {
 | 
			
		|||
 | 
			
		||||
extern const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT];
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_init(uint8_t addr);
 | 
			
		||||
void IS31FL3741_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
bool IS31FL3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
void is31fl3741_init(uint8_t addr);
 | 
			
		||||
void is31fl3741_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
bool is31fl3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void IS31FL3741_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3741_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3741_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
 | 
			
		||||
void is31fl3741_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 IS31FL3741_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void IS31FL3741_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
void IS31FL3741_set_scaling_registers(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3741_update_pwm_buffers(uint8_t addr, uint8_t index);
 | 
			
		||||
void is31fl3741_update_led_control_registers(uint8_t addr, uint8_t index);
 | 
			
		||||
void is31fl3741_set_scaling_registers(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
 | 
			
		||||
void IS31FL3741_set_pwm_buffer(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
void is31fl3741_set_pwm_buffer(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue);
 | 
			
		||||
 | 
			
		||||
#define PUR_0R 0x00   // No PUR resistor
 | 
			
		||||
#define PUR_05KR 0x01 // 0.5k Ohm resistor
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue