diff options
Diffstat (limited to 'drivers/issi/is31fl3731-simple.c')
| -rw-r--r-- | drivers/issi/is31fl3731-simple.c | 71 |
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. |
| 77 | uint8_t g_pwm_buffer[LED_DRIVER_COUNT][144]; | 77 | uint8_t g_pwm_buffer[LED_DRIVER_COUNT][144]; |
| 78 | bool g_pwm_buffer_update_required = false; | 78 | bool 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}}; | 82 | uint8_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}}; | 84 | uint8_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}}; | 86 | uint8_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}}; | 88 | uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}, {0}}; |
| 89 | #endif | 89 | #endif |
| 90 | bool g_led_control_registers_update_required = false; | 90 | bool 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 | |||
| 107 | void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) { | 106 | void 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 | ||
| 122 | void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) { | 121 | void 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 | ||
| 202 | void IS31FL3731_set_value(int index, uint8_t value) { | 199 | void 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 | ||
| 218 | void IS31FL3731_set_led_control_register(uint8_t index, bool value) { | 215 | void 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 | ||
| 240 | void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index) { | 237 | void 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 | } |
