mirror of
https://github.com/qmk/qmk_firmware.git
synced 2024-12-01 07:25:50 +00:00
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>
This commit is contained in:
parent
0bf0977c02
commit
3d70766327
@ -34,9 +34,10 @@ Some variants of the WS2812 may have their color components in a different physi
|
|||||||
In this case, you can change the byte order by defining `WS2812_BYTE_ORDER` as one of the following values:
|
In this case, you can change the byte order by defining `WS2812_BYTE_ORDER` as one of the following values:
|
||||||
|
|
||||||
|Byte order |Known devices |
|
|Byte order |Known devices |
|
||||||
|-----------------------------------|-------------------------------|
|
|---------------------------------|-----------------------------|
|
||||||
|`WS2812_BYTE_ORDER_GRB` (default)|Most WS2812's, SK6812, SK6805|
|
|`WS2812_BYTE_ORDER_GRB` (default)|Most WS2812's, SK6812, SK6805|
|
||||||
|`WS2812_BYTE_ORDER_RGB` |WS2812B-2020 |
|
|`WS2812_BYTE_ORDER_RGB` |WS2812B-2020 |
|
||||||
|
|`WS2812_BYTE_ORDER_BGR` |TM1812 |
|
||||||
|
|
||||||
|
|
||||||
### Bitbang
|
### Bitbang
|
||||||
|
@ -97,6 +97,10 @@ void ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) {
|
|||||||
sendByte(ledarray[i].r);
|
sendByte(ledarray[i].r);
|
||||||
sendByte(ledarray[i].g);
|
sendByte(ledarray[i].g);
|
||||||
sendByte(ledarray[i].b);
|
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
|
#endif
|
||||||
|
|
||||||
#ifdef RGBW
|
#ifdef RGBW
|
||||||
|
@ -180,6 +180,43 @@
|
|||||||
* @return The bit index
|
* @return The bit index
|
||||||
*/
|
*/
|
||||||
# define WS2812_BLUE_BIT(led, bit) WS2812_BIT((led), 2, (bit))
|
# 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
|
#endif
|
||||||
|
|
||||||
/* --- PRIVATE VARIABLES ---------------------------------------------------- */
|
/* --- PRIVATE VARIABLES ---------------------------------------------------- */
|
||||||
|
@ -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 + 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 + 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);
|
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
#define WS2812_BYTE_ORDER_RGB 0
|
#define WS2812_BYTE_ORDER_RGB 0
|
||||||
#define WS2812_BYTE_ORDER_GRB 1
|
#define WS2812_BYTE_ORDER_GRB 1
|
||||||
|
#define WS2812_BYTE_ORDER_BGR 2
|
||||||
|
|
||||||
#ifndef WS2812_BYTE_ORDER
|
#ifndef WS2812_BYTE_ORDER
|
||||||
# define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_GRB
|
# define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_GRB
|
||||||
@ -51,6 +52,10 @@ typedef struct PACKED {
|
|||||||
uint8_t r;
|
uint8_t r;
|
||||||
uint8_t g;
|
uint8_t g;
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
|
#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR)
|
||||||
|
uint8_t b;
|
||||||
|
uint8_t g;
|
||||||
|
uint8_t r;
|
||||||
#endif
|
#endif
|
||||||
} cRGB;
|
} cRGB;
|
||||||
|
|
||||||
@ -66,6 +71,10 @@ typedef struct PACKED {
|
|||||||
uint8_t r;
|
uint8_t r;
|
||||||
uint8_t g;
|
uint8_t g;
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
|
#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR)
|
||||||
|
uint8_t b;
|
||||||
|
uint8_t g;
|
||||||
|
uint8_t r;
|
||||||
#endif
|
#endif
|
||||||
uint8_t w;
|
uint8_t w;
|
||||||
} cRGBW;
|
} cRGBW;
|
||||||
|
Loading…
Reference in New Issue
Block a user