diff --git a/src/board/system76/common/include/board/kbled.h b/src/board/system76/common/include/board/kbled.h index 28ffeac..c3efd93 100644 --- a/src/board/system76/common/include/board/kbled.h +++ b/src/board/system76/common/include/board/kbled.h @@ -5,6 +5,13 @@ #include +enum KbledKind { + KBLED_NONE = 0, + KBLED_WHITE = 1, + KBLED_RGB = 2, +}; +extern enum KbledKind kbled_kind; + // Must be specified by board void kbled_init(void); void kbled_reset(void); diff --git a/src/board/system76/common/kbled.c b/src/board/system76/common/kbled.c index 6474680..c6cabd5 100644 --- a/src/board/system76/common/kbled.c +++ b/src/board/system76/common/kbled.c @@ -3,6 +3,8 @@ #include #include +enum KbledKind kbled_kind = KBLED_NONE; + // clang-format off static uint8_t LEVEL_I = 1; static const uint8_t __code LEVELS[] = { diff --git a/src/board/system76/common/kbled/bonw14.c b/src/board/system76/common/kbled/bonw14.c index d7d07c6..b1eec9e 100644 --- a/src/board/system76/common/kbled/bonw14.c +++ b/src/board/system76/common/kbled/bonw14.c @@ -7,6 +7,8 @@ #include void kbled_init(void) { + kbled_kind = KBLED_RGB; + i2c_reset(&I2C_DGPU, true); // Force SMBUS B design to 100kHZ diff --git a/src/board/system76/common/kbled/darp5.c b/src/board/system76/common/kbled/darp5.c index 66b16c2..89ccabd 100644 --- a/src/board/system76/common/kbled/darp5.c +++ b/src/board/system76/common/kbled/darp5.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only #include +#include #include #include #include @@ -9,6 +10,12 @@ #define kbled_i2c_set(A, D, L) i2c_set(&I2C_KBLED, 0x68, A, D, L) void kbled_init(void) { + if (!gpio_get(&RGBKB_DET_N)) { + kbled_kind = KBLED_RGB; + } else { + kbled_kind = KBLED_WHITE; + } + i2c_reset(&I2C_KBLED, true); } @@ -48,6 +55,9 @@ void kbled_set(uint8_t level) { } uint32_t kbled_get_color(void) { + if (kbled_kind == KBLED_WHITE) + return 0xFFFFFF; + // Get blue component from channel 0 uint8_t value; kbled_i2c_get(0x02, &value, 1); @@ -65,6 +75,9 @@ uint32_t kbled_get_color(void) { } void kbled_set_color(uint32_t color) { + if (kbled_kind == KBLED_WHITE) + color = 0xFFFFFF; + // Set channel 0 - 2 to blue component uint8_t value = (uint8_t)(color); kbled_i2c_set(0x02, &value, 1); diff --git a/src/board/system76/common/kbled/oryp5.c b/src/board/system76/common/kbled/oryp5.c index 36391f4..14a5f19 100644 --- a/src/board/system76/common/kbled/oryp5.c +++ b/src/board/system76/common/kbled/oryp5.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only #include +#include #include #include #include @@ -9,6 +10,12 @@ #define kbled_i2c_set(A, D, L) i2c_set(&I2C_KBLED, 0x68, A, D, L) void kbled_init(void) { + if (!gpio_get(&RGBKB_DET_N)) { + kbled_kind = KBLED_RGB; + } else { + kbled_kind = KBLED_WHITE; + } + i2c_reset(&I2C_KBLED, true); } @@ -48,6 +55,9 @@ void kbled_set(uint8_t level) { } uint32_t kbled_get_color(void) { + if (kbled_kind == KBLED_WHITE) + return 0xFFFFFF; + // Get blue component uint8_t value; kbled_i2c_get(0x02, &value, 1); @@ -65,6 +75,9 @@ uint32_t kbled_get_color(void) { } void kbled_set_color(uint32_t color) { + if (kbled_kind == KBLED_WHITE) + color = 0xFFFFFF; + // Set blue component uint8_t value = (uint8_t)(color); kbled_i2c_set(0x02, &value, 1); diff --git a/src/board/system76/common/kbled/rgb_pwm.c b/src/board/system76/common/kbled/rgb_pwm.c index 5f86c59..41a8c1b 100644 --- a/src/board/system76/common/kbled/rgb_pwm.c +++ b/src/board/system76/common/kbled/rgb_pwm.c @@ -1,9 +1,16 @@ // SPDX-License-Identifier: GPL-3.0-only +#include #include #include void kbled_init(void) { + if (!gpio_get(&RGBKB_DET_N)) { + kbled_kind = KBLED_RGB; + } else { + kbled_kind = KBLED_WHITE; + } + //TODO: enable PWMs kbled_reset(); } @@ -29,6 +36,9 @@ void kbled_set(uint8_t level) { } uint32_t kbled_get_color(void) { + if (kbled_kind == KBLED_WHITE) + return 0xFFFFFF; + // Get PWM of blue component uint32_t color = (uint32_t)DCR7; @@ -42,6 +52,9 @@ uint32_t kbled_get_color(void) { } void kbled_set_color(uint32_t color) { + if (kbled_kind == KBLED_WHITE) + color = 0xFFFFFF; + // Set PWM for blue component DCR7 = (uint8_t)(color); diff --git a/src/board/system76/common/kbled/white_dac.c b/src/board/system76/common/kbled/white_dac.c index 983047d..25176ce 100644 --- a/src/board/system76/common/kbled/white_dac.c +++ b/src/board/system76/common/kbled/white_dac.c @@ -22,6 +22,8 @@ static uint8_t __code levels[] = { // clang-format on void kbled_init(void) { + kbled_kind = KBLED_WHITE; + // Enable DAC used for KBLIGHT_ADJ DACPDREG &= ~BIT(KBLED_DAC); kbled_reset();