diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2021-02-11 15:52:53 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-02-12 16:51:08 +0000 |
commit | de9fd43a3ffffa4e4c9e7c12bc0be40860b7b293 (patch) | |
tree | 115e22ec66a2beaa5cc3875419b2012747177e38 | |
parent | 914a3266dc25ff00e2ca171827f1e94cb5e8c5e9 (diff) | |
download | chrome-ec-de9fd43a3ffffa4e4c9e7c12bc0be40860b7b293.tar.gz |
PCHG: Get SOC proactively when device is detected
This patch makes PCHG send CHG_CTRL_CHARGING_INFO_CMD when a stylus
is detected. This will allow the EC to report 'full' to the host
even if charging doesn't start (because the stylus is already
charged).
BUG=b:179390065,b:173235954
BRANCH=trogdor
TEST=CoachZ. Re-attach charged stylus and verify PCHG_STATE_FULL
is reported.
Change-Id: Id8578e2d3d21294fb08a21933f12ecee7f2bd062
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2691729
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r-- | common/peripheral_charger.c | 15 | ||||
-rw-r--r-- | driver/nfc/ctn730.c | 30 | ||||
-rw-r--r-- | include/peripheral_charger.h | 2 |
3 files changed, 42 insertions, 5 deletions
diff --git a/common/peripheral_charger.c b/common/peripheral_charger.c index 85910d4c76..cb9a6e1f3e 100644 --- a/common/peripheral_charger.c +++ b/common/peripheral_charger.c @@ -83,6 +83,9 @@ static enum pchg_state pchg_initialize(struct pchg *ctx, enum pchg_state state) CPRINTS("ERR: Failed to initialize"); } + ctx->battery_percent = 0; + ctx->error = 0; + return state; } @@ -159,6 +162,11 @@ static enum pchg_state pchg_state_enabled(struct pchg *ctx) state = PCHG_STATE_INITIALIZED; break; case PCHG_EVENT_DEVICE_DETECTED: + /* + * Proactively query SOC in case charging info won't be sent + * because device is already charged. + */ + ctx->cfg->drv->get_soc(ctx); state = PCHG_STATE_DETECTED; break; case PCHG_EVENT_CHARGE_STARTED: @@ -195,6 +203,7 @@ static enum pchg_state pchg_state_detected(struct pchg *ctx) state = PCHG_STATE_CHARGING; break; case PCHG_EVENT_DEVICE_LOST: + ctx->battery_percent = 0; state = PCHG_STATE_ENABLED; break; case PCHG_EVENT_CHARGE_ERROR: @@ -231,6 +240,7 @@ static enum pchg_state pchg_state_charging(struct pchg *ctx) CPRINTS("Battery %d%%", ctx->battery_percent); break; case PCHG_EVENT_DEVICE_LOST: + ctx->battery_percent = 0; state = PCHG_STATE_ENABLED; break; case PCHG_EVENT_CHARGE_ERROR: @@ -444,8 +454,9 @@ static int cc_pchg(int argc, char **argv) ctx = &pchgs[port]; if (argc == 2) { - ccprintf("P%d STATE_%s EVENT_%s\n", port, - _text_state(ctx->state), _text_event(ctx->event)); + ccprintf("P%d STATE_%s EVENT_%s SOC=%d%%\n", port, + _text_state(ctx->state), _text_event(ctx->event), + ctx->battery_percent); return EC_SUCCESS; } diff --git a/driver/nfc/ctn730.c b/driver/nfc/ctn730.c index c8be10d297..8e5dd2ea20 100644 --- a/driver/nfc/ctn730.c +++ b/driver/nfc/ctn730.c @@ -90,6 +90,8 @@ static const int _detection_interval_ms = 100; #define WLC_HOST_CTRL_DUMP_STATUS_CMD_SIZE 1 /* WLC_CHG_CTRL_CHARGING_INFO constants */ +#define WLC_CHG_CTRL_CHARGING_INFO_CMD_SIZE 0 +#define WLC_CHG_CTRL_CHARGING_INFO_RSP_SIZE 2 #define WLC_CHG_CTRL_CHARGING_INFO_EVT_SIZE 5 /* Status Codes */ @@ -313,12 +315,13 @@ static int _process_payload_response(struct pchg *ctx, struct ctn730_msg *res) if (IS_ENABLED(CTN730_DEBUG)) CPRINTS("Payload: %ph", HEX_BUF(buf, len)); + ctx->event = PCHG_EVENT_NONE; + switch (res->instruction) { case WLC_HOST_CTRL_RESET: if (len != WLC_HOST_CTRL_RESET_RSP_SIZE || buf[0] != WLC_HOST_STATUS_OK) return EC_ERROR_UNKNOWN; - ctx->event = PCHG_EVENT_NONE; break; case WLC_CHG_CTRL_ENABLE: if (len != WLC_CHG_CTRL_ENABLE_RSP_SIZE @@ -330,11 +333,15 @@ static int _process_payload_response(struct pchg *ctx, struct ctn730_msg *res) if (len != WLC_CHG_CTRL_DISABLE_RSP_SIZE || buf[0] != WLC_HOST_STATUS_OK) return EC_ERROR_UNKNOWN; - ctx->event = PCHG_EVENT_NONE; + break; + case WLC_CHG_CTRL_CHARGING_INFO: + if (len != WLC_CHG_CTRL_CHARGING_INFO_RSP_SIZE + || buf[0] != WLC_HOST_STATUS_OK) + return EC_ERROR_UNKNOWN; + ctx->battery_percent = buf[1]; break; default: CPRINTS("Received unknown response (%d)", res->instruction); - ctx->event = PCHG_EVENT_NONE; break; } @@ -453,6 +460,22 @@ static int ctn730_get_event(struct pchg *ctx) return EC_ERROR_UNKNOWN; } +static int ctn730_get_soc(struct pchg *ctx) +{ + struct ctn730_msg cmd; + int rv; + + cmd.message_type = CTN730_MESSAGE_TYPE_COMMAND; + cmd.instruction = WLC_CHG_CTRL_CHARGING_INFO; + cmd.length = WLC_CHG_CTRL_CHARGING_INFO_CMD_SIZE; + + rv = _send_command(ctx, &cmd); + if (rv) + return rv; + + return EC_SUCCESS; +} + /** * Send command in blocking loop * @@ -519,6 +542,7 @@ const struct pchg_drv ctn730_drv = { .init = ctn730_init, .enable = ctn730_enable, .get_event = ctn730_get_event, + .get_soc = ctn730_get_soc, }; static int cc_ctn730(int argc, char **argv) diff --git a/include/peripheral_charger.h b/include/peripheral_charger.h index 2ede2c6f2c..62b1b0ac01 100644 --- a/include/peripheral_charger.h +++ b/include/peripheral_charger.h @@ -146,6 +146,8 @@ struct pchg_drv { int (*enable)(struct pchg *ctx, bool enable); /* Get event info. */ int (*get_event)(struct pchg *ctx); + /* Get battery level. */ + int (*get_soc)(struct pchg *ctx); }; /** |