diff options
Diffstat (limited to 'quantum/rgb_matrix/rgb_matrix_drivers.c')
| -rw-r--r-- | quantum/rgb_matrix/rgb_matrix_drivers.c | 184 |
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 | |||
| 30 | static void init(void) { | 36 | static 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) |
| 121 | static void flush(void) { | 163 | static 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) |
| 141 | static void flush(void) { | 184 | static 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) |
| 161 | static void flush(void) { | 205 | static 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) | ||
| 175 | static void flush(void) { | 220 | static 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) | ||
| 235 | static 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 | |||
| 248 | const 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 | |||
| 192 | static void init(void) { | 259 | static 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 | ||
| 200 | static void flush(void) { | 268 | static 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 |
| 231 | static inline void setled(int i, uint8_t r, uint8_t g, uint8_t b) { | 299 | static 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; |
