diff --git a/firmware/target/mips/ingenic_x1000/erosqnative/power-erosqnative.c b/firmware/target/mips/ingenic_x1000/erosqnative/power-erosqnative.c index 17cdb4d645..7ad9479a96 100644 --- a/firmware/target/mips/ingenic_x1000/erosqnative/power-erosqnative.c +++ b/firmware/target/mips/ingenic_x1000/erosqnative/power-erosqnative.c @@ -62,7 +62,8 @@ void power_init(void) /* FIXME: Copy paste from M3K. Probably not necessary */ axp_modify(AXP_REG_DCDCMODE, 0, 0xc0); - /* Power on required supplies */ + /* Power on required supplies + * TODO: This should be checked, though likely all but EXTEN are needed */ axp_set_enabled_supplies( (1 << AXP_SUPPLY_EXTEN) | (1 << AXP_SUPPLY_DCDC1) | @@ -81,6 +82,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 outputs time to stabilize. * With the power thread delay, this can apparently go as low as 50, * Keeping a higher value here just to ensure the bootloader works @@ -91,7 +96,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 diff --git a/firmware/target/mips/ingenic_x1000/fiiom3k/power-fiiom3k.c b/firmware/target/mips/ingenic_x1000/fiiom3k/power-fiiom3k.c index 53451ffa6c..c8498c4dbc 100644 --- a/firmware/target/mips/ingenic_x1000/fiiom3k/power-fiiom3k.c +++ b/firmware/target/mips/ingenic_x1000/fiiom3k/power-fiiom3k.c @@ -78,6 +78,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); + /* Short delay to give power outputs time to stabilize */ mdelay(200); } @@ -85,7 +89,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 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