Co-authored-by: Xelus22 <17491233+Xelus22@users.noreply.github.com>pull/16249/head
@ -0,0 +1,299 @@ | |||
/* Copyright 2017 Jason Williams | |||
* Copyright 2018 Jack Humbert | |||
* Copyright 2018 Yiancar | |||
* Copyright 2020 MelGeek | |||
* Copyright 2021 MasterSpoon | |||
* | |||
* 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 | |||
* the Free Software Foundation, either version 2 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#pragma once | |||
// 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: | |||
// 00 <-> GND | |||
// 01 <-> SCL | |||
// 10 <-> SDA | |||
// 11 <-> VCC | |||
// ADDR represents A1:A0 of the 7-bit address. | |||
// The result is: 0b01100(ADDR) | |||
#ifndef DRIVER_ADDR_1 | |||
# define DRIVER_ADDR_1 0b0110000 | |||
#endif | |||
// Command Registers | |||
#define ISSI_COMMANDREGISTER_WRITELOCK 0xFE | |||
#define ISSI_COMMANDREGISTER 0xFD | |||
#define ISSI_IDREGISTER 0xFC | |||
#define ISSI_REGISTER_UNLOCK 0xC5 | |||
// Response Registers | |||
#define ISSI_PAGE_PWM 0x00 | |||
#define ISSI_PAGE_SCALING 0x02 | |||
#define ISSI_PAGE_FUNCTION 0x04 | |||
// Registers under Function Register | |||
#define ISSI_REG_CONFIGURATION 0x00 | |||
#define ISSI_REG_GLOBALCURRENT 0x01 | |||
#define ISSI_REG_PULLDOWNUP 0x02 | |||
#define ISSI_REG_SSR 0x41 | |||
#define ISSI_REG_RESET 0x3F | |||
#define ISSI_REG_PWM_SET 0x36 | |||
// Set defaults for Function Registers | |||
#ifndef ISSI_CONFIGURATION | |||
# define ISSI_CONFIGURATION 0x31 | |||
#endif | |||
#ifndef ISSI_GLOBALCURRENT | |||
# define ISSI_GLOBALCURRENT 0xFF | |||
#endif | |||
#ifndef ISSI_PULLDOWNUP | |||
# define ISSI_PULLDOWNUP 0x55 | |||
#endif | |||
#ifndef ISSI_PWM_SET | |||
# define ISSI_PWM_SET 0x00 | |||
#endif | |||
// Set defaults for Spread Spectrum Register | |||
#ifndef ISSI_SSR_1 | |||
# define ISSI_SSR_1 0x00 | |||
#endif | |||
#ifndef ISSI_SSR_2 | |||
# define ISSI_SSR_2 0x00 | |||
#endif | |||
#ifndef ISSI_SSR_3 | |||
# define ISSI_SSR_3 0x00 | |||
#endif | |||
#ifndef ISSI_SSR_4 | |||
# define ISSI_SSR_4 0x00 | |||
#endif | |||
// Set defaults for Scaling registers | |||
#ifndef ISSI_SCAL_RED | |||
# define ISSI_SCAL_RED 0xFF | |||
#endif | |||
#ifndef ISSI_SCAL_BLUE | |||
# define ISSI_SCAL_BLUE 0xFF | |||
#endif | |||
#ifndef ISSI_SCAL_GREEN | |||
# define ISSI_SCAL_GREEN 0xFF | |||
#endif | |||
#define ISSI_SCAL_RED_OFF 0x00 | |||
#define ISSI_SCAL_GREEN_OFF 0x00 | |||
#define ISSI_SCAL_BLUE_OFF 0x00 | |||
#ifndef ISSI_SCAL_LED | |||
# define ISSI_SCAL_LED 0xFF | |||
#endif | |||
#define ISSI_SCAL_LED_OFF 0x00 | |||
// Set buffer sizes | |||
#define ISSI_MAX_LEDS 180 | |||
#define ISSI_SCALING_SIZE 180 | |||
#define ISSI_PWM_TRF_SIZE 18 | |||
#define ISSI_SCALING_TRF_SIZE 18 | |||
// Location of 1st bit for PWM and Scaling registers | |||
#define ISSI_PWM_REG_1ST 0x00 | |||
#define ISSI_SCL_REG_1ST 0x00 | |||
// Map CS SW locations to order in PWM / Scaling buffers | |||
// This matches the ORDER in the Datasheet Register not the POSITION | |||
// It will always count from 0x00 to (ISSI_MAX_LEDS - 1) | |||
#define CS1_SW1 0x00 | |||
#define CS2_SW1 0x01 | |||
#define CS3_SW1 0x02 | |||
#define CS4_SW1 0x03 | |||
#define CS5_SW1 0x04 | |||
#define CS6_SW1 0x05 | |||
#define CS7_SW1 0x06 | |||
#define CS8_SW1 0x07 | |||
#define CS9_SW1 0x08 | |||
#define CS10_SW1 0x09 | |||
#define CS11_SW1 0x0A | |||
#define CS12_SW1 0x0B | |||
#define CS13_SW1 0x0C | |||
#define CS14_SW1 0x0D | |||
#define CS15_SW1 0x0E | |||
#define CS16_SW1 0x0F | |||
#define CS17_SW1 0x10 | |||
#define CS18_SW1 0x11 | |||
#define CS19_SW1 0x12 | |||
#define CS20_SW1 0x13 | |||
#define CS21_SW1 0x14 | |||
#define CS22_SW1 0x15 | |||
#define CS23_SW1 0x16 | |||
#define CS24_SW1 0x17 | |||
#define CS25_SW1 0x18 | |||
#define CS26_SW1 0x19 | |||
#define CS27_SW1 0x1A | |||
#define CS28_SW1 0x1B | |||
#define CS29_SW1 0x1C | |||
#define CS30_SW1 0x1D | |||
#define CS1_SW2 0x1E | |||
#define CS2_SW2 0x1F | |||
#define CS3_SW2 0x20 | |||
#define CS4_SW2 0x21 | |||
#define CS5_SW2 0x22 | |||
#define CS6_SW2 0x23 | |||
#define CS7_SW2 0x24 | |||
#define CS8_SW2 0x25 | |||
#define CS9_SW2 0x26 | |||
#define CS10_SW2 0x27 | |||
#define CS11_SW2 0x28 | |||
#define CS12_SW2 0x29 | |||
#define CS13_SW2 0x2A | |||
#define CS14_SW2 0x2B | |||
#define CS15_SW2 0x2C | |||
#define CS16_SW2 0x2D | |||
#define CS17_SW2 0x2E | |||
#define CS18_SW2 0x2F | |||
#define CS19_SW2 0x30 | |||
#define CS20_SW2 0x31 | |||
#define CS21_SW2 0x32 | |||
#define CS22_SW2 0x33 | |||
#define CS23_SW2 0x34 | |||
#define CS24_SW2 0x35 | |||
#define CS25_SW2 0x36 | |||
#define CS26_SW2 0x37 | |||
#define CS27_SW2 0x38 | |||
#define CS28_SW2 0x39 | |||
#define CS29_SW2 0x3A | |||
#define CS30_SW2 0x3B | |||
#define CS1_SW3 0x3C | |||
#define CS2_SW3 0x3D | |||
#define CS3_SW3 0x3E | |||
#define CS4_SW3 0x3F | |||
#define CS5_SW3 0x40 | |||
#define CS6_SW3 0x41 | |||
#define CS7_SW3 0x42 | |||
#define CS8_SW3 0x43 | |||
#define CS9_SW3 0x44 | |||
#define CS10_SW3 0x45 | |||
#define CS11_SW3 0x46 | |||
#define CS12_SW3 0x47 | |||
#define CS13_SW3 0x48 | |||
#define CS14_SW3 0x49 | |||
#define CS15_SW3 0x4A | |||
#define CS16_SW3 0x4B | |||
#define CS17_SW3 0x4C | |||
#define CS18_SW3 0x4D | |||
#define CS19_SW3 0x4E | |||
#define CS20_SW3 0x4F | |||
#define CS21_SW3 0x50 | |||
#define CS22_SW3 0x51 | |||
#define CS23_SW3 0x52 | |||
#define CS24_SW3 0x53 | |||
#define CS25_SW3 0x54 | |||
#define CS26_SW3 0x55 | |||
#define CS27_SW3 0x56 | |||
#define CS28_SW3 0x57 | |||
#define CS29_SW3 0x58 | |||
#define CS30_SW3 0x59 | |||
#define CS1_SW4 0x5A | |||
#define CS2_SW4 0x5B | |||
#define CS3_SW4 0x5C | |||
#define CS4_SW4 0x5D | |||
#define CS5_SW4 0x5E | |||
#define CS6_SW4 0x5F | |||
#define CS7_SW4 0x60 | |||
#define CS8_SW4 0x61 | |||
#define CS9_SW4 0x62 | |||
#define CS10_SW4 0x63 | |||
#define CS11_SW4 0x64 | |||
#define CS12_SW4 0x65 | |||
#define CS13_SW4 0x66 | |||
#define CS14_SW4 0x67 | |||
#define CS15_SW4 0x68 | |||
#define CS16_SW4 0x69 | |||
#define CS17_SW4 0x6A | |||
#define CS18_SW4 0x6B | |||
#define CS19_SW4 0x6C | |||
#define CS20_SW4 0x6D | |||
#define CS21_SW4 0x6E | |||
#define CS22_SW4 0x6F | |||
#define CS23_SW4 0x70 | |||
#define CS24_SW4 0x71 | |||
#define CS25_SW4 0x72 | |||
#define CS26_SW4 0x73 | |||
#define CS27_SW4 0x74 | |||
#define CS28_SW4 0x75 | |||
#define CS29_SW4 0x76 | |||
#define CS30_SW4 0x77 | |||
#define CS1_SW5 0x78 | |||
#define CS2_SW5 0x79 | |||
#define CS3_SW5 0x7A | |||
#define CS4_SW5 0x7B | |||
#define CS5_SW5 0x7C | |||
#define CS6_SW5 0x7D | |||
#define CS7_SW5 0x7E | |||
#define CS8_SW5 0x7F | |||
#define CS9_SW5 0x80 | |||
#define CS10_SW5 0x81 | |||
#define CS11_SW5 0x82 | |||
#define CS12_SW5 0x83 | |||
#define CS13_SW5 0x84 | |||
#define CS14_SW5 0x85 | |||
#define CS15_SW5 0x86 | |||
#define CS16_SW5 0x87 | |||
#define CS17_SW5 0x88 | |||
#define CS18_SW5 0x89 | |||
#define CS19_SW5 0x8A | |||
#define CS20_SW5 0x8B | |||
#define CS21_SW5 0x8C | |||
#define CS22_SW5 0x8D | |||
#define CS23_SW5 0x8E | |||
#define CS24_SW5 0x8F | |||
#define CS25_SW5 0x90 | |||
#define CS26_SW5 0x91 | |||
#define CS27_SW5 0x92 | |||
#define CS28_SW5 0x93 | |||
#define CS29_SW5 0x94 | |||
#define CS30_SW5 0x95 | |||
#define CS1_SW6 0x96 | |||
#define CS2_SW6 0x97 | |||
#define CS3_SW6 0x98 | |||
#define CS4_SW6 0x99 | |||
#define CS5_SW6 0x9A | |||
#define CS6_SW6 0x9B | |||
#define CS7_SW6 0x9C | |||
#define CS8_SW6 0x9D | |||
#define CS9_SW6 0x9E | |||
#define CS10_SW6 0x9F | |||
#define CS11_SW6 0xA0 | |||
#define CS12_SW6 0xA1 | |||
#define CS13_SW6 0xA2 | |||
#define CS14_SW6 0xA3 | |||
#define CS15_SW6 0xA4 | |||
#define CS16_SW6 0xA5 | |||
#define CS17_SW6 0xA6 | |||
#define CS18_SW6 0xA7 | |||
#define CS19_SW6 0xA8 | |||
#define CS20_SW6 0xA9 | |||
#define CS21_SW6 0xAA | |||
#define CS22_SW6 0xAB | |||
#define CS23_SW6 0xAC | |||
#define CS24_SW6 0xAD | |||
#define CS25_SW6 0xAE | |||
#define CS26_SW6 0xAF | |||
#define CS27_SW6 0xB0 | |||
#define CS28_SW6 0xB1 | |||
#define CS29_SW6 0xB2 | |||
#define CS30_SW6 0xB3 |
@ -0,0 +1,327 @@ | |||
/* Copyright 2017 Jason Williams | |||
* Copyright 2018 Jack Humbert | |||
* Copyright 2018 Yiancar | |||
* Copyright 2020 MelGeek | |||
* Copyright 2021 MasterSpoon | |||
* | |||
* 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 | |||
* the Free Software Foundation, either version 2 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#pragma once | |||
// 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: | |||
// 00 <-> GND | |||
// 01 <-> SCL | |||
// 10 <-> SDA | |||
// 11 <-> VCC | |||
// ADDR1 represents A1:A0 of the 7-bit address. | |||
// ADDR2 represents A3:A2 of the 7-bit address. | |||
// The result is: 0b010(ADDR2)(ADDR1) | |||
#ifndef DRIVER_ADDR_1 | |||
# define DRIVER_ADDR_1 0b0100000 | |||
#endif | |||
// Set defaults for Spread Spectrum Register | |||
#ifndef ISSI_SSR_1 | |||
# if DRIVER_COUNT == 1 | |||
# define ISSI_SSR_1 0x00 | |||
# else | |||
# define ISSI_SSR_1 0xC0 | |||
# endif | |||
#endif | |||
#ifndef ISSI_SSR_2 | |||
# define ISSI_SSR_2 0x80 | |||
#endif | |||
#ifndef ISSI_SSR_3 | |||
# define ISSI_SSR_3 0x80 | |||
#endif | |||
#ifndef ISSI_SSR_4 | |||
# define ISSI_SSR_4 0x80 | |||
#endif | |||
// Command Registers | |||
#define ISSI_COMMANDREGISTER_WRITELOCK 0xFE | |||
#define ISSI_COMMANDREGISTER 0xFD | |||
#define ISSI_IDREGISTER 0xFC | |||
#define ISSI_REGISTER_UNLOCK 0xC5 | |||
// Response Registers | |||
#define ISSI_PAGE_PWM 0x00 | |||
#define ISSI_PAGE_SCALING 0x01 | |||
#define ISSI_PAGE_FUNCTION 0x02 | |||
// Registers under Function Register | |||
#define ISSI_REG_CONFIGURATION 0x00 | |||
#define ISSI_REG_GLOBALCURRENT 0x01 | |||
#define ISSI_REG_PULLDOWNUP 0x02 | |||
#define ISSI_REG_TEMP 0x24 | |||
#define ISSI_REG_SSR 0x25 | |||
#define ISSI_REG_RESET 0x2F | |||
// Set defaults for Function Registers | |||
#ifndef ISSI_CONFIGURATION | |||
# define ISSI_CONFIGURATION 0x01 | |||
#endif | |||
#ifndef ISSI_GLOBALCURRENT | |||
# define ISSI_GLOBALCURRENT 0xFF | |||
#endif | |||
#ifndef ISSI_PULLDOWNUP | |||
# define ISSI_PULLDOWNUP 0x33 | |||
#endif | |||
#ifndef ISSI_TEMP | |||
# define ISSI_TEMP 0x00 | |||
#endif | |||
// Set defaults for Scaling registers | |||
#ifndef ISSI_SCAL_RED | |||
# define ISSI_SCAL_RED 0xFF | |||
#endif | |||
#ifndef ISSI_SCAL_BLUE | |||
# define ISSI_SCAL_BLUE 0xFF | |||
#endif | |||
#ifndef ISSI_SCAL_GREEN | |||
# define ISSI_SCAL_GREEN 0xFF | |||
#endif | |||
#define ISSI_SCAL_RED_OFF 0x00 | |||
#define ISSI_SCAL_GREEN_OFF 0x00 | |||
#define ISSI_SCAL_BLUE_OFF 0x00 | |||
#ifndef ISSI_SCAL_LED | |||
# define ISSI_SCAL_LED 0xFF | |||
#endif | |||
#define ISSI_SCAL_LED_OFF 0x00 | |||
// Set buffer sizes | |||
#define ISSI_MAX_LEDS 198 | |||
#define ISSI_SCALING_SIZE 198 | |||
#define ISSI_PWM_TRF_SIZE 18 | |||
#define ISSI_SCALING_TRF_SIZE 18 | |||
// Location of 1st bit for PWM and Scaling registers | |||
#define ISSI_PWM_REG_1ST 0x01 | |||
#define ISSI_SCL_REG_1ST 0x01 | |||
// Map CS SW locations to order in PWM / Scaling buffers | |||
// This matches the ORDER in the Datasheet Register not the POSITION | |||
// It will always count from 0x00 to (ISSI_MAX_LEDS - 1) | |||
#define CS1_SW1 0x00 | |||
#define CS2_SW1 0x01 | |||
#define CS3_SW1 0x02 | |||
#define CS4_SW1 0x03 | |||
#define CS5_SW1 0x04 | |||
#define CS6_SW1 0x05 | |||
#define CS7_SW1 0x06 | |||
#define CS8_SW1 0x07 | |||
#define CS9_SW1 0x08 | |||
#define CS10_SW1 0x09 | |||
#define CS11_SW1 0x0A | |||
#define CS12_SW1 0x0B | |||
#define CS13_SW1 0x0C | |||
#define CS14_SW1 0x0D | |||
#define CS15_SW1 0x0E | |||
#define CS16_SW1 0x0F | |||
#define CS17_SW1 0x10 | |||
#define CS18_SW1 0x11 | |||
#define CS1_SW2 0x12 | |||
#define CS2_SW2 0x13 | |||
#define CS3_SW2 0x14 | |||
#define CS4_SW2 0x15 | |||
#define CS5_SW2 0x16 | |||
#define CS6_SW2 0x17 | |||
#define CS7_SW2 0x18 | |||
#define CS8_SW2 0x19 | |||
#define CS9_SW2 0x1A | |||
#define CS10_SW2 0x1B | |||
#define CS11_SW2 0x1C | |||
#define CS12_SW2 0x1D | |||
#define CS13_SW2 0x1E | |||
#define CS14_SW2 0x1F | |||
#define CS15_SW2 0x20 | |||
#define CS16_SW2 0x21 | |||
#define CS17_SW2 0x22 | |||
#define CS18_SW2 0x23 | |||
#define CS1_SW3 0x24 | |||
#define CS2_SW3 0x25 | |||
#define CS3_SW3 0x26 | |||
#define CS4_SW3 0x27 | |||
#define CS5_SW3 0x28 | |||
#define CS6_SW3 0x29 | |||
#define CS7_SW3 0x2A | |||
#define CS8_SW3 0x2B | |||
#define CS9_SW3 0x2C | |||
#define CS10_SW3 0x2D | |||
#define CS11_SW3 0x2E | |||
#define CS12_SW3 0x2F | |||
#define CS13_SW3 0x30 | |||
#define CS14_SW3 0x31 | |||
#define CS15_SW3 0x32 | |||
#define CS16_SW3 0x33 | |||
#define CS17_SW3 0x34 | |||
#define CS18_SW3 0x35 | |||
#define CS1_SW4 0x36 | |||
#define CS2_SW4 0x37 | |||
#define CS3_SW4 0x38 | |||
#define CS4_SW4 0x39 | |||
#define CS5_SW4 0x3A | |||
#define CS6_SW4 0x3B | |||
#define CS7_SW4 0x3C | |||
#define CS8_SW4 0x3D | |||
#define CS9_SW4 0x3E | |||
#define CS10_SW4 0x3F | |||
#define CS11_SW4 0x40 | |||
#define CS12_SW4 0x41 | |||
#define CS13_SW4 0x42 | |||
#define CS14_SW4 0x43 | |||
#define CS15_SW4 0x44 | |||
#define CS16_SW4 0x45 | |||
#define CS17_SW4 0x46 | |||
#define CS18_SW4 0x47 | |||
#define CS1_SW5 0x48 | |||
#define CS2_SW5 0x49 | |||
#define CS3_SW5 0x4A | |||
#define CS4_SW5 0x4B | |||
#define CS5_SW5 0x4C | |||
#define CS6_SW5 0x4D | |||
#define CS7_SW5 0x4E | |||
#define CS8_SW5 0x4F | |||
#define CS9_SW5 0x50 | |||
#define CS10_SW5 0x51 | |||
#define CS11_SW5 0x52 | |||
#define CS12_SW5 0x53 | |||
#define CS13_SW5 0x54 | |||
#define CS14_SW5 0x55 | |||
#define CS15_SW5 0x56 | |||
#define CS16_SW5 0x57 | |||
#define CS17_SW5 0x58 | |||
#define CS18_SW5 0x59 | |||
#define CS1_SW6 0x5A | |||
#define CS2_SW6 0x5B | |||
#define CS3_SW6 0x5C | |||
#define CS4_SW6 0x5D | |||
#define CS5_SW6 0x5E | |||
#define CS6_SW6 0x5F | |||
#define CS7_SW6 0x60 | |||
#define CS8_SW6 0x61 | |||
#define CS9_SW6 0x62 | |||
#define CS10_SW6 0x63 | |||
#define CS11_SW6 0x64 | |||
#define CS12_SW6 0x65 | |||
#define CS13_SW6 0x66 | |||
#define CS14_SW6 0x67 | |||
#define CS15_SW6 0x68 | |||
#define CS16_SW6 0x69 | |||
#define CS17_SW6 0x6A | |||
#define CS18_SW6 0x6B | |||
#define CS1_SW7 0x6C | |||
#define CS2_SW7 0x6D | |||
#define CS3_SW7 0x6E | |||
#define CS4_SW7 0x6F | |||
#define CS5_SW7 0x70 | |||
#define CS6_SW7 0x71 | |||
#define CS7_SW7 0x72 | |||
#define CS8_SW7 0x73 | |||
#define CS9_SW7 0x74 | |||
#define CS10_SW7 0x75 | |||
#define CS11_SW7 0x76 | |||
#define CS12_SW7 0x77 | |||
#define CS13_SW7 0x78 | |||
#define CS14_SW7 0x79 | |||
#define CS15_SW7 0x7A | |||
#define CS16_SW7 0x7B | |||
#define CS17_SW7 0x7C | |||
#define CS18_SW7 0x7D | |||
#define CS1_SW8 0x7E | |||
#define CS2_SW8 0x7F | |||
#define CS3_SW8 0x80 | |||
#define CS4_SW8 0x81 | |||
#define CS5_SW8 0x82 | |||
#define CS6_SW8 0x83 | |||
#define CS7_SW8 0x84 | |||
#define CS8_SW8 0x85 | |||
#define CS9_SW8 0x86 | |||
#define CS10_SW8 0x87 | |||
#define CS11_SW8 0x88 | |||
#define CS12_SW8 0x89 | |||
#define CS13_SW8 0x8A | |||
#define CS14_SW8 0x8B | |||
#define CS15_SW8 0x8C | |||
#define CS16_SW8 0x8D | |||
#define CS17_SW8 0x8E | |||
#define CS18_SW8 0x8F | |||
#define CS1_SW9 0x90 | |||
#define CS2_SW9 0x91 | |||
#define CS3_SW9 0x92 | |||
#define CS4_SW9 0x93 | |||
#define CS5_SW9 0x94 | |||
#define CS6_SW9 0x95 | |||
#define CS7_SW9 0x96 | |||
#define CS8_SW9 0x97 | |||
#define CS9_SW9 0x98 | |||
#define CS10_SW9 0x99 | |||
#define CS11_SW9 0x9A | |||
#define CS12_SW9 0x9B | |||
#define CS13_SW9 0x9C | |||
#define CS14_SW9 0x9D | |||
#define CS15_SW9 0x9E | |||
#define CS16_SW9 0x9F | |||
#define CS17_SW9 0xA0 | |||
#define CS18_SW9 0xA1 | |||
#define CS1_SW10 0xA2 | |||
#define CS2_SW10 0xA3 | |||
#define CS3_SW10 0xA4 | |||
#define CS4_SW10 0xA5 | |||
#define CS5_SW10 0xA6 | |||
#define CS6_SW10 0xA7 | |||
#define CS7_SW10 0xA8 | |||
#define CS8_SW10 0xA9 | |||
#define CS9_SW10 0xAA | |||
#define CS10_SW10 0xAB | |||
#define CS11_SW10 0xAC | |||
#define CS12_SW10 0xAD | |||
#define CS13_SW10 0xAE | |||
#define CS14_SW10 0xAF | |||
#define CS15_SW10 0xB0 | |||
#define CS16_SW10 0xB1 | |||
#define CS17_SW10 0xB2 | |||
#define CS18_SW10 0xB3 | |||
#define CS1_SW11 0xB4 | |||
#define CS2_SW11 0xB5 | |||
#define CS3_SW11 0xB6 | |||
#define CS4_SW11 0xB7 | |||
#define CS5_SW11 0xB8 | |||
#define CS6_SW11 0xB9 | |||
#define CS7_SW11 0xBA | |||
#define CS8_SW11 0xBB | |||
#define CS9_SW11 0xBC | |||
#define CS10_SW11 0xBD | |||
#define CS11_SW11 0xBE | |||
#define CS12_SW11 0xBF | |||
#define CS13_SW11 0xC0 | |||
#define CS14_SW11 0xC1 | |||
#define CS15_SW11 0xC2 | |||
#define CS16_SW11 0xC3 | |||
#define CS17_SW11 0xC4 | |||
#define CS18_SW11 0xC5 |
@ -0,0 +1,270 @@ | |||
/* Copyright 2017 Jason Williams | |||
* Copyright 2018 Jack Humbert | |||
* Copyright 2018 Yiancar | |||
* Copyright 2020 MelGeek | |||
* Copyright 2021 MasterSpoon | |||
* | |||
* 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 | |||
* the Free Software Foundation, either version 2 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#pragma once | |||
// 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: | |||
// 00 <-> GND | |||
// 01 <-> SCL | |||
// 10 <-> SDA | |||
// 11 <-> VCC | |||
// ADDR1 represents A1:A0 of the 7-bit address. | |||
// ADDR2 represents A3:A2 of the 7-bit address. | |||
// The result is: 0b010(ADDR2)(ADDR1) | |||
#ifndef DRIVER_ADDR_1 | |||
# define DRIVER_ADDR_1 0b0100000 | |||
#endif | |||
// Set defaults for Spread Spectrum Register | |||
#ifndef ISSI_SSR_1 | |||
# if DRIVER_COUNT == 1 | |||
# define ISSI_SSR_1 0x00 | |||
# else | |||
# define ISSI_SSR_1 0xC0 | |||
# endif | |||
#endif | |||
#ifndef ISSI_SSR_2 | |||
# define ISSI_SSR_2 0x80 | |||
#endif | |||
#ifndef ISSI_SSR_3 | |||
# define ISSI_SSR_3 0x80 | |||
#endif | |||
#ifndef ISSI_SSR_4 | |||
# define ISSI_SSR_4 0x80 | |||
#endif | |||
// Command Registers | |||
#define ISSI_COMMANDREGISTER_WRITELOCK 0xFE | |||
#define ISSI_COMMANDREGISTER 0xFD | |||
#define ISSI_IDREGISTER 0xFC | |||
#define ISSI_REGISTER_UNLOCK 0xC5 | |||
// Response Registers | |||
#define ISSI_PAGE_PWM 0x00 | |||
#define ISSI_PAGE_SCALING 0x01 | |||
#define ISSI_PAGE_FUNCTION 0x02 | |||
// Registers under Function Register | |||
#define ISSI_REG_CONFIGURATION 0x00 | |||
#define ISSI_REG_GLOBALCURRENT 0x01 | |||
#define ISSI_REG_PULLDOWNUP 0x02 | |||
#define ISSI_REG_TEMP 0x24 | |||
#define ISSI_REG_SSR 0x25 | |||
#define ISSI_REG_RESET 0x2F | |||
// Set defaults for Function Registers | |||
#ifndef ISSI_CONFIGURATION | |||
# define ISSI_CONFIGURATION 0x31 | |||
#endif | |||
#ifndef ISSI_GLOBALCURRENT | |||
# define ISSI_GLOBALCURRENT 0xFF | |||
#endif | |||
#ifndef ISSI_PULLDOWNUP | |||
# define ISSI_PULLDOWNUP 0x33 | |||
#endif | |||
#ifndef ISSI_TEMP | |||
# define ISSI_TEMP 0x00 | |||
#endif | |||
// Set defaults for Scaling registers | |||
#ifndef ISSI_SCAL_RED | |||
# define ISSI_SCAL_RED 0xFF | |||
#endif | |||
#ifndef ISSI_SCAL_BLUE | |||
# define ISSI_SCAL_BLUE 0xFF | |||
#endif | |||
#ifndef ISSI_SCAL_GREEN | |||
# define ISSI_SCAL_GREEN 0xFF | |||
#endif | |||
#define ISSI_SCAL_RED_OFF 0x00 | |||
#define ISSI_SCAL_GREEN_OFF 0x00 | |||
#define ISSI_SCAL_BLUE_OFF 0x00 | |||
#ifndef ISSI_SCAL_LED | |||
# define ISSI_SCAL_LED 0xFF | |||
#endif | |||
#define ISSI_SCAL_LED_OFF 0x00 | |||
// Set buffer sizes | |||
#define ISSI_MAX_LEDS 144 | |||
#define ISSI_SCALING_SIZE 144 | |||
#define ISSI_PWM_TRF_SIZE 18 | |||
#define ISSI_SCALING_TRF_SIZE 18 | |||
// Location of 1st bit for PWM and Scaling registers | |||
#define ISSI_PWM_REG_1ST 0x01 | |||
#define ISSI_SCL_REG_1ST 0x01 | |||
// Map CS SW locations to order in PWM / Scaling buffers | |||
// This matches the ORDER in the Datasheet Register not the POSITION | |||
// It will always count from 0x00 to (ISSI_MAX_LEDS - 1) | |||
#define CS1_SW1 0x00 | |||
#define CS2_SW1 0x01 | |||
#define CS3_SW1 0x02 | |||
#define CS4_SW1 0x03 | |||
#define CS5_SW1 0x04 | |||
#define CS6_SW1 0x05 | |||
#define CS7_SW1 0x06 | |||
#define CS8_SW1 0x07 | |||
#define CS9_SW1 0x08 | |||
#define CS10_SW1 0x09 | |||
#define CS11_SW1 0x0A | |||
#define CS12_SW1 0x0B | |||
#define CS13_SW1 0x0C | |||
#define CS14_SW1 0x0D | |||
#define CS15_SW1 0x0E | |||
#define CS16_SW1 0x0F | |||
#define CS17_SW1 0x10 | |||
#define CS18_SW1 0x11 | |||
#define CS1_SW2 0x12 | |||
#define CS2_SW2 0x13 | |||
#define CS3_SW2 0x14 | |||
#define CS4_SW2 0x15 | |||
#define CS5_SW2 0x16 | |||
#define CS6_SW2 0x17 | |||
#define CS7_SW2 0x18 | |||
#define CS8_SW2 0x19 | |||
#define CS9_SW2 0x1A | |||
#define CS10_SW2 0x1B | |||
#define CS11_SW2 0x1C | |||
#define CS12_SW2 0x1D | |||
#define CS13_SW2 0x1E | |||
#define CS14_SW2 0x1F | |||
#define CS15_SW2 0x20 | |||
#define CS16_SW2 0x21 | |||
#define CS17_SW2 0x22 | |||
#define CS18_SW2 0x23 | |||
#define CS1_SW3 0x24 | |||
#define CS2_SW3 0x25 | |||
#define CS3_SW3 0x26 | |||
#define CS4_SW3 0x27 | |||
#define CS5_SW3 0x28 | |||
#define CS6_SW3 0x29 | |||
#define CS7_SW3 0x2A | |||
#define CS8_SW3 0x2B | |||
#define CS9_SW3 0x2C | |||
#define CS10_SW3 0x2D | |||
#define CS11_SW3 0x2E | |||
#define CS12_SW3 0x2F | |||
#define CS13_SW3 0x30 | |||
#define CS14_SW3 0x31 | |||
#define CS15_SW3 0x32 | |||
#define CS16_SW3 0x33 | |||
#define CS17_SW3 0x34 | |||
#define CS18_SW3 0x35 | |||
#define CS1_SW4 0x36 | |||
#define CS2_SW4 0x37 | |||
#define CS3_SW4 0x38 | |||
#define CS4_SW4 0x39 | |||
#define CS5_SW4 0x3A | |||
#define CS6_SW4 0x3B | |||
#define CS7_SW4 0x3C | |||
#define CS8_SW4 0x3D | |||
#define CS9_SW4 0x3E | |||
#define CS10_SW4 0x3F | |||
#define CS11_SW4 0x40 | |||
#define CS12_SW4 0x41 | |||
#define CS13_SW4 0x42 | |||
#define CS14_SW4 0x43 | |||
#define CS15_SW4 0x44 | |||
#define CS16_SW4 0x45 | |||
#define CS17_SW4 0x46 | |||
#define CS18_SW4 0x47 | |||
#define CS1_SW5 0x48 | |||
#define CS2_SW5 0x49 | |||
#define CS3_SW5 0x4A | |||
#define CS4_SW5 0x4B | |||
#define CS5_SW5 0x4C | |||
#define CS6_SW5 0x4D | |||
#define CS7_SW5 0x4E | |||
#define CS8_SW5 0x4F | |||
#define CS9_SW5 0x50 | |||
#define CS10_SW5 0x51 | |||
#define CS11_SW5 0x52 | |||
#define CS12_SW5 0x53 | |||
#define CS13_SW5 0x54 | |||
#define CS14_SW5 0x55 | |||
#define CS15_SW5 0x56 | |||
#define CS16_SW5 0x57 | |||
#define CS17_SW5 0x58 | |||
#define CS18_SW5 0x59 | |||
#define CS1_SW6 0x5A | |||
#define CS2_SW6 0x5B | |||
#define CS3_SW6 0x5C | |||
#define CS4_SW6 0x5D | |||
#define CS5_SW6 0x5E | |||
#define CS6_SW6 0x5F | |||
#define CS7_SW6 0x60 | |||
#define CS8_SW6 0x61 | |||
#define CS9_SW6 0x62 | |||
#define CS10_SW6 0x63 | |||
#define CS11_SW6 0x64 | |||
#define CS12_SW6 0x65 | |||
#define CS13_SW6 0x66 | |||
#define CS14_SW6 0x67 | |||
#define CS15_SW6 0x68 | |||
#define CS16_SW6 0x69 | |||
#define CS17_SW6 0x6A | |||
#define CS18_SW6 0x6B | |||
#define CS1_SW7 0x6C | |||
#define CS2_SW7 0x6D | |||
#define CS3_SW7 0x6E | |||
#define CS4_SW7 0x6F | |||
#define CS5_SW7 0x70 | |||
#define CS6_SW7 0x71 | |||
#define CS7_SW7 0x72 | |||
#define CS8_SW7 0x73 | |||
#define CS9_SW7 0x74 | |||
#define CS10_SW7 0x75 | |||
#define CS11_SW7 0x76 | |||
#define CS12_SW7 0x77 | |||
#define CS13_SW7 0x78 | |||
#define CS14_SW7 0x79 | |||
#define CS15_SW7 0x7A | |||
#define CS16_SW7 0x7B | |||
#define CS17_SW7 0x7C | |||
#define CS18_SW7 0x7D | |||
#define CS1_SW8 0x7E | |||
#define CS2_SW8 0x7F | |||
#define CS3_SW8 0x80 | |||
#define CS4_SW8 0x81 | |||
#define CS5_SW8 0x82 | |||
#define CS6_SW8 0x83 | |||
#define CS7_SW8 0x84 | |||
#define CS8_SW8 0x85 | |||
#define CS9_SW8 0x86 | |||
#define CS10_SW8 0x87 | |||
#define CS11_SW8 0x88 | |||
#define CS12_SW8 0x89 | |||
#define CS13_SW8 0x8A | |||
#define CS14_SW8 0x8B | |||
#define CS15_SW8 0x8C | |||
#define CS16_SW8 0x8D | |||
#define CS17_SW8 0x8E | |||
#define CS18_SW8 0x8F |
@ -0,0 +1,198 @@ | |||
/* Copyright 2017 Jason Williams | |||
* Copyright 2018 Jack Humbert | |||
* Copyright 2018 Yiancar | |||
* Copyright 2020 MelGeek | |||
* Copyright 2021 MasterSpoon | |||
* | |||
* 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 | |||
* the Free Software Foundation, either version 2 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#pragma once | |||
// 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: | |||
// 00 <-> GND | |||
// 01 <-> SCL | |||
// 10 <-> SDA | |||
// 11 <-> VCC | |||
// ADDR1 represents A1:A0 of the 7-bit address. | |||
// ADDR2 represents A3:A2 of the 7-bit address. | |||
// The result is: 0b110(ADDR2)(ADDR1) | |||
#ifndef DRIVER_ADDR_1 | |||
# define DRIVER_ADDR_1 0b1100000 | |||
#endif | |||
// Set defaults for Spread Spectrum Register | |||
#ifndef ISSI_SSR_1 | |||
# define ISSI_SSR_1 0x00 | |||
#endif | |||
#ifndef ISSI_SSR_2 | |||
# define ISSI_SSR_2 0x00 | |||
#endif | |||
#ifndef ISSI_SSR_3 | |||
# define ISSI_SSR_3 0x00 | |||
#endif | |||
#ifndef ISSI_SSR_4 | |||
# define ISSI_SSR_4 0x00 | |||
#endif | |||
// Command Registers | |||
#define ISSI_COMMANDREGISTER_WRITELOCK 0xFE | |||
#define ISSI_COMMANDREGISTER 0xFD | |||
#define ISSI_IDREGISTER 0xFC | |||
#define ISSI_REGISTER_UNLOCK 0xC5 | |||
// Response Registers | |||
#define ISSI_PAGE_PWM 0x00 | |||
#define ISSI_PAGE_SCALING 0x01 | |||
#define ISSI_PAGE_FUNCTION 0x01 | |||
// Registers under Function Register | |||
#define ISSI_REG_CONFIGURATION 0x50 | |||
#define ISSI_REG_GLOBALCURRENT 0x51 | |||
#define ISSI_REG_PULLDOWNUP 0x52 | |||
#define ISSI_REG_TEMP 0x5F | |||
#define ISSI_REG_SSR 0x60 | |||
#define ISSI_REG_RESET 0x8F | |||
#define ISSI_REG_PWM_ENABLE 0xE0 | |||
#define ISSI_REG_PWM_SET 0xE2 | |||
// Set defaults for Function Registers | |||
#ifndef ISSI_CONFIGURATION | |||
# define ISSI_CONFIGURATION 0x01 | |||
#endif | |||
#ifndef ISSI_GLOBALCURRENT | |||
# define ISSI_GLOBALCURRENT 0xFF | |||
#endif | |||
#ifndef ISSI_PULLDOWNUP | |||
# define ISSI_PULLDOWNUP 0x33 | |||
#endif | |||
#ifndef ISSI_TEMP | |||
# define ISSI_TEMP 0x00 | |||
#endif | |||
#ifndef ISSI_PWM_ENABLE | |||
# define ISSI_PWM_ENABLE 0x00 | |||
#endif | |||
#ifndef ISSI_PWM_SET | |||
# define ISSI_PWM_SET 0x00 | |||
#endif | |||
// Set defaults for Scaling registers | |||
#ifndef ISSI_SCAL_RED | |||
# define ISSI_SCAL_RED 0xFF | |||
#endif | |||
#ifndef ISSI_SCAL_BLUE | |||
# define ISSI_SCAL_BLUE 0xFF | |||
#endif | |||
#ifndef ISSI_SCAL_GREEN | |||
# define ISSI_SCAL_GREEN 0xFF | |||
#endif | |||
#define ISSI_SCAL_RED_OFF 0x00 | |||
#define ISSI_SCAL_GREEN_OFF 0x00 | |||
#define ISSI_SCAL_BLUE_OFF 0x00 | |||
#ifndef ISSI_SCAL_LED | |||
# define ISSI_SCAL_LED 0xFF | |||
#endif | |||
#define ISSI_SCAL_LED_OFF 0x00 | |||
// Set buffer sizes | |||
#define ISSI_MAX_LEDS 72 | |||
#define ISSI_SCALING_SIZE 72 | |||
#define ISSI_PWM_TRF_SIZE 18 | |||
#define ISSI_SCALING_TRF_SIZE 18 | |||
// Location of 1st bit for PWM and Scaling registers | |||
#define ISSI_PWM_REG_1ST 0x01 | |||
#define ISSI_SCL_REG_1ST 0x01 | |||
// Map CS SW locations to order in PWM / Scaling buffers | |||
// This matches the ORDER in the Datasheet Register not the POSITION | |||
// It will always count from 0x00 to (ISSI_MAX_LEDS - 1) | |||
#define CS1_SW1 0x00 | |||
#define CS2_SW1 0x01 | |||
#define CS3_SW1 0x02 | |||
#define CS4_SW1 0x03 | |||
#define CS5_SW1 0x04 | |||
#define CS6_SW1 0x05 | |||
#define CS7_SW1 0x06 | |||
#define CS8_SW1 0x07 | |||
#define CS9_SW1 0x08 | |||
#define CS10_SW1 0x09 | |||
#define CS11_SW1 0x0A | |||
#define CS12_SW1 0x0B | |||
#define CS13_SW1 0x0C | |||
#define CS14_SW1 0x0D | |||
#define CS15_SW1 0x0E | |||
#define CS16_SW1 0x0F | |||
#define CS17_SW1 0x10 | |||
#define CS18_SW1 0x11 | |||
#define CS1_SW2 0x12 | |||
#define CS2_SW2 0x13 | |||
#define CS3_SW2 0x14 | |||
#define CS4_SW2 0x15 | |||
#define CS5_SW2 0x16 | |||
#define CS6_SW2 0x17 | |||
#define CS7_SW2 0x18 | |||
#define CS8_SW2 0x19 | |||
#define CS9_SW2 0x1A | |||
#define CS10_SW2 0x1B | |||
#define CS11_SW2 0x1C | |||
#define CS12_SW2 0x1D | |||
#define CS13_SW2 0x1E | |||
#define CS14_SW2 0x1F | |||
#define CS15_SW2 0x20 | |||
#define CS16_SW2 0x21 | |||
#define CS17_SW2 0x22 | |||
#define CS18_SW2 0x23 | |||
#define CS1_SW3 0x24 | |||
#define CS2_SW3 0x25 | |||
#define CS3_SW3 0x26 | |||
#define CS4_SW3 0x27 | |||
#define CS5_SW3 0x28 | |||
#define CS6_SW3 0x29 | |||
#define CS7_SW3 0x2A | |||
#define CS8_SW3 0x2B | |||
#define CS9_SW3 0x2C | |||
#define CS10_SW3 0x2D | |||
#define CS11_SW3 0x2E | |||
#define CS12_SW3 0x2F | |||
#define CS13_SW3 0x30 | |||
#define CS14_SW3 0x31 | |||
#define CS15_SW3 0x32 | |||
#define CS16_SW3 0x33 | |||
#define CS17_SW3 0x34 | |||
#define CS18_SW3 0x35 | |||
#define CS1_SW4 0x36 | |||
#define CS2_SW4 0x37 | |||
#define CS3_SW4 0x38 | |||
#define CS4_SW4 0x39 | |||
#define CS5_SW4 0x3A | |||
#define CS6_SW4 0x3B | |||
#define CS7_SW4 0x3C | |||
#define CS8_SW4 0x3D | |||
#define CS9_SW4 0x3E | |||
#define CS10_SW4 0x3F | |||
#define CS11_SW4 0x40 | |||
#define CS12_SW4 0x41 | |||
#define CS13_SW4 0x42 | |||
#define CS14_SW4 0x43 | |||
#define CS15_SW4 0x44 | |||
#define CS16_SW4 0x45 | |||
#define CS17_SW4 0x46 | |||
#define CS18_SW4 0x47 |
@ -0,0 +1,230 @@ | |||
/* Copyright 2017 Jason Williams | |||
* Copyright 2018 Jack Humbert | |||
* Copyright 2018 Yiancar | |||
* Copyright 2020 MelGeek | |||
* Copyright 2021 MasterSpoon | |||
* | |||
* 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 | |||
* the Free Software Foundation, either version 2 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include "is31flcommon.h" | |||
#include "i2c_master.h" | |||
#include "wait.h" | |||
#include <string.h> | |||
// Set defaults for Timeout and Persistence | |||
#ifndef ISSI_TIMEOUT | |||
# define ISSI_TIMEOUT 100 | |||
#endif | |||
#ifndef ISSI_PERSISTENCE | |||
# define ISSI_PERSISTENCE 0 | |||
#endif | |||
// Transfer buffer for TWITransmitData() | |||
uint8_t g_twi_transfer_buffer[20]; | |||
// These buffers match the PWM & scaling registers. | |||
// Storing them like this is optimal for I2C transfers to the registers. | |||
uint8_t g_pwm_buffer[DRIVER_COUNT][ISSI_MAX_LEDS]; | |||
bool g_pwm_buffer_update_required[DRIVER_COUNT] = {false}; | |||
uint8_t g_scaling_buffer[DRIVER_COUNT][ISSI_SCALING_SIZE]; | |||
bool g_scaling_buffer_update_required[DRIVER_COUNT] = {false}; | |||
// For writing of single register entry | |||
void IS31FL_write_single_register(uint8_t addr, uint8_t reg, uint8_t data) { | |||
// Set register address and register data ready to write | |||
g_twi_transfer_buffer[0] = reg; | |||
g_twi_transfer_buffer[1] = data; | |||
#if ISSI_PERSISTENCE > 0 | |||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { | |||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) break; | |||
} | |||
#else | |||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); | |||
#endif | |||
} | |||
// For writing of mulitple register entries to make use of address auto increment | |||
// Once the controller has been called and we have written the first bit of data | |||
// the controller will move to the next register meaning we can write sequential blocks. | |||
bool IS31FL_write_multi_registers(uint8_t addr, uint8_t *source_buffer, uint8_t buffer_size, uint8_t transfer_size, uint8_t start_reg_addr) { | |||
// Split the buffer into chunks to transfer | |||
for (int i = 0; i < buffer_size; i += transfer_size) { | |||
// Set the first entry of transfer buffer to the first register we want to write | |||
g_twi_transfer_buffer[0] = i + start_reg_addr; | |||
// Copy the section of our source buffer into the transfer buffer after first register address | |||
memcpy(g_twi_transfer_buffer + 1, source_buffer + i, transfer_size); | |||
#if ISSI_PERSISTENCE > 0 | |||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { | |||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, transfer_size + 1, ISSI_TIMEOUT) != 0) { | |||
return false; | |||
} | |||
} | |||
#else | |||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, transfer_size + 1, ISSI_TIMEOUT) != 0) { | |||
return false; | |||
} | |||
#endif | |||
} | |||
return true; | |||
} | |||
void IS31FL_unlock_register(uint8_t addr, uint8_t page) { | |||
// unlock the command register and select Page to write | |||
IS31FL_write_single_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, ISSI_REGISTER_UNLOCK); | |||
IS31FL_write_single_register(addr, ISSI_COMMANDREGISTER, page); | |||
} | |||
void IS31FL_common_init(uint8_t addr, uint8_t ssr) { | |||
// Setup phase, need to take out of software shutdown and configure | |||
// ISSI_SSR_x is passed to allow Master / Slave setting where applicable | |||
// Unlock the command register & select Function Register | |||
IS31FL_unlock_register(addr, ISSI_PAGE_FUNCTION); | |||
// Set Configuration Register to remove Software shutdown | |||
IS31FL_write_single_register(addr, ISSI_REG_CONFIGURATION, ISSI_CONFIGURATION); | |||
// Set Golbal Current Control Register | |||
IS31FL_write_single_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT); | |||
// Set Pull up & Down for SWx CSy | |||
IS31FL_write_single_register(addr, ISSI_REG_PULLDOWNUP, ISSI_PULLDOWNUP); | |||
// Set Tempature Status | |||
#ifdef ISSI_REG_TEMP | |||
IS31FL_write_single_register(addr, ISSI_REG_TEMP, ISSI_TEMP); | |||
#endif | |||
// Set Spread Spectrum Register, passed through as sets SYNC function | |||
IS31FL_write_single_register(addr, ISSI_REG_SSR, ssr); | |||
// Set PWM Frequency Enable Register if applicable | |||
#ifdef ISSI_REG_PWM_ENABLE | |||
IS31FL_write_single_register(addr, ISSI_REG_PWM_ENABLE, ISSI_PWM_ENABLE); | |||
#endif | |||
// Set PWM Frequency Register if applicable | |||
#ifdef ISSI_REG_PWM_SET | |||
IS31FL_write_single_register(addr, ISSI_REG_PWM_SET, ISSI_PWM_SET); | |||
#endif | |||
// Wait 10ms to ensure the device has woken up. | |||
wait_ms(10); | |||
} | |||
void IS31FL_common_update_pwm_register(uint8_t addr, uint8_t index) { | |||
if (g_pwm_buffer_update_required[index]) { | |||
// Queue up the correct page | |||
IS31FL_unlock_register(addr, ISSI_PAGE_PWM); | |||
// Hand off the update to IS31FL_write_multi_registers | |||
IS31FL_write_multi_registers(addr, g_pwm_buffer[index], ISSI_MAX_LEDS, ISSI_PWM_TRF_SIZE, ISSI_PWM_REG_1ST); | |||
// Update flags that pwm_buffer has been updated | |||
g_pwm_buffer_update_required[index] = false; | |||
} | |||
} | |||
#ifdef ISSI_MANUAL_SCALING | |||
void IS31FL_set_manual_scaling_buffer(void) { | |||
for (int i = 0; i < ISSI_MANUAL_SCALING; i++) { | |||
is31_led scale = g_is31_scaling[i]; | |||
if (scale.driver >= 0 && scale.driver < DRIVER_LED_TOTAL) { | |||
is31_led led = g_is31_leds[scale.driver]; | |||
# ifdef RGB_MATRIX_ENABLE | |||
g_scaling_buffer[led.driver][led.r] = scale.r; | |||
g_scaling_buffer[led.driver][led.g] = scale.g; | |||
g_scaling_buffer[led.driver][led.b] = scale.b; | |||
# elif defined(LED_MATRIX_ENABLE) | |||
g_scaling_buffer[led.driver][led.v] = scale.v; | |||
# endif | |||
g_scaling_buffer_update_required[led.driver] = true; | |||
} | |||
} | |||
} | |||
#endif | |||
void IS31FL_common_update_scaling_register(uint8_t addr, uint8_t index) { | |||
if (g_scaling_buffer_update_required[index]) { | |||
// Queue up the correct page | |||
IS31FL_unlock_register(addr, ISSI_PAGE_SCALING); | |||
// Hand off the update to IS31FL_write_multi_registers | |||
IS31FL_write_multi_registers(addr, g_scaling_buffer[index], ISSI_SCALING_SIZE, ISSI_SCALING_TRF_SIZE, ISSI_SCL_REG_1ST); | |||
// Update flags that scaling_buffer has been updated | |||
g_scaling_buffer_update_required[index] = false; | |||
} | |||
} | |||
#ifdef RGB_MATRIX_ENABLE | |||
// Colour is set by adjusting PWM register | |||
void IS31FL_RGB_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) { | |||
if (index >= 0 && index < DRIVER_LED_TOTAL) { | |||
is31_led led = g_is31_leds[index]; | |||
g_pwm_buffer[led.driver][led.r] = red; | |||
g_pwm_buffer[led.driver][led.g] = green; | |||
g_pwm_buffer[led.driver][led.b] = blue; | |||
g_pwm_buffer_update_required[led.driver] = true; | |||
} | |||
} | |||
void IS31FL_RGB_set_color_all(uint8_t red, uint8_t green, uint8_t blue) { | |||
for (int i = 0; i < DRIVER_LED_TOTAL; i++) { | |||
IS31FL_RGB_set_color(i, red, green, blue); | |||
} | |||
} | |||
// Setup Scaling register that decides the peak current of each LED | |||
void IS31FL_RGB_set_scaling_buffer(uint8_t index, bool red, bool green, bool blue) { | |||
is31_led led = g_is31_leds[index]; | |||
if (red) { | |||
g_scaling_buffer[led.driver][led.r] = ISSI_SCAL_RED; | |||
} else { | |||
g_scaling_buffer[led.driver][led.r] = ISSI_SCAL_RED_OFF; | |||
} | |||
if (green) { | |||
g_scaling_buffer[led.driver][led.g] = ISSI_SCAL_GREEN; | |||
} else { | |||
g_scaling_buffer[led.driver][led.g] = ISSI_SCAL_GREEN_OFF; | |||
} | |||
if (blue) { | |||
g_scaling_buffer[led.driver][led.b] = ISSI_SCAL_BLUE; | |||
} else { | |||
g_scaling_buffer[led.driver][led.b] = ISSI_SCAL_BLUE_OFF; | |||
} | |||
g_scaling_buffer_update_required[led.driver] = true; | |||
} | |||
#elif defined(LED_MATRIX_ENABLE) | |||
// LED Matrix Specific scripts | |||
void IS31FL_simple_set_scaling_buffer(uint8_t index, bool value) { | |||
is31_led led = g_is31_leds[index]; | |||
if (value) { | |||
g_scaling_buffer[led.driver][led.v] = ISSI_SCAL_LED; | |||
} else { | |||
g_scaling_buffer[led.driver][led.v] = ISSI_SCAL_LED_OFF; | |||
} | |||
g_scaling_buffer_update_required[led.driver] = true; | |||
} | |||
void IS31FL_simple_set_brightness(int index, uint8_t value) { | |||
if (index >= 0 && index < DRIVER_LED_TOTAL) { | |||
is31_led led = g_is31_leds[index]; | |||
g_pwm_buffer[led.driver][led.v] = value; | |||
g_pwm_buffer_update_required[led.driver] = true; | |||
} | |||
} | |||
void IS31FL_simple_set_brigntness_all(uint8_t value) { | |||
for (int i = 0; i < DRIVER_LED_TOTAL; i++) { | |||
IS31FL_simple_set_brightness(i, value); | |||
} | |||
} | |||
#endif |
@ -0,0 +1,78 @@ | |||
/* Copyright 2017 Jason Williams | |||
* Copyright 2018 Jack Humbert | |||
* Copyright 2018 Yiancar | |||
* Copyright 2020 MelGeek | |||
* Copyright 2021 MasterSpoon | |||
* | |||
* 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 | |||
* the Free Software Foundation, either version 2 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#pragma once | |||
#include <stdint.h> | |||
#include <stdbool.h> | |||
#include "progmem.h" | |||
// Which variant header file to use | |||
#ifdef IS31FL3742A | |||
# include "is31fl3742.h" | |||
#elif defined(IS31FL3743A) | |||
# include "is31fl3743.h" | |||
#elif defined(IS31FL3745) | |||
# include "is31fl3745.h" | |||
#elif defined(IS31FL3746A) | |||
# include "is31fl3746.h" | |||
#endif | |||
#ifdef RGB_MATRIX_ENABLE | |||
typedef struct is31_led { | |||
uint8_t driver; | |||
uint8_t r; | |||
uint8_t g; | |||
uint8_t b; | |||
} __attribute__((packed)) is31_led; | |||
#elif defined(LED_MATRIX_ENABLE) | |||
typedef struct is31_led { | |||
uint8_t driver; | |||
uint8_t v; | |||
} __attribute__((packed)) is31_led; | |||
#endif | |||
#ifdef ISSI_MANUAL_SCALING | |||
extern const is31_led __flash g_is31_scaling[]; | |||
void IS31FL_set_manual_scaling_buffer(void); | |||
#endif | |||
extern const is31_led __flash g_is31_leds[DRIVER_LED_TOTAL]; | |||
void IS31FL_write_single_register(uint8_t addr, uint8_t reg, uint8_t data); | |||
bool IS31FL_write_multi_registers(uint8_t addr, uint8_t *source_buffer, uint8_t buffer_size, uint8_t transfer_size, uint8_t start_reg_addr); | |||
void IS31FL_unlock_register(uint8_t addr, uint8_t page); | |||
void IS31FL_common_init(uint8_t addr, uint8_t ssr); | |||
void IS31FL_common_update_pwm_register(uint8_t addr, uint8_t index); | |||
void IS31FL_common_update_scaling_register(uint8_t addr, uint8_t index); | |||
#ifdef RGB_MATRIX_ENABLE | |||
// RGB Matrix Specific scripts | |||
void IS31FL_RGB_set_color(int index, uint8_t red, uint8_t green, uint8_t blue); | |||
void IS31FL_RGB_set_color_all(uint8_t red, uint8_t green, uint8_t blue); | |||
void IS31FL_RGB_set_scaling_buffer(uint8_t index, bool red, bool green, bool blue); | |||
#elif defined(LED_MATRIX_ENABLE) | |||
// LED Matrix Specific scripts | |||
void IS31FL_simple_set_scaling_buffer(uint8_t index, bool value); | |||
void IS31FL_simple_set_brightness(int index, uint8_t value); | |||
void IS31FL_simple_set_brigntness_all(uint8_t value); | |||
#endif |