From 4f3934fddce2813512ccfb6a0f835178d87c261c Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 5 Jan 2021 13:15:59 -0700 Subject: [PATCH 1/3] Do not duplicate kbled support. Add kbled_max and kbled_get_color functions --- src/board/system76/addw1/board.mk | 3 ++ src/board/system76/addw2/board.mk | 3 ++ src/board/system76/addw2/kbled.c | 36 -------------- src/board/system76/bonw14/board.mk | 3 ++ src/board/system76/common/common.mk | 4 ++ .../system76/common/include/board/kbled.h | 2 + .../{bonw14/kbled.c => common/kbled/bonw14.c} | 19 ++++---- .../{darp5/kbled.c => common/kbled/darp5.c} | 21 ++++++++ src/board/system76/common/kbled/none.c | 17 +++++++ .../{oryp5/kbled.c => common/kbled/oryp5.c} | 25 +++++++++- .../{addw1/kbled.c => common/kbled/rgb_pwm.c} | 17 +++++++ .../kbled.c => common/kbled/white_dac.c} | 13 ++++- src/board/system76/darp5/board.mk | 7 +-- src/board/system76/darp7/board.mk | 3 ++ src/board/system76/darp7/kbled.c | 36 -------------- src/board/system76/galp3-c/board.mk | 4 ++ src/board/system76/galp3-c/kbled.c | 48 ------------------- src/board/system76/galp5/board.mk | 4 ++ src/board/system76/gaze15/board.mk | 3 ++ src/board/system76/gaze15/kbled.c | 36 -------------- src/board/system76/lemp10/board.mk | 4 ++ src/board/system76/lemp10/kbled.c | 48 ------------------- src/board/system76/lemp9/board.mk | 4 ++ src/board/system76/lemp9/kbled.c | 48 ------------------- src/board/system76/oryp5/board.mk | 7 +-- src/board/system76/oryp6/board.mk | 3 ++ src/board/system76/oryp6/kbled.c | 36 -------------- src/common/include/common/macro.h | 3 ++ 28 files changed, 148 insertions(+), 309 deletions(-) delete mode 100644 src/board/system76/addw2/kbled.c rename src/board/system76/{bonw14/kbled.c => common/kbled/bonw14.c} (61%) rename src/board/system76/{darp5/kbled.c => common/kbled/darp5.c} (77%) create mode 100644 src/board/system76/common/kbled/none.c rename src/board/system76/{oryp5/kbled.c => common/kbled/oryp5.c} (78%) rename src/board/system76/{addw1/kbled.c => common/kbled/rgb_pwm.c} (68%) rename src/board/system76/{galp5/kbled.c => common/kbled/white_dac.c} (76%) delete mode 100644 src/board/system76/darp7/kbled.c delete mode 100644 src/board/system76/galp3-c/kbled.c delete mode 100644 src/board/system76/gaze15/kbled.c delete mode 100644 src/board/system76/lemp10/kbled.c delete mode 100644 src/board/system76/lemp9/kbled.c delete mode 100644 src/board/system76/oryp6/kbled.c diff --git a/src/board/system76/addw1/board.mk b/src/board/system76/addw1/board.mk index 2115a0e25..cae834c8f 100644 --- a/src/board/system76/addw1/board.mk +++ b/src/board/system76/addw1/board.mk @@ -6,6 +6,9 @@ EC=it8587e KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=rgb_pwm + # Set discrete GPU I2C bus CFLAGS+=-DI2C_DGPU=I2C_1 diff --git a/src/board/system76/addw2/board.mk b/src/board/system76/addw2/board.mk index 3a6bd21b9..19e99f189 100644 --- a/src/board/system76/addw2/board.mk +++ b/src/board/system76/addw2/board.mk @@ -6,6 +6,9 @@ EC=it5570e KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=rgb_pwm + # Set discrete GPU I2C bus CFLAGS+=-DI2C_DGPU=I2C_1 diff --git a/src/board/system76/addw2/kbled.c b/src/board/system76/addw2/kbled.c deleted file mode 100644 index 0f262e469..000000000 --- a/src/board/system76/addw2/kbled.c +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only - -#include -#include - -void kbled_init(void) { - //TODO: enable PWMs - kbled_reset(); -} - -void kbled_reset(void) { - // Set brightness and color - kbled_set_color(0xFFFFFF); - kbled_set(0x00); -} - -uint8_t kbled_get(void) { - // Get PWM for power - return DCR0; -} - -void kbled_set(uint8_t level) { - // Set PWM for power - DCR0 = level; -} - -void kbled_set_color(uint32_t color) { - // Set PWM for blue component - DCR7 = (uint8_t)(color); - - // Set PWM for green component - DCR6 = (uint8_t)(color >> 8); - - // Set PWM for red component - DCR5 = (uint8_t)(color >> 16); -} diff --git a/src/board/system76/bonw14/board.mk b/src/board/system76/bonw14/board.mk index f5b4438e7..74ff7717d 100644 --- a/src/board/system76/bonw14/board.mk +++ b/src/board/system76/bonw14/board.mk @@ -6,6 +6,9 @@ EC=it5570e KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=bonw14 + # Set discrete GPU I2C bus CFLAGS+=-DI2C_DGPU=I2C_1 diff --git a/src/board/system76/common/common.mk b/src/board/system76/common/common.mk index 83fcd43b7..93fe9f433 100644 --- a/src/board/system76/common/common.mk +++ b/src/board/system76/common/common.mk @@ -28,6 +28,10 @@ CFLAGS+=-I$(SYSTEM76_COMMON_DIR)/include CHARGER?=bq24780s SRC+=$(SYSTEM76_COMMON_DIR)/charger/$(CHARGER).c +# Add kbled +KBLED?=none +SRC+=$(SYSTEM76_COMMON_DIR)/kbled/$(KBLED).c + # Add scratch ROM include $(SYSTEM76_COMMON_DIR)/scratch/scratch.mk diff --git a/src/board/system76/common/include/board/kbled.h b/src/board/system76/common/include/board/kbled.h index afa76fe2b..28ffeac87 100644 --- a/src/board/system76/common/include/board/kbled.h +++ b/src/board/system76/common/include/board/kbled.h @@ -9,7 +9,9 @@ void kbled_init(void); void kbled_reset(void); uint8_t kbled_get(void); +uint8_t kbled_max(void); void kbled_set(uint8_t level); +uint32_t kbled_get_color(void); void kbled_set_color(uint32_t color); // Provided by common code diff --git a/src/board/system76/bonw14/kbled.c b/src/board/system76/common/kbled/bonw14.c similarity index 61% rename from src/board/system76/bonw14/kbled.c rename to src/board/system76/common/kbled/bonw14.c index b651279e8..802e165cd 100644 --- a/src/board/system76/bonw14/kbled.c +++ b/src/board/system76/common/kbled/bonw14.c @@ -27,16 +27,13 @@ void kbled_reset(void) { kbled_set(0x00); } -uint8_t kbled_get(void) { - return 0; -} +// Keep the following functions for compatibility - they are set via USB HID +uint8_t kbled_get(void) { /*Always off*/ return 0; } -void kbled_set(uint8_t level) { - // Keep function for compatibility - this is set via USB HID - level = level; -} +uint8_t kbled_max(void) { /*Always off*/ return 0; } -void kbled_set_color(uint32_t color) { - // Keep function for compatibility - this is set via USB HID - color = color; -} +void kbled_set(uint8_t level) { /*Fix unused variable*/ level = level; } + +uint32_t kbled_get_color(void) { /*Always black*/ return 0; } + +void kbled_set_color(uint32_t color) { /*Fix unused variable*/ color = color; } diff --git a/src/board/system76/darp5/kbled.c b/src/board/system76/common/kbled/darp5.c similarity index 77% rename from src/board/system76/darp5/kbled.c rename to src/board/system76/common/kbled/darp5.c index f1178bf2e..66b16c2ed 100644 --- a/src/board/system76/darp5/kbled.c +++ b/src/board/system76/common/kbled/darp5.c @@ -39,10 +39,31 @@ uint8_t kbled_get(void) { return level; } +uint8_t kbled_max(void) { + return 255; +} + void kbled_set(uint8_t level) { kbled_i2c_set(0x12, &level, 1); } +uint32_t kbled_get_color(void) { + // Get blue component from channel 0 + uint8_t value; + kbled_i2c_get(0x02, &value, 1); + uint32_t color = (uint32_t)value; + + // Get green component from channel 3 + kbled_i2c_get(0x05, &value, 1); + color |= ((uint32_t)value) << 8; + + // Get red component from channel 6 + kbled_i2c_get(0x08, &value, 1); + color |= ((uint32_t)value) << 16; + + return color; +} + void kbled_set_color(uint32_t color) { // Set channel 0 - 2 to blue component uint8_t value = (uint8_t)(color); diff --git a/src/board/system76/common/kbled/none.c b/src/board/system76/common/kbled/none.c new file mode 100644 index 000000000..453d526c9 --- /dev/null +++ b/src/board/system76/common/kbled/none.c @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-3.0-only + +#include + +void kbled_init(void) {} + +void kbled_reset(void) {} + +uint8_t kbled_get(void) { /*Always off*/ return 0; } + +uint8_t kbled_max(void) { /*Always off*/ return 0; } + +void kbled_set(uint8_t level) { /*Fix unused variable*/ level = level; } + +uint32_t kbled_get_color(void) { /*Always black*/ return 0; } + +void kbled_set_color(uint32_t color) { /*Fix unused variable*/ color = color; } diff --git a/src/board/system76/oryp5/kbled.c b/src/board/system76/common/kbled/oryp5.c similarity index 78% rename from src/board/system76/oryp5/kbled.c rename to src/board/system76/common/kbled/oryp5.c index 1caf2171e..36391f46e 100644 --- a/src/board/system76/oryp5/kbled.c +++ b/src/board/system76/common/kbled/oryp5.c @@ -39,10 +39,31 @@ uint8_t kbled_get(void) { return level; } +uint8_t kbled_max(void) { + return 255; +} + void kbled_set(uint8_t level) { kbled_i2c_set(0x12, &level, 1); } +uint32_t kbled_get_color(void) { + // Get blue component + uint8_t value; + kbled_i2c_get(0x02, &value, 1); + uint32_t color = (uint32_t)value; + + // Get green component + kbled_i2c_get(0x03, &value, 1); + color |= ((uint32_t)value) << 8; + + // Get red component + kbled_i2c_get(0x04, &value, 1); + color |= ((uint32_t)value) << 16; + + return color; +} + void kbled_set_color(uint32_t color) { // Set blue component uint8_t value = (uint8_t)(color); @@ -50,13 +71,13 @@ void kbled_set_color(uint32_t color) { kbled_i2c_set(0x05, &value, 1); kbled_i2c_set(0x08, &value, 1); - // Set red component + // Set green component value = (uint8_t)(color >> 8); kbled_i2c_set(0x03, &value, 1); kbled_i2c_set(0x06, &value, 1); kbled_i2c_set(0x09, &value, 1); - // Set green component + // Set red component value = (uint8_t)(color >> 16); kbled_i2c_set(0x04, &value, 1); kbled_i2c_set(0x07, &value, 1); diff --git a/src/board/system76/addw1/kbled.c b/src/board/system76/common/kbled/rgb_pwm.c similarity index 68% rename from src/board/system76/addw1/kbled.c rename to src/board/system76/common/kbled/rgb_pwm.c index 0f262e469..5f86c5991 100644 --- a/src/board/system76/addw1/kbled.c +++ b/src/board/system76/common/kbled/rgb_pwm.c @@ -19,11 +19,28 @@ uint8_t kbled_get(void) { return DCR0; } +uint8_t kbled_max(void) { + return 255; +} + void kbled_set(uint8_t level) { // Set PWM for power DCR0 = level; } +uint32_t kbled_get_color(void) { + // Get PWM of blue component + uint32_t color = (uint32_t)DCR7; + + // Get PWM of green component + color |= ((uint32_t)DCR6) << 8; + + // Get PWM of red component + color |= ((uint32_t)DCR5) << 16; + + return color; +} + void kbled_set_color(uint32_t color) { // Set PWM for blue component DCR7 = (uint8_t)(color); diff --git a/src/board/system76/galp5/kbled.c b/src/board/system76/common/kbled/white_dac.c similarity index 76% rename from src/board/system76/galp5/kbled.c rename to src/board/system76/common/kbled/white_dac.c index b384b137d..8f371985c 100644 --- a/src/board/system76/galp5/kbled.c +++ b/src/board/system76/common/kbled/white_dac.c @@ -4,8 +4,11 @@ #include #include -#define KBLED_DAC 2 -#define KBLED_DACDAT DACDAT2 +#if !defined(KBLED_DAC) + #error "KBLED_DAC must be defined" +#endif + +#define KBLED_DACDAT xconcat(DACDAT, KBLED_DAC) static uint8_t __code levels[] = { 0x00, @@ -37,6 +40,10 @@ uint8_t kbled_get(void) { return 0; } +uint8_t kbled_max(void) { + return ARRAY_SIZE(levels) - 1; +} + void kbled_set(uint8_t level) { uint8_t raw = 0; if (level < ARRAY_SIZE(levels)) { @@ -45,4 +52,6 @@ void kbled_set(uint8_t level) { KBLED_DACDAT = raw; } +uint32_t kbled_get_color(void) { /* Always white */ return 0xFFFFFF; } + void kbled_set_color(uint32_t color) { /*Fix unused variable*/ color = color; } diff --git a/src/board/system76/darp5/board.mk b/src/board/system76/darp5/board.mk index 8dcfc9ae0..1eda786d5 100644 --- a/src/board/system76/darp5/board.mk +++ b/src/board/system76/darp5/board.mk @@ -6,12 +6,13 @@ EC=it8587e KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=darp5 +CFLAGS+=-DI2C_KBLED=I2C_1 + # Set battery I2C bus CFLAGS+=-DI2C_SMBUS=I2C_0 -# Set keyboard LED I2C bus -CFLAGS+=-DI2C_KBLED=I2C_1 - # Set touchpad PS2 bus CFLAGS+=-DPS2_TOUCHPAD=PS2_3 diff --git a/src/board/system76/darp7/board.mk b/src/board/system76/darp7/board.mk index 54d92e78b..d001b25e2 100644 --- a/src/board/system76/darp7/board.mk +++ b/src/board/system76/darp7/board.mk @@ -9,6 +9,9 @@ CFLAGS+=-DEC_ESPI=1 KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=rgb_pwm + # Set battery I2C bus CFLAGS+=-DI2C_SMBUS=I2C_4 diff --git a/src/board/system76/darp7/kbled.c b/src/board/system76/darp7/kbled.c deleted file mode 100644 index 0f262e469..000000000 --- a/src/board/system76/darp7/kbled.c +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only - -#include -#include - -void kbled_init(void) { - //TODO: enable PWMs - kbled_reset(); -} - -void kbled_reset(void) { - // Set brightness and color - kbled_set_color(0xFFFFFF); - kbled_set(0x00); -} - -uint8_t kbled_get(void) { - // Get PWM for power - return DCR0; -} - -void kbled_set(uint8_t level) { - // Set PWM for power - DCR0 = level; -} - -void kbled_set_color(uint32_t color) { - // Set PWM for blue component - DCR7 = (uint8_t)(color); - - // Set PWM for green component - DCR6 = (uint8_t)(color >> 8); - - // Set PWM for red component - DCR5 = (uint8_t)(color >> 16); -} diff --git a/src/board/system76/galp3-c/board.mk b/src/board/system76/galp3-c/board.mk index cbc0f19ca..b365bfe10 100644 --- a/src/board/system76/galp3-c/board.mk +++ b/src/board/system76/galp3-c/board.mk @@ -6,6 +6,10 @@ EC=it8587e KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=white_dac +CFLAGS+=-DKBLED_DAC=5 + # Set battery I2C bus CFLAGS+=-DI2C_SMBUS=I2C_0 diff --git a/src/board/system76/galp3-c/kbled.c b/src/board/system76/galp3-c/kbled.c deleted file mode 100644 index ccef22a9a..000000000 --- a/src/board/system76/galp3-c/kbled.c +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only - -#include -#include -#include - -#define KBLED_DAC 5 -#define KBLED_DACDAT DACDAT5 - -static uint8_t __code levels[] = { - 0x00, - 0x80, - 0x90, - 0xA8, - 0xC0, - 0xFF -}; - -void kbled_init(void) { - // Enable DAC used for KBLIGHT_ADJ - DACPDREG &= ~(1 << KBLED_DAC); - kbled_reset(); -} - -void kbled_reset(void) { - kbled_set(0); -} - -uint8_t kbled_get(void) { - uint8_t level; - uint8_t raw = KBLED_DACDAT; - for (level = 0; level < ARRAY_SIZE(levels); level++) { - if (raw <= levels[level]) { - return level; - } - } - return 0; -} - -void kbled_set(uint8_t level) { - uint8_t raw = 0; - if (level < ARRAY_SIZE(levels)) { - raw = levels[level]; - } - KBLED_DACDAT = raw; -} - -void kbled_set_color(uint32_t color) { /*Fix unused variable*/ color = color; } diff --git a/src/board/system76/galp5/board.mk b/src/board/system76/galp5/board.mk index 0b23d6301..66d6ed323 100644 --- a/src/board/system76/galp5/board.mk +++ b/src/board/system76/galp5/board.mk @@ -9,6 +9,10 @@ CFLAGS+=-DEC_ESPI=1 KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=white_dac +CFLAGS+=-DKBLED_DAC=2 + # Set discrete GPU I2C bus CFLAGS+=-DI2C_DGPU=I2C_1 diff --git a/src/board/system76/gaze15/board.mk b/src/board/system76/gaze15/board.mk index 74529640f..ccc771975 100644 --- a/src/board/system76/gaze15/board.mk +++ b/src/board/system76/gaze15/board.mk @@ -6,6 +6,9 @@ EC=it5570e KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=rgb_pwm + # Set discrete GPU I2C bus CFLAGS+=-DI2C_DGPU=I2C_1 diff --git a/src/board/system76/gaze15/kbled.c b/src/board/system76/gaze15/kbled.c deleted file mode 100644 index 0f262e469..000000000 --- a/src/board/system76/gaze15/kbled.c +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only - -#include -#include - -void kbled_init(void) { - //TODO: enable PWMs - kbled_reset(); -} - -void kbled_reset(void) { - // Set brightness and color - kbled_set_color(0xFFFFFF); - kbled_set(0x00); -} - -uint8_t kbled_get(void) { - // Get PWM for power - return DCR0; -} - -void kbled_set(uint8_t level) { - // Set PWM for power - DCR0 = level; -} - -void kbled_set_color(uint32_t color) { - // Set PWM for blue component - DCR7 = (uint8_t)(color); - - // Set PWM for green component - DCR6 = (uint8_t)(color >> 8); - - // Set PWM for red component - DCR5 = (uint8_t)(color >> 16); -} diff --git a/src/board/system76/lemp10/board.mk b/src/board/system76/lemp10/board.mk index 54d92e78b..0dcf30676 100644 --- a/src/board/system76/lemp10/board.mk +++ b/src/board/system76/lemp10/board.mk @@ -9,6 +9,10 @@ CFLAGS+=-DEC_ESPI=1 KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=white_dac +CFLAGS+=-DKBLED_DAC=2 + # Set battery I2C bus CFLAGS+=-DI2C_SMBUS=I2C_4 diff --git a/src/board/system76/lemp10/kbled.c b/src/board/system76/lemp10/kbled.c deleted file mode 100644 index b384b137d..000000000 --- a/src/board/system76/lemp10/kbled.c +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only - -#include -#include -#include - -#define KBLED_DAC 2 -#define KBLED_DACDAT DACDAT2 - -static uint8_t __code levels[] = { - 0x00, - 0x80, - 0x90, - 0xA8, - 0xC0, - 0xFF -}; - -void kbled_init(void) { - // Enable DAC used for KBLIGHT_ADJ - DACPDREG &= ~BIT(KBLED_DAC); - kbled_reset(); -} - -void kbled_reset(void) { - kbled_set(0); -} - -uint8_t kbled_get(void) { - uint8_t level; - uint8_t raw = KBLED_DACDAT; - for (level = 0; level < ARRAY_SIZE(levels); level++) { - if (raw <= levels[level]) { - return level; - } - } - return 0; -} - -void kbled_set(uint8_t level) { - uint8_t raw = 0; - if (level < ARRAY_SIZE(levels)) { - raw = levels[level]; - } - KBLED_DACDAT = raw; -} - -void kbled_set_color(uint32_t color) { /*Fix unused variable*/ color = color; } diff --git a/src/board/system76/lemp9/board.mk b/src/board/system76/lemp9/board.mk index 5d111a122..c2f8d80f6 100644 --- a/src/board/system76/lemp9/board.mk +++ b/src/board/system76/lemp9/board.mk @@ -6,6 +6,10 @@ EC=it5570e KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=white_dac +CFLAGS+=-DKBLED_DAC=2 + # Set battery I2C bus CFLAGS+=-DI2C_SMBUS=I2C_4 diff --git a/src/board/system76/lemp9/kbled.c b/src/board/system76/lemp9/kbled.c deleted file mode 100644 index 1ef92d18b..000000000 --- a/src/board/system76/lemp9/kbled.c +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only - -#include -#include -#include - -#define KBLED_DAC 2 -#define KBLED_DACDAT DACDAT2 - -static uint8_t __code levels[] = { - 0x00, - 0x80, - 0x90, - 0xA8, - 0xC0, - 0xFF -}; - -void kbled_init(void) { - // Enable DAC used for KBLIGHT_ADJ - DACPDREG &= ~(1 << KBLED_DAC); - kbled_reset(); -} - -void kbled_reset(void) { - kbled_set(0); -} - -uint8_t kbled_get(void) { - uint8_t level; - uint8_t raw = KBLED_DACDAT; - for (level = 0; level < ARRAY_SIZE(levels); level++) { - if (raw <= levels[level]) { - return level; - } - } - return 0; -} - -void kbled_set(uint8_t level) { - uint8_t raw = 0; - if (level < ARRAY_SIZE(levels)) { - raw = levels[level]; - } - KBLED_DACDAT = raw; -} - -void kbled_set_color(uint32_t color) { /*Fix unused variable*/ color = color; } diff --git a/src/board/system76/oryp5/board.mk b/src/board/system76/oryp5/board.mk index 59ac2cf64..38ff03b8f 100644 --- a/src/board/system76/oryp5/board.mk +++ b/src/board/system76/oryp5/board.mk @@ -6,15 +6,16 @@ EC=it8587e KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=oryp5 +CFLAGS+=-DI2C_KBLED=I2C_1 + # Set discrete GPU I2C bus CFLAGS+=-DI2C_DGPU=I2C_1 # Set battery I2C bus CFLAGS+=-DI2C_SMBUS=I2C_0 -# Set keyboard LED I2C bus -CFLAGS+=-DI2C_KBLED=I2C_1 - # Set touchpad PS2 bus CFLAGS+=-DPS2_TOUCHPAD=PS2_3 diff --git a/src/board/system76/oryp6/board.mk b/src/board/system76/oryp6/board.mk index 05a14d283..b880fc1dc 100644 --- a/src/board/system76/oryp6/board.mk +++ b/src/board/system76/oryp6/board.mk @@ -6,6 +6,9 @@ EC=it5570e KEYMAP?=default SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c +# Set keyboard LED mechanism +KBLED=rgb_pwm + # Set discrete GPU I2C bus CFLAGS+=-DI2C_DGPU=I2C_1 diff --git a/src/board/system76/oryp6/kbled.c b/src/board/system76/oryp6/kbled.c deleted file mode 100644 index 0f262e469..000000000 --- a/src/board/system76/oryp6/kbled.c +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only - -#include -#include - -void kbled_init(void) { - //TODO: enable PWMs - kbled_reset(); -} - -void kbled_reset(void) { - // Set brightness and color - kbled_set_color(0xFFFFFF); - kbled_set(0x00); -} - -uint8_t kbled_get(void) { - // Get PWM for power - return DCR0; -} - -void kbled_set(uint8_t level) { - // Set PWM for power - DCR0 = level; -} - -void kbled_set_color(uint32_t color) { - // Set PWM for blue component - DCR7 = (uint8_t)(color); - - // Set PWM for green component - DCR6 = (uint8_t)(color >> 8); - - // Set PWM for red component - DCR5 = (uint8_t)(color >> 16); -} diff --git a/src/common/include/common/macro.h b/src/common/include/common/macro.h index 4509fa4a9..5fe6fe159 100644 --- a/src/common/include/common/macro.h +++ b/src/common/include/common/macro.h @@ -3,6 +3,9 @@ #ifndef _COMMON_MACRO_H #define _COMMON_MACRO_H +#define xconcat(a, b) concat(a, b) +#define concat(a, b) a ## b + #define xstr(s) str(s) #define str(s) #s From c44710167fdfe410df4642efaf4f2d046d35961d Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 5 Jan 2021 13:16:57 -0700 Subject: [PATCH 2/3] Add led value and color commands --- src/board/system76/common/smfi.c | 61 +++++++++++++++++++++++++++++ src/common/include/common/command.h | 10 +++++ tool/src/ec.rs | 51 ++++++++++++++++++++++++ 3 files changed, 122 insertions(+) diff --git a/src/board/system76/common/smfi.c b/src/board/system76/common/smfi.c index eb6417796..e6a07490e 100644 --- a/src/board/system76/common/smfi.c +++ b/src/board/system76/common/smfi.c @@ -19,6 +19,7 @@ #ifndef __SCRATCH__ #include + #include #include #endif #include @@ -183,6 +184,54 @@ static enum Result cmd_keymap_set(void) { return RES_ERR; } } + +static enum Result cmd_led_get_value(void) { + uint8_t index = smfi_cmd[SMFI_CMD_DATA]; + if (index == CMD_LED_INDEX_ALL) { + smfi_cmd[SMFI_CMD_DATA + 1] = kbled_get(); + smfi_cmd[SMFI_CMD_DATA + 2] = kbled_max(); + return RES_OK; + } else { + return RES_ERR; + } +} + +static enum Result cmd_led_set_value(void) { + uint8_t index = smfi_cmd[SMFI_CMD_DATA]; + if (index == CMD_LED_INDEX_ALL) { + kbled_set(smfi_cmd[SMFI_CMD_DATA + 1]); + return RES_OK; + } else { + return RES_ERR; + } +} + +static enum Result cmd_led_get_color(void) { + uint8_t index = smfi_cmd[SMFI_CMD_DATA]; + if (index == CMD_LED_INDEX_ALL) { + uint32_t color = kbled_get_color(); + smfi_cmd[SMFI_CMD_DATA + 1] = (uint8_t)(color >> 16); + smfi_cmd[SMFI_CMD_DATA + 2] = (uint8_t)(color >> 8); + smfi_cmd[SMFI_CMD_DATA + 3] = (uint8_t)(color >> 0); + return RES_OK; + } else { + return RES_ERR; + } +} + +static enum Result cmd_led_set_color(void) { + uint8_t index = smfi_cmd[SMFI_CMD_DATA]; + if (index == CMD_LED_INDEX_ALL) { + kbled_set_color( + (((uint32_t)smfi_cmd[SMFI_CMD_DATA + 1]) << 16) | + (((uint32_t)smfi_cmd[SMFI_CMD_DATA + 2]) << 8) | + (((uint32_t)smfi_cmd[SMFI_CMD_DATA + 3]) << 0) + ); + return RES_OK; + } else { + return RES_ERR; + } +} #endif // !defined(__SCRATCH__) #if defined(__SCRATCH__) @@ -296,6 +345,18 @@ void smfi_event(void) { case CMD_KEYMAP_SET: smfi_cmd[SMFI_CMD_RES] = cmd_keymap_set(); break; + case CMD_LED_GET_VALUE: + smfi_cmd[SMFI_CMD_RES] = cmd_led_get_value(); + break; + case CMD_LED_SET_VALUE: + smfi_cmd[SMFI_CMD_RES] = cmd_led_set_value(); + break; + case CMD_LED_GET_COLOR: + smfi_cmd[SMFI_CMD_RES] = cmd_led_get_color(); + break; + case CMD_LED_SET_COLOR: + smfi_cmd[SMFI_CMD_RES] = cmd_led_set_color(); + break; #endif // !defined(__SCRATCH__) case CMD_SPI: smfi_cmd[SMFI_CMD_RES] = cmd_spi(); diff --git a/src/common/include/common/command.h b/src/common/include/common/command.h index e9f442ef9..3043cc0c6 100644 --- a/src/common/include/common/command.h +++ b/src/common/include/common/command.h @@ -26,6 +26,14 @@ enum Command { CMD_KEYMAP_GET = 9, // Set keyboard map index CMD_KEYMAP_SET = 10, + // Get LED value by index + CMD_LED_GET_VALUE = 11, + // Set LED value by index + CMD_LED_SET_VALUE = 12, + // Get LED color by index + CMD_LED_GET_COLOR = 13, + // Set LED color by index + CMD_LED_SET_COLOR = 14, //TODO }; @@ -48,4 +56,6 @@ enum CommandSpiFlag { CMD_SPI_FLAG_BACKUP = (1 << 3), }; +#define CMD_LED_INDEX_ALL 0xFF + #endif // _COMMON_COMMAND_H diff --git a/tool/src/ec.rs b/tool/src/ec.rs index 8491b25e3..7d25b881e 100644 --- a/tool/src/ec.rs +++ b/tool/src/ec.rs @@ -25,6 +25,10 @@ enum Cmd { FanSet = 8, KeymapGet = 9, KeymapSet = 10, + LedGetValue = 11, + LedSetValue = 12, + LedGetColor = 13, + LedSetColor = 14, } const CMD_SPI_FLAG_READ: u8 = 1 << 0; @@ -193,6 +197,53 @@ impl Ec { ]; self.command(Cmd::KeymapSet, &mut data) } + + // Get LED value by index + pub unsafe fn led_get_value(&mut self, index: u8) -> Result<(u8, u8), Error> { + let mut data = [ + index, + 0, + 0, + ]; + self.command(Cmd::LedGetValue, &mut data)?; + Ok((data[1], data[2])) + } + + // Set LED value by index + pub unsafe fn led_set_value(&mut self, index: u8, value: u8) -> Result<(), Error> { + let mut data = [ + index, + value, + ]; + self.command(Cmd::LedSetValue, &mut data) + } + + // Get LED color by index + pub unsafe fn led_get_color(&mut self, index: u8) -> Result<(u8, u8, u8), Error> { + let mut data = [ + index, + 0, + 0, + 0, + ]; + self.command(Cmd::LedGetColor, &mut data)?; + Ok(( + data[1], + data[2], + data[3], + )) + } + + // Set LED color by index + pub unsafe fn led_set_color(&mut self, index: u8, red: u8, green: u8, blue: u8) -> Result<(), Error> { + let mut data = [ + index, + red, + green, + blue, + ]; + self.command(Cmd::LedSetColor, &mut data) + } } pub struct EcSpi<'a, A: Access> { From b28c49baa97c7ecf1dcdc5ae437c7159b3c6adeb Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 5 Jan 2021 13:17:04 -0700 Subject: [PATCH 3/3] ectool 0.2.3 --- tool/Cargo.lock | 28 ++++++++++++++-------------- tool/Cargo.toml | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tool/Cargo.lock b/tool/Cargo.lock index cc0eed1cf..799a9a84f 100644 --- a/tool/Cargo.lock +++ b/tool/Cargo.lock @@ -2,27 +2,27 @@ # It is not intended for manual editing. [[package]] name = "cc" -version = "1.0.60" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hidapi" -version = "1.2.3" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.79 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libc" -version = "0.2.79" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "pkg-config" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -32,16 +32,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "system76_ectool" -version = "0.2.2" +version = "0.2.3" dependencies = [ - "hidapi 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.79 (registry+https://github.com/rust-lang/crates.io-index)", + "hidapi 1.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)", "redox_hwio 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [metadata] -"checksum cc 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)" = "ef611cc68ff783f18535d77ddd080185275713d852c4f5cbb6122c462a7a825c" -"checksum hidapi 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5c6ffb97f2ec5835ec73bcea5256fc2cd57a13c5958230778ef97f11900ba661" -"checksum libc 0.2.79 (registry+https://github.com/rust-lang/crates.io-index)" = "2448f6066e80e3bfc792e9c98bf705b4b0fc6e8ef5b43e5889aff0eaa9c58743" -"checksum pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33" +"checksum cc 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" +"checksum hidapi 1.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "76c352a18370f7e7e47bcbfcbdc5432b8c80c705b5d751a25232c659fcf5c775" +"checksum libc 0.2.81 (registry+https://github.com/rust-lang/crates.io-index)" = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" +"checksum pkg-config 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" "checksum redox_hwio 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "41aa2c4c67329a04106644cad336238aa5adecfd73d06fb10339d472ce6d8070" diff --git a/tool/Cargo.toml b/tool/Cargo.toml index 20b4c6181..745e45b14 100644 --- a/tool/Cargo.toml +++ b/tool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "system76_ectool" -version = "0.2.2" +version = "0.2.3" edition = "2018" description = "System76 EC tool" license = "MIT"