diff options
Diffstat (limited to 'drivers/avr/is31fl3731.c')
| -rw-r--r-- | drivers/avr/is31fl3731.c | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/drivers/avr/is31fl3731.c b/drivers/avr/is31fl3731.c index 13dfe6eaf..158b77b7b 100644 --- a/drivers/avr/is31fl3731.c +++ b/drivers/avr/is31fl3731.c | |||
| @@ -78,18 +78,19 @@ bool g_led_control_registers_update_required = false; | |||
| 78 | // 0x10 - R16,R15,R14,R13,R12,R11,R10,R09 | 78 | // 0x10 - R16,R15,R14,R13,R12,R11,R10,R09 |
| 79 | 79 | ||
| 80 | 80 | ||
| 81 | void IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data ) | 81 | uint8_t IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data ) |
| 82 | { | 82 | { |
| 83 | g_twi_transfer_buffer[0] = reg; | 83 | g_twi_transfer_buffer[0] = reg; |
| 84 | g_twi_transfer_buffer[1] = data; | 84 | g_twi_transfer_buffer[1] = data; |
| 85 | 85 | ||
| 86 | //Transmit data until succesful | 86 | //Transmit data until succesful |
| 87 | //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,2) != 0); | 87 | //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,2) != 0); |
| 88 | i2c_transmit(addr << 1, g_twi_transfer_buffer,2); | 88 | return i2c_transmit(addr << 1, g_twi_transfer_buffer,2); |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) | 91 | uint8_t IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) |
| 92 | { | 92 | { |
| 93 | uint8_t ret = 0; | ||
| 93 | // assumes bank is already selected | 94 | // assumes bank is already selected |
| 94 | 95 | ||
| 95 | // transmit PWM registers in 9 transfers of 16 bytes | 96 | // transmit PWM registers in 9 transfers of 16 bytes |
| @@ -110,64 +111,67 @@ void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) | |||
| 110 | 111 | ||
| 111 | //Transmit buffer until succesful | 112 | //Transmit buffer until succesful |
| 112 | //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,17) != 0); | 113 | //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,17) != 0); |
| 113 | i2c_transmit(addr << 1, g_twi_transfer_buffer,17); | 114 | ret |= i2c_transmit(addr << 1, g_twi_transfer_buffer, 17); |
| 114 | |||
| 115 | } | 115 | } |
| 116 | return ret; | ||
| 116 | } | 117 | } |
| 117 | 118 | ||
| 118 | void IS31FL3731_init( uint8_t addr ) | 119 | uint8_t IS31FL3731_init( uint8_t addr ) |
| 119 | { | 120 | { |
| 121 | uint8_t ret = 0; | ||
| 120 | // In order to avoid the LEDs being driven with garbage data | 122 | // In order to avoid the LEDs being driven with garbage data |
| 121 | // in the LED driver's PWM registers, first enable software shutdown, | 123 | // in the LED driver's PWM registers, first enable software shutdown, |
| 122 | // then set up the mode and other settings, clear the PWM registers, | 124 | // then set up the mode and other settings, clear the PWM registers, |
| 123 | // then disable software shutdown. | 125 | // then disable software shutdown. |
| 124 | 126 | ||
| 125 | // select "function register" bank | 127 | // select "function register" bank |
| 126 | IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG ); | 128 | ret |= IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG ); |
| 127 | 129 | ||
| 128 | // enable software shutdown | 130 | // enable software shutdown |
| 129 | IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x00 ); | 131 | ret |= IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x00 ); |
| 130 | // this delay was copied from other drivers, might not be needed | 132 | // this delay was copied from other drivers, might not be needed |
| 131 | _delay_ms( 10 ); | 133 | _delay_ms( 10 ); |
| 132 | 134 | ||
| 133 | // picture mode | 135 | // picture mode |
| 134 | IS31FL3731_write_register( addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE ); | 136 | ret |= IS31FL3731_write_register( addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE ); |
| 135 | // display frame 0 | 137 | // display frame 0 |
| 136 | IS31FL3731_write_register( addr, ISSI_REG_PICTUREFRAME, 0x00 ); | 138 | ret |= IS31FL3731_write_register( addr, ISSI_REG_PICTUREFRAME, 0x00 ); |
| 137 | // audio sync off | 139 | // audio sync off |
| 138 | IS31FL3731_write_register( addr, ISSI_REG_AUDIOSYNC, 0x00 ); | 140 | ret |= IS31FL3731_write_register( addr, ISSI_REG_AUDIOSYNC, 0x00 ); |
| 139 | 141 | ||
| 140 | // select bank 0 | 142 | // select bank 0 |
| 141 | IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 ); | 143 | ret |= IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 ); |
| 142 | 144 | ||
| 143 | // turn off all LEDs in the LED control register | 145 | // turn off all LEDs in the LED control register |
| 144 | for ( int i = 0x00; i <= 0x11; i++ ) | 146 | for ( int i = 0x00; i <= 0x11; i++ ) |
| 145 | { | 147 | { |
| 146 | IS31FL3731_write_register( addr, i, 0x00 ); | 148 | ret |= IS31FL3731_write_register( addr, i, 0x00 ); |
| 147 | } | 149 | } |
| 148 | 150 | ||
| 149 | // turn off all LEDs in the blink control register (not really needed) | 151 | // turn off all LEDs in the blink control register (not really needed) |
| 150 | for ( int i = 0x12; i <= 0x23; i++ ) | 152 | for ( int i = 0x12; i <= 0x23; i++ ) |
| 151 | { | 153 | { |
| 152 | IS31FL3731_write_register( addr, i, 0x00 ); | 154 | ret |= IS31FL3731_write_register( addr, i, 0x00 ); |
| 153 | } | 155 | } |
| 154 | 156 | ||
| 155 | // set PWM on all LEDs to 0 | 157 | // set PWM on all LEDs to 0 |
| 156 | for ( int i = 0x24; i <= 0xB3; i++ ) | 158 | for ( int i = 0x24; i <= 0xB3; i++ ) |
| 157 | { | 159 | { |
| 158 | IS31FL3731_write_register( addr, i, 0x00 ); | 160 | ret |= IS31FL3731_write_register( addr, i, 0x00 ); |
| 159 | } | 161 | } |
| 160 | 162 | ||
| 161 | // select "function register" bank | 163 | // select "function register" bank |
| 162 | IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG ); | 164 | ret |= IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG ); |
| 163 | 165 | ||
| 164 | // disable software shutdown | 166 | // disable software shutdown |
| 165 | IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x01 ); | 167 | ret |= IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x01 ); |
| 166 | 168 | ||
| 167 | // select bank 0 and leave it selected. | 169 | // select bank 0 and leave it selected. |
| 168 | // most usage after initialization is just writing PWM buffers in bank 0 | 170 | // most usage after initialization is just writing PWM buffers in bank 0 |
| 169 | // as there's not much point in double-buffering | 171 | // as there's not much point in double-buffering |
| 170 | IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 ); | 172 | ret |= IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 ); |
| 173 | |||
| 174 | return ret; | ||
| 171 | } | 175 | } |
| 172 | 176 | ||
| 173 | void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) | 177 | void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) |
| @@ -223,25 +227,29 @@ void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, b | |||
| 223 | 227 | ||
| 224 | } | 228 | } |
| 225 | 229 | ||
| 226 | void IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ) | 230 | uint8_t IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ) |
| 227 | { | 231 | { |
| 232 | uint8_t ret = 0; | ||
| 228 | if ( g_pwm_buffer_update_required ) | 233 | if ( g_pwm_buffer_update_required ) |
| 229 | { | 234 | { |
| 230 | IS31FL3731_write_pwm_buffer( addr1, g_pwm_buffer[0] ); | 235 | ret |= IS31FL3731_write_pwm_buffer( addr1, g_pwm_buffer[0] ); |
| 231 | IS31FL3731_write_pwm_buffer( addr2, g_pwm_buffer[1] ); | 236 | ret |= IS31FL3731_write_pwm_buffer( addr2, g_pwm_buffer[1] ); |
| 232 | } | 237 | } |
| 233 | g_pwm_buffer_update_required = false; | 238 | g_pwm_buffer_update_required = false; |
| 239 | return ret; | ||
| 234 | } | 240 | } |
| 235 | 241 | ||
| 236 | void IS31FL3731_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) | 242 | uint8_t IS31FL3731_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) |
| 237 | { | 243 | { |
| 244 | uint8_t ret = 0; | ||
| 238 | if ( g_led_control_registers_update_required ) | 245 | if ( g_led_control_registers_update_required ) |
| 239 | { | 246 | { |
| 240 | for ( int i=0; i<18; i++ ) | 247 | for ( int i=0; i<18; i++ ) |
| 241 | { | 248 | { |
| 242 | IS31FL3731_write_register(addr1, i, g_led_control_registers[0][i] ); | 249 | ret |= IS31FL3731_write_register(addr1, i, g_led_control_registers[0][i] ); |
| 243 | IS31FL3731_write_register(addr2, i, g_led_control_registers[1][i] ); | 250 | ret |= IS31FL3731_write_register(addr2, i, g_led_control_registers[1][i] ); |
| 244 | } | 251 | } |
| 245 | } | 252 | } |
| 253 | return ret; | ||
| 246 | } | 254 | } |
| 247 | 255 | ||
