summaryrefslogtreecommitdiff
path: root/common/host_command_pd.c
diff options
context:
space:
mode:
authorAlec Berg <alecaberg@chromium.org>2015-02-03 15:49:47 -0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-02-04 23:32:37 +0000
commit19b6e5da2391bb7f75cf3aa29dddddfad75ff7c8 (patch)
treeec2a47efcd619428ead37939e625d491fd50e0ee /common/host_command_pd.c
parent9590a539206ab783c0a453b8d74e3f02ee157e77 (diff)
downloadchrome-ec-19b6e5da2391bb7f75cf3aa29dddddfad75ff7c8.tar.gz
samus: fix lightbar tap sequence doesn't always show on AC event
Fix bug on samus that the battery status doesn't always show on lightbar when AC is plugged/unplugged. It doesn't show when the battery is full is S3 or S5 because in these states we turn off CHARGE_EN so that ACOK to the EC never toggles. Instead, what we want to do is display battery status whenever the active charge port changes. This will happen when AC is plugged or unplugged OR if a user has AC on both ports and toggles between them using the charge override hot-keys. BUG=chrome-os-partner:36317 BRANCH=samus TEST=test plugging and unplugging AC on both sides when battery is full and unit is in S0, and when unit is in S5. also tested lightbar flashes battery percentage when two zingers are plugged in and you switch between them using Ctrl+Search+0|1|2. Change-Id: I5cd7fff4f466adf857f1e63f07f3b0c7ae8422c7 Signed-off-by: Alec Berg <alecaberg@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/245922 Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Diffstat (limited to 'common/host_command_pd.c')
-rw-r--r--common/host_command_pd.c41
1 files changed, 31 insertions, 10 deletions
diff --git a/common/host_command_pd.c b/common/host_command_pd.c
index e9282abee4..ca315c574f 100644
--- a/common/host_command_pd.c
+++ b/common/host_command_pd.c
@@ -9,6 +9,7 @@
#include "common.h"
#include "console.h"
#include "host_command.h"
+#include "lightbar.h"
#include "task.h"
#include "timer.h"
#include "util.h"
@@ -20,6 +21,9 @@
/* By default allow 5V charging only for the dead battery case */
static enum pd_charge_state charge_state = PD_CHARGE_5V;
+#define CHARGE_PORT_UNINITIALIZED -2
+static int charge_port = CHARGE_PORT_UNINITIALIZED;
+
void host_command_pd_send_status(enum pd_charge_state new_chg_state)
{
/* Update PD MCU charge state if necessary */
@@ -29,13 +33,15 @@ void host_command_pd_send_status(enum pd_charge_state new_chg_state)
task_set_event(TASK_ID_PDCMD, TASK_EVENT_EXCHANGE_PD_STATUS, 0);
}
-void pd_exchange_status(int *charge_port)
+int pd_get_active_charge_port(void)
+{
+ return charge_port;
+}
+
+static void pd_exchange_status(void)
{
struct ec_params_pd_status ec_status;
- struct ec_response_pd_status pd_status = {
- /* default for when the PD isn't cooperating */
- .active_charge_port = -1,
- };
+ struct ec_response_pd_status pd_status;
int rv = 0;
/* Send PD charge state and battery state of charge */
@@ -55,14 +61,29 @@ void pd_exchange_status(int *charge_port)
sizeof(struct ec_params_pd_status), &pd_status,
sizeof(struct ec_response_pd_status));
- if (charge_port)
- *charge_port = pd_status.active_charge_port;
-
if (rv < 0) {
CPRINTS("Host command to PD MCU failed");
return;
}
+#ifdef HAS_TASK_LIGHTBAR
+ /*
+ * If charge port has changed, and it was initialized, then show
+ * battery status on lightbar.
+ */
+ if (pd_status.active_charge_port != charge_port) {
+ if (charge_port != CHARGE_PORT_UNINITIALIZED) {
+ charge_port = pd_status.active_charge_port;
+ lightbar_sequence(LIGHTBAR_TAP);
+ } else {
+ charge_port = pd_status.active_charge_port;
+ }
+ }
+#else
+ /* Store the active charge port */
+ charge_port = pd_status.active_charge_port;
+#endif
+
/* Set input current limit */
rv = charge_set_input_current_limit(MAX(pd_status.curr_lim_ma,
CONFIG_CHARGER_INPUT_CURRENT));
@@ -77,7 +98,7 @@ void pd_exchange_status(int *charge_port)
void pd_command_task(void)
{
/* On startup exchange status with the PD */
- pd_exchange_status(0);
+ pd_exchange_status();
while (1) {
/* Wait for the next command event */
@@ -85,6 +106,6 @@ void pd_command_task(void)
/* Process event to send status to PD */
if (evt & TASK_EVENT_EXCHANGE_PD_STATUS)
- pd_exchange_status(0);
+ pd_exchange_status();
}
}