diff options
Diffstat (limited to 'platforms/chibios/drivers/ws2812_spi.c')
| -rw-r--r-- | platforms/chibios/drivers/ws2812_spi.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/platforms/chibios/drivers/ws2812_spi.c b/platforms/chibios/drivers/ws2812_spi.c index fe14b478a..62722f466 100644 --- a/platforms/chibios/drivers/ws2812_spi.c +++ b/platforms/chibios/drivers/ws2812_spi.c | |||
| @@ -3,10 +3,6 @@ | |||
| 3 | 3 | ||
| 4 | /* Adapted from https://github.com/gamazeps/ws2812b-chibios-SPIDMA/ */ | 4 | /* Adapted from https://github.com/gamazeps/ws2812b-chibios-SPIDMA/ */ |
| 5 | 5 | ||
| 6 | #ifdef RGBW | ||
| 7 | # error "RGBW not supported" | ||
| 8 | #endif | ||
| 9 | |||
| 10 | // Define the spi your LEDs are plugged to here | 6 | // Define the spi your LEDs are plugged to here |
| 11 | #ifndef WS2812_SPI | 7 | #ifndef WS2812_SPI |
| 12 | # define WS2812_SPI SPID1 | 8 | # define WS2812_SPI SPID1 |
| @@ -24,15 +20,15 @@ | |||
| 24 | // Default Push Pull | 20 | // Default Push Pull |
| 25 | #ifndef WS2812_EXTERNAL_PULLUP | 21 | #ifndef WS2812_EXTERNAL_PULLUP |
| 26 | # if defined(USE_GPIOV1) | 22 | # if defined(USE_GPIOV1) |
| 27 | # define WS2812_MOSI_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_PUSHPULL | 23 | # define WS2812_MOSI_OUTPUT_MODE PAL_MODE_ALTERNATE_PUSHPULL |
| 28 | # else | 24 | # else |
| 29 | # define WS2812_MOSI_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL | 25 | # define WS2812_MOSI_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL |
| 30 | # endif | 26 | # endif |
| 31 | #else | 27 | #else |
| 32 | # if defined(USE_GPIOV1) | 28 | # if defined(USE_GPIOV1) |
| 33 | # define WS2812_MOSI_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_OPENDRAIN | 29 | # define WS2812_MOSI_OUTPUT_MODE PAL_MODE_ALTERNATE_OPENDRAIN |
| 34 | # else | 30 | # else |
| 35 | # define WS2812_MOSI_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN | 31 | # define WS2812_MOSI_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_OUTPUT_TYPE_OPENDRAIN |
| 36 | # endif | 32 | # endif |
| 37 | #endif | 33 | #endif |
| 38 | 34 | ||
| @@ -68,14 +64,18 @@ | |||
| 68 | #endif | 64 | #endif |
| 69 | 65 | ||
| 70 | #if defined(USE_GPIOV1) | 66 | #if defined(USE_GPIOV1) |
| 71 | # define WS2812_SCK_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_PUSHPULL | 67 | # define WS2812_SCK_OUTPUT_MODE PAL_MODE_ALTERNATE_PUSHPULL |
| 72 | #else | 68 | #else |
| 73 | # define WS2812_SCK_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_SCK_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL | 69 | # define WS2812_SCK_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_SCK_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL |
| 74 | #endif | 70 | #endif |
| 75 | 71 | ||
| 76 | #define BYTES_FOR_LED_BYTE 4 | 72 | #define BYTES_FOR_LED_BYTE 4 |
| 77 | #define NB_COLORS 3 | 73 | #ifdef RGBW |
| 78 | #define BYTES_FOR_LED (BYTES_FOR_LED_BYTE * NB_COLORS) | 74 | # define WS2812_CHANNELS 4 |
| 75 | #else | ||
| 76 | # define WS2812_CHANNELS 3 | ||
| 77 | #endif | ||
| 78 | #define BYTES_FOR_LED (BYTES_FOR_LED_BYTE * WS2812_CHANNELS) | ||
| 79 | #define DATA_SIZE (BYTES_FOR_LED * RGBLED_NUM) | 79 | #define DATA_SIZE (BYTES_FOR_LED * RGBLED_NUM) |
| 80 | #define RESET_SIZE (1000 * WS2812_TRST_US / (2 * 1250)) | 80 | #define RESET_SIZE (1000 * WS2812_TRST_US / (2 * 1250)) |
| 81 | #define PREAMBLE_SIZE 4 | 81 | #define PREAMBLE_SIZE 4 |
| @@ -116,6 +116,9 @@ static void set_led_color_rgb(LED_TYPE color, int pos) { | |||
| 116 | for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.g, j); | 116 | for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.g, j); |
| 117 | for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.r, j); | 117 | for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.r, j); |
| 118 | #endif | 118 | #endif |
| 119 | #ifdef RGBW | ||
| 120 | for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 4 + j] = get_protocol_eq(color.w, j); | ||
| 121 | #endif | ||
| 119 | } | 122 | } |
| 120 | 123 | ||
| 121 | void ws2812_init(void) { | 124 | void ws2812_init(void) { |
