summaryrefslogtreecommitdiff
path: root/platforms
diff options
context:
space:
mode:
authorRyan <fauxpark@gmail.com>2024-03-18 22:03:27 +1100
committerGitHub <noreply@github.com>2024-03-18 22:03:27 +1100
commitf7cf40fa77164d7be9358ce83f7f5939d71b38bc (patch)
tree812acccac18212ae685a4dbc5e25fbe216b787ea /platforms
parent23b7a02ebe2e6df738baa624c17e821c1573b69b (diff)
Add init function to RGBLight driver struct (#23076)
Diffstat (limited to 'platforms')
-rw-r--r--platforms/avr/drivers/ws2812_bitbang.c4
-rw-r--r--platforms/avr/drivers/ws2812_i2c.c6
-rw-r--r--platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c11
-rw-r--r--platforms/chibios/drivers/ws2812_bitbang.c6
-rw-r--r--platforms/chibios/drivers/ws2812_pwm.c6
-rw-r--r--platforms/chibios/drivers/ws2812_spi.c6
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
38static inline void ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t masklo, uint8_t maskhi); 38static inline void ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t masklo, uint8_t maskhi);
39 39
40void ws2812_setleds(rgb_led_t *ledarray, uint16_t number_of_leds) { 40void 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
44void 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
21void ws2812_setleds(rgb_led_t *ledarray, uint16_t leds) { 21void 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
180bool ws2812_init(void) { 180void 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
253static inline void sync_ws2812_transfer(void) { 251static inline void sync_ws2812_transfer(void) {
@@ -269,11 +267,6 @@ static inline void sync_ws2812_transfer(void) {
269} 267}
270 268
271void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { 269void 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
84void ws2812_setleds(rgb_led_t *ledarray, uint16_t leds) { 84void 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
391void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { 391void 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
190void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) { 190void 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 }