[Core] Clean up ISSI drivers, Add IS31FL3736 support (#20572)
Co-authored-by: Pablo Martínez <58857054+elpekenin@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									0d9e37d638
								
							
						
					
					
						commit
						6a619e6403
					
				
					 13 changed files with 155 additions and 36 deletions
				
			
		| 
						 | 
				
			
			@ -156,6 +156,82 @@ const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
 | 
			
		|||
Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3733.pdf) and the header file `drivers/led/issi/is31fl3733.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` for now).
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
### IS31FL3736 :id=is31fl3736
 | 
			
		||||
 | 
			
		||||
There is basic support for addressable RGB matrix lighting with the I2C IS31FL3737 RGB controller. To enable it, add this to your `rules.mk`:
 | 
			
		||||
 | 
			
		||||
```make
 | 
			
		||||
RGB_MATRIX_ENABLE = yes
 | 
			
		||||
RGB_MATRIX_DRIVER = IS31FL3736
 | 
			
		||||
```
 | 
			
		||||
You can use between 1 and 4 IS31FL3736 IC's. Do not specify `DRIVER_ADDR_<N>` defines for IC's that are not present on your keyboard.
 | 
			
		||||
 | 
			
		||||
Configure the hardware via your `config.h`:
 | 
			
		||||
 | 
			
		||||
| Variable | Description | Default |
 | 
			
		||||
|----------|-------------|---------|
 | 
			
		||||
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
 | 
			
		||||
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
 | 
			
		||||
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3736B only | 0 |
 | 
			
		||||
| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
 | 
			
		||||
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
 | 
			
		||||
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
 | 
			
		||||
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
 | 
			
		||||
| `RGB_MATRIX_LED_COUNT` | (Required) How many RGB lights are present across all drivers | |
 | 
			
		||||
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
 | 
			
		||||
| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
 | 
			
		||||
| `DRIVER_ADDR_3` | (Optional) Address for the third RGB driver | |
 | 
			
		||||
| `DRIVER_ADDR_4` | (Optional) Address for the fourth RGB driver | |
 | 
			
		||||
 | 
			
		||||
The IS31FL3736 IC's have on-chip resistors that can be enabled to allow for de-ghosting of the RGB matrix. By default these resistors are not enabled (`ISSI_SWPULLUP`/`ISSI_CSPULLUP` are given the value of`PUR_0R`), the values that can be set to enable de-ghosting are as follows:
 | 
			
		||||
 | 
			
		||||
| `ISSI_SWPULLUP/ISSI_CSPULLUP` | Description |
 | 
			
		||||
|----------------------|-------------|
 | 
			
		||||
| `PUR_0R` | (default) Do not use the on-chip resistors/enable de-ghosting |
 | 
			
		||||
| `PUR_05KR` | The 0.5k Ohm resistor used during blanking period (t_NOL) |
 | 
			
		||||
| `PUR_1KR` | The 1k Ohm resistor used during blanking period (t_NOL) |
 | 
			
		||||
| `PUR_2KR` | The 2k Ohm resistor used during blanking period (t_NOL) |
 | 
			
		||||
| `PUR_4KR` | The 4k Ohm resistor used during blanking period (t_NOL) |
 | 
			
		||||
| `PUR_8KR` | The 8k Ohm resistor during blanking period (t_NOL) |
 | 
			
		||||
| `PUR_16KR` | The 16k Ohm resistor during blanking period (t_NOL) |
 | 
			
		||||
| `PUR_32KR` | The 32k Ohm resistor used during blanking period (t_NOL) |
 | 
			
		||||
 | 
			
		||||
Here is an example using 2 drivers.
 | 
			
		||||
 | 
			
		||||
```c
 | 
			
		||||
// This is a 7-bit address, that gets left-shifted and bit 0
 | 
			
		||||
// set to 0 for write, 1 for read (as per I2C protocol)
 | 
			
		||||
// The address will vary depending on your wiring:
 | 
			
		||||
// 0000 <-> GND
 | 
			
		||||
// 0101 <-> SCL
 | 
			
		||||
// 1010 <-> SDA
 | 
			
		||||
// 1111 <-> VCC
 | 
			
		||||
// ADDR represents A3:A0 of the 7-bit address.
 | 
			
		||||
// The result is: 0b101(ADDR)
 | 
			
		||||
#define DRIVER_ADDR_1 0b1010000
 | 
			
		||||
#define DRIVER_ADDR_2 0b1010001
 | 
			
		||||
 | 
			
		||||
#define DRIVER_COUNT 2
 | 
			
		||||
#define DRIVER_1_LED_TOTAL 30
 | 
			
		||||
#define DRIVER_2_LED_TOTAL 36
 | 
			
		||||
#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
 | 
			
		||||
```
 | 
			
		||||
!> Note the parentheses, this is so when `RGB_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
 | 
			
		||||
 | 
			
		||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
 | 
			
		||||
 | 
			
		||||
```c
 | 
			
		||||
const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
 | 
			
		||||
/* Refer to IS31 manual for these locations
 | 
			
		||||
 *   driver
 | 
			
		||||
 *   |  R location
 | 
			
		||||
 *   |  |       G location
 | 
			
		||||
 *   |  |       |       B location
 | 
			
		||||
 *   |  |       |       | */
 | 
			
		||||
    {0, B_1,    A_1,    C_1},
 | 
			
		||||
    ....
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
### IS31FL3737 :id=is31fl3737
 | 
			
		||||
 | 
			
		||||
There is basic support for addressable RGB matrix lighting with the I2C IS31FL3737 RGB controller. To enable it, add this to your `rules.mk`:
 | 
			
		||||
| 
						 | 
				
			
			@ -218,8 +294,6 @@ Here is an example using 2 drivers.
 | 
			
		|||
```
 | 
			
		||||
!> Note the parentheses, this is so when `RGB_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
 | 
			
		||||
 | 
			
		||||
Currently only 2 drivers are supported, but it would be trivial to support all 4 combinations.
 | 
			
		||||
 | 
			
		||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
 | 
			
		||||
 | 
			
		||||
```c
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue