summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2013-05-07 14:01:27 +0800
committerChromeBot <chrome-bot@google.com>2013-05-07 20:59:56 -0700
commitac3488cd0b41ade3dd38ec61c4b07db6489f2260 (patch)
tree95c92a1bd6289c6b8611b9cf4e63200317154b70
parent5007bbc009ccc8c8e64fac5f5540c85573d4ae80 (diff)
downloadchrome-ec-ac3488cd0b41ade3dd38ec61c4b07db6489f2260.tar.gz
spring: Improve charging current control
This includes: - Increase overcurrent retry count from 1 to 2. - Mark overcurrent event regardless of what current PWM duty cycle is. - PWM duty cycle settles faster. - PWM duty cycle starts from ~100%. BUG=chrome-os-partner:19001, chrome-os-partner:19037 TEST=Manual BRANCH=spring Change-Id: Idf007fb589fde3baef6c8975dfa1f2fc1ec6e95d Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/50262 Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r--common/extpower_usb.c57
1 files changed, 37 insertions, 20 deletions
diff --git a/common/extpower_usb.c b/common/extpower_usb.c
index a31363e04b..d64417d6dd 100644
--- a/common/extpower_usb.c
+++ b/common/extpower_usb.c
@@ -58,13 +58,14 @@ enum ilim_config {
/* PWM control loop parameters */
#define PWM_CTRL_MAX_DUTY 96 /* Minimum current for dead battery */
-#define PWM_CTRL_BEGIN_OFFSET 30
+#define PWM_CTRL_BEGIN_OFFSET 90
#define PWM_CTRL_OC_MARGIN 15
#define PWM_CTRL_OC_DETECT_TIME (800 * MSEC)
#define PWM_CTRL_OC_BACK_OFF 3
-#define PWM_CTRL_OC_RETRY 1
-#define PWM_CTRL_STEP_DOWN 2
+#define PWM_CTRL_OC_RETRY 2
+#define PWM_CTRL_STEP_DOWN 3
#define PWM_CTRL_STEP_UP 5
+#define PWM_CTRL_STEP_FAST_DOWN 15
#define PWM_CTRL_VBUS_HARD_LOW 4400
#define PWM_CTRL_VBUS_LOW 4500
#define PWM_CTRL_VBUS_HIGH 4700 /* Must be higher than 4.5V */
@@ -291,16 +292,29 @@ static void set_pwm_duty_cycle(int percent)
current_pwm_duty = percent;
}
-static int pwm_check_lower_bound(void)
-{
- if (current_limit_mode == LIMIT_AGGRESSIVE)
- return (current_pwm_duty > nominal_pwm_duty -
- PWM_CTRL_OC_MARGIN &&
- current_pwm_duty > over_current_pwm_duty &&
- current_pwm_duty > 0);
- else
- return (current_pwm_duty > nominal_pwm_duty &&
- current_pwm_duty > 0);
+/**
+ * Returns next lower PWM duty cycle, or -1 for unchanged duty cycle.
+ */
+static int pwm_get_next_lower(void)
+{
+ int fast_next = current_pwm_duty - PWM_CTRL_STEP_FAST_DOWN;
+
+ if (current_limit_mode == LIMIT_AGGRESSIVE) {
+ if (fast_next >= nominal_pwm_duty - PWM_CTRL_OC_MARGIN &&
+ fast_next >= over_current_pwm_duty)
+ return MAX(fast_next, 0);
+ if (current_pwm_duty > nominal_pwm_duty -
+ PWM_CTRL_OC_MARGIN &&
+ current_pwm_duty > over_current_pwm_duty &&
+ current_pwm_duty > 0)
+ return MAX(current_pwm_duty - PWM_CTRL_STEP_DOWN, 0);
+ return -1;
+ } else {
+ if (current_pwm_duty > nominal_pwm_duty && current_pwm_duty > 0)
+ return MAX(current_pwm_duty - PWM_CTRL_STEP_DOWN, 0);
+ else
+ return -1;
+ }
}
static int pwm_check_vbus_low(int vbus, int battery_current)
@@ -401,11 +415,10 @@ static void usb_detect_overcurrent(int dev_type)
power_removed_time[idx] = get_time();
power_removed_type[idx] = current_dev_type;
/*
- * Considering user may plug/unplug the charger too fast, we
- * don't limit current to lower than nominal current limit.
+ * TODO(victoryang): Record the maximum current seen during
+ * retry?
*/
- power_removed_pwm_duty[idx] = MIN(current_pwm_duty,
- nominal_pwm_duty);
+ power_removed_pwm_duty[idx] = current_pwm_duty;
} else if (dev_type & TSU6721_TYPE_VBUS_DEBOUNCED) {
int idx = !(dev_type == TSU6721_TYPE_VBUS_DEBOUNCED);
timestamp_t now = get_time();
@@ -656,6 +669,7 @@ DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, usb_boost_pwr_off_hook, HOOK_PRIO_DEFAULT);
static void power_tweak(void)
{
int vbus, current;
+ int next;
if (current_ilim_config != ILIM_CONFIG_PWM)
return;
@@ -691,9 +705,12 @@ static void power_tweak(void)
if (pwm_check_vbus_low(vbus, current)) {
set_pwm_duty_cycle(current_pwm_duty + PWM_CTRL_STEP_UP);
CPRINTF("[%T PWM duty up %d%%]\n", current_pwm_duty);
- } else if (vbus > PWM_CTRL_VBUS_HIGH && pwm_check_lower_bound()) {
- set_pwm_duty_cycle(current_pwm_duty - PWM_CTRL_STEP_DOWN);
- CPRINTF("[%T PWM duty down %d%%]\n", current_pwm_duty);
+ } else if (vbus > PWM_CTRL_VBUS_HIGH) {
+ next = pwm_get_next_lower();
+ if (next >= 0) {
+ set_pwm_duty_cycle(next);
+ CPRINTF("[%T PWM duty down %d%%]\n", current_pwm_duty);
+ }
}
}
DECLARE_HOOK(HOOK_SECOND, power_tweak, HOOK_PRIO_DEFAULT);