Subrata Banik has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/85765?usp=email )
Change subject: ec/google/chromeec: Add function to detect barrel charger ......................................................................
ec/google/chromeec: Add function to detect barrel charger
This commit introduces a new function, google_chromeec_is_barrel_charger_present(), which checks if a barrel charger is present.
The function uses the following logic to determine if a barrel charger is present:
- If both a barrel charger and USB-C PD are present, then the barrel charger takes precedence over USB-C PD. As a result, google_chromeec_is_usb_pd_attached() will return false. This logic can be used to deterministically say if a barrel charger is present even when both a barrel charger and USB-C PD are attached.
- If an AC charger is detected and USB-C PD is not present, then a barrel charger must be present.
This change allows the EC to accurately detect the presence of a barrel charger, even when a USB-C PD charger is also attached.
BUG=b:377798581 TEST=Able to read the charger status correctly while booting google/fatcat.
Experiment #1: - USB-C PD Attached = yes - Barrel Attached = No - Charger Detected = Yes
``` fatcat-rev257 ~ # cbmem -c | grep -5 "ac_charger_present" [INFO ] ac_charger_present: yes [INFO ] usb_pd_present: yes [INFO ] baseboard_devtree_update: Barrel Absent ```
Experiment #2: - USB-C PD Attached = No - Barrel Attached = Yes - Charger Detected = Yes
``` [INFO ] ac_charger_present: yes [INFO ] usb_pd_present: no [INFO ] baseboard_devtree_update: Barrel Present ```
Experiment #3: - USB-C PD Attached = Yes - Barrel Attached = Yes - Charger Detected = Yes
``` [INFO ] ac_charger_present: yes [INFO ] usb_pd_present: no [INFO ] baseboard_devtree_update: Barrel Present ```
Experiment #4: - USB-C PD Attached = No - Barrel Attached = No - Charger Detected = No
``` [INFO ] ac_charger_present: no [INFO ] usb_pd_present: no [INFO ] baseboard_devtree_update: Barrel Absent ```
Change-Id: I9644f0dec057f95bb0a22cdc18edc1a0234ee3a9 Signed-off-by: Subrata Banik subratabanik@google.com --- M src/ec/google/chromeec/ec.c M src/ec/google/chromeec/ec.h 2 files changed, 36 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/65/85765/1
diff --git a/src/ec/google/chromeec/ec.c b/src/ec/google/chromeec/ec.c index 502684c..670d557 100644 --- a/src/ec/google/chromeec/ec.c +++ b/src/ec/google/chromeec/ec.c @@ -1005,6 +1005,34 @@ return false; }
+/* + * Using below scenarios to conclude if device has a barrel charger attached. + * +-----------+-----------------+------------------+---------------------------------+ + * | Scenarios | Charger Present | USB-C PD Present | Conclusion: Barrel Present ? | + * +-----------+-----------------+------------------+---------------------------------+ + * | #1 | Yes | Yes | Non Conclusive (comments below) | + * | #2 | No | Yes | Not possible | + * | #3 | Yes | No | Must be barrel charger | + * | #4 | No | No | Barrel not present | + * +-----------+-----------------+------------------+---------------------------------+ + */ +bool google_chromeec_is_barrel_charger_present(void) +{ + bool ac_charger_present = google_chromeec_is_charger_present(); + bool usb_pd_present = google_chromeec_is_usb_pd_attached(); + + /* + * If both barrel charger and USB-C PD present at once then barrel took the precedence + * over USB-C PD as a result `google_chromeec_is_usb_pd_attached()` will return + * `false`. This logic can be used further here to deterministically say if barrel + * charger is present even when both barrel charger and USB-C PD attached. + */ + if (ac_charger_present == true && usb_pd_present == false) + return true; + + return false; +} + int google_chromeec_override_dedicated_charger_limit(uint16_t current_lim, uint16_t voltage_lim) { diff --git a/src/ec/google/chromeec/ec.h b/src/ec/google/chromeec/ec.h index a50c311..c66db18 100644 --- a/src/ec/google/chromeec/ec.h +++ b/src/ec/google/chromeec/ec.h @@ -148,6 +148,14 @@ */ bool google_chromeec_is_charger_present(void);
+/** + * Check if barrel charger is present. + * + * @return true: if the barrel_charger is present + * false: if the barrel_charger is not present + */ +bool google_chromeec_is_barrel_charger_present(void); + /* * Set max current and voltage of a dedicated charger. *