summaryrefslogtreecommitdiff
path: root/common/lid_angle.c
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2021-11-04 12:11:58 -0600
committerCommit Bot <commit-bot@chromium.org>2021-11-05 04:22:34 +0000
commit252457d4b21f46889eebad61d4c0a65331919cec (patch)
tree01856c4d31d710b20e85a74c8d7b5836e35c3b98 /common/lid_angle.c
parent08f5a1e6fc2c9467230444ac9b582dcf4d9f0068 (diff)
downloadchrome-ec-stabilize-14526.89.B-ish.tar.gz
In the interest of making long-term branch maintenance incur as little technical debt on us as possible, we should not maintain any files on the branch we are not actually using. This has the added effect of making it extremely clear when merging CLs from the main branch when changes have the possibility to affect us. The follow-on CL adds a convenience script to actually pull updates from the main branch and generate a CL for the update. BUG=b:204206272 BRANCH=ish TEST=make BOARD=arcada_ish && make BOARD=drallion_ish Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Change-Id: I17e4694c38219b5a0823e0a3e55a28d1348f4b18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3262038 Reviewed-by: Jett Rink <jettrink@chromium.org> Reviewed-by: Tom Hughes <tomhughes@chromium.org>
Diffstat (limited to 'common/lid_angle.c')
-rw-r--r--common/lid_angle.c202
1 files changed, 0 insertions, 202 deletions
diff --git a/common/lid_angle.c b/common/lid_angle.c
deleted file mode 100644
index 8a3775b959..0000000000
--- a/common/lid_angle.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/* Copyright 2014 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.
- */
-
-/* Lid angle module for Chrome EC */
-
-#include "chipset.h"
-#include "common.h"
-#include "console.h"
-#include "hooks.h"
-#include "keyboard_scan.h"
-#include "lid_angle.h"
-#include "lid_switch.h"
-#include "math_util.h"
-#include "motion_lid.h"
-#include "motion_sense.h"
-#include "tablet_mode.h"
-
-/* Console output macros */
-#define CPUTS(outstr) cputs(CC_LIDANGLE, outstr)
-#define CPRINTS(format, args...) cprints(CC_LIDANGLE, format, ## args)
-
-/*
- * Define the number of previous lid angle measurements to keep for determining
- * whether to enable or disable peripherals that are only needed for laptop
- * mode. These incude keyboard and trackpad. Note, that in order to change the
- * enable/disable state of these peripherals, all stored measurements of the
- * lid angle buffer must be in the specified range.
- */
-#define LID_ANGLE_BUFFER_SIZE 4
-
-/*
- * Define two variables to determine if wake source peripherals that are only
- * applicable for laptop mode should be enabled or disabled in S3 based on the
- * current lid angle. Note, the lid angle is bound to [0, 360]. Here are two
- * angles, defined such that we segregate the lid angle space into two regions.
- * The first region is the region in which we enable peripherals in S3 and is
- * when the lid angle CCW of the small_angle and CW of the large_angle. The
- * second region is the region in which we disable peripherals in S3 and is when
- * the lid angle is CCW of the large_angle and CW of the small_angle.
- *
- * Note, the most sensical values are small_angle = 0 and large_angle = 180,
- * but, the angle measurement is not perfect, and we know that if the angle is
- * near 0 and the lid isn't closed, then the lid must be near 360. So, the
- * small_angle is set to a small positive value to make sure we don't swap modes
- * when the lid is open all the way but is measuring a small positive value.
- */
-static int wake_large_angle = 180;
-static const int wake_small_angle = 13;
-
-/* Define hysteresis value to add stability to the flags. */
-#define LID_ANGLE_HYSTERESIS_DEG 2
-
-/* Define max and min values for wake_large_angle. */
-#define LID_ANGLE_MIN_LARGE_ANGLE 0
-#define LID_ANGLE_MAX_LARGE_ANGLE 360
-
-/**
- * Determine if given angle is in region to enable peripherals.
- *
- * @param ang Some lid angle in degrees [0, 360]
- *
- * @return true/false
- */
-static int lid_in_range_to_enable_peripherals(int ang)
-{
- /*
- * If the wake large angle is min or max, then this function should
- * return false or true respectively, independent of input angle.
- */
- if (wake_large_angle == LID_ANGLE_MIN_LARGE_ANGLE)
- return 0;
- else if (wake_large_angle == LID_ANGLE_MAX_LARGE_ANGLE)
- return 1;
-
- return (ang >= (wake_small_angle + LID_ANGLE_HYSTERESIS_DEG)) &&
- (ang <= (wake_large_angle - LID_ANGLE_HYSTERESIS_DEG));
-}
-
-/**
- * Determine if given angle is in region to ignore peripherals.
- *
- * @param ang Some lid angle in degrees [0, 360]
- *
- * @return true/false
- */
-static int lid_in_range_to_ignore_peripherals(int ang)
-{
- /*
- * If the wake large angle is min or max, then this function should
- * return true or false respectively, independent of input angle.
- */
- if (wake_large_angle == LID_ANGLE_MIN_LARGE_ANGLE)
- return 1;
- else if (wake_large_angle == LID_ANGLE_MAX_LARGE_ANGLE)
- return 0;
-
- return (ang <= (wake_small_angle - LID_ANGLE_HYSTERESIS_DEG)) ||
- (ang >= (wake_large_angle + LID_ANGLE_HYSTERESIS_DEG));
-}
-
-
-int lid_angle_get_wake_angle(void)
-{
- return wake_large_angle;
-}
-
-void lid_angle_set_wake_angle(int ang)
-{
- if (ang < LID_ANGLE_MIN_LARGE_ANGLE)
- ang = LID_ANGLE_MIN_LARGE_ANGLE;
- else if (ang > LID_ANGLE_MAX_LARGE_ANGLE)
- ang = LID_ANGLE_MAX_LARGE_ANGLE;
-
- wake_large_angle = ang;
-}
-
-void lid_angle_update(int lid_ang)
-{
- static int lidangle_buffer[LID_ANGLE_BUFFER_SIZE];
- static int index;
- int i;
- int accept = 1, ignore = 1;
-
- /* Record most recent lid angle in circular buffer. */
- lidangle_buffer[index] = lid_ang;
- index = (index == LID_ANGLE_BUFFER_SIZE-1) ? 0 : index+1;
-
- /*
- * Manage whether or not peripherals are enabled based on lid angle
- * history.
- */
- for (i = 0; i < LID_ANGLE_BUFFER_SIZE; i++) {
- /*
- * If any lid angle samples are unreliable, then
- * don't change peripheral state.
- */
- if (lidangle_buffer[i] == LID_ANGLE_UNRELIABLE)
- return;
-
- /*
- * Force all elements of the lid angle buffer to be
- * in range of one of the conditions in order to change
- * to the corresponding peripheral state.
- */
- if (!lid_in_range_to_enable_peripherals(lidangle_buffer[i]))
- accept = 0;
- if (!lid_in_range_to_ignore_peripherals(lidangle_buffer[i]))
- ignore = 0;
- }
-
- /* Enable or disable peripherals as necessary. */
- if (accept)
- lid_angle_peripheral_enable(1);
- else if (ignore && !accept)
- lid_angle_peripheral_enable(0);
-}
-
-static void enable_peripherals(void)
-{
- /*
- * Make sure lid angle is not disabling peripherals when AP is running.
- */
- lid_angle_peripheral_enable(1);
-}
-DECLARE_HOOK(HOOK_CHIPSET_RESUME, enable_peripherals, HOOK_PRIO_DEFAULT);
-
-#ifdef CONFIG_TABLET_MODE
-static void suspend_peripherals(void)
-{
- /*
- * Make sure peripherals are disabled in S3 in tablet mode.
- */
- if (tablet_get_mode())
- lid_angle_peripheral_enable(0);
-}
-DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, suspend_peripherals, HOOK_PRIO_DEFAULT);
-#endif /* CONFIG_TABLET_MODE */
-
-#ifdef TEST_BUILD
-__overridable void lid_angle_peripheral_enable(int enable)
-{
-}
-#else
-__overridable void lid_angle_peripheral_enable(int enable)
-{
- int chipset_in_s0 = chipset_in_state(CHIPSET_STATE_ON);
-
- if (enable) {
- keyboard_scan_enable(1, KB_SCAN_DISABLE_LID_ANGLE);
- } else {
- /*
- * Ensure that the chipset is off before disabling the keyboard.
- * When the chipset is on, the EC keeps the keyboard enabled and
- * the AP decides whether to ignore input devices or not.
- */
- if (!chipset_in_s0)
- keyboard_scan_enable(0, KB_SCAN_DISABLE_LID_ANGLE);
- }
-}
-#endif /* TEST_BUILD */