kbled: Check if using white or RGB keyboard

Use RGBKB-DET# to determine the type of keyboard connected.

If a white keyboard is attached, always set the color to white, and
always return white for the color.

Signed-off-by: Tim Crawford <tcrawford@system76.com>
This commit is contained in:
Tim Crawford
2023-05-19 17:46:39 -06:00
committed by Jeremy Soller
parent c71a58f7cf
commit 598aef8c4a
7 changed files with 52 additions and 0 deletions

View File

@ -5,6 +5,13 @@
#include <stdint.h>
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);

View File

@ -3,6 +3,8 @@
#include <board/kbled.h>
#include <common/macro.h>
enum KbledKind kbled_kind = KBLED_NONE;
// clang-format off
static uint8_t LEVEL_I = 1;
static const uint8_t __code LEVELS[] = {

View File

@ -7,6 +7,8 @@
#include <ec/smbus.h>
void kbled_init(void) {
kbled_kind = KBLED_RGB;
i2c_reset(&I2C_DGPU, true);
// Force SMBUS B design to 100kHZ

View File

@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-3.0-only
#include <arch/delay.h>
#include <board/gpio.h>
#include <board/kbled.h>
#include <common/macro.h>
#include <ec/i2c.h>
@ -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);

View File

@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-3.0-only
#include <arch/delay.h>
#include <board/gpio.h>
#include <board/kbled.h>
#include <common/macro.h>
#include <ec/i2c.h>
@ -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);

View File

@ -1,9 +1,16 @@
// SPDX-License-Identifier: GPL-3.0-only
#include <board/gpio.h>
#include <board/kbled.h>
#include <ec/pwm.h>
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);

View File

@ -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();