LED drivers: refactor page selection (#22518)
This commit is contained in:
		
							parent
							
								
									3a2aec47b7
								
							
						
					
					
						commit
						358bc8eac8
					
				
					 29 changed files with 211 additions and 274 deletions
				
			
		| 
						 | 
				
			
			@ -43,6 +43,8 @@ extern const is31fl3218_led_t PROGMEM g_is31fl3218_leds[IS31FL3218_LED_COUNT];
 | 
			
		|||
 | 
			
		||||
void is31fl3218_init(void);
 | 
			
		||||
 | 
			
		||||
void is31fl3218_write_register(uint8_t reg, uint8_t data);
 | 
			
		||||
 | 
			
		||||
void is31fl3218_set_value(int index, uint8_t value);
 | 
			
		||||
 | 
			
		||||
void is31fl3218_set_value_all(uint8_t value);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,6 +45,8 @@ extern const is31fl3218_led_t PROGMEM g_is31fl3218_leds[IS31FL3218_LED_COUNT];
 | 
			
		|||
 | 
			
		||||
void is31fl3218_init(void);
 | 
			
		||||
 | 
			
		||||
void is31fl3218_write_register(uint8_t reg, uint8_t data);
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,8 +62,12 @@ void is31fl3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3731_select_page(uint8_t addr, uint8_t page) {
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_REG_COMMAND, page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // assumes bank is already selected
 | 
			
		||||
    // assumes page 0 is already selected
 | 
			
		||||
 | 
			
		||||
    // transmit PWM registers in 9 transfers of 16 bytes
 | 
			
		||||
    // g_twi_transfer_buffer[] is 20 bytes
 | 
			
		||||
| 
						 | 
				
			
			@ -123,8 +127,7 @@ void is31fl3731_init(uint8_t addr) {
 | 
			
		|||
    // then set up the mode and other settings, clear the PWM registers,
 | 
			
		||||
    // then disable software shutdown.
 | 
			
		||||
 | 
			
		||||
    // select "function register" bank
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_REG_COMMAND, IS31FL3731_COMMAND_FUNCTION);
 | 
			
		||||
    is31fl3731_select_page(addr, IS31FL3731_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // enable software shutdown
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_FUNCTION_REG_SHUTDOWN, 0x00);
 | 
			
		||||
| 
						 | 
				
			
			@ -142,8 +145,7 @@ void is31fl3731_init(uint8_t addr) {
 | 
			
		|||
    // audio sync off
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_FUNCTION_REG_AUDIO_SYNC, 0x00);
 | 
			
		||||
 | 
			
		||||
    // select bank 0
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_REG_COMMAND, IS31FL3731_COMMAND_FRAME_1);
 | 
			
		||||
    is31fl3731_select_page(addr, IS31FL3731_COMMAND_FRAME_1);
 | 
			
		||||
 | 
			
		||||
    // turn off all LEDs in the LED control register
 | 
			
		||||
    for (int i = 0; i < IS31FL3731_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -160,16 +162,15 @@ void is31fl3731_init(uint8_t addr) {
 | 
			
		|||
        is31fl3731_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // select "function register" bank
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_REG_COMMAND, IS31FL3731_COMMAND_FUNCTION);
 | 
			
		||||
    is31fl3731_select_page(addr, IS31FL3731_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // disable software shutdown
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_FUNCTION_REG_SHUTDOWN, 0x01);
 | 
			
		||||
 | 
			
		||||
    // select bank 0 and leave it selected.
 | 
			
		||||
    // most usage after initialization is just writing PWM buffers in bank 0
 | 
			
		||||
    // select page 0 and leave it selected.
 | 
			
		||||
    // most usage after initialization is just writing PWM buffers in page 0
 | 
			
		||||
    // as there's not much point in double-buffering
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_REG_COMMAND, IS31FL3731_COMMAND_FRAME_1);
 | 
			
		||||
    is31fl3731_select_page(addr, IS31FL3731_COMMAND_FRAME_1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3731_set_value(int index, uint8_t value) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,6 +103,7 @@ extern const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT];
 | 
			
		|||
void is31fl3731_init_drivers(void);
 | 
			
		||||
void is31fl3731_init(uint8_t addr);
 | 
			
		||||
void is31fl3731_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3731_select_page(uint8_t addr, uint8_t page);
 | 
			
		||||
void is31fl3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
 | 
			
		||||
void is31fl3731_set_value(int index, uint8_t value);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,8 +59,12 @@ void is31fl3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3731_select_page(uint8_t addr, uint8_t page) {
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_REG_COMMAND, page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // assumes bank is already selected
 | 
			
		||||
    // assumes page 0 is already selected
 | 
			
		||||
 | 
			
		||||
    // transmit PWM registers in 9 transfers of 16 bytes
 | 
			
		||||
    // g_twi_transfer_buffer[] is 20 bytes
 | 
			
		||||
| 
						 | 
				
			
			@ -120,8 +124,7 @@ void is31fl3731_init(uint8_t addr) {
 | 
			
		|||
    // then set up the mode and other settings, clear the PWM registers,
 | 
			
		||||
    // then disable software shutdown.
 | 
			
		||||
 | 
			
		||||
    // select "function register" bank
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_REG_COMMAND, IS31FL3731_COMMAND_FUNCTION);
 | 
			
		||||
    is31fl3731_select_page(addr, IS31FL3731_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // enable software shutdown
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_FUNCTION_REG_SHUTDOWN, 0x00);
 | 
			
		||||
| 
						 | 
				
			
			@ -139,8 +142,7 @@ void is31fl3731_init(uint8_t addr) {
 | 
			
		|||
    // audio sync off
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_FUNCTION_REG_AUDIO_SYNC, 0x00);
 | 
			
		||||
 | 
			
		||||
    // select bank 0
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_REG_COMMAND, IS31FL3731_COMMAND_FRAME_1);
 | 
			
		||||
    is31fl3731_select_page(addr, IS31FL3731_COMMAND_FRAME_1);
 | 
			
		||||
 | 
			
		||||
    // turn off all LEDs in the LED control register
 | 
			
		||||
    for (int i = 0; i < IS31FL3731_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -157,16 +159,15 @@ void is31fl3731_init(uint8_t addr) {
 | 
			
		|||
        is31fl3731_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // select "function register" bank
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_REG_COMMAND, IS31FL3731_COMMAND_FUNCTION);
 | 
			
		||||
    is31fl3731_select_page(addr, IS31FL3731_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // disable software shutdown
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_FUNCTION_REG_SHUTDOWN, 0x01);
 | 
			
		||||
 | 
			
		||||
    // select bank 0 and leave it selected.
 | 
			
		||||
    // most usage after initialization is just writing PWM buffers in bank 0
 | 
			
		||||
    // select page 0 and leave it selected.
 | 
			
		||||
    // most usage after initialization is just writing PWM buffers in page 0
 | 
			
		||||
    // as there's not much point in double-buffering
 | 
			
		||||
    is31fl3731_write_register(addr, IS31FL3731_REG_COMMAND, IS31FL3731_COMMAND_FRAME_1);
 | 
			
		||||
    is31fl3731_select_page(addr, IS31FL3731_COMMAND_FRAME_1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -104,6 +104,7 @@ extern const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT];
 | 
			
		|||
void is31fl3731_init_drivers(void);
 | 
			
		||||
void is31fl3731_init(uint8_t addr);
 | 
			
		||||
void is31fl3731_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3731_select_page(uint8_t addr, uint8_t page);
 | 
			
		||||
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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,7 +67,7 @@
 | 
			
		|||
uint8_t g_twi_transfer_buffer[20];
 | 
			
		||||
 | 
			
		||||
// These buffers match the IS31FL3733 PWM registers.
 | 
			
		||||
// The control buffers match the PG0 LED On/Off registers.
 | 
			
		||||
// The control buffers match the page 0 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
 | 
			
		||||
| 
						 | 
				
			
			@ -97,8 +97,13 @@ bool is31fl3733_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3733_select_page(uint8_t addr, uint8_t page) {
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool is31fl3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // Assumes PG1 is already selected.
 | 
			
		||||
    // Assumes page 1 is already selected.
 | 
			
		||||
    // If any of the transactions fails function returns false.
 | 
			
		||||
    // Transmit PWM registers in 12 transfers of 16 bytes.
 | 
			
		||||
    // g_twi_transfer_buffer[] is 20 bytes
 | 
			
		||||
| 
						 | 
				
			
			@ -163,32 +168,23 @@ void is31fl3733_init(uint8_t addr, uint8_t sync) {
 | 
			
		|||
    // then disable software shutdown.
 | 
			
		||||
    // Sync is passed so set it according to the datasheet.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3733_select_page(addr, IS31FL3733_COMMAND_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
    // Select PG0
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, IS31FL3733_COMMAND_LED_CONTROL);
 | 
			
		||||
    // Turn off all LEDs.
 | 
			
		||||
    for (int i = 0; i < IS31FL3733_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3733_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3733_select_page(addr, IS31FL3733_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
    // Select PG1
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, IS31FL3733_COMMAND_PWM);
 | 
			
		||||
    // Set PWM on all LEDs to 0
 | 
			
		||||
    // No need to setup Breath registers to PWM as that is the default.
 | 
			
		||||
    for (int i = 0; i < IS31FL3733_PWM_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3733_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3733_select_page(addr, IS31FL3733_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // Select PG3
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, IS31FL3733_COMMAND_FUNCTION);
 | 
			
		||||
    // Set de-ghost pull-up resistors (SWx)
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_FUNCTION_REG_SW_PULLUP, IS31FL3733_SW_PULLUP);
 | 
			
		||||
    // Set de-ghost pull-down resistors (CSx)
 | 
			
		||||
| 
						 | 
				
			
			@ -239,11 +235,9 @@ void is31fl3733_set_led_control_register(uint8_t index, bool value) {
 | 
			
		|||
 | 
			
		||||
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, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, IS31FL3733_COMMAND_PWM);
 | 
			
		||||
        is31fl3733_select_page(addr, IS31FL3733_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
        // If any of the transactions fail we risk writing dirty PG0,
 | 
			
		||||
        // If any of the transactions fail we risk writing dirty page 0,
 | 
			
		||||
        // refresh page 0 just in case.
 | 
			
		||||
        if (!is31fl3733_write_pwm_buffer(addr, g_pwm_buffer[index])) {
 | 
			
		||||
            g_led_control_registers_update_required[index] = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -254,9 +248,8 @@ void is31fl3733_update_pwm_buffers(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, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, IS31FL3733_COMMAND_LED_CONTROL);
 | 
			
		||||
        is31fl3733_select_page(addr, IS31FL3733_COMMAND_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < IS31FL3733_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
            is31fl3733_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -117,6 +117,7 @@ extern const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT];
 | 
			
		|||
void is31fl3733_init_drivers(void);
 | 
			
		||||
void is31fl3733_init(uint8_t addr, uint8_t sync);
 | 
			
		||||
bool is31fl3733_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3733_select_page(uint8_t addr, uint8_t page);
 | 
			
		||||
bool is31fl3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
 | 
			
		||||
void is31fl3733_set_value(int index, uint8_t value);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -66,7 +66,7 @@
 | 
			
		|||
uint8_t g_twi_transfer_buffer[20];
 | 
			
		||||
 | 
			
		||||
// These buffers match the IS31FL3733 PWM registers.
 | 
			
		||||
// The control buffers match the PG0 LED On/Off registers.
 | 
			
		||||
// The control buffers match the page 0 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
 | 
			
		||||
| 
						 | 
				
			
			@ -96,8 +96,13 @@ bool is31fl3733_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3733_select_page(uint8_t addr, uint8_t page) {
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool is31fl3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // Assumes PG1 is already selected.
 | 
			
		||||
    // Assumes page 1 is already selected.
 | 
			
		||||
    // If any of the transactions fails function returns false.
 | 
			
		||||
    // Transmit PWM registers in 12 transfers of 16 bytes.
 | 
			
		||||
    // g_twi_transfer_buffer[] is 20 bytes
 | 
			
		||||
| 
						 | 
				
			
			@ -162,32 +167,23 @@ void is31fl3733_init(uint8_t addr, uint8_t sync) {
 | 
			
		|||
    // then disable software shutdown.
 | 
			
		||||
    // Sync is passed so set it according to the datasheet.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3733_select_page(addr, IS31FL3733_COMMAND_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
    // Select PG0
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, IS31FL3733_COMMAND_LED_CONTROL);
 | 
			
		||||
    // Turn off all LEDs.
 | 
			
		||||
    for (int i = 0; i < IS31FL3733_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3733_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3733_select_page(addr, IS31FL3733_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
    // Select PG1
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, IS31FL3733_COMMAND_PWM);
 | 
			
		||||
    // Set PWM on all LEDs to 0
 | 
			
		||||
    // No need to setup Breath registers to PWM as that is the default.
 | 
			
		||||
    for (int i = 0; i < IS31FL3733_PWM_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3733_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3733_select_page(addr, IS31FL3733_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // Select PG3
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, IS31FL3733_COMMAND_FUNCTION);
 | 
			
		||||
    // Set de-ghost pull-up resistors (SWx)
 | 
			
		||||
    is31fl3733_write_register(addr, IS31FL3733_FUNCTION_REG_SW_PULLUP, IS31FL3733_SW_PULLUP);
 | 
			
		||||
    // Set de-ghost pull-down resistors (CSx)
 | 
			
		||||
| 
						 | 
				
			
			@ -254,11 +250,9 @@ void is31fl3733_set_led_control_register(uint8_t index, bool red, bool green, bo
 | 
			
		|||
 | 
			
		||||
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, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, IS31FL3733_COMMAND_PWM);
 | 
			
		||||
        is31fl3733_select_page(addr, IS31FL3733_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
        // If any of the transactions fail we risk writing dirty PG0,
 | 
			
		||||
        // If any of the transactions fail we risk writing dirty page 0,
 | 
			
		||||
        // refresh page 0 just in case.
 | 
			
		||||
        if (!is31fl3733_write_pwm_buffer(addr, g_pwm_buffer[index])) {
 | 
			
		||||
            g_led_control_registers_update_required[index] = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -269,9 +263,8 @@ void is31fl3733_update_pwm_buffers(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, IS31FL3733_REG_COMMAND_WRITE_LOCK, IS31FL3733_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3733_write_register(addr, IS31FL3733_REG_COMMAND, IS31FL3733_COMMAND_LED_CONTROL);
 | 
			
		||||
        is31fl3733_select_page(addr, IS31FL3733_COMMAND_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < IS31FL3733_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
            is31fl3733_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -142,6 +142,7 @@ extern const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT];
 | 
			
		|||
void is31fl3733_init_drivers(void);
 | 
			
		||||
void is31fl3733_init(uint8_t addr, uint8_t sync);
 | 
			
		||||
bool is31fl3733_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3733_select_page(uint8_t addr, uint8_t page);
 | 
			
		||||
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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,7 +51,7 @@
 | 
			
		|||
uint8_t g_twi_transfer_buffer[20];
 | 
			
		||||
 | 
			
		||||
// These buffers match the IS31FL3736 PWM registers.
 | 
			
		||||
// The control buffers match the PG0 LED On/Off registers.
 | 
			
		||||
// The control buffers match the page 0 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
 | 
			
		||||
| 
						 | 
				
			
			@ -75,8 +75,13 @@ void is31fl3736_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3736_select_page(uint8_t addr, uint8_t page) {
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND_WRITE_LOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // assumes PG1 is already selected
 | 
			
		||||
    // assumes page 1 is already selected
 | 
			
		||||
 | 
			
		||||
    // transmit PWM registers in 12 transfers of 16 bytes
 | 
			
		||||
    // g_twi_transfer_buffer[] is 20 bytes
 | 
			
		||||
| 
						 | 
				
			
			@ -135,32 +140,23 @@ void is31fl3736_init(uint8_t addr) {
 | 
			
		|||
    // Set up the mode and other settings, clear the PWM registers,
 | 
			
		||||
    // then disable software shutdown.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND_WRITE_LOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3736_select_page(addr, IS31FL3736_COMMAND_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
    // Select PG0
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, IS31FL3736_COMMAND_LED_CONTROL);
 | 
			
		||||
    // Turn off all LEDs.
 | 
			
		||||
    for (int i = 0; i < IS31FL3736_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3736_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND_WRITE_LOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3736_select_page(addr, IS31FL3736_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
    // Select PG1
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, IS31FL3736_COMMAND_PWM);
 | 
			
		||||
    // Set PWM on all LEDs to 0
 | 
			
		||||
    // No need to setup Breath registers to PWM as that is the default.
 | 
			
		||||
    for (int i = 0; i < IS31FL3736_PWM_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3736_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND_WRITE_LOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3736_select_page(addr, IS31FL3736_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // Select PG3
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, IS31FL3736_COMMAND_FUNCTION);
 | 
			
		||||
    // Set de-ghost pull-up resistors (SWx)
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_FUNCTION_REG_SW_PULLUP, IS31FL3736_SW_PULLUP);
 | 
			
		||||
    // Set de-ghost pull-down resistors (CSx)
 | 
			
		||||
| 
						 | 
				
			
			@ -217,9 +213,7 @@ void is31fl3736_set_led_control_register(uint8_t index, bool value) {
 | 
			
		|||
 | 
			
		||||
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, IS31FL3736_REG_COMMAND_WRITE_LOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, IS31FL3736_COMMAND_PWM);
 | 
			
		||||
        is31fl3736_select_page(addr, IS31FL3736_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
        is31fl3736_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
        g_pwm_buffer_update_required[index] = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -228,9 +222,8 @@ void is31fl3736_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		|||
 | 
			
		||||
void is31fl3736_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
 | 
			
		||||
        is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND_WRITE_LOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, IS31FL3736_COMMAND_LED_CONTROL);
 | 
			
		||||
        is31fl3736_select_page(addr, IS31FL3736_COMMAND_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < IS31FL3736_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
            is31fl3736_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -112,6 +112,7 @@ extern const is31fl3736_led_t PROGMEM g_is31fl3736_leds[IS31FL3736_LED_COUNT];
 | 
			
		|||
void is31fl3736_init_drivers(void);
 | 
			
		||||
void is31fl3736_init(uint8_t addr);
 | 
			
		||||
void is31fl3736_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3736_select_page(uint8_t addr, uint8_t page);
 | 
			
		||||
void is31fl3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
 | 
			
		||||
void is31fl3736_set_value(int index, uint8_t value);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,7 +51,7 @@
 | 
			
		|||
uint8_t g_twi_transfer_buffer[20];
 | 
			
		||||
 | 
			
		||||
// These buffers match the IS31FL3736 PWM registers.
 | 
			
		||||
// The control buffers match the PG0 LED On/Off registers.
 | 
			
		||||
// The control buffers match the page 0 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
 | 
			
		||||
| 
						 | 
				
			
			@ -75,8 +75,13 @@ void is31fl3736_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3736_select_page(uint8_t addr, uint8_t page) {
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND_WRITE_LOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // assumes PG1 is already selected
 | 
			
		||||
    // assumes page 1 is already selected
 | 
			
		||||
 | 
			
		||||
    // transmit PWM registers in 12 transfers of 16 bytes
 | 
			
		||||
    // g_twi_transfer_buffer[] is 20 bytes
 | 
			
		||||
| 
						 | 
				
			
			@ -135,32 +140,23 @@ void is31fl3736_init(uint8_t addr) {
 | 
			
		|||
    // Set up the mode and other settings, clear the PWM registers,
 | 
			
		||||
    // then disable software shutdown.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND_WRITE_LOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3736_select_page(addr, IS31FL3736_REG_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
    // Select PG0
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, IS31FL3736_REG_LED_CONTROL);
 | 
			
		||||
    // Turn off all LEDs.
 | 
			
		||||
    for (int i = 0; i < IS31FL3736_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3736_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND_WRITELOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3736_select_page(addr, IS31FL3736_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
    // Select PG1
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, IS31FL3736_COMMAND_PWM);
 | 
			
		||||
    // Set PWM on all LEDs to 0
 | 
			
		||||
    // No need to setup Breath registers to PWM as that is the default.
 | 
			
		||||
    for (int i = 0; i < IS31FL3736_PWM_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3736_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND_WRITE_LOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3736_select_page(addr, IS31FL3736_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // Select PG3
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, IS31FL3736_COMMAND_FUNCTION);
 | 
			
		||||
    // Set de-ghost pull-up resistors (SWx)
 | 
			
		||||
    is31fl3736_write_register(addr, IS31FL3736_FUNCTION_REG_SW_PULLUP, IS31FL3736_SW_PULLUP);
 | 
			
		||||
    // Set de-ghost pull-down resistors (CSx)
 | 
			
		||||
| 
						 | 
				
			
			@ -234,9 +230,7 @@ void is31fl3736_set_led_control_register(uint8_t index, bool red, bool green, bo
 | 
			
		|||
 | 
			
		||||
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, IS31FL3736_REG_COMMAND_WRITE_LOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, IS31FL3736_COMMAND_PWM);
 | 
			
		||||
        is31fl3736_select_page(addr, IS31FL3736_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
        is31fl3736_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
        g_pwm_buffer_update_required[index] = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -245,9 +239,8 @@ void is31fl3736_update_pwm_buffers(uint8_t addr, uint8_t index) {
 | 
			
		|||
 | 
			
		||||
void is31fl3736_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
 | 
			
		||||
        is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND_WRITE_LOCK, IS31FL3736_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3736_write_register(addr, IS31FL3736_REG_COMMAND, IS31FL3736_COMMAND_LED_CONTROL);
 | 
			
		||||
        is31fl3736_select_page(addr, IS31FL3736_COMMAND_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < IS31FL3736_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
            is31fl3736_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -126,6 +126,7 @@ extern const is31fl3736_led_t PROGMEM g_is31fl3736_leds[IS31FL3736_LED_COUNT];
 | 
			
		|||
void is31fl3736_init_drivers(void);
 | 
			
		||||
void is31fl3736_init(uint8_t addr);
 | 
			
		||||
void is31fl3736_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3736_select_page(uint8_t addr, uint8_t page);
 | 
			
		||||
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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,7 +53,7 @@
 | 
			
		|||
uint8_t g_twi_transfer_buffer[20];
 | 
			
		||||
 | 
			
		||||
// These buffers match the IS31FL3737 PWM registers.
 | 
			
		||||
// The control buffers match the PG0 LED On/Off registers.
 | 
			
		||||
// The control buffers match the page 0 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
 | 
			
		||||
| 
						 | 
				
			
			@ -78,8 +78,13 @@ void is31fl3737_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3737_select_page(uint8_t addr, uint8_t page) {
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // assumes PG1 is already selected
 | 
			
		||||
    // assumes page 1 is already selected
 | 
			
		||||
 | 
			
		||||
    // transmit PWM registers in 12 transfers of 16 bytes
 | 
			
		||||
    // g_twi_transfer_buffer[] is 20 bytes
 | 
			
		||||
| 
						 | 
				
			
			@ -138,32 +143,23 @@ void is31fl3737_init(uint8_t addr) {
 | 
			
		|||
    // Set up the mode and other settings, clear the PWM registers,
 | 
			
		||||
    // then disable software shutdown.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3737_select_page(addr, IS31FL3737_COMMAND_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
    // Select PG0
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, IS31FL3737_COMMAND_LED_CONTROL);
 | 
			
		||||
    // Turn off all LEDs.
 | 
			
		||||
    for (int i = 0; i < IS31FL3737_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3737_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3737_select_page(addr, IS31FL3737_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
    // Select PG1
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, IS31FL3737_COMMAND_PWM);
 | 
			
		||||
    // Set PWM on all LEDs to 0
 | 
			
		||||
    // No need to setup Breath registers to PWM as that is the default.
 | 
			
		||||
    for (int i = 0; i < IS31FL3737_PWM_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3737_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3737_select_page(addr, IS31FL3737_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // Select PG3
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, IS31FL3737_COMMAND_FUNCTION);
 | 
			
		||||
    // Set de-ghost pull-up resistors (SWx)
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_FUNCTION_REG_SW_PULLUP, IS31FL3737_SW_PULLUP);
 | 
			
		||||
    // Set de-ghost pull-down resistors (CSx)
 | 
			
		||||
| 
						 | 
				
			
			@ -214,9 +210,7 @@ void is31fl3737_set_led_control_register(uint8_t index, bool value) {
 | 
			
		|||
 | 
			
		||||
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, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, IS31FL3737_COMMAND_PWM);
 | 
			
		||||
        is31fl3737_select_page(addr, IS31FL3737_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
        is31fl3737_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
        g_pwm_buffer_update_required[index] = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -225,9 +219,8 @@ void is31fl3737_update_pwm_buffers(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, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, IS31FL3737_COMMAND_LED_CONTROL);
 | 
			
		||||
        is31fl3737_select_page(addr, IS31FL3737_COMMAND_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < IS31FL3737_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
            is31fl3737_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -102,6 +102,7 @@ extern const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT];
 | 
			
		|||
void is31fl3737_init_drivers(void);
 | 
			
		||||
void is31fl3737_init(uint8_t addr);
 | 
			
		||||
void is31fl3737_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3737_select_page(uint8_t addr, uint8_t page);
 | 
			
		||||
void is31fl3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
 | 
			
		||||
void is31fl3737_set_value(int index, uint8_t value);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,7 +53,7 @@
 | 
			
		|||
uint8_t g_twi_transfer_buffer[20];
 | 
			
		||||
 | 
			
		||||
// These buffers match the IS31FL3737 PWM registers.
 | 
			
		||||
// The control buffers match the PG0 LED On/Off registers.
 | 
			
		||||
// The control buffers match the page 0 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
 | 
			
		||||
| 
						 | 
				
			
			@ -78,8 +78,13 @@ void is31fl3737_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3737_select_page(uint8_t addr, uint8_t page) {
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // assumes PG1 is already selected
 | 
			
		||||
    // assumes page 1 is already selected
 | 
			
		||||
 | 
			
		||||
    // transmit PWM registers in 12 transfers of 16 bytes
 | 
			
		||||
    // g_twi_transfer_buffer[] is 20 bytes
 | 
			
		||||
| 
						 | 
				
			
			@ -138,32 +143,23 @@ void is31fl3737_init(uint8_t addr) {
 | 
			
		|||
    // Set up the mode and other settings, clear the PWM registers,
 | 
			
		||||
    // then disable software shutdown.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3737_select_page(addr, IS31FL3737_COMMAND_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
    // Select PG0
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, IS31FL3737_COMMAND_LED_CONTROL);
 | 
			
		||||
    // Turn off all LEDs.
 | 
			
		||||
    for (int i = 0; i < IS31FL3737_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3737_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3737_select_page(addr, IS31FL3737_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
    // Select PG1
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, IS31FL3737_COMMAND_PWM);
 | 
			
		||||
    // Set PWM on all LEDs to 0
 | 
			
		||||
    // No need to setup Breath registers to PWM as that is the default.
 | 
			
		||||
    for (int i = 0; i < IS31FL3737_PWM_REGISTER_COUNT; i++) {
 | 
			
		||||
        is31fl3737_write_register(addr, i, 0x00);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3737_select_page(addr, IS31FL3737_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // Select PG3
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, IS31FL3737_COMMAND_FUNCTION);
 | 
			
		||||
    // Set de-ghost pull-up resistors (SWx)
 | 
			
		||||
    is31fl3737_write_register(addr, IS31FL3737_FUNCTION_REG_SW_PULLUP, IS31FL3737_SW_PULLUP);
 | 
			
		||||
    // Set de-ghost pull-down resistors (CSx)
 | 
			
		||||
| 
						 | 
				
			
			@ -230,9 +226,7 @@ void is31fl3737_set_led_control_register(uint8_t index, bool red, bool green, bo
 | 
			
		|||
 | 
			
		||||
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, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, IS31FL3737_COMMAND_PWM);
 | 
			
		||||
        is31fl3737_select_page(addr, IS31FL3737_COMMAND_PWM);
 | 
			
		||||
 | 
			
		||||
        is31fl3737_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
        g_pwm_buffer_update_required[index] = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -241,9 +235,8 @@ void is31fl3737_update_pwm_buffers(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, IS31FL3737_REG_COMMAND_WRITE_LOCK, IS31FL3737_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3737_write_register(addr, IS31FL3737_REG_COMMAND, IS31FL3737_COMMAND_LED_CONTROL);
 | 
			
		||||
        is31fl3737_select_page(addr, IS31FL3737_COMMAND_LED_CONTROL);
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < IS31FL3737_LED_CONTROL_REGISTER_COUNT; i++) {
 | 
			
		||||
            is31fl3737_write_register(addr, i, g_led_control_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -119,6 +119,7 @@ extern const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT];
 | 
			
		|||
void is31fl3737_init_drivers(void);
 | 
			
		||||
void is31fl3737_init(uint8_t addr);
 | 
			
		||||
void is31fl3737_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3737_select_page(uint8_t addr, uint8_t page);
 | 
			
		||||
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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,7 +56,7 @@
 | 
			
		|||
uint8_t g_twi_transfer_buffer[20] = {0xFF};
 | 
			
		||||
 | 
			
		||||
// These buffers match the IS31FL3741 and IS31FL3741A PWM registers.
 | 
			
		||||
// The scaling buffers match the PG2 and PG3 LED On/Off registers.
 | 
			
		||||
// The scaling buffers match the page 2 and 3 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
 | 
			
		||||
| 
						 | 
				
			
			@ -80,14 +80,17 @@ void is31fl3741_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3741_select_page(uint8_t addr, uint8_t page) {
 | 
			
		||||
    is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool is31fl3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // Assume PG0 is already selected
 | 
			
		||||
    // Assume page 0 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, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
            is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, IS31FL3741_COMMAND_PWM_1);
 | 
			
		||||
            is31fl3741_select_page(addr, IS31FL3741_COMMAND_PWM_1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        g_twi_transfer_buffer[0] = i % 180;
 | 
			
		||||
| 
						 | 
				
			
			@ -162,11 +165,7 @@ void is31fl3741_init(uint8_t addr) {
 | 
			
		|||
    // then disable software shutdown.
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
 | 
			
		||||
    // Select PG4
 | 
			
		||||
    is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, IS31FL3741_COMMAND_FUNCTION);
 | 
			
		||||
    is31fl3741_select_page(addr, IS31FL3741_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // Set to Normal operation
 | 
			
		||||
    is31fl3741_write_register(addr, IS31FL3741_FUNCTION_REG_CONFIGURATION, IS31FL3741_CONFIGURATION);
 | 
			
		||||
| 
						 | 
				
			
			@ -218,9 +217,7 @@ void is31fl3741_set_led_control_register(uint8_t index, bool value) {
 | 
			
		|||
 | 
			
		||||
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, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, IS31FL3741_COMMAND_PWM_0);
 | 
			
		||||
        is31fl3741_select_page(addr, IS31FL3741_COMMAND_PWM_0);
 | 
			
		||||
 | 
			
		||||
        is31fl3741_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -236,20 +233,16 @@ void is31fl3741_set_pwm_buffer(const is31fl3741_led_t *pled, uint8_t value) {
 | 
			
		|||
 | 
			
		||||
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, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, IS31FL3741_COMMAND_SCALING_0);
 | 
			
		||||
        is31fl3741_select_page(addr, IS31FL3741_COMMAND_SCALING_0);
 | 
			
		||||
 | 
			
		||||
        // CS1_SW1 to CS30_SW6 are on PG2
 | 
			
		||||
        // CS1_SW1 to CS30_SW6 are on page 2
 | 
			
		||||
        for (int i = CS1_SW1; i <= CS30_SW6; ++i) {
 | 
			
		||||
            is31fl3741_write_register(addr, i, g_scaling_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // unlock the command register and select PG3
 | 
			
		||||
        is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, IS31FL3741_COMMAND_SCALING_1);
 | 
			
		||||
        is31fl3741_select_page(addr, IS31FL3741_COMMAND_SCALING_1);
 | 
			
		||||
 | 
			
		||||
        // CS1_SW7 to CS39_SW9 are on PG3
 | 
			
		||||
        // CS1_SW7 to CS39_SW9 are on page 3
 | 
			
		||||
        for (int i = CS1_SW7; i <= CS39_SW9; ++i) {
 | 
			
		||||
            is31fl3741_write_register(addr, i - CS1_SW7, g_scaling_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -104,6 +104,7 @@ extern const is31fl3741_led_t PROGMEM g_is31fl3741_leds[IS31FL3741_LED_COUNT];
 | 
			
		|||
void is31fl3741_init_drivers(void);
 | 
			
		||||
void is31fl3741_init(uint8_t addr);
 | 
			
		||||
void is31fl3741_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3741_select_page(uint8_t addr, uint8_t page);
 | 
			
		||||
bool is31fl3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
 | 
			
		||||
 | 
			
		||||
void is31fl3741_set_value(int index, uint8_t value);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,7 +56,7 @@
 | 
			
		|||
uint8_t g_twi_transfer_buffer[20] = {0xFF};
 | 
			
		||||
 | 
			
		||||
// These buffers match the IS31FL3741 and IS31FL3741A PWM registers.
 | 
			
		||||
// The scaling buffers match the PG2 and PG3 LED On/Off registers.
 | 
			
		||||
// The scaling buffers match the page 2 and 3 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
 | 
			
		||||
| 
						 | 
				
			
			@ -80,14 +80,17 @@ void is31fl3741_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void is31fl3741_select_page(uint8_t addr, uint8_t page) {
 | 
			
		||||
    is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
    is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool is31fl3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
 | 
			
		||||
    // Assume PG0 is already selected
 | 
			
		||||
    // Assume page 0 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, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
            is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, IS31FL3741_COMMAND_PWM_1);
 | 
			
		||||
            is31fl3741_select_page(addr, IS31FL3741_COMMAND_PWM_1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        g_twi_transfer_buffer[0] = i % 180;
 | 
			
		||||
| 
						 | 
				
			
			@ -162,11 +165,7 @@ void is31fl3741_init(uint8_t addr) {
 | 
			
		|||
    // then disable software shutdown.
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
 | 
			
		||||
    // Unlock the command register.
 | 
			
		||||
    is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
 | 
			
		||||
    // Select PG4
 | 
			
		||||
    is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, IS31FL3741_COMMAND_FUNCTION);
 | 
			
		||||
    is31fl3741_select_page(addr, IS31FL3741_COMMAND_FUNCTION);
 | 
			
		||||
 | 
			
		||||
    // Set to Normal operation
 | 
			
		||||
    is31fl3741_write_register(addr, IS31FL3741_FUNCTION_REG_CONFIGURATION, IS31FL3741_CONFIGURATION);
 | 
			
		||||
| 
						 | 
				
			
			@ -232,9 +231,7 @@ void is31fl3741_set_led_control_register(uint8_t index, bool red, bool green, bo
 | 
			
		|||
 | 
			
		||||
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, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, IS31FL3741_COMMAND_PWM_0);
 | 
			
		||||
        is31fl3741_select_page(addr, IS31FL3741_COMMAND_PWM_0);
 | 
			
		||||
 | 
			
		||||
        is31fl3741_write_pwm_buffer(addr, g_pwm_buffer[index]);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -252,20 +249,16 @@ void is31fl3741_set_pwm_buffer(const is31fl3741_led_t *pled, uint8_t red, uint8_
 | 
			
		|||
 | 
			
		||||
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, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, IS31FL3741_COMMAND_SCALING_0);
 | 
			
		||||
        is31fl3741_select_page(addr, IS31FL3741_COMMAND_SCALING_0);
 | 
			
		||||
 | 
			
		||||
        // CS1_SW1 to CS30_SW6 are on PG2
 | 
			
		||||
        // CS1_SW1 to CS30_SW6 are on page 2
 | 
			
		||||
        for (int i = CS1_SW1; i <= CS30_SW6; ++i) {
 | 
			
		||||
            is31fl3741_write_register(addr, i, g_scaling_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // unlock the command register and select PG3
 | 
			
		||||
        is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND_WRITE_LOCK, IS31FL3741_COMMAND_WRITE_LOCK_MAGIC);
 | 
			
		||||
        is31fl3741_write_register(addr, IS31FL3741_REG_COMMAND, IS31FL3741_COMMAND_SCALING_1);
 | 
			
		||||
        is31fl3741_select_page(addr, IS31FL3741_COMMAND_SCALING_1);
 | 
			
		||||
 | 
			
		||||
        // CS1_SW7 to CS39_SW9 are on PG3
 | 
			
		||||
        // CS1_SW7 to CS39_SW9 are on page 3
 | 
			
		||||
        for (int i = CS1_SW7; i <= CS39_SW9; ++i) {
 | 
			
		||||
            is31fl3741_write_register(addr, i - CS1_SW7, g_scaling_registers[index][i]);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -121,6 +121,7 @@ extern const is31fl3741_led_t PROGMEM g_is31fl3741_leds[IS31FL3741_LED_COUNT];
 | 
			
		|||
void is31fl3741_init_drivers(void);
 | 
			
		||||
void is31fl3741_init(uint8_t addr);
 | 
			
		||||
void is31fl3741_write_register(uint8_t addr, uint8_t reg, uint8_t data);
 | 
			
		||||
void is31fl3741_select_page(uint8_t addr, uint8_t page);
 | 
			
		||||
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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue