summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkb-elmo <lorwel@mailbox.org>2021-01-15 22:42:30 +0100
committerDrashna Jael're <drashna@live.com>2021-02-02 09:40:28 -0800
commit329d563bf93911178ad7066588b829335ff5ff3b (patch)
treeb180bb2f20720492843d91abf9ea7ae69a1b63b3
parent0719cda8514df3d2d361667aff577d28f67e1f09 (diff)
Add BGR byte order for WS2812 drivers (#11562)
* add byte order bgr for ws2812 * update docs for driver change * Update ws2812_driver.md * Update docs/ws2812_driver.md Co-authored-by: Ryan <fauxpark@gmail.com> Co-authored-by: Ryan <fauxpark@gmail.com>
-rw-r--r--drivers/chibios/ws2812.c4
-rw-r--r--drivers/chibios/ws2812_pwm.c37
-rw-r--r--drivers/chibios/ws2812_spi.c4
-rw-r--r--quantum/color.h9
4 files changed, 54 insertions, 0 deletions
diff --git a/drivers/chibios/ws2812.c b/drivers/chibios/ws2812.c
index 4f32e27d22..876ed46eac 100644
--- a/drivers/chibios/ws2812.c
+++ b/drivers/chibios/ws2812.c
@@ -97,6 +97,10 @@ void ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) {
sendByte(ledarray[i].r);
sendByte(ledarray[i].g);
sendByte(ledarray[i].b);
+#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR)
+ sendByte(ledarray[i].b);
+ sendByte(ledarray[i].g);
+ sendByte(ledarray[i].r);
#endif
#ifdef RGBW
diff --git a/drivers/chibios/ws2812_pwm.c b/drivers/chibios/ws2812_pwm.c
index 3af922c063..140120d488 100644
--- a/drivers/chibios/ws2812_pwm.c
+++ b/drivers/chibios/ws2812_pwm.c
@@ -180,6 +180,43 @@
* @return The bit index
*/
# define WS2812_BLUE_BIT(led, bit) WS2812_BIT((led), 2, (bit))
+
+#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR)
+/**
+ * @brief Determine the index in @ref ws2812_frame_buffer "the frame buffer" of a given red bit
+ *
+ * @note The red byte is the middle byte in the color packet
+ *
+ * @param[in] led: The led index [0, @ref RGBLED_NUM)
+ * @param[in] bit: The bit number [0, 7]
+ *
+ * @return The bit index
+ */
+# define WS2812_RED_BIT(led, bit) WS2812_BIT((led), 2, (bit))
+
+/**
+ * @brief Determine the index in @ref ws2812_frame_buffer "the frame buffer" of a given green bit
+ *
+ * @note The red byte is the first byte in the color packet
+ *
+ * @param[in] led: The led index [0, @ref RGBLED_NUM)
+ * @param[in] bit: The bit number [0, 7]
+ *
+ * @return The bit index
+ */
+# define WS2812_GREEN_BIT(led, bit) WS2812_BIT((led), 1, (bit))
+
+/**
+ * @brief Determine the index in @ref ws2812_frame_buffer "the frame buffer" of a given blue bit
+ *
+ * @note The red byte is the last byte in the color packet
+ *
+ * @param[in] led: The led index [0, @ref RGBLED_NUM)
+ * @param[in] bit: The bit index [0, 7]
+ *
+ * @return The bit index
+ */
+# define WS2812_BLUE_BIT(led, bit) WS2812_BIT((led), 0, (bit))
#endif
/* --- PRIVATE VARIABLES ---------------------------------------------------- */
diff --git a/drivers/chibios/ws2812_spi.c b/drivers/chibios/ws2812_spi.c
index a933424362..89df2987b5 100644
--- a/drivers/chibios/ws2812_spi.c
+++ b/drivers/chibios/ws2812_spi.c
@@ -70,6 +70,10 @@ static void set_led_color_rgb(LED_TYPE color, int pos) {
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + j] = get_protocol_eq(color.r, j);
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.g, j);
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.b, j);
+#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR)
+ for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + j] = get_protocol_eq(color.b, j);
+ for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.g, j);
+ 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);
#endif
}
diff --git a/quantum/color.h b/quantum/color.h
index 7448168b3a..4783f6839c 100644
--- a/quantum/color.h
+++ b/quantum/color.h
@@ -37,6 +37,7 @@
#define WS2812_BYTE_ORDER_RGB 0
#define WS2812_BYTE_ORDER_GRB 1
+#define WS2812_BYTE_ORDER_BGR 2
#ifndef WS2812_BYTE_ORDER
# define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_GRB
@@ -51,6 +52,10 @@ typedef struct PACKED {
uint8_t r;
uint8_t g;
uint8_t b;
+#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR)
+ uint8_t b;
+ uint8_t g;
+ uint8_t r;
#endif
} cRGB;
@@ -66,6 +71,10 @@ typedef struct PACKED {
uint8_t r;
uint8_t g;
uint8_t b;
+#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR)
+ uint8_t b;
+ uint8_t g;
+ uint8_t r;
#endif
uint8_t w;
} cRGBW;