diff options
-rw-r--r-- | common/base_state.c | 32 | ||||
-rw-r--r-- | common/build.mk | 1 | ||||
-rw-r--r-- | common/keyboard_mkbp.c | 14 | ||||
-rw-r--r-- | include/base_state.h | 15 | ||||
-rw-r--r-- | include/config.h | 6 | ||||
-rw-r--r-- | include/ec_commands.h | 3 |
6 files changed, 70 insertions, 1 deletions
diff --git a/common/base_state.c b/common/base_state.c new file mode 100644 index 0000000000..b0f352231d --- /dev/null +++ b/common/base_state.c @@ -0,0 +1,32 @@ +/* Copyright 2018 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "base_state.h" +#include "console.h" +#include "host_command.h" +#include "hooks.h" + +#define CPRINTS(format, args...) cprints(CC_MOTION_LID, format, ## args) + +/* 1: base attached, 0: otherwise */ +static int base_state; + +int base_get_state(void) +{ + return base_state; +} + +void base_set_state(int state) +{ + if (base_state == !!state) + return; + + base_state = !!state; + CPRINTS("base state: %stached", state ? "at" : "de"); + hook_notify(HOOK_BASE_ATTACHED_CHANGE); + + /* Notify host of mode change. This likely will wake it up. */ + host_set_single_event(EC_HOST_EVENT_MODE_CHANGE); +} diff --git a/common/build.mk b/common/build.mk index 9530586e41..1b3cf67e98 100644 --- a/common/build.mk +++ b/common/build.mk @@ -21,6 +21,7 @@ common-$(HAS_TASK_ALS)+=als.o common-$(CONFIG_AP_HANG_DETECT)+=ap_hang_detect.o common-$(CONFIG_BACKLIGHT_LID)+=backlight_lid.o common-$(CONFIG_BASE32)+=base32.o +common-$(CONFIG_BASE_ATTACHED_SWITCH)+=base_state.o common-$(CONFIG_BATTERY)+=battery.o common-$(CONFIG_BATTERY_FUEL_GAUGE)+=battery_fuel_gauge.o common-$(CONFIG_BLUETOOTH_LE)+=bluetooth_le.o diff --git a/common/keyboard_mkbp.c b/common/keyboard_mkbp.c index ffe5aefa92..efd86f2e10 100644 --- a/common/keyboard_mkbp.c +++ b/common/keyboard_mkbp.c @@ -6,6 +6,7 @@ */ #include "atomic.h" +#include "base_state.h" #include "button.h" #include "chipset.h" #include "common.h" @@ -264,6 +265,16 @@ DECLARE_HOOK(HOOK_TABLET_MODE_CHANGE, mkbp_tablet_mode_change, HOOK_PRIO_LAST); DECLARE_HOOK(HOOK_INIT, mkbp_tablet_mode_change, HOOK_PRIO_INIT_LID+1); #endif +#ifdef CONFIG_BASE_ATTACHED_SWITCH +static void mkbp_base_attached_change(void) +{ + mkbp_update_switches(EC_MKBP_BASE_ATTACHED, base_get_state()); +} +DECLARE_HOOK(HOOK_BASE_ATTACHED_CHANGE, mkbp_base_attached_change, + HOOK_PRIO_LAST); +DECLARE_HOOK(HOOK_INIT, mkbp_base_attached_change, HOOK_PRIO_INIT_LID+1); +#endif + void keyboard_update_button(enum keyboard_button_type button, int is_pressed) { switch (button) { @@ -430,6 +441,9 @@ static uint32_t get_supported_switches(void) #ifdef CONFIG_TABLET_MODE_SWITCH val |= (1 << EC_MKBP_TABLET_MODE); #endif +#ifdef CONFIG_BASE_ATTACHED_SWITCH + val |= (1 << EC_MKBP_BASE_ATTACHED); +#endif return val; } diff --git a/include/base_state.h b/include/base_state.h new file mode 100644 index 0000000000..6ee0948e5f --- /dev/null +++ b/include/base_state.h @@ -0,0 +1,15 @@ +/* Copyright 2018 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/** + * Return 1 if base attached, 0 otherwise. + */ +int base_get_state(void); + +/** + * Sets the current state of the base, with 0 meaning detached, + * and non-zero meaning attached. + */ +void base_set_state(int state); diff --git a/include/config.h b/include/config.h index 84f3b0ad65..c5a79901c4 100644 --- a/include/config.h +++ b/include/config.h @@ -2751,6 +2751,12 @@ #undef CONFIG_TABLET_SWITCH /* + * Add a virtual switch to indicate when detachable device has + * base attached. + */ +#undef CONFIG_BASE_ATTACHED_SWITCH + +/* * Microchip Trace FIFO Debug Port */ #undef CONFIG_MCHP_TFDP diff --git a/include/ec_commands.h b/include/ec_commands.h index 30b02024d7..e45e56911c 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -596,7 +596,7 @@ enum host_event_code { /* EC desires to change state of host-controlled USB mux */ EC_HOST_EVENT_USB_MUX = 28, - /* TABLET/LAPTOP mode event*/ + /* TABLET/LAPTOP mode or detachable base attach/detach event */ EC_HOST_EVENT_MODE_CHANGE = 29, /* Keyboard recovery combo with hardware reinitialization */ @@ -3285,6 +3285,7 @@ struct __ec_align1 ec_response_get_next_event_v1 { /* Switches */ #define EC_MKBP_LID_OPEN 0 #define EC_MKBP_TABLET_MODE 1 +#define EC_MKBP_BASE_ATTACHED 2 /* Run keyboard factory test scanning */ #define EC_CMD_KEYBOARD_FACTORY_TEST 0x0068 |