Skip to content

Commit

Permalink
all led drivers
Browse files Browse the repository at this point in the history
  • Loading branch information
Xelus22 committed Jan 26, 2025
1 parent eba10a7 commit 8d23dd4
Show file tree
Hide file tree
Showing 25 changed files with 469 additions and 219 deletions.
3 changes: 3 additions & 0 deletions drivers/led/apa102.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@

rgb_t apa102_leds[APA102_LED_COUNT];
uint8_t apa102_led_brightness = APA102_DEFAULT_BRIGHTNESS;
bool apa102_dirty = false;

static void apa102_send_byte(uint8_t byte) {
APA102_SEND_BIT(byte, 7);
Expand Down Expand Up @@ -126,6 +127,7 @@ void apa102_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
apa102_leds[index].r = red;
apa102_leds[index].g = green;
apa102_leds[index].b = blue;
apa102_dirty = true;
}

void apa102_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
Expand All @@ -135,6 +137,7 @@ void apa102_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
}

void apa102_flush(void) {
if (!apa102_dirty) return;
apa102_start_frame();
for (uint8_t i = 0; i < APA102_LED_COUNT; i++) {
apa102_send_frame(apa102_leds[i].r, apa102_leds[i].g, apa102_leds[i].b, apa102_led_brightness);
Expand Down
2 changes: 1 addition & 1 deletion drivers/led/issi/is31fl3729-mono.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ void is31fl3729_set_value(int index, uint8_t value) {
return;
}

driver_buffers[led.driver].pwm_buffer[led.v] = value;
driver_buffers[led.driver].pwm_buffer[led.v] = value;
driver_buffers[led.driver].pwm_buffer_dirty[led.v / IS31FL3729_PWM_REGISTERS_PER_CHUNK] = true;
}
}
Expand Down
10 changes: 5 additions & 5 deletions drivers/led/issi/is31fl3731.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,10 @@ const uint8_t i2c_addresses[IS31FL3731_DRIVER_COUNT] = {
// buffers and the transfers in is31fl3731_write_pwm_buffer() but it's
// probably not worth the extra complexity.
typedef struct is31fl3731_driver_t {
uint8_t pwm_buffer[IS31FL3731_PWM_REGISTER_COUNT];
bool pwm_buffer_dirty[IS31FL3731_CHUNK_COUNT];
uint8_t led_control_buffer[IS31FL3731_LED_CONTROL_REGISTER_COUNT];
bool led_control_buffer_dirty;
uint8_t pwm_buffer[IS31FL3731_PWM_REGISTER_COUNT];
bool pwm_buffer_dirty[IS31FL3731_CHUNK_COUNT];
uint8_t led_control_buffer[IS31FL3731_LED_CONTROL_REGISTER_COUNT];
bool led_control_buffer_dirty;
} PACKED is31fl3731_driver_t;

is31fl3731_driver_t driver_buffers[IS31FL3731_DRIVER_COUNT] = {{
Expand Down Expand Up @@ -86,7 +86,7 @@ void is31fl3731_write_pwm_buffer(uint8_t index) {
// Transmit PWM registers in 9 transfers of 16 bytes.

// Iterate over the pwm_buffer contents at 16 byte intervals.
for (uint8_t i = 0; i < IS31FL3731_CHUNK_COUNT; i ++) {
for (uint8_t i = 0; i < IS31FL3731_CHUNK_COUNT; i++) {
if (!driver_buffers[index].pwm_buffer_dirty[i]) {
continue;
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/led/issi/is31fl3733-mono.c
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ void is31fl3733_set_value(int index, uint8_t value) {
return;
}

driver_buffers[led.driver].pwm_buffer[led.v] = value;
driver_buffers[led.driver].pwm_buffer[led.v] = value;
driver_buffers[led.driver].pwm_buffer_dirty[led.v / IS31FL3733_PWM_REGISTERS_PER_CHUNK] = true;
}
}
Expand Down
39 changes: 26 additions & 13 deletions drivers/led/issi/is31fl3736-mono.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@
# define IS31FL3736_GLOBAL_CURRENT 0xFF
#endif

#define IS31FL3736_PWM_REGISTERS_PER_CHUNK 16
#define IS31FL3736_CHUNK_COUNT (IS31FL3736_PWM_REGISTER_COUNT / IS31FL3736_PWM_REGISTERS_PER_CHUNK)

const uint8_t i2c_addresses[IS31FL3736_DRIVER_COUNT] = {
IS31FL3736_I2C_ADDRESS_1,
#ifdef IS31FL3736_I2C_ADDRESS_2
Expand All @@ -68,14 +71,14 @@ const uint8_t i2c_addresses[IS31FL3736_DRIVER_COUNT] = {
// probably not worth the extra complexity.
typedef struct is31fl3736_driver_t {
uint8_t pwm_buffer[IS31FL3736_PWM_REGISTER_COUNT];
bool pwm_buffer_dirty;
bool pwm_buffer_dirty[IS31FL3736_CHUNK_COUNT];
uint8_t led_control_buffer[IS31FL3736_LED_CONTROL_REGISTER_COUNT];
bool led_control_buffer_dirty;
} PACKED is31fl3736_driver_t;

is31fl3736_driver_t driver_buffers[IS31FL3736_DRIVER_COUNT] = {{
.pwm_buffer = {0},
.pwm_buffer_dirty = false,
.pwm_buffer_dirty = {0},
.led_control_buffer = {0},
.led_control_buffer_dirty = false,
}};
Expand All @@ -100,13 +103,21 @@ void is31fl3736_write_pwm_buffer(uint8_t index) {
// Transmit PWM registers in 12 transfers of 16 bytes.

// Iterate over the pwm_buffer contents at 16 byte intervals.
for (uint8_t i = 0; i < IS31FL3736_PWM_REGISTER_COUNT; i += 16) {
for (uint8_t i = 0; i < IS31FL3736_CHUNK_COUNT; i++) {
if (!driver_buffers[index].pwm_buffer_dirty[i]) {
continue;
}

driver_buffers[index].pwm_buffer_dirty[i] = false;

uint8_t offset = i * IS31FL3736_PWM_REGISTERS_PER_CHUNK;

#if IS31FL3736_I2C_PERSISTENCE > 0
for (uint8_t j = 0; j < IS31FL3736_I2C_PERSISTENCE; j++) {
if (i2c_write_register(i2c_addresses[index] << 1, i, driver_buffers[index].pwm_buffer + i, 16, IS31FL3736_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break;
if (i2c_write_register(i2c_addresses[index] << 1, offset, driver_buffers[index].pwm_buffer + offset, IS31FL3736_PWM_REGISTERS_PER_CHUNK, IS31FL3736_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break;
}
#else
i2c_write_register(i2c_addresses[index] << 1, i, driver_buffers[index].pwm_buffer + i, 16, IS31FL3736_I2C_TIMEOUT);
i2c_write_register(i2c_addresses[index] << 1, offset, driver_buffers[index].pwm_buffer + offset, IS31FL3736_PWM_REGISTERS_PER_CHUNK, IS31FL3736_I2C_TIMEOUT);
#endif
}
}
Expand Down Expand Up @@ -178,8 +189,8 @@ void is31fl3736_set_value(int index, uint8_t value) {
return;
}

driver_buffers[led.driver].pwm_buffer[led.v] = value;
driver_buffers[led.driver].pwm_buffer_dirty = true;
driver_buffers[led.driver].pwm_buffer[led.v] = value;
driver_buffers[led.driver].pwm_buffer_dirty[led.v / IS31FL3736_PWM_REGISTERS_PER_CHUNK] = true;
}
}

Expand Down Expand Up @@ -212,12 +223,14 @@ void is31fl3736_set_led_control_register(uint8_t index, bool value) {
}

void is31fl3736_update_pwm_buffers(uint8_t index) {
if (driver_buffers[index].pwm_buffer_dirty) {
is31fl3736_select_page(index, IS31FL3736_COMMAND_PWM);

is31fl3736_write_pwm_buffer(index);

driver_buffers[index].pwm_buffer_dirty = false;
for (uint8_t i = 0; i < IS31FL3736_CHUNK_COUNT; i++) {
if (driver_buffers[index].pwm_buffer_dirty[i]) {
// if any of these are true then write PWM buffer
// then exit the loop
is31fl3736_select_page(index, IS31FL3736_COMMAND_PWM);
is31fl3736_write_pwm_buffer(index);
return;
}
}
}

Expand Down
45 changes: 30 additions & 15 deletions drivers/led/issi/is31fl3736.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@
# define IS31FL3736_GLOBAL_CURRENT 0xFF
#endif

#define IS31FL3736_PWM_REGISTERS_PER_CHUNK 16
#define IS31FL3736_CHUNK_COUNT (IS31FL3736_PWM_REGISTER_COUNT / IS31FL3736_PWM_REGISTERS_PER_CHUNK)

const uint8_t i2c_addresses[IS31FL3736_DRIVER_COUNT] = {
IS31FL3736_I2C_ADDRESS_1,
#ifdef IS31FL3736_I2C_ADDRESS_2
Expand All @@ -68,14 +71,14 @@ const uint8_t i2c_addresses[IS31FL3736_DRIVER_COUNT] = {
// probably not worth the extra complexity.
typedef struct is31fl3736_driver_t {
uint8_t pwm_buffer[IS31FL3736_PWM_REGISTER_COUNT];
bool pwm_buffer_dirty;
bool pwm_buffer_dirty[IS31FL3736_CHUNK_COUNT];
uint8_t led_control_buffer[IS31FL3736_LED_CONTROL_REGISTER_COUNT];
bool led_control_buffer_dirty;
} PACKED is31fl3736_driver_t;

is31fl3736_driver_t driver_buffers[IS31FL3736_DRIVER_COUNT] = {{
.pwm_buffer = {0},
.pwm_buffer_dirty = false,
.pwm_buffer_dirty = {0},
.led_control_buffer = {0},
.led_control_buffer_dirty = false,
}};
Expand All @@ -100,13 +103,21 @@ void is31fl3736_write_pwm_buffer(uint8_t index) {
// Transmit PWM registers in 12 transfers of 16 bytes.

// Iterate over the pwm_buffer contents at 16 byte intervals.
for (uint8_t i = 0; i < IS31FL3736_PWM_REGISTER_COUNT; i += 16) {
for (uint8_t i = 0; i < IS31FL3736_CHUNK_COUNT; i++) {
if (!driver_buffers[index].pwm_buffer_dirty[i]) {
continue;
}

driver_buffers[index].pwm_buffer_dirty[i] = false;

uint8_t offset = i * IS31FL3736_PWM_REGISTERS_PER_CHUNK;

#if IS31FL3736_I2C_PERSISTENCE > 0
for (uint8_t j = 0; j < IS31FL3736_I2C_PERSISTENCE; j++) {
if (i2c_write_register(i2c_addresses[index] << 1, i, driver_buffers[index].pwm_buffer + i, 16, IS31FL3736_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break;
if (i2c_write_register(i2c_addresses[index] << 1, offset, driver_buffers[index].pwm_buffer + offset, IS31FL3736_PWM_REGISTERS_PER_CHUNK, IS31FL3736_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break;
}
#else
i2c_write_register(i2c_addresses[index] << 1, i, driver_buffers[index].pwm_buffer + i, 16, IS31FL3736_I2C_TIMEOUT);
i2c_write_register(i2c_addresses[index] << 1, offset, driver_buffers[index].pwm_buffer + offset, IS31FL3736_PWM_REGISTERS_PER_CHUNK, IS31FL3736_I2C_TIMEOUT);
#endif
}
}
Expand Down Expand Up @@ -178,10 +189,12 @@ void is31fl3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
return;
}

driver_buffers[led.driver].pwm_buffer[led.r] = red;
driver_buffers[led.driver].pwm_buffer[led.g] = green;
driver_buffers[led.driver].pwm_buffer[led.b] = blue;
driver_buffers[led.driver].pwm_buffer_dirty = true;
driver_buffers[led.driver].pwm_buffer[led.r] = red;
driver_buffers[led.driver].pwm_buffer[led.g] = green;
driver_buffers[led.driver].pwm_buffer[led.b] = blue;
driver_buffers[led.driver].pwm_buffer_dirty[led.r / IS31FL3736_PWM_REGISTERS_PER_CHUNK] = true;
driver_buffers[led.driver].pwm_buffer_dirty[led.g / IS31FL3736_PWM_REGISTERS_PER_CHUNK] = true;
driver_buffers[led.driver].pwm_buffer_dirty[led.b / IS31FL3736_PWM_REGISTERS_PER_CHUNK] = true;
}
}

Expand Down Expand Up @@ -229,12 +242,14 @@ void is31fl3736_set_led_control_register(uint8_t index, bool red, bool green, bo
}

void is31fl3736_update_pwm_buffers(uint8_t index) {
if (driver_buffers[index].pwm_buffer_dirty) {
is31fl3736_select_page(index, IS31FL3736_COMMAND_PWM);

is31fl3736_write_pwm_buffer(index);

driver_buffers[index].pwm_buffer_dirty = false;
for (uint8_t i = 0; i < IS31FL3736_CHUNK_COUNT; i++) {
if (driver_buffers[index].pwm_buffer_dirty[i]) {
// if any of these are true then write PWM buffer
// then exit the loop
is31fl3736_select_page(index, IS31FL3736_COMMAND_PWM);
is31fl3736_write_pwm_buffer(index);
return;
}
}
}

Expand Down
37 changes: 25 additions & 12 deletions drivers/led/issi/is31fl3737-mono.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@
# define IS31FL3737_GLOBAL_CURRENT 0xFF
#endif

#define IS31FL3737_PWM_REGISTERS_PER_CHUNK 16
#define IS31FL3737_CHUNK_COUNT (IS31FL3737_PWM_REGISTER_COUNT / IS31FL3737_PWM_REGISTERS_PER_CHUNK)

const uint8_t i2c_addresses[IS31FL3737_DRIVER_COUNT] = {
IS31FL3737_I2C_ADDRESS_1,
#ifdef IS31FL3737_I2C_ADDRESS_2
Expand All @@ -70,7 +73,7 @@ const uint8_t i2c_addresses[IS31FL3737_DRIVER_COUNT] = {
// probably not worth the extra complexity.
typedef struct is31fl3737_driver_t {
uint8_t pwm_buffer[IS31FL3737_PWM_REGISTER_COUNT];
bool pwm_buffer_dirty;
bool pwm_buffer_dirty[IS31FL3737_CHUNK_COUNT];
uint8_t led_control_buffer[IS31FL3737_LED_CONTROL_REGISTER_COUNT];
bool led_control_buffer_dirty;
} PACKED is31fl3737_driver_t;
Expand Down Expand Up @@ -102,13 +105,21 @@ void is31fl3737_write_pwm_buffer(uint8_t index) {
// Transmit PWM registers in 12 transfers of 16 bytes.

// Iterate over the pwm_buffer contents at 16 byte intervals.
for (uint8_t i = 0; i < IS31FL3737_PWM_REGISTER_COUNT; i += 16) {
for (uint8_t i = 0; i < IS31FL3737_CHUNK_COUNT; i += 16) {
if (!driver_buffers[index].pwm_buffer_dirty[i]) {
continue;
}

driver_buffers[index].pwm_buffer_dirty[i] = false;

uint8_t offset = i * IS31FL3737_PWM_REGISTERS_PER_CHUNK;

#if IS31FL3737_I2C_PERSISTENCE > 0
for (uint8_t j = 0; j < IS31FL3737_I2C_PERSISTENCE; j++) {
if (i2c_write_register(i2c_addresses[index] << 1, i, driver_buffers[index].pwm_buffer + i, 16, IS31FL3737_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break;
if (i2c_write_register(i2c_addresses[index] << 1, offset, driver_buffers[index].pwm_buffer + offset, IS31FL3737_PWM_REGISTERS_PER_CHUNK, IS31FL3737_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break;
}
#else
i2c_write_register(i2c_addresses[index] << 1, i, driver_buffers[index].pwm_buffer + i, 16, IS31FL3737_I2C_TIMEOUT);
i2c_write_register(i2c_addresses[index] << 1, offset, driver_buffers[index].pwm_buffer + offset, IS31FL3737_PWM_REGISTERS_PER_CHUNK, IS31FL3737_I2C_TIMEOUT);
#endif
}
}
Expand Down Expand Up @@ -180,8 +191,8 @@ void is31fl3737_set_value(int index, uint8_t value) {
return;
}

driver_buffers[led.driver].pwm_buffer[led.v] = value;
driver_buffers[led.driver].pwm_buffer_dirty = true;
driver_buffers[led.driver].pwm_buffer[led.v] = value;
driver_buffers[led.driver].pwm_buffer_dirty[led.v / IS31FL3737_PWM_REGISTERS_PER_CHUNK] = true;
}
}

Expand All @@ -208,12 +219,14 @@ void is31fl3737_set_led_control_register(uint8_t index, bool value) {
}

void is31fl3737_update_pwm_buffers(uint8_t index) {
if (driver_buffers[index].pwm_buffer_dirty) {
is31fl3737_select_page(index, IS31FL3737_COMMAND_PWM);

is31fl3737_write_pwm_buffer(index);

driver_buffers[index].pwm_buffer_dirty = false;
for (uint8_t i = 0; i < IS31FL3737_CHUNK_COUNT; i++) {
if (driver_buffers[index].pwm_buffer_dirty[i]) {
// if any of these are true then write PWM buffer
// then exit the loop
is31fl3737_select_page(index, IS31FL3737_COMMAND_PWM);
is31fl3737_write_pwm_buffer(index);
return;
}
}
}

Expand Down
Loading

0 comments on commit 8d23dd4

Please sign in to comment.