static void plug_charger_with_ts(int supplier_type, int port, int min_current, int vbus_low_current, int overcurrent_current, timestamp_t reg_time) { vbus_low_current_ma = vbus_low_current; overcurrent_current_ma = overcurrent_current; chg_ramp_charge_supplier_change(port, supplier_type, min_current, reg_time); }
static void unplug_charger(void) { chg_ramp_charge_supplier_change(CHARGE_PORT_NONE, CHARGE_SUPPLIER_NONE, 0, get_time()); }
/** * Charge manager refresh -- responsible for selecting the active charge port * and charge power. Called as a deferred task. */ static void charge_manager_refresh(void) { int new_supplier, new_port; int new_charge_current, new_charge_current_uncapped; int new_charge_voltage, i; int updated_new_port = CHARGE_PORT_NONE; int updated_old_port = CHARGE_PORT_NONE; int ceil; /* Hunt for an acceptable charge port */ while (1) { charge_manager_get_best_charge_port(&new_port, &new_supplier); /* * If the port or supplier changed, make an attempt to switch to * the port. We will re-set the active port on a supplier change * to give the board-level function another chance to reject * the port, for example, if the port has become a charge * source. */ if ((new_port == charge_port && new_supplier == charge_supplier) || board_set_active_charge_port(new_port) == EC_SUCCESS) break; /* 'Dont charge' request must be accepted */ ASSERT(new_port != CHARGE_PORT_NONE); /* * Zero the available charge on the rejected port so that * it is no longer chosen. */ for (i = 0; i < CHARGE_SUPPLIER_COUNT; ++i) available_charge[i][new_port].current = 0; } /* * Clear override if it wasn't selected as the 'best' port -- it means * that no charge is available on the port, or the port was rejected. */ if (override_port >= 0 && override_port != new_port) override_port = OVERRIDE_OFF; if (new_supplier == CHARGE_SUPPLIER_NONE) { new_charge_current = 0; new_charge_current_uncapped = 0; new_charge_voltage = 0; } else { new_charge_current_uncapped = available_charge[new_supplier][new_port].current; #ifdef CONFIG_CHARGE_RAMP_HW /* * Allow to set the maximum current value, so the hardware can * know the range of acceptable current values for its ramping. */ if (board_is_ramp_allowed(new_supplier)) new_charge_current_uncapped = board_get_ramp_current_limit(new_supplier, new_charge_current_uncapped); #endif /* CONFIG_CHARGE_RAMP_HW */ /* Enforce port charge ceiling. */ ceil = charge_manager_get_ceil(new_port); if (ceil != CHARGE_CEIL_NONE) new_charge_current = MIN(ceil, new_charge_current_uncapped); else new_charge_current = new_charge_current_uncapped; new_charge_voltage = available_charge[new_supplier][new_port].voltage; } /* Change the charge limit + charge port/supplier if modified. */ if (new_port != charge_port || new_charge_current != charge_current || new_supplier != charge_supplier) { #ifdef HAS_TASK_CHG_RAMP chg_ramp_charge_supplier_change( new_port, new_supplier, new_charge_current, registration_time[new_port]); #else #ifdef CONFIG_CHARGE_RAMP_HW /* Enable or disable charge ramp */ charger_set_hw_ramp(board_is_ramp_allowed(new_supplier)); #endif board_set_charge_limit(new_charge_current); #endif CPRINTS("CL: p%d s%d i%d v%d", new_port, new_supplier, new_charge_current, new_charge_voltage); } /* * Signal new power request only if the port changed, the voltage * on the same port changed, or the actual uncapped current * on the same port changed (don't consider ceil). */ if (new_port != CHARGE_PORT_NONE && (new_port != charge_port || new_charge_current_uncapped != charge_current_uncapped || new_charge_voltage != charge_voltage)) updated_new_port = new_port; /* If charge port changed, cleanup old port */ if (charge_port != new_port && charge_port != CHARGE_PORT_NONE) { /* Check if need power swap */ charge_manager_switch_to_source(charge_port); /* Signal new power request on old port */ updated_old_port = charge_port; } /* Update globals to reflect current state. */ charge_current = new_charge_current; charge_current_uncapped = new_charge_current_uncapped; charge_voltage = new_charge_voltage; charge_supplier = new_supplier; charge_port = new_port; #ifdef CONFIG_USB_PD_LOGGING /* * Write a log under the following conditions: * 1. A port becomes active or * 2. A port becomes inactive or * 3. The active charge port power limit changes or * 4. Any supplier change on an inactive port */ if (updated_new_port != CHARGE_PORT_NONE) save_log[updated_new_port] = 1; /* Don't log non-meaningful changes on charge port */ else if (charge_port != CHARGE_PORT_NONE) save_log[charge_port] = 0; if (updated_old_port != CHARGE_PORT_NONE) save_log[updated_old_port] = 1; for (i = 0; i < CONFIG_USB_PD_PORT_COUNT; ++i) if (save_log[i]) charge_manager_save_log(i); #endif /* New power requests must be set only after updating the globals. */ if (updated_new_port != CHARGE_PORT_NONE) pd_set_new_power_request(updated_new_port); if (updated_old_port != CHARGE_PORT_NONE) pd_set_new_power_request(updated_old_port); }