aboutsummaryrefslogtreecommitdiff
path: root/drivers/avr/is31fl3731.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/avr/is31fl3731.c')
-rw-r--r--drivers/avr/is31fl3731.c56
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
81void IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data ) 81uint8_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
91void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) 91uint8_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
118void IS31FL3731_init( uint8_t addr ) 119uint8_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
173void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) 177void 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
226void IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ) 230uint8_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
236void IS31FL3731_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) 242uint8_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