aboutsummaryrefslogtreecommitdiff
path: root/quantum/rgb_matrix/rgb_matrix_drivers.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/rgb_matrix/rgb_matrix_drivers.c')
-rw-r--r--quantum/rgb_matrix/rgb_matrix_drivers.c184
1 files changed, 130 insertions, 54 deletions
diff --git a/quantum/rgb_matrix/rgb_matrix_drivers.c b/quantum/rgb_matrix/rgb_matrix_drivers.c
index 2cec162e2..130ca47a6 100644
--- a/quantum/rgb_matrix/rgb_matrix_drivers.c
+++ b/quantum/rgb_matrix/rgb_matrix_drivers.c
@@ -23,111 +23,153 @@
23 * be here if shared between boards. 23 * be here if shared between boards.
24 */ 24 */
25 25
26#if defined(IS31FL3731) || defined(IS31FL3733) || defined(IS31FL3737) || defined(IS31FL3741) 26#if defined(IS31FL3731) || defined(IS31FL3733) || defined(IS31FL3737) || defined(IS31FL3741) || defined(CKLED2001)
27
28# include "i2c_master.h" 27# include "i2c_master.h"
29 28
29// TODO: Remove this at some later date
30# if defined(DRIVER_ADDR_1) && defined(DRIVER_ADDR_2)
31# if DRIVER_ADDR_1 == DRIVER_ADDR_2
32# error "Setting DRIVER_ADDR_2 == DRIVER_ADDR_1 is obsolete. If you are only using one ISSI driver, set DRIVER_COUNT to 1 and remove DRIVER_ADDR_2"
33# endif
34# endif
35
30static void init(void) { 36static void init(void) {
31 i2c_init(); 37 i2c_init();
32# ifdef IS31FL3731 38
39# if defined(IS31FL3731)
33 IS31FL3731_init(DRIVER_ADDR_1); 40 IS31FL3731_init(DRIVER_ADDR_1);
34# ifdef DRIVER_ADDR_2 41# if defined(DRIVER_ADDR_2)
35 IS31FL3731_init(DRIVER_ADDR_2); 42 IS31FL3731_init(DRIVER_ADDR_2);
36# endif 43# if defined(DRIVER_ADDR_3)
37# ifdef DRIVER_ADDR_3
38 IS31FL3731_init(DRIVER_ADDR_3); 44 IS31FL3731_init(DRIVER_ADDR_3);
39# endif 45# if defined(DRIVER_ADDR_4)
40# ifdef DRIVER_ADDR_4
41 IS31FL3731_init(DRIVER_ADDR_4); 46 IS31FL3731_init(DRIVER_ADDR_4);
47# endif
48# endif
42# endif 49# endif
50
43# elif defined(IS31FL3733) 51# elif defined(IS31FL3733)
44# ifndef DRIVER_SYNC_1 52# if !defined(DRIVER_SYNC_1)
45# define DRIVER_SYNC_1 0 53# define DRIVER_SYNC_1 0
46# endif 54# endif
47 IS31FL3733_init(DRIVER_ADDR_1, DRIVER_SYNC_1); 55 IS31FL3733_init(DRIVER_ADDR_1, DRIVER_SYNC_1);
48# if defined DRIVER_ADDR_2 && (DRIVER_ADDR_1 != DRIVER_ADDR_2) 56# if defined(DRIVER_ADDR_2)
49# ifndef DRIVER_SYNC_2 57# if !defined(DRIVER_SYNC_2)
50# define DRIVER_SYNC_2 0 58# define DRIVER_SYNC_2 0
51# endif 59# endif
52 IS31FL3733_init(DRIVER_ADDR_2, DRIVER_SYNC_2); 60 IS31FL3733_init(DRIVER_ADDR_2, DRIVER_SYNC_2);
53# endif 61# if defined(DRIVER_ADDR_3)
54# ifdef DRIVER_ADDR_3 62# if !defined(DRIVER_SYNC_3)
55# ifndef DRIVER_SYNC_3 63# define DRIVER_SYNC_3 0
56# define DRIVER_SYNC_3 0 64# endif
57# endif
58 IS31FL3733_init(DRIVER_ADDR_3, DRIVER_SYNC_3); 65 IS31FL3733_init(DRIVER_ADDR_3, DRIVER_SYNC_3);
59# endif 66# if defined(DRIVER_ADDR_4)
60# ifdef DRIVER_ADDR_4 67# if !defined(DRIVER_SYNC_4)
61# ifndef DRIVER_SYNC_4 68# define DRIVER_SYNC_4 0
62# define DRIVER_SYNC_4 0 69# endif
63# endif
64 IS31FL3733_init(DRIVER_ADDR_4, DRIVER_SYNC_4); 70 IS31FL3733_init(DRIVER_ADDR_4, DRIVER_SYNC_4);
71# endif
72# endif
65# endif 73# endif
74
66# elif defined(IS31FL3737) 75# elif defined(IS31FL3737)
67 IS31FL3737_init(DRIVER_ADDR_1); 76 IS31FL3737_init(DRIVER_ADDR_1);
68# if defined(DRIVER_ADDR_2) && (DRIVER_ADDR_2 != DRIVER_ADDR_1) // provides backward compatibility 77# if defined(DRIVER_ADDR_2)
69 IS31FL3737_init(DRIVER_ADDR_2); 78 IS31FL3737_init(DRIVER_ADDR_2);
70# endif 79# endif
71# else 80
81# elif defined(IS31FL3741)
72 IS31FL3741_init(DRIVER_ADDR_1); 82 IS31FL3741_init(DRIVER_ADDR_1);
83
84# elif defined(CKLED2001)
85 CKLED2001_init(DRIVER_ADDR_1);
86# if defined(DRIVER_ADDR_2)
87 CKLED2001_init(DRIVER_ADDR_2);
88# if defined(DRIVER_ADDR_3)
89 CKLED2001_init(DRIVER_ADDR_3);
90# if defined(DRIVER_ADDR_4)
91 CKLED2001_init(DRIVER_ADDR_4);
92# endif
93# endif
94# endif
73# endif 95# endif
96
74 for (int index = 0; index < DRIVER_LED_TOTAL; index++) { 97 for (int index = 0; index < DRIVER_LED_TOTAL; index++) {
75 bool enabled = true; 98 bool enabled = true;
99
76 // This only caches it for later 100 // This only caches it for later
77# ifdef IS31FL3731 101# if defined(IS31FL3731)
78 IS31FL3731_set_led_control_register(index, enabled, enabled, enabled); 102 IS31FL3731_set_led_control_register(index, enabled, enabled, enabled);
79# elif defined(IS31FL3733) 103# elif defined(IS31FL3733)
80 IS31FL3733_set_led_control_register(index, enabled, enabled, enabled); 104 IS31FL3733_set_led_control_register(index, enabled, enabled, enabled);
81# elif defined(IS31FL3737) 105# elif defined(IS31FL3737)
82 IS31FL3737_set_led_control_register(index, enabled, enabled, enabled); 106 IS31FL3737_set_led_control_register(index, enabled, enabled, enabled);
83# else 107# elif defined(IS31FL3741)
84 IS31FL3741_set_led_control_register(index, enabled, enabled, enabled); 108 IS31FL3741_set_led_control_register(index, enabled, enabled, enabled);
109# elif defined(CKLED2001)
110 CKLED2001_set_led_control_register(index, enabled, enabled, enabled);
85# endif 111# endif
86 } 112 }
113
87 // This actually updates the LED drivers 114 // This actually updates the LED drivers
88# ifdef IS31FL3731 115# if defined(IS31FL3731)
89 IS31FL3731_update_led_control_registers(DRIVER_ADDR_1, 0); 116 IS31FL3731_update_led_control_registers(DRIVER_ADDR_1, 0);
90# ifdef DRIVER_ADDR_2 117# if defined(DRIVER_ADDR_2)
91 IS31FL3731_update_led_control_registers(DRIVER_ADDR_2, 1); 118 IS31FL3731_update_led_control_registers(DRIVER_ADDR_2, 1);
92# endif 119# if defined(DRIVER_ADDR_3)
93# ifdef DRIVER_ADDR_3
94 IS31FL3731_update_led_control_registers(DRIVER_ADDR_3, 2); 120 IS31FL3731_update_led_control_registers(DRIVER_ADDR_3, 2);
95# endif 121# if defined(DRIVER_ADDR_4)
96# ifdef DRIVER_ADDR_4
97 IS31FL3731_update_led_control_registers(DRIVER_ADDR_4, 3); 122 IS31FL3731_update_led_control_registers(DRIVER_ADDR_4, 3);
123# endif
124# endif
98# endif 125# endif
126
99# elif defined(IS31FL3733) 127# elif defined(IS31FL3733)
100 IS31FL3733_update_led_control_registers(DRIVER_ADDR_1, 0); 128 IS31FL3733_update_led_control_registers(DRIVER_ADDR_1, 0);
101# ifdef DRIVER_ADDR_2 129# if defined(DRIVER_ADDR_2)
102 IS31FL3733_update_led_control_registers(DRIVER_ADDR_2, 1); 130 IS31FL3733_update_led_control_registers(DRIVER_ADDR_2, 1);
103# endif 131# if defined(DRIVER_ADDR_3)
104# ifdef DRIVER_ADDR_3
105 IS31FL3733_update_led_control_registers(DRIVER_ADDR_3, 2); 132 IS31FL3733_update_led_control_registers(DRIVER_ADDR_3, 2);
106# endif 133# if defined(DRIVER_ADDR_4)
107# ifdef DRIVER_ADDR_4
108 IS31FL3733_update_led_control_registers(DRIVER_ADDR_4, 3); 134 IS31FL3733_update_led_control_registers(DRIVER_ADDR_4, 3);
135# endif
136# endif
109# endif 137# endif
138
110# elif defined(IS31FL3737) 139# elif defined(IS31FL3737)
111 IS31FL3737_update_led_control_registers(DRIVER_ADDR_1, 0); 140 IS31FL3737_update_led_control_registers(DRIVER_ADDR_1, 0);
112# if defined(DRIVER_ADDR_2) && (DRIVER_ADDR_2 != DRIVER_ADDR_1) // provides backward compatibility 141# if defined(DRIVER_ADDR_2)
113 IS31FL3737_update_led_control_registers(DRIVER_ADDR_2, 1); 142 IS31FL3737_update_led_control_registers(DRIVER_ADDR_2, 1);
114# endif 143# endif
115# else 144
145# elif defined(IS31FL3741)
116 IS31FL3741_update_led_control_registers(DRIVER_ADDR_1, 0); 146 IS31FL3741_update_led_control_registers(DRIVER_ADDR_1, 0);
147
148# elif defined(CKLED2001)
149 CKLED2001_update_led_control_registers(DRIVER_ADDR_1, 0);
150# if defined(DRIVER_ADDR_2)
151 CKLED2001_update_led_control_registers(DRIVER_ADDR_2, 1);
152# if defined(DRIVER_ADDR_3)
153 CKLED2001_update_led_control_registers(DRIVER_ADDR_3, 2);
154# if defined(DRIVER_ADDR_4)
155 CKLED2001_update_led_control_registers(DRIVER_ADDR_4, 3);
156# endif
157# endif
158# endif
117# endif 159# endif
118} 160}
119 161
120# ifdef IS31FL3731 162# if defined(IS31FL3731)
121static void flush(void) { 163static void flush(void) {
122 IS31FL3731_update_pwm_buffers(DRIVER_ADDR_1, 0); 164 IS31FL3731_update_pwm_buffers(DRIVER_ADDR_1, 0);
123# ifdef DRIVER_ADDR_2 165# if defined(DRIVER_ADDR_2)
124 IS31FL3731_update_pwm_buffers(DRIVER_ADDR_2, 1); 166 IS31FL3731_update_pwm_buffers(DRIVER_ADDR_2, 1);
125# endif 167# if defined(DRIVER_ADDR_3)
126# ifdef DRIVER_ADDR_3
127 IS31FL3731_update_pwm_buffers(DRIVER_ADDR_3, 2); 168 IS31FL3731_update_pwm_buffers(DRIVER_ADDR_3, 2);
128# endif 169# if defined(DRIVER_ADDR_4)
129# ifdef DRIVER_ADDR_4
130 IS31FL3731_update_pwm_buffers(DRIVER_ADDR_4, 3); 170 IS31FL3731_update_pwm_buffers(DRIVER_ADDR_4, 3);
171# endif
172# endif
131# endif 173# endif
132} 174}
133 175
@@ -137,17 +179,18 @@ const rgb_matrix_driver_t rgb_matrix_driver = {
137 .set_color = IS31FL3731_set_color, 179 .set_color = IS31FL3731_set_color,
138 .set_color_all = IS31FL3731_set_color_all, 180 .set_color_all = IS31FL3731_set_color_all,
139}; 181};
182
140# elif defined(IS31FL3733) 183# elif defined(IS31FL3733)
141static void flush(void) { 184static void flush(void) {
142 IS31FL3733_update_pwm_buffers(DRIVER_ADDR_1, 0); 185 IS31FL3733_update_pwm_buffers(DRIVER_ADDR_1, 0);
143# ifdef DRIVER_ADDR_2 186# if defined(DRIVER_ADDR_2)
144 IS31FL3733_update_pwm_buffers(DRIVER_ADDR_2, 1); 187 IS31FL3733_update_pwm_buffers(DRIVER_ADDR_2, 1);
145# endif 188# if defined(DRIVER_ADDR_3)
146# ifdef DRIVER_ADDR_3
147 IS31FL3733_update_pwm_buffers(DRIVER_ADDR_3, 2); 189 IS31FL3733_update_pwm_buffers(DRIVER_ADDR_3, 2);
148# endif 190# if defined(DRIVER_ADDR_4)
149# ifdef DRIVER_ADDR_4
150 IS31FL3733_update_pwm_buffers(DRIVER_ADDR_4, 3); 191 IS31FL3733_update_pwm_buffers(DRIVER_ADDR_4, 3);
192# endif
193# endif
151# endif 194# endif
152} 195}
153 196
@@ -157,10 +200,11 @@ const rgb_matrix_driver_t rgb_matrix_driver = {
157 .set_color = IS31FL3733_set_color, 200 .set_color = IS31FL3733_set_color,
158 .set_color_all = IS31FL3733_set_color_all, 201 .set_color_all = IS31FL3733_set_color_all,
159}; 202};
203
160# elif defined(IS31FL3737) 204# elif defined(IS31FL3737)
161static void flush(void) { 205static void flush(void) {
162 IS31FL3737_update_pwm_buffers(DRIVER_ADDR_1, 0); 206 IS31FL3737_update_pwm_buffers(DRIVER_ADDR_1, 0);
163# if defined(DRIVER_ADDR_2) && (DRIVER_ADDR_2 != DRIVER_ADDR_1) // provides backward compatibility 207# if defined(DRIVER_ADDR_2)
164 IS31FL3737_update_pwm_buffers(DRIVER_ADDR_2, 1); 208 IS31FL3737_update_pwm_buffers(DRIVER_ADDR_2, 1);
165# endif 209# endif
166} 210}
@@ -171,10 +215,11 @@ const rgb_matrix_driver_t rgb_matrix_driver = {
171 .set_color = IS31FL3737_set_color, 215 .set_color = IS31FL3737_set_color,
172 .set_color_all = IS31FL3737_set_color_all, 216 .set_color_all = IS31FL3737_set_color_all,
173}; 217};
174# else 218
219# elif defined(IS31FL3741)
175static void flush(void) { 220static void flush(void) {
176 IS31FL3741_update_pwm_buffers(DRIVER_ADDR_1, 0); 221 IS31FL3741_update_pwm_buffers(DRIVER_ADDR_1, 0);
177# if defined(DRIVER_ADDR_2) && (DRIVER_ADDR_2 != DRIVER_ADDR_1) // provides backward compatibility 222# if defined(DRIVER_ADDR_2)
178 IS31FL3741_update_pwm_buffers(DRIVER_ADDR_2, 1); 223 IS31FL3741_update_pwm_buffers(DRIVER_ADDR_2, 1);
179# endif 224# endif
180} 225}
@@ -185,21 +230,44 @@ const rgb_matrix_driver_t rgb_matrix_driver = {
185 .set_color = IS31FL3741_set_color, 230 .set_color = IS31FL3741_set_color,
186 .set_color_all = IS31FL3741_set_color_all, 231 .set_color_all = IS31FL3741_set_color_all,
187}; 232};
233
234# elif defined(CKLED2001)
235static void flush(void) {
236 CKLED2001_update_pwm_buffers(DRIVER_ADDR_1, 0);
237# if defined(DRIVER_ADDR_2)
238 CKLED2001_update_pwm_buffers(DRIVER_ADDR_2, 1);
239# if defined(DRIVER_ADDR_3)
240 CKLED2001_update_pwm_buffers(DRIVER_ADDR_3, 2);
241# if defined(DRIVER_ADDR_4)
242 CKLED2001_update_pwm_buffers(DRIVER_ADDR_4, 3);
243# endif
244# endif
245# endif
246}
247
248const rgb_matrix_driver_t rgb_matrix_driver = {
249 .init = init,
250 .flush = flush,
251 .set_color = CKLED2001_set_color,
252 .set_color_all = CKLED2001_set_color_all,
253};
188# endif 254# endif
189 255
190#elif defined(AW20216) 256#elif defined(AW20216)
191# include "spi_master.h" 257# include "spi_master.h"
258
192static void init(void) { 259static void init(void) {
193 spi_init(); 260 spi_init();
261
194 AW20216_init(DRIVER_1_CS, DRIVER_1_EN); 262 AW20216_init(DRIVER_1_CS, DRIVER_1_EN);
195# ifdef DRIVER_2_CS 263# if defined(DRIVER_2_CS)
196 AW20216_init(DRIVER_2_CS, DRIVER_2_EN); 264 AW20216_init(DRIVER_2_CS, DRIVER_2_EN);
197# endif 265# endif
198} 266}
199 267
200static void flush(void) { 268static void flush(void) {
201 AW20216_update_pwm_buffers(DRIVER_1_CS, 0); 269 AW20216_update_pwm_buffers(DRIVER_1_CS, 0);
202# ifdef DRIVER_2_CS 270# if defined(DRIVER_2_CS)
203 AW20216_update_pwm_buffers(DRIVER_2_CS, 1); 271 AW20216_update_pwm_buffers(DRIVER_2_CS, 1);
204# endif 272# endif
205} 273}
@@ -229,6 +297,14 @@ static void flush(void) {
229 297
230// Set an led in the buffer to a color 298// Set an led in the buffer to a color
231static inline void setled(int i, uint8_t r, uint8_t g, uint8_t b) { 299static inline void setled(int i, uint8_t r, uint8_t g, uint8_t b) {
300# if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT)
301 const uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT;
302 if (!is_keyboard_left() && (i >= k_rgb_matrix_split[0])) {
303 i -= k_rgb_matrix_split[0];
304 } else if (is_keyboard_left() && (i >= k_rgb_matrix_split[0]))
305 return;
306# endif
307
232 rgb_matrix_ws2812_array[i].r = r; 308 rgb_matrix_ws2812_array[i].r = r;
233 rgb_matrix_ws2812_array[i].g = g; 309 rgb_matrix_ws2812_array[i].g = g;
234 rgb_matrix_ws2812_array[i].b = b; 310 rgb_matrix_ws2812_array[i].b = b;