diff options
author | Vic Yang <victoryang@chromium.org> | 2013-07-02 12:20:35 +0800 |
---|---|---|
committer | ChromeBot <chrome-bot@google.com> | 2013-07-08 18:05:44 -0700 |
commit | 03493a72db6ea5e12eda2a9488253d7fae6eec0b (patch) | |
tree | 31661bc6239aa4ddcfd0242af03126a7bcd10060 | |
parent | 690d6670f48830a436811437696e21c53a976b1e (diff) | |
download | chrome-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.c | 28 |
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 { |