diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/awinic/aw20216.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/drivers/awinic/aw20216.c b/drivers/awinic/aw20216.c index 269bb3a59..776653fa6 100644 --- a/drivers/awinic/aw20216.c +++ b/drivers/awinic/aw20216.c | |||
| @@ -43,6 +43,10 @@ | |||
| 43 | #define AW_CONFIG_DEFAULT 0b10110000 | 43 | #define AW_CONFIG_DEFAULT 0b10110000 |
| 44 | #define AW_CHIPEN 1 | 44 | #define AW_CHIPEN 1 |
| 45 | 45 | ||
| 46 | #define AW_PWM_REGISTER_COUNT 216 | ||
| 47 | |||
| 48 | #define AW_SPI_START(PIN) spi_start(PIN, false, 0, AW_SPI_DIVISOR) | ||
| 49 | |||
| 46 | #ifndef AW_SCALING_MAX | 50 | #ifndef AW_SCALING_MAX |
| 47 | # define AW_SCALING_MAX 150 | 51 | # define AW_SCALING_MAX 150 |
| 48 | #endif | 52 | #endif |
| @@ -63,13 +67,13 @@ | |||
| 63 | # define AW_SPI_DIVISOR 4 | 67 | # define AW_SPI_DIVISOR 4 |
| 64 | #endif | 68 | #endif |
| 65 | 69 | ||
| 66 | uint8_t g_spi_transfer_buffer[20] = {0}; | 70 | uint8_t g_spi_transfer_buffer[3] = {0}; |
| 67 | aw_led g_pwm_buffer[DRIVER_LED_TOTAL]; | 71 | uint8_t g_pwm_buffer[DRIVER_COUNT][AW_PWM_REGISTER_COUNT]; |
| 68 | bool g_pwm_buffer_update_required[DRIVER_LED_TOTAL]; | 72 | bool g_pwm_buffer_update_required[DRIVER_COUNT] = {false}; |
| 69 | 73 | ||
| 70 | bool AW20216_write_register(pin_t slave_pin, uint8_t page, uint8_t reg, uint8_t data) { | 74 | bool AW20216_write_register(pin_t slave_pin, uint8_t page, uint8_t reg, uint8_t data) { |
| 71 | // Do we need to call spi_stop() if this fails? | 75 | // Do we need to call spi_stop() if this fails? |
| 72 | if (!spi_start(slave_pin, false, 0, AW_SPI_DIVISOR)) { | 76 | if (!AW_SPI_START(slave_pin)) { |
| 73 | return false; | 77 | return false; |
| 74 | } | 78 | } |
| 75 | 79 | ||
| @@ -147,10 +151,11 @@ void AW20216_init(void) { | |||
| 147 | } | 151 | } |
| 148 | 152 | ||
| 149 | void AW20216_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) { | 153 | void AW20216_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) { |
| 150 | g_pwm_buffer[index].r = red; | 154 | aw_led led = g_aw_leds[index]; |
| 151 | g_pwm_buffer[index].g = green; | 155 | g_pwm_buffer[led.driver][led.r] = red; |
| 152 | g_pwm_buffer[index].b = blue; | 156 | g_pwm_buffer[led.driver][led.g] = green; |
| 153 | g_pwm_buffer_update_required[index] = true; | 157 | g_pwm_buffer[led.driver][led.b] = blue; |
| 158 | g_pwm_buffer_update_required[led.driver] = true; | ||
| 154 | return; | 159 | return; |
| 155 | } | 160 | } |
| 156 | void AW20216_set_color_all(uint8_t red, uint8_t green, uint8_t blue) { | 161 | void AW20216_set_color_all(uint8_t red, uint8_t green, uint8_t blue) { |
| @@ -159,12 +164,19 @@ void AW20216_set_color_all(uint8_t red, uint8_t green, uint8_t blue) { | |||
| 159 | } | 164 | } |
| 160 | return; | 165 | return; |
| 161 | } | 166 | } |
| 167 | |||
| 168 | void AW20216_write_pwm_buffer(pin_t slave_pin, uint8_t buffer_idx) { | ||
| 169 | AW_SPI_START(slave_pin); | ||
| 170 | spi_write((AWINIC_ID | AW_PAGE_PWM | AW_WRITE)); | ||
| 171 | spi_write(0); | ||
| 172 | spi_transmit(g_pwm_buffer[buffer_idx], AW_PWM_REGISTER_COUNT); | ||
| 173 | spi_stop(); | ||
| 174 | } | ||
| 175 | |||
| 162 | void AW20216_update_pwm_buffers(void) { | 176 | void AW20216_update_pwm_buffers(void) { |
| 163 | for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { | 177 | AW20216_write_pwm_buffer(DRIVER_1_CS, 0); |
| 164 | if (g_pwm_buffer_update_required[i]) { | 178 | #ifdef DRIVER_2_CS |
| 165 | AW20216_update_pwm(i, g_pwm_buffer[i].r, g_pwm_buffer[i].g, g_pwm_buffer[i].b); | 179 | AW20216_write_pwm_buffer(DRIVER_2_CS, 1); |
| 166 | g_pwm_buffer_update_required[i] = false; | 180 | #endif |
| 167 | } | ||
| 168 | } | ||
| 169 | return; | 181 | return; |
| 170 | } | 182 | } |
