X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=drivers%2Favr%2Fis31fl3731.c;h=70813464b2be3988258d120099b0b4c967a6e710;hb=6380f8319057d33bb6d07c66789867e49c634504;hp=13dfe6eaf615c0e6753f68897c43c269a05e512c;hpb=682555faac8a67deff5688b956165cd1c39389cb;p=qmk_firmware.git diff --git a/drivers/avr/is31fl3731.c b/drivers/avr/is31fl3731.c index 13dfe6eaf..70813464b 100644 --- a/drivers/avr/is31fl3731.c +++ b/drivers/avr/is31fl3731.c @@ -49,6 +49,14 @@ #define ISSI_COMMANDREGISTER 0xFD #define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine' +#ifndef ISSI_TIMEOUT + #define ISSI_TIMEOUT 100 +#endif + +#ifndef ISSI_PERSISTENCE + #define ISSI_PERSISTENCE 0 +#endif + // Transfer buffer for TWITransmitData() uint8_t g_twi_transfer_buffer[20]; @@ -83,9 +91,14 @@ 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; - //Transmit data until succesful - //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,2) != 0); - i2c_transmit(addr << 1, g_twi_transfer_buffer,2); + #if ISSI_PERSISTENCE > 0 + for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { + if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) + break; + } + #else + i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); + #endif } void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) @@ -96,22 +109,24 @@ void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) // g_twi_transfer_buffer[] is 20 bytes // iterate over the pwm_buffer contents at 16 byte intervals - for ( int i = 0; i < 144; i += 16 ) - { + for ( int i = 0; i < 144; i += 16 ) { // set the first register, e.g. 0x24, 0x34, 0x44, etc. g_twi_transfer_buffer[0] = 0x24 + i; // copy the data from i to i+15 // device will auto-increment register for data after the first byte // thus this sets registers 0x24-0x33, 0x34-0x43, etc. in one transfer - for ( int j = 0; j < 16; j++ ) - { + for ( int j = 0; j < 16; j++ ) { g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j]; } - //Transmit buffer until succesful - //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,17) != 0); - i2c_transmit(addr << 1, g_twi_transfer_buffer,17); - + #if ISSI_PERSISTENCE > 0 + for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { + if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) + break; + } + #else + i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT); + #endif } } @@ -168,6 +183,7 @@ void IS31FL3731_init( uint8_t addr ) // 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 ); + } void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) @@ -220,7 +236,6 @@ void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, b g_led_control_registers_update_required = true; - } void IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 )