From 90dd2f84a9174c38dbfb07d582ec6ee7697b1939 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Mon, 27 Dec 2021 12:26:59 +0000 Subject: x1000: Correctly limit USB charging current The way this was done before was wrong - limiting the charge current is not enough since the device will draw additional power to run. Use the AXP192's vbus current limit control to stay compliant with the USB specification. Change-Id: I91b84e3480a432e49bec53cf2a17e4e3444404a4 --- .../ingenic_x1000/shanlingq1/power-shanlingq1.c | 23 ++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'firmware/target/mips/ingenic_x1000/shanlingq1') diff --git a/firmware/target/mips/ingenic_x1000/shanlingq1/power-shanlingq1.c b/firmware/target/mips/ingenic_x1000/shanlingq1/power-shanlingq1.c index 65d1bc163f..9637ceef2f 100644 --- a/firmware/target/mips/ingenic_x1000/shanlingq1/power-shanlingq1.c +++ b/firmware/target/mips/ingenic_x1000/shanlingq1/power-shanlingq1.c @@ -86,7 +86,7 @@ void power_init(void) (1 << AXP_SUPPLY_DCDC2) | /* LCD (1.2 V) */ (1 << AXP_SUPPLY_DCDC3) | /* CPU (1.8 V) */ (1 << AXP_SUPPLY_LDO2) | /* Touchscreen (3.3 V) */ - (1 << AXP_SUPPLY_LDO3)); /* not sure (2.5 V) */ + (1 << AXP_SUPPLY_LDO3)); /* USB analog (2.5 V) */ /* Enable required ADCs */ axp_set_enabled_adcs( @@ -98,6 +98,10 @@ void power_init(void) (1 << AXP_ADC_INTERNAL_TEMP) | (1 << AXP_ADC_APS_VOLTAGE)); + /* Configure USB charging */ + axp_set_vhold_level(4400); + usb_charging_maxcurrent_change(100); + /* Delay to give power output time to stabilize */ mdelay(20); } @@ -105,7 +109,22 @@ void power_init(void) #ifdef HAVE_USB_CHARGING_ENABLE void usb_charging_maxcurrent_change(int maxcurrent) { - axp_set_charge_current(maxcurrent); + int vbus_limit; + int charge_current; + + /* Note that the charge current setting is a maximum: it will be + * reduced dynamically by the AXP192 so the combined load is less + * than the set VBUS current limit. */ + if(maxcurrent <= 100) { + vbus_limit = AXP_VBUS_LIMIT_100mA; + charge_current = 550; + } else { + vbus_limit = AXP_VBUS_LIMIT_500mA; + charge_current = 550; + } + + axp_set_vbus_limit(vbus_limit); + axp_set_charge_current(charge_current); } #endif -- cgit v1.2.3