summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/keyboard_backlight.c5
-rw-r--r--common/rgb_keyboard.c54
-rw-r--r--include/keyboard_backlight.h7
-rw-r--r--include/rgb_keyboard.h1
-rw-r--r--test/rgb_keyboard.c21
5 files changed, 74 insertions, 14 deletions
diff --git a/common/keyboard_backlight.c b/common/keyboard_backlight.c
index b1b3671d3d..8cf400dc34 100644
--- a/common/keyboard_backlight.c
+++ b/common/keyboard_backlight.c
@@ -21,8 +21,9 @@ static struct kblight_conf kblight;
static int current_percent;
static uint8_t current_enable;
-void __attribute__((weak)) board_kblight_init(void)
-{ }
+__overridable void board_kblight_init(void) {}
+
+__overridable void board_kblight_shutdown(void) {}
static int kblight_init(void)
{
diff --git a/common/rgb_keyboard.c b/common/rgb_keyboard.c
index d909d3ad09..4f62271370 100644
--- a/common/rgb_keyboard.c
+++ b/common/rgb_keyboard.c
@@ -257,6 +257,24 @@ static int rgbkbd_set_global_brightness(uint8_t gcc)
return rv;
}
+static int rgbkbd_set_scale(uint8_t scale)
+{
+ int e, i, rv = EC_SUCCESS;
+
+ for (i = 0; i < rgbkbd_count; i++) {
+ struct rgbkbd *ctx = &rgbkbds[i];
+
+ e = ctx->cfg->drv->set_scale(ctx, 0, scale, get_grid_size(ctx));
+ if (e) {
+ CPRINTS("Failed to set scale of GRID%d to %d (%d)",
+ i, scale, e);
+ rv = e;
+ }
+ }
+
+ return rv;
+}
+
static int rgbkbd_init(void)
{
int rv = EC_SUCCESS;
@@ -338,6 +356,12 @@ static int rgbkbd_get_enabled(void)
return rgbkbds[0].state >= RGBKBD_STATE_ENABLED;
}
+static void rgbkbd_reset(void)
+{
+ board_kblight_shutdown();
+ board_kblight_init();
+}
+
const struct kblight_drv kblight_rgbkbd = {
.init = rgbkbd_init,
.set = rgbkbd_kblight_set,
@@ -410,7 +434,7 @@ static enum ec_status hc_rgbkbd(struct host_cmd_handler_args *args)
}
DECLARE_HOST_COMMAND(EC_CMD_RGBKBD, hc_rgbkbd, EC_VER_MASK(0));
-test_export_static int cc_rgbk(int argc, char **argv)
+test_export_static int cc_rgb(int argc, char **argv)
{
char *end, *comma;
struct rgb_s color;
@@ -445,6 +469,28 @@ test_export_static int cc_rgbk(int argc, char **argv)
rgbkbd_reset_color((struct rgb_s){.r = 0, .g = 0, .b = 0});
ccprintf("Demo set to %d\n", demo);
return EC_SUCCESS;
+ } else if (!strcasecmp(argv[1], "reset")) {
+ rgbkbd_reset();
+ rv = rgbkbd_init();
+ if (rv)
+ return rv;
+ return rgbkbd_enable(0);
+ } else if (!strcasecmp(argv[1], "enable")) {
+ return rgbkbd_enable(1);
+ } else if (!strcasecmp(argv[1], "disable")) {
+ return rgbkbd_enable(0);
+ } else if (!strcasecmp(argv[1], "scale")) {
+ /* Usage 6 */
+ val = strtoi(argv[2], &end, 0);
+ if (*end || val > RGBKBD_MAX_SCALE)
+ return EC_ERROR_PARAM2;
+ return rgbkbd_set_scale(val);
+ } else if (!strcasecmp(argv[1], "red")) {
+ color.r = 255;
+ color.g = 0;
+ color.b = 0;
+ rgbkbd_reset_color(color);
+ return EC_SUCCESS;
} else {
/* Usage 1 */
if (argc != 2)
@@ -497,12 +543,14 @@ test_export_static int cc_rgbk(int argc, char **argv)
return rv;
}
#ifndef TEST_BUILD
-DECLARE_CONSOLE_COMMAND(rgbk, cc_rgbk,
+DECLARE_CONSOLE_COMMAND(rgb, cc_rgb,
"\n"
"1. rgbk <global-brightness>\n"
"2. rgbk <col,row> <r-bright> <g-bright> <b-bright>\n"
"3. rgbk all <r-bright> <g-bright> <b-bright>\n"
- "4. rgbk demo <id>\n",
+ "4. rgbk demo <id>\n"
+ "5. rgbk reset/enable/disable/red\n"
+ "6. rgbk scale <val>\n",
"Set color of RGB keyboard"
);
#endif
diff --git a/include/keyboard_backlight.h b/include/keyboard_backlight.h
index 96bf69aaae..194bec66f4 100644
--- a/include/keyboard_backlight.h
+++ b/include/keyboard_backlight.h
@@ -54,7 +54,12 @@ struct kblight_drv {
/**
* Initialize keyboard backlight per board
*/
-void board_kblight_init(void);
+__override_proto void board_kblight_init(void);
+
+/**
+ * Shutdown keyboard backlight
+ */
+__override_proto void board_kblight_shutdown(void);
/**
* Set keyboard backlight brightness
diff --git a/include/rgb_keyboard.h b/include/rgb_keyboard.h
index 3593ab6f0e..2a2e35003b 100644
--- a/include/rgb_keyboard.h
+++ b/include/rgb_keyboard.h
@@ -13,6 +13,7 @@
#define SIZE_OF_RGB sizeof(struct rgb_s)
#define RGBKBD_MAX_GCC_LEVEL 0xff
+#define RGBKBD_MAX_SCALE 0xff
enum rgbkbd_demo {
RGBKBD_DEMO_OFF = 0,
diff --git a/test/rgb_keyboard.c b/test/rgb_keyboard.c
index 935c60165b..76f4fe5a10 100644
--- a/test/rgb_keyboard.c
+++ b/test/rgb_keyboard.c
@@ -8,6 +8,7 @@
#include "common.h"
#include "console.h"
+#include "keyboard_backlight.h"
#include "rgb_keyboard.h"
#include "task.h"
#include "test_util.h"
@@ -71,6 +72,10 @@ static struct rgbkbd_mock {
uint32_t gcc_level;
} mock_state;
+__override void board_kblight_init(void) {}
+
+__override void board_kblight_shutdown(void) {}
+
void before_test(void)
{
memset(&mock_state, 0, sizeof(mock_state));
@@ -201,7 +206,7 @@ static int test_rgbkbd_startup(void)
return EC_SUCCESS;
}
-int cc_rgbk(int argc, char **argv);
+int cc_rgb(int argc, char **argv);
extern enum rgbkbd_demo demo;
static int test_rgbkbd_console_command(void)
@@ -220,13 +225,13 @@ static int test_rgbkbd_console_command(void)
before_test();
argc = ARRAY_SIZE(argv_demo);
zassert_equal(demo, 2, "demo == 2");
- zassert_equal(cc_rgbk(argc, argv_demo), EC_SUCCESS, "rgbk demo 0");
+ zassert_equal(cc_rgb(argc, argv_demo), EC_SUCCESS, "rgbk demo 0");
zassert_equal(demo, 0, "demo == 0");
/* Test 'rgbk 100'. */
before_test();
argc = ARRAY_SIZE(argv_gcc);
- zassert_equal(cc_rgbk(argc, argv_gcc), EC_SUCCESS, "rgbk 100");
+ zassert_equal(cc_rgb(argc, argv_gcc), EC_SUCCESS, "rgbk 100");
zassert_equal(mock_state.count_drv_set_gcc, rgbkbd_count,
"set_gcc() called");
zassert_equal(mock_state.gcc_level, 100, "gcc == 100");
@@ -239,7 +244,7 @@ static int test_rgbkbd_console_command(void)
offset = rgbkbd_vsize * x + y;
sprintf(buf, "%d,%d", x, y);
argc = ARRAY_SIZE(argv_color);
- zassert_equal(cc_rgbk(argc, argv_color), EC_SUCCESS,
+ zassert_equal(cc_rgb(argc, argv_color), EC_SUCCESS,
"rgbk %s 1 2 3", buf);
zassert_equal(ctx->buf[offset].r, 1, "R = 1");
zassert_equal(ctx->buf[offset].g, 2, "G = 2");
@@ -252,7 +257,7 @@ static int test_rgbkbd_console_command(void)
y = -1;
sprintf(buf, "%d,%d", x, y);
argc = ARRAY_SIZE(argv_color);
- zassert_equal(cc_rgbk(argc, argv_color), EC_SUCCESS,
+ zassert_equal(cc_rgb(argc, argv_color), EC_SUCCESS,
"rgbk %s 1 2 3", buf);
for (r = 0; r < rgbkbd_vsize; r++) {
offset = rgbkbd_vsize * x + r;
@@ -267,7 +272,7 @@ static int test_rgbkbd_console_command(void)
y = 1;
sprintf(buf, "%d,%d", x, y);
argc = ARRAY_SIZE(argv_color);
- zassert_equal(cc_rgbk(argc, argv_color), EC_SUCCESS,
+ zassert_equal(cc_rgb(argc, argv_color), EC_SUCCESS,
"rgbk %s 1 2 3", buf);
for (c = 0; c < rgbkbd_hsize; c++) {
ctx = &rgbkbds[c / rgbkbds[0].cfg->col_len];
@@ -280,7 +285,7 @@ static int test_rgbkbd_console_command(void)
/* Test 'rgbk all 1 2 3'. */
before_test();
argc = ARRAY_SIZE(argv_all);
- zassert_equal(cc_rgbk(argc, argv_all), EC_SUCCESS, "rgbk all 1 2 3");
+ zassert_equal(cc_rgb(argc, argv_all), EC_SUCCESS, "rgbk all 1 2 3");
for (i = 0; i < rgbkbd_count; i++) {
ctx = &rgbkbds[i];
for (c = 0; c < ctx->cfg->col_len; c++) {
@@ -341,7 +346,7 @@ static int test_rgbkbd_demo_flow(void)
int i, j, g;
argc = ARRAY_SIZE(argv_demo);
- zassert_equal(cc_rgbk(argc, argv_demo), EC_SUCCESS, "rgbk demo flow");
+ zassert_equal(cc_rgb(argc, argv_demo), EC_SUCCESS, "rgbk demo flow");
for (j = 0; j < 0x100 / step; j++) {
/* Take a snapshot. */