summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2013-07-02 12:20:35 +0800
committerChromeBot <chrome-bot@google.com>2013-07-08 18:05:44 -0700
commit03493a72db6ea5e12eda2a9488253d7fae6eec0b (patch)
tree31661bc6239aa4ddcfd0242af03126a7bcd10060
parent690d6670f48830a436811437696e21c53a976b1e (diff)
downloadchrome-ec-03493a72db6ea5e12eda2a9488253d7fae6eec0b.tar.gz
Improve over current detection
This includes: - Capturing over-current event on transition from known device type to unknown device type. - Limiting current draw when device type is not determined yet. - Shortening CABLE_DET delay to 0.6 seconds so that over-current event for USB host has a 0.6-second window for the charger to recover. BUG=chrome-os-partner:20648 TEST=Charge with Arrow BRANCH=Spring Change-Id: Ie66ccd2d69adf8436a67e504f82da6eca3d0b14f Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/60730
-rw-r--r--board/spring/usb_charging.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/board/spring/usb_charging.c b/board/spring/usb_charging.c
index 9faf422c56..56a5ef6655 100644
--- a/board/spring/usb_charging.c
+++ b/board/spring/usb_charging.c
@@ -52,6 +52,7 @@
#define MA_TO_PWM(curr) (((curr) - PWM_MAPPING_A) / PWM_MAPPING_B)
/* PWM controlled current limit */
+#define I_LIMIT_100MA MA_TO_PWM(100)
#define I_LIMIT_500MA MA_TO_PWM(500)
#define I_LIMIT_1000MA MA_TO_PWM(1000)
#define I_LIMIT_1500MA MA_TO_PWM(1500)
@@ -81,7 +82,7 @@
#define DELAY_USB_DP_DN_MS 20
#define DELAY_ID_MUX_MS 30
#define CABLE_DET_POLL_MS 100
-#define CABLE_DET_POLL_COUNT 10
+#define CABLE_DET_POLL_COUNT 6
static int current_dev_type = TSU6721_TYPE_NONE;
static int nominal_pwm_duty;
@@ -539,6 +540,26 @@ static void usb_boost_pwr_off_hook(void) { usb_boost_power_hook(0); }
DECLARE_HOOK(HOOK_CHIPSET_PRE_INIT, usb_boost_pwr_on_hook, HOOK_PRIO_DEFAULT);
DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, usb_boost_pwr_off_hook, HOOK_PRIO_DEFAULT);
+static int usb_charger_removed(int dev_type)
+{
+ if (!(current_dev_type & TSU6721_TYPE_VBUS_DEBOUNCED))
+ return 0;
+
+ /* Charger is removed */
+ if (dev_type == TSU6721_TYPE_NONE)
+ return 1;
+
+ /*
+ * Device type changed from known type to unknown type. Assuming
+ * it went away and came back.
+ */
+ if ((current_dev_type != TSU6721_TYPE_VBUS_DEBOUNCED) &&
+ (dev_type == TSU6721_TYPE_VBUS_DEBOUNCED))
+ return 1;
+
+ return 0;
+}
+
/*
* When a power source is removed, record time, power source type,
* and PWM duty cycle. Then when we see a power source, compare type
@@ -547,8 +568,7 @@ DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, usb_boost_pwr_off_hook, HOOK_PRIO_DEFAULT);
*/
static void usb_detect_overcurrent(int dev_type)
{
- if ((current_dev_type & TSU6721_TYPE_VBUS_DEBOUNCED) &&
- (dev_type == TSU6721_TYPE_NONE)) {
+ if (usb_charger_removed(dev_type)) {
int idx = !(current_dev_type == TSU6721_TYPE_VBUS_DEBOUNCED);
power_removed_time[idx] = get_time();
power_removed_type[idx] = current_dev_type;
@@ -625,6 +645,8 @@ static void usb_update_ilim(int dev_type)
current_limit = hard_current_limit(I_LIMIT_2000MA);
else if (dev_type & TOAD_DEVICE_TYPE)
current_limit = hard_current_limit(I_LIMIT_500MA);
+ else if (dev_type == TSU6721_TYPE_VBUS_DEBOUNCED)
+ current_limit = hard_current_limit(I_LIMIT_100MA);
board_pwm_nominal_duty_cycle(current_limit);
} else {