diff options
| author | Ryan <fauxpark@gmail.com> | 2024-03-18 22:03:27 +1100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-18 22:03:27 +1100 |
| commit | f7cf40fa77164d7be9358ce83f7f5939d71b38bc (patch) | |
| tree | 812acccac18212ae685a4dbc5e25fbe216b787ea /platforms | |
| parent | 23b7a02ebe2e6df738baa624c17e821c1573b69b (diff) | |
Add init function to RGBLight driver struct (#23076)
Diffstat (limited to 'platforms')
| -rw-r--r-- | platforms/avr/drivers/ws2812_bitbang.c | 4 | ||||
| -rw-r--r-- | platforms/avr/drivers/ws2812_i2c.c | 6 | ||||
| -rw-r--r-- | platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c | 11 | ||||
| -rw-r--r-- | platforms/chibios/drivers/ws2812_bitbang.c | 6 | ||||
| -rw-r--r-- | platforms/chibios/drivers/ws2812_pwm.c | 6 | ||||
| -rw-r--r-- | platforms/chibios/drivers/ws2812_spi.c | 6 |
6 files changed, 5 insertions, 34 deletions
diff --git a/platforms/avr/drivers/ws2812_bitbang.c b/platforms/avr/drivers/ws2812_bitbang.c index 116053591f..be127e501c 100644 --- a/platforms/avr/drivers/ws2812_bitbang.c +++ b/platforms/avr/drivers/ws2812_bitbang.c | |||
| @@ -37,9 +37,11 @@ | |||
| 37 | 37 | ||
| 38 | static inline void ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t masklo, uint8_t maskhi); | 38 | static inline void ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t masklo, uint8_t maskhi); |
| 39 | 39 | ||
| 40 | void ws2812_setleds(rgb_led_t *ledarray, uint16_t number_of_leds) { | 40 | void ws2812_init(void) { |
| 41 | DDRx_ADDRESS(WS2812_DI_PIN) |= pinmask(WS2812_DI_PIN); | 41 | DDRx_ADDRESS(WS2812_DI_PIN) |= pinmask(WS2812_DI_PIN); |
| 42 | } | ||
| 42 | 43 | ||
| 44 | void ws2812_setleds(rgb_led_t *ledarray, uint16_t number_of_leds) { | ||
| 43 | uint8_t masklo = ~(pinmask(WS2812_DI_PIN)) & PORTx_ADDRESS(WS2812_DI_PIN); | 45 | uint8_t masklo = ~(pinmask(WS2812_DI_PIN)) & PORTx_ADDRESS(WS2812_DI_PIN); |
| 44 | uint8_t maskhi = pinmask(WS2812_DI_PIN) | PORTx_ADDRESS(WS2812_DI_PIN); | 46 | uint8_t maskhi = pinmask(WS2812_DI_PIN) | PORTx_ADDRESS(WS2812_DI_PIN); |
| 45 | 47 | ||
diff --git a/platforms/avr/drivers/ws2812_i2c.c b/platforms/avr/drivers/ws2812_i2c.c index f52a037b8e..60b466c32a 100644 --- a/platforms/avr/drivers/ws2812_i2c.c +++ b/platforms/avr/drivers/ws2812_i2c.c | |||
| @@ -19,11 +19,5 @@ void ws2812_init(void) { | |||
| 19 | 19 | ||
| 20 | // Setleds for standard RGB | 20 | // Setleds for standard RGB |
| 21 | void ws2812_setleds(rgb_led_t *ledarray, uint16_t leds) { | 21 | void ws2812_setleds(rgb_led_t *ledarray, uint16_t leds) { |
| 22 | static bool s_init = false; | ||
| 23 | if (!s_init) { | ||
| 24 | ws2812_init(); | ||
| 25 | s_init = true; | ||
| 26 | } | ||
| 27 | |||
| 28 | i2c_transmit(WS2812_I2C_ADDRESS, (uint8_t *)ledarray, sizeof(rgb_led_t) * leds, WS2812_I2C_TIMEOUT); | 22 | i2c_transmit(WS2812_I2C_ADDRESS, (uint8_t *)ledarray, sizeof(rgb_led_t) * leds, WS2812_I2C_TIMEOUT); |
| 29 | } | 23 | } |
diff --git a/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c b/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c index 799d96b3c6..95a827e4b8 100644 --- a/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c +++ b/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c | |||
| @@ -177,7 +177,7 @@ static void ws2812_dma_callback(void* p, uint32_t ct) { | |||
| 177 | osalSysUnlockFromISR(); | 177 | osalSysUnlockFromISR(); |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | bool ws2812_init(void) { | 180 | void ws2812_init(void) { |
| 181 | uint pio_idx = pio_get_index(pio); | 181 | uint pio_idx = pio_get_index(pio); |
| 182 | /* Get PIOx peripheral out of reset state. */ | 182 | /* Get PIOx peripheral out of reset state. */ |
| 183 | hal_lld_peripheral_unreset(pio_idx == 0 ? RESETS_ALLREG_PIO0 : RESETS_ALLREG_PIO1); | 183 | hal_lld_peripheral_unreset(pio_idx == 0 ? RESETS_ALLREG_PIO0 : RESETS_ALLREG_PIO1); |
| @@ -196,7 +196,7 @@ bool ws2812_init(void) { | |||
| 196 | STATE_MACHINE = pio_claim_unused_sm(pio, true); | 196 | STATE_MACHINE = pio_claim_unused_sm(pio, true); |
| 197 | if (STATE_MACHINE < 0) { | 197 | if (STATE_MACHINE < 0) { |
| 198 | dprintln("ERROR: Failed to acquire state machine for WS2812 output!"); | 198 | dprintln("ERROR: Failed to acquire state machine for WS2812 output!"); |
| 199 | return false; | 199 | return; |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | uint offset = pio_add_program(pio, &ws2812_program); | 202 | uint offset = pio_add_program(pio, &ws2812_program); |
| @@ -246,8 +246,6 @@ bool ws2812_init(void) { | |||
| 246 | DMA_CTRL_TRIG_TREQ_SEL(pio == pio0 ? STATE_MACHINE : STATE_MACHINE + 8) | | 246 | DMA_CTRL_TRIG_TREQ_SEL(pio == pio0 ? STATE_MACHINE : STATE_MACHINE + 8) | |
| 247 | DMA_CTRL_TRIG_PRIORITY(RP_DMA_PRIORITY_WS2812); | 247 | DMA_CTRL_TRIG_PRIORITY(RP_DMA_PRIORITY_WS2812); |
| 248 | // clang-format on | 248 | // clang-format on |
| 249 | |||
| 250 | return true; | ||
| 251 | } | 249 | } |
| 252 | 250 | ||
| 253 | static inline void sync_ws2812_transfer(void) { | 251 | static inline void sync_ws2812_transfer(void) { |
| @@ -269,11 +267,6 @@ static inline void sync_ws2812_transfer(void) { | |||
| 269 | } | 267 | } |
| 270 | 268 | ||
| 271 | void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { | 269 | void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { |
| 272 | static bool is_initialized = false; | ||
| 273 | if (unlikely(!is_initialized)) { | ||
| 274 | is_initialized = ws2812_init(); | ||
| 275 | } | ||
| 276 | |||
| 277 | sync_ws2812_transfer(); | 270 | sync_ws2812_transfer(); |
| 278 | 271 | ||
| 279 | for (int i = 0; i < leds; i++) { | 272 | for (int i = 0; i < leds; i++) { |
diff --git a/platforms/chibios/drivers/ws2812_bitbang.c b/platforms/chibios/drivers/ws2812_bitbang.c index 1ed87c4381..9ed6bacd5a 100644 --- a/platforms/chibios/drivers/ws2812_bitbang.c +++ b/platforms/chibios/drivers/ws2812_bitbang.c | |||
| @@ -82,12 +82,6 @@ void ws2812_init(void) { | |||
| 82 | 82 | ||
| 83 | // Setleds for standard RGB | 83 | // Setleds for standard RGB |
| 84 | void ws2812_setleds(rgb_led_t *ledarray, uint16_t leds) { | 84 | void ws2812_setleds(rgb_led_t *ledarray, uint16_t leds) { |
| 85 | static bool s_init = false; | ||
| 86 | if (!s_init) { | ||
| 87 | ws2812_init(); | ||
| 88 | s_init = true; | ||
| 89 | } | ||
| 90 | |||
| 91 | // this code is very time dependent, so we need to disable interrupts | 85 | // this code is very time dependent, so we need to disable interrupts |
| 92 | chSysLock(); | 86 | chSysLock(); |
| 93 | 87 | ||
diff --git a/platforms/chibios/drivers/ws2812_pwm.c b/platforms/chibios/drivers/ws2812_pwm.c index e0b3bfd5b5..7dc3414ead 100644 --- a/platforms/chibios/drivers/ws2812_pwm.c +++ b/platforms/chibios/drivers/ws2812_pwm.c | |||
| @@ -389,12 +389,6 @@ void ws2812_write_led_rgbw(uint16_t led_number, uint8_t r, uint8_t g, uint8_t b, | |||
| 389 | 389 | ||
| 390 | // Setleds for standard RGB | 390 | // Setleds for standard RGB |
| 391 | void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { | 391 | void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { |
| 392 | static bool s_init = false; | ||
| 393 | if (!s_init) { | ||
| 394 | ws2812_init(); | ||
| 395 | s_init = true; | ||
| 396 | } | ||
| 397 | |||
| 398 | for (uint16_t i = 0; i < leds; i++) { | 392 | for (uint16_t i = 0; i < leds; i++) { |
| 399 | #ifdef RGBW | 393 | #ifdef RGBW |
| 400 | ws2812_write_led_rgbw(i, ledarray[i].r, ledarray[i].g, ledarray[i].b, ledarray[i].w); | 394 | ws2812_write_led_rgbw(i, ledarray[i].r, ledarray[i].g, ledarray[i].b, ledarray[i].w); |
diff --git a/platforms/chibios/drivers/ws2812_spi.c b/platforms/chibios/drivers/ws2812_spi.c index 01162f07f4..5b990ccaa0 100644 --- a/platforms/chibios/drivers/ws2812_spi.c +++ b/platforms/chibios/drivers/ws2812_spi.c | |||
| @@ -188,12 +188,6 @@ void ws2812_init(void) { | |||
| 188 | } | 188 | } |
| 189 | 189 | ||
| 190 | void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { | 190 | void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { |
| 191 | static bool s_init = false; | ||
| 192 | if (!s_init) { | ||
| 193 | ws2812_init(); | ||
| 194 | s_init = true; | ||
| 195 | } | ||
| 196 | |||
| 197 | for (uint8_t i = 0; i < leds; i++) { | 191 | for (uint8_t i = 0; i < leds; i++) { |
| 198 | set_led_color_rgb(ledarray[i], i); | 192 | set_led_color_rgb(ledarray[i], i); |
| 199 | } | 193 | } |
