Enable de-ghosting for RGB/LED matrix on all ISSI LED drivers (#14508)

* Initial work for de-ghost enable

* Dumb mistake with the redefine

* Added Copywrite stuff on source files

* Fixed whitespace errors

* Added support for all ISSI LED drivers

* Updated docs for support for ISSI LED driver pull-up pull-down

* Applied clang format

* Added 'boolean' flag to enable de-ghosting for the is31fl3731 IC

* Fixed some of the grammer in the docs

* Fixed comment placement and grammer of comment

* Fixed whitespace errors from lint

Co-authored-by: donicrosby <donicrosby1995@gmail.com>
This commit is contained in:
donicrosby 2021-11-01 19:40:01 -04:00 committed by GitHub
parent 7ae0f371cf
commit 0c72501763
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 136 additions and 10 deletions

View File

@ -21,6 +21,7 @@ You can use between 1 and 4 IS31FL3731 IC's. Do not specify `DRIVER_ADDR_<N>` de
|----------|-------------|---------| |----------|-------------|---------|
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 | | `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 | | `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `ISSI_3731_DEGHOST` | (Optional) Set this define to enable de-ghosting by halving Vcc during blanking time | |
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | | | `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | | | `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | | | `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
@ -85,6 +86,8 @@ You can use between 1 and 4 IS31FL3733 IC's. Do not specify `DRIVER_ADDR_<N>` de
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 | | `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 | | `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3733B only | 0 | | `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3733B only | 0 |
| `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 | | | `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | | | `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | | | `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
@ -96,6 +99,18 @@ You can use between 1 and 4 IS31FL3733 IC's. Do not specify `DRIVER_ADDR_<N>` de
| `DRIVER_SYNC_3` | (Optional) Sync configuration for the third RGB driver | 0 | | `DRIVER_SYNC_3` | (Optional) Sync configuration for the third RGB driver | 0 |
| `DRIVER_SYNC_4` | (Optional) Sync configuration for the fourth RGB driver | 0 | | `DRIVER_SYNC_4` | (Optional) Sync configuration for the fourth RGB driver | 0 |
The IS31FL3733 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_3KR` | The 3k Ohm resistor used at all times |
| `PUR_4KR` | The 4k Ohm resistor used at all times |
| `PUR_8KR` | The 8k Ohm resistor used at all times |
| `PUR_16KR` | The 16k Ohm resistor used at all times |
| `PUR_32KR` | The 32k Ohm resistor used during blanking period (t_NOL) |
Here is an example using 2 drivers. Here is an example using 2 drivers.
```c ```c
@ -156,11 +171,25 @@ Configure the hardware via your `config.h`:
|----------|-------------|---------| |----------|-------------|---------|
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 | | `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 | | `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `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 | | | `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | | | `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | | | `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | | | `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
The IS31FL3737 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. Here is an example using 2 drivers.

View File

@ -1,6 +1,7 @@
/* Copyright 2017 Jason Williams /* Copyright 2017 Jason Williams
* Copyright 2018 Jack Humbert * Copyright 2018 Jack Humbert
* Copyright 2019 Clueboard * Copyright 2019 Clueboard
* Copyright 2021 Doni Crosby
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -40,6 +41,9 @@
#define ISSI_REG_PICTUREFRAME 0x01 #define ISSI_REG_PICTUREFRAME 0x01
// Not defined in the datasheet -- See AN for IC
#define ISSI_REG_GHOST_IMAGE_PREVENTION 0xC2 // Set bit 4 to enable de-ghosting
#define ISSI_REG_SHUTDOWN 0x0A #define ISSI_REG_SHUTDOWN 0x0A
#define ISSI_REG_AUDIOSYNC 0x06 #define ISSI_REG_AUDIOSYNC 0x06
@ -144,6 +148,9 @@ void IS31FL3731_init(uint8_t addr) {
// enable software shutdown // enable software shutdown
IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00); IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00);
#ifdef ISSI_3731_DEGHOST // set to enable de-ghosting of the array
IS31FL3731_write_register(addr, ISSI_REG_GHOST_IMAGE_PREVENTION, 0x10);
#endif
// this delay was copied from other drivers, might not be needed // this delay was copied from other drivers, might not be needed
wait_ms(10); wait_ms(10);

View File

@ -1,5 +1,6 @@
/* Copyright 2017 Jason Williams /* Copyright 2017 Jason Williams
* Copyright 2018 Jack Humbert * Copyright 2018 Jack Humbert
* Copyright 2021 Doni Crosby
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -39,6 +40,9 @@
#define ISSI_REG_PICTUREFRAME 0x01 #define ISSI_REG_PICTUREFRAME 0x01
// Not defined in the datasheet -- See AN for IC
#define ISSI_REG_GHOST_IMAGE_PREVENTION 0xC2 // Set bit 4 to enable de-ghosting
#define ISSI_REG_SHUTDOWN 0x0A #define ISSI_REG_SHUTDOWN 0x0A
#define ISSI_REG_AUDIOSYNC 0x06 #define ISSI_REG_AUDIOSYNC 0x06
@ -132,6 +136,9 @@ void IS31FL3731_init(uint8_t addr) {
// enable software shutdown // enable software shutdown
IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00); IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00);
#ifdef ISSI_3731_DEGHOST // set to enable de-ghosting of the array
IS31FL3731_write_register(addr, ISSI_REG_GHOST_IMAGE_PREVENTION, 0x10);
#endif
// this delay was copied from other drivers, might not be needed // this delay was copied from other drivers, might not be needed
wait_ms(10); wait_ms(10);

View File

@ -1,6 +1,7 @@
/* Copyright 2017 Jason Williams /* Copyright 2017 Jason Williams
* Copyright 2018 Jack Humbert * Copyright 2018 Jack Humbert
* Copyright 2018 Yiancar * Copyright 2018 Yiancar
* Copyright 2021 Doni Crosby
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -58,6 +59,12 @@
#ifndef ISSI_PWM_FREQUENCY #ifndef ISSI_PWM_FREQUENCY
# define ISSI_PWM_FREQUENCY 0b000 // PFS - IS31FL3733B only # define ISSI_PWM_FREQUENCY 0b000 // PFS - IS31FL3733B only
#ifndef ISSI_SWPULLUP
# define ISSI_SWPULLUP PUR_0R
#endif
#ifndef ISSI_CSPULLUP
# define ISSI_CSPULLUP PUR_0R
#endif #endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
@ -158,6 +165,10 @@ void IS31FL3733_init(uint8_t addr, uint8_t sync) {
// Select PG3 // Select PG3
IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION); IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
// Set de-ghost pull-up resistors (SWx)
IS31FL3733_write_register(addr, ISSI_REG_SWPULLUP, ISSI_SWPULLUP);
// Set de-ghost pull-down resistors (CSx)
IS31FL3733_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
// Set global current to maximum. // Set global current to maximum.
IS31FL3733_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF); IS31FL3733_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Disable software shutdown. // Disable software shutdown.

View File

@ -1,6 +1,7 @@
/* Copyright 2017 Jason Williams /* Copyright 2017 Jason Williams
* Copyright 2018 Jack Humbert * Copyright 2018 Jack Humbert
* Copyright 2018 Yiancar * Copyright 2018 Yiancar
* Copyright 2021 Doni Crosby
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -47,6 +48,14 @@ void IS31FL3733_set_led_control_register(uint8_t index, bool red, bool green, bo
void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index); void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index);
void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index); void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index);
#define PUR_0R 0x00 // No PUR resistor
#define PUR_05KR 0x02 // 0.5k Ohm resistor in t_NOL
#define PUR_3KR 0x03 // 3.0k Ohm resistor on all the time
#define PUR_4KR 0x04 // 4.0k Ohm resistor on all the time
#define PUR_8KR 0x05 // 8.0k Ohm resistor on all the time
#define PUR_16KR 0x06 // 16k Ohm resistor on all the time
#define PUR_32KR 0x07 // 32k Ohm resistor in t_NOL
#define A_1 0x00 #define A_1 0x00
#define A_2 0x01 #define A_2 0x01
#define A_3 0x02 #define A_3 0x02

View File

@ -1,4 +1,5 @@
/* Copyright 2018 Jason Williams (Wilba) /* Copyright 2018 Jason Williams (Wilba)
* Copyright 2021 Doni Crosby
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -54,6 +55,14 @@
# define ISSI_PERSISTENCE 0 # define ISSI_PERSISTENCE 0
#endif #endif
#ifndef ISSI_SWPULLUP
# define ISSI_SWPULLUP PUR_0R
#endif
#ifndef ISSI_CSPULLUP
# define ISSI_CSPULLUP PUR_0R
#endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
uint8_t g_twi_transfer_buffer[20]; uint8_t g_twi_transfer_buffer[20];
@ -140,6 +149,10 @@ void IS31FL3736_init(uint8_t addr) {
// Select PG3 // Select PG3
IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION); IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
// Set de-ghost pull-up resistors (SWx)
IS31FL3736_write_register(addr, ISSI_REG_SWPULLUP, ISSI_SWPULLUP);
// Set de-ghost pull-down resistors (CSx)
IS31FL3736_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
// Set global current to maximum. // Set global current to maximum.
IS31FL3736_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF); IS31FL3736_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Disable software shutdown. // Disable software shutdown.

View File

@ -1,4 +1,5 @@
/* Copyright 2018 Jason Williams (Wilba) /* Copyright 2018 Jason Williams (Wilba)
* Copyright 2021 Doni Crosby
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -60,6 +61,15 @@ void IS31FL3736_mono_set_led_control_register(uint8_t index, bool enabled);
void IS31FL3736_update_pwm_buffers(uint8_t addr1, uint8_t addr2); void IS31FL3736_update_pwm_buffers(uint8_t addr1, uint8_t addr2);
void IS31FL3736_update_led_control_registers(uint8_t addr1, uint8_t addr2); void IS31FL3736_update_led_control_registers(uint8_t addr1, uint8_t addr2);
#define PUR_0R 0x00 // No PUR resistor
#define PUR_05KR 0x01 // 0.5k Ohm resistor
#define PUR_1KR 0x02 // 1.0k Ohm resistor
#define PUR_2KR 0x03 // 2.0k Ohm resistor
#define PUR_4KR 0x04 // 4.0k Ohm resistor
#define PUR_8KR 0x05 // 8.0k Ohm resistor
#define PUR_16KR 0x06 // 16k Ohm resistor
#define PUR_32KR 0x07 // 32k Ohm resistor
#define A_1 0x00 #define A_1 0x00
#define A_2 0x02 #define A_2 0x02
#define A_3 0x04 #define A_3 0x04

View File

@ -1,6 +1,7 @@
/* Copyright 2017 Jason Williams /* Copyright 2017 Jason Williams
* Copyright 2018 Jack Humbert * Copyright 2018 Jack Humbert
* Copyright 2018 Yiancar * Copyright 2018 Yiancar
* Copyright 2021 Doni Crosby
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -56,6 +57,14 @@
# define ISSI_PERSISTENCE 0 # define ISSI_PERSISTENCE 0
#endif #endif
#ifndef ISSI_SWPULLUP
# define ISSI_SWPULLUP PUR_0R
#endif
#ifndef ISSI_CSPULLUP
# define ISSI_CSPULLUP PUR_0R
#endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
uint8_t g_twi_transfer_buffer[20]; uint8_t g_twi_transfer_buffer[20];
@ -143,6 +152,10 @@ void IS31FL3737_init(uint8_t addr) {
// Select PG3 // Select PG3
IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION); IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
// Set de-ghost pull-up resistors (SWx)
IS31FL3737_write_register(addr, ISSI_REG_SWPULLUP, ISSI_SWPULLUP);
// Set de-ghost pull-down resistors (CSx)
IS31FL3737_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
// Set global current to maximum. // Set global current to maximum.
IS31FL3737_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF); IS31FL3737_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Disable software shutdown. // Disable software shutdown.

View File

@ -1,6 +1,7 @@
/* Copyright 2017 Jason Williams /* Copyright 2017 Jason Williams
* Copyright 2018 Jack Humbert * Copyright 2018 Jack Humbert
* Copyright 2018 Yiancar * Copyright 2018 Yiancar
* Copyright 2021 Doni Crosby
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -47,6 +48,15 @@ void IS31FL3737_set_led_control_register(uint8_t index, bool red, bool green, bo
void IS31FL3737_update_pwm_buffers(uint8_t addr1, uint8_t addr2); void IS31FL3737_update_pwm_buffers(uint8_t addr1, uint8_t addr2);
void IS31FL3737_update_led_control_registers(uint8_t addr1, uint8_t addr2); void IS31FL3737_update_led_control_registers(uint8_t addr1, uint8_t addr2);
#define PUR_0R 0x00 // No PUR resistor
#define PUR_05KR 0x01 // 0.5k Ohm resistor in t_NOL
#define PUR_1KR 0x02 // 1.0k Ohm resistor in t_NOL
#define PUR_2KR 0x03 // 2.0k Ohm resistor in t_NOL
#define PUR_4KR 0x04 // 4.0k Ohm resistor in t_NOL
#define PUR_8KR 0x05 // 8.0k Ohm resistor in t_NOL
#define PUR_16KR 0x06 // 16k Ohm resistor in t_NOL
#define PUR_32KR 0x07 // 32k Ohm resistor in t_NOL
#define A_1 0x00 #define A_1 0x00
#define A_2 0x01 #define A_2 0x01
#define A_3 0x02 #define A_3 0x02

View File

@ -61,6 +61,14 @@
# define ISSI_PERSISTENCE 0 # define ISSI_PERSISTENCE 0
#endif #endif
#ifndef ISSI_SWPULLUP
# define ISSI_SWPULLUP PUR_32KR
#endif
#ifndef ISSI_CSPULLUP
# define ISSI_CSPULLUP PUR_32KR
#endif
#define ISSI_MAX_LEDS 351 #define ISSI_MAX_LEDS 351
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
@ -157,7 +165,7 @@ void IS31FL3741_init(uint8_t addr) {
// Set Golbal Current Control Register // Set Golbal Current Control Register
IS31FL3741_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF); IS31FL3741_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Set Pull up & Down for SWx CSy // Set Pull up & Down for SWx CSy
IS31FL3741_write_register(addr, ISSI_REG_PULLDOWNUP, 0x77); IS31FL3741_write_register(addr, ISSI_REG_PULLDOWNUP, ((ISSI_CSPULLUP << 4) | ISSI_SWPULLUP));
// IS31FL3741_update_led_scaling_registers(addr, 0xFF, 0xFF, 0xFF); // IS31FL3741_update_led_scaling_registers(addr, 0xFF, 0xFF, 0xFF);

View File

@ -51,6 +51,15 @@ void IS31FL3741_set_scaling_registers(const is31_led *pled, uint8_t red, uint8_t
void IS31FL3741_set_pwm_buffer(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue); void IS31FL3741_set_pwm_buffer(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue);
#define PUR_0R 0x00 // No PUR resistor
#define PUR_05KR 0x01 // 0.5k Ohm resistor
#define PUR_1KR 0x02 // 1.0k Ohm resistor
#define PUR_2KR 0x03 // 2.0k Ohm resistor
#define PUR_4KR 0x04 // 4.0k Ohm resistor
#define PUR_8KR 0x05 // 8.0k Ohm resistor
#define PUR_16KR 0x06 // 16k Ohm resistor
#define PUR_32KR 0x07 // 32k Ohm resistor
#define CS1_SW1 0x00 #define CS1_SW1 0x00
#define CS2_SW1 0x01 #define CS2_SW1 0x01
#define CS3_SW1 0x02 #define CS3_SW1 0x02