aboutsummaryrefslogtreecommitdiff
path: root/drivers/issi/is31fl3731-simple.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/issi/is31fl3731-simple.c')
-rw-r--r--drivers/issi/is31fl3731-simple.c71
1 files changed, 34 insertions, 37 deletions
diff --git a/drivers/issi/is31fl3731-simple.c b/drivers/issi/is31fl3731-simple.c
index a7faa9c38..fad4676de 100644
--- a/drivers/issi/is31fl3731-simple.c
+++ b/drivers/issi/is31fl3731-simple.c
@@ -17,11 +17,11 @@
17 */ 17 */
18 18
19#ifdef __AVR__ 19#ifdef __AVR__
20#include <avr/interrupt.h> 20# include <avr/interrupt.h>
21#include <avr/io.h> 21# include <avr/io.h>
22#include <util/delay.h> 22# include <util/delay.h>
23#else 23#else
24#include "wait.h" 24# include "wait.h"
25#endif 25#endif
26 26
27#include <stdint.h> 27#include <stdint.h>
@@ -41,7 +41,7 @@
41// 0b1110110 AD <-> SDA 41// 0b1110110 AD <-> SDA
42#define ISSI_ADDR_DEFAULT 0x74 42#define ISSI_ADDR_DEFAULT 0x74
43 43
44#define ISSI_REG_CONFIG 0x00 44#define ISSI_REG_CONFIG 0x00
45#define ISSI_REG_CONFIG_PICTUREMODE 0x00 45#define ISSI_REG_CONFIG_PICTUREMODE 0x00
46#define ISSI_REG_CONFIG_AUTOPLAYMODE 0x08 46#define ISSI_REG_CONFIG_AUTOPLAYMODE 0x08
47#define ISSI_REG_CONFIG_AUDIOPLAYMODE 0x18 47#define ISSI_REG_CONFIG_AUDIOPLAYMODE 0x18
@@ -50,20 +50,20 @@
50#define ISSI_CONF_AUTOFRAMEMODE 0x04 50#define ISSI_CONF_AUTOFRAMEMODE 0x04
51#define ISSI_CONF_AUDIOMODE 0x08 51#define ISSI_CONF_AUDIOMODE 0x08
52 52
53#define ISSI_REG_PICTUREFRAME 0x01 53#define ISSI_REG_PICTUREFRAME 0x01
54 54
55#define ISSI_REG_SHUTDOWN 0x0A 55#define ISSI_REG_SHUTDOWN 0x0A
56#define ISSI_REG_AUDIOSYNC 0x06 56#define ISSI_REG_AUDIOSYNC 0x06
57 57
58#define ISSI_COMMANDREGISTER 0xFD 58#define ISSI_COMMANDREGISTER 0xFD
59#define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine' 59#define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine'
60 60
61#ifndef ISSI_TIMEOUT 61#ifndef ISSI_TIMEOUT
62 #define ISSI_TIMEOUT 100 62# define ISSI_TIMEOUT 100
63#endif 63#endif
64 64
65#ifndef ISSI_PERSISTENCE 65#ifndef ISSI_PERSISTENCE
66 #define ISSI_PERSISTENCE 0 66# define ISSI_PERSISTENCE 0
67#endif 67#endif
68 68
69// Transfer buffer for TWITransmitData() 69// Transfer buffer for TWITransmitData()
@@ -75,17 +75,17 @@ uint8_t g_twi_transfer_buffer[20];
75// buffers and the transfers in IS31FL3731_write_pwm_buffer() but it's 75// buffers and the transfers in IS31FL3731_write_pwm_buffer() but it's
76// probably not worth the extra complexity. 76// probably not worth the extra complexity.
77uint8_t g_pwm_buffer[LED_DRIVER_COUNT][144]; 77uint8_t g_pwm_buffer[LED_DRIVER_COUNT][144];
78bool g_pwm_buffer_update_required = false; 78bool g_pwm_buffer_update_required = false;
79 79
80/* There's probably a better way to init this... */ 80/* There's probably a better way to init this... */
81#if LED_DRIVER_COUNT == 1 81#if LED_DRIVER_COUNT == 1
82 uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}}; 82uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}};
83#elif LED_DRIVER_COUNT == 2 83#elif LED_DRIVER_COUNT == 2
84 uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}}; 84uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}};
85#elif LED_DRIVER_COUNT == 3 85#elif LED_DRIVER_COUNT == 3
86 uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}}; 86uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}};
87#elif LED_DRIVER_COUNT == 4 87#elif LED_DRIVER_COUNT == 4
88 uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}, {0}}; 88uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}, {0}};
89#endif 89#endif
90bool g_led_control_registers_update_required = false; 90bool g_led_control_registers_update_required = false;
91 91
@@ -103,20 +103,19 @@ bool g_led_control_registers_update_required = false;
103// 0x0E - R17,G15,G14,G13,G12,G11,G10,G09 103// 0x0E - R17,G15,G14,G13,G12,G11,G10,G09
104// 0x10 - R16,R15,R14,R13,R12,R11,R10,R09 104// 0x10 - R16,R15,R14,R13,R12,R11,R10,R09
105 105
106
107void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) { 106void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
108 g_twi_transfer_buffer[0] = reg; 107 g_twi_transfer_buffer[0] = reg;
109 g_twi_transfer_buffer[1] = data; 108 g_twi_transfer_buffer[1] = data;
110 109
111 #if ISSI_PERSISTENCE > 0 110#if ISSI_PERSISTENCE > 0
112 for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { 111 for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
113 if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) { 112 if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) {
114 break; 113 break;
115 }
116 } 114 }
117 #else 115 }
118 i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); 116#else
119 #endif 117 i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
118#endif
120} 119}
121 120
122void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) { 121void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
@@ -136,14 +135,13 @@ void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
136 g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j]; 135 g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
137 } 136 }
138 137
139 #if ISSI_PERSISTENCE > 0 138#if ISSI_PERSISTENCE > 0
140 for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { 139 for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
141 if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) 140 if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) break;
142 break; 141 }
143 } 142#else
144 #else 143 i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
145 i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT); 144#endif
146 #endif
147 } 145 }
148} 146}
149 147
@@ -196,7 +194,6 @@ void IS31FL3731_init(uint8_t addr) {
196 // most usage after initialization is just writing PWM buffers in bank 0 194 // most usage after initialization is just writing PWM buffers in bank 0
197 // as there's not much point in double-buffering 195 // as there's not much point in double-buffering
198 IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0); 196 IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
199
200} 197}
201 198
202void IS31FL3731_set_value(int index, uint8_t value) { 199void IS31FL3731_set_value(int index, uint8_t value) {
@@ -205,7 +202,7 @@ void IS31FL3731_set_value(int index, uint8_t value) {
205 202
206 // Subtract 0x24 to get the second index of g_pwm_buffer 203 // Subtract 0x24 to get the second index of g_pwm_buffer
207 g_pwm_buffer[led.driver][led.v - 0x24] = value; 204 g_pwm_buffer[led.driver][led.v - 0x24] = value;
208 g_pwm_buffer_update_required = true; 205 g_pwm_buffer_update_required = true;
209 } 206 }
210} 207}
211 208
@@ -216,10 +213,10 @@ void IS31FL3731_set_value_all(uint8_t value) {
216} 213}
217 214
218void IS31FL3731_set_led_control_register(uint8_t index, bool value) { 215void IS31FL3731_set_led_control_register(uint8_t index, bool value) {
219 is31_led led = g_is31_leds[index]; 216 is31_led led = g_is31_leds[index];
220 217
221 uint8_t control_register = (led.v - 0x24) / 8; 218 uint8_t control_register = (led.v - 0x24) / 8;
222 uint8_t bit_value = (led.v - 0x24) % 8; 219 uint8_t bit_value = (led.v - 0x24) % 8;
223 220
224 if (value) { 221 if (value) {
225 g_led_control_registers[led.driver][control_register] |= (1 << bit_value); 222 g_led_control_registers[led.driver][control_register] |= (1 << bit_value);
@@ -239,7 +236,7 @@ void IS31FL3731_update_pwm_buffers(uint8_t addr, uint8_t index) {
239 236
240void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index) { 237void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index) {
241 if (g_led_control_registers_update_required) { 238 if (g_led_control_registers_update_required) {
242 for (int i=0; i<18; i++) { 239 for (int i = 0; i < 18; i++) {
243 IS31FL3731_write_register(addr, i, g_led_control_registers[index][i]); 240 IS31FL3731_write_register(addr, i, g_led_control_registers[index][i]);
244 } 241 }
245 } 242 }