diff options
-rw-r--r-- | board/amenia/board.c | 7 | ||||
-rw-r--r-- | board/amenia/board.h | 13 | ||||
-rw-r--r-- | board/chell/board.h | 2 | ||||
-rw-r--r-- | board/elm/board.h | 2 | ||||
-rw-r--r-- | board/glados/board.h | 2 | ||||
-rw-r--r-- | board/oak/board.h | 3 | ||||
-rw-r--r-- | board/reef/board.h | 10 | ||||
-rw-r--r-- | board/wheatley/board.h | 2 | ||||
-rw-r--r-- | driver/charger/bd99955.c | 159 | ||||
-rw-r--r-- | driver/charger/bd99955.h | 20 | ||||
-rw-r--r-- | driver/charger/isl9237.c | 8 | ||||
-rw-r--r-- | include/config.h | 6 |
12 files changed, 216 insertions, 18 deletions
diff --git a/board/amenia/board.c b/board/amenia/board.c index 9b98a0a9f9..56d02895b5 100644 --- a/board/amenia/board.c +++ b/board/amenia/board.c @@ -116,9 +116,12 @@ const struct adc_t adc_channels[] = { /* Vbus sensing. Converted to mV, full ADC is equivalent to 28.16V. */ [ADC_VBUS] = {"VBUS", NPCX_ADC_CH1, 28160, ADC_READ_MAX+1, 0}, /* Adapter current output or battery discharging current */ - [ADC_AMON_BMON] = {"AMON_BMON", NPCX_ADC_CH4, 55000, 6144, 0}, + [ADC_AMON_BMON] = {"AMON_BMON", NPCX_ADC_CH4, + (5 << BD99955_IOUT_GAIN_SELECT) * 10000, + ADC_READ_MAX+1, 0}, /* System current consumption */ - [ADC_PSYS] = {"PSYS", NPCX_ADC_CH3, 1, 1, 0}, + [ADC_PSYS] = {"PSYS", NPCX_ADC_CH3, ADC_MAX_VOLT * 10, + ADC_READ_MAX+1, 3}, /* Thermistor 0 */ [ADC_THERM_SYS0] = {"THERM_SYS0", NPCX_ADC_CH0, 1, 1, 0}, /* Thermistor 1 */ diff --git a/board/amenia/board.h b/board/amenia/board.h index b716519269..e111a83f4d 100644 --- a/board/amenia/board.h +++ b/board/amenia/board.h @@ -31,7 +31,6 @@ #define CONFIG_CHARGER #define CONFIG_CHARGER_V2 -#define CONFIG_CHARGER_ADC_AMON_BMON #define CONFIG_CHARGER_DISCHARGE_ON_AC #define CONFIG_CHARGER_BD99955 #define CONFIG_CHARGER_ILIM_PIN_DISABLED @@ -40,10 +39,18 @@ #define CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW 15000 #define CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON 1 #define CONFIG_CHARGER_NARROW_VDC -#define CONFIG_CHARGER_SENSE_RESISTOR 10 -#define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 #define CONFIG_USB_CHARGER +#define CONFIG_CMD_CHARGER_ADC_AMON_BMON +#define CONFIG_CHARGER_SENSE_RESISTOR 10 +#define CONFIG_CHARGER_SENSE_RESISTOR_AC 10 +#define BD99955_IOUT_GAIN_SELECT \ + BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_20V + +#define CONFIG_CMD_CHARGER_PSYS +#define BD99955_PSYS_GAIN_SELECT \ + BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_02UAW + #define CONFIG_CHIPSET_APOLLOLAKE #define CONFIG_CMD_ACCELS #define CONFIG_CMD_ACCEL_INFO diff --git a/board/chell/board.h b/board/chell/board.h index d4c51058a3..bfcd96abe2 100644 --- a/board/chell/board.h +++ b/board/chell/board.h @@ -27,7 +27,6 @@ #define CONFIG_CHARGER #define CONFIG_CHARGER_V2 -#define CONFIG_CHARGER_ADC_AMON_BMON #define CONFIG_CHARGER_DISCHARGE_ON_AC #define CONFIG_CHARGER_ISL9237 #define CONFIG_CHARGER_ILIM_PIN_DISABLED @@ -37,6 +36,7 @@ #define CONFIG_CHARGER_PROFILE_OVERRIDE #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 +#define CONFIG_CMD_CHARGER_ADC_AMON_BMON #define CONFIG_CHIPSET_SKYLAKE #define CONFIG_CHIPSET_RESET_HOOK diff --git a/board/elm/board.h b/board/elm/board.h index b30c05b04a..7ba5a5c443 100644 --- a/board/elm/board.h +++ b/board/elm/board.h @@ -41,7 +41,6 @@ #define CONFIG_CHARGER_NARROW_VDC #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 -#define CONFIG_CHARGER_ADC_AMON_BMON #define CONFIG_CHARGER_DISCHARGE_ON_AC #define CONFIG_CHARGER_V2 #define CONFIG_CHIPSET_MEDIATEK @@ -110,6 +109,7 @@ #define CONFIG_USB_SWITCH_PI3USB9281_CHIP_COUNT 1 /* Optional features */ +#define CONFIG_CMD_CHARGER_ADC_AMON_BMON #define CONFIG_CMD_HOSTCMD #define CONFIG_CMD_I2C_PROTECT #define CONFIG_CMD_PD_CONTROL diff --git a/board/glados/board.h b/board/glados/board.h index dbe1fd614c..498fd45a04 100644 --- a/board/glados/board.h +++ b/board/glados/board.h @@ -31,7 +31,6 @@ #define CONFIG_CHARGER #define CONFIG_CHARGER_V2 -#define CONFIG_CHARGER_ADC_AMON_BMON #define CONFIG_CHARGER_DISCHARGE_ON_AC #define CONFIG_CHARGER_ISL9237 #define CONFIG_CHARGER_ILIM_PIN_DISABLED @@ -41,6 +40,7 @@ #define CONFIG_CHARGER_PROFILE_OVERRIDE #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 +#define CONFIG_CMD_CHARGER_ADC_AMON_BMON #define CONFIG_CHIPSET_SKYLAKE #define CONFIG_CHIPSET_RESET_HOOK diff --git a/board/oak/board.h b/board/oak/board.h index da022f48f0..dfc154f3cb 100644 --- a/board/oak/board.h +++ b/board/oak/board.h @@ -52,13 +52,14 @@ #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 #endif /* BOARD_REV */ -#define CONFIG_CHARGER_ADC_AMON_BMON #define CONFIG_CHARGER_DISCHARGE_ON_AC #define CONFIG_CHARGER_V2 #define CONFIG_CHIPSET_MEDIATEK #define CONFIG_CMD_TYPEC #define CONFIG_EXTPOWER_GPIO #define CONFIG_FORCE_CONSOLE_RESUME +#define CONFIG_CMD_CHARGER_ADC_AMON_BMON + /* * EC_WAKE: PA0 - WKUP1 * POWER_BUTTON_L: PB5 - WKUP6 diff --git a/board/reef/board.h b/board/reef/board.h index 73bb77c8b9..9d6d99a0b4 100644 --- a/board/reef/board.h +++ b/board/reef/board.h @@ -61,6 +61,16 @@ #define CONFIG_POWER_BUTTON_X86 #define CONFIG_POWER_COMMON +#define CONFIG_CMD_CHARGER_ADC_AMON_BMON +#define CONFIG_CHARGER_SENSE_RESISTOR 10 +#define CONFIG_CHARGER_SENSE_RESISTOR_AC 10 +#define BD99955_IOUT_GAIN_SELECT \ + BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_20V + +#define CONFIG_CMD_CHARGER_PSYS +#define BD99955_PSYS_GAIN_SELECT \ + BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_02UAW + /* EC */ #define CONFIG_ADC #define CONFIG_BOARD_VERSION diff --git a/board/wheatley/board.h b/board/wheatley/board.h index 70e627347d..7ef5f22fcd 100644 --- a/board/wheatley/board.h +++ b/board/wheatley/board.h @@ -24,7 +24,6 @@ #define CONFIG_CHARGER #define CONFIG_CHARGER_V2 -#define CONFIG_CHARGER_ADC_AMON_BMON #define CONFIG_CHARGER_DISCHARGE_ON_AC #define CONFIG_CHARGER_ISL9237 #define CONFIG_CHARGER_ILIM_PIN_DISABLED @@ -34,6 +33,7 @@ #define CONFIG_CHARGER_PROFILE_OVERRIDE #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 +#define CONFIG_CMD_CHARGER_ADC_AMON_BMON #define CONFIG_CHIPSET_SKYLAKE #define CONFIG_CLOCK_CRYSTAL diff --git a/driver/charger/bd99955.c b/driver/charger/bd99955.c index cf3ad64d95..4ad95cc3eb 100644 --- a/driver/charger/bd99955.c +++ b/driver/charger/bd99955.c @@ -911,3 +911,162 @@ DECLARE_CONSOLE_COMMAND(bd99955, console_command_bd99955, "Read or write a charger register", NULL); #endif /* CONFIG_CMD_CHARGER */ + +#ifdef CONFIG_CMD_CHARGER_PSYS +static int bd99955_psys_charger_adc(void) +{ + int i; + int reg; + uint64_t ipmon = 0; + + for (i = 0; i < BD99955_PMON_IOUT_ADC_READ_COUNT; i++) { + if (ch_raw_read16(BD99955_CMD_PMON_DACIN_VAL, ®, + BD99955_EXTENDED_COMMAND)) + return 0; + + /* Conversion Interval is 200us */ + usleep(200); + ipmon += reg; + } + + /* + * Calculate power in mW + * PSYS = VACP×IACP+VBAT×IBAT = IPMON / GPMON + */ + return (int) ((ipmon * 1000) / ((1 << BD99955_PSYS_GAIN_SELECT) * + BD99955_PMON_IOUT_ADC_READ_COUNT)); +} + +static int bd99955_enable_psys(void) +{ + int rv; + int reg; + + rv = ch_raw_read16(BD99955_CMD_PMON_IOUT_CTRL_SET, ®, + BD99955_EXTENDED_COMMAND); + if (rv) + return rv; + + /* Enable PSYS & Select PSYS Gain */ + reg &= ~BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_MASK; + reg |= (BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_INSEL | + BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_OUT_EN | + BD99955_PSYS_GAIN_SELECT); + + return ch_raw_write16(BD99955_CMD_PMON_IOUT_CTRL_SET, reg, + BD99955_EXTENDED_COMMAND); +} + +/** + * Get system power. + */ +static int console_command_psys(int argc, char **argv) +{ + int rv; + + rv = bd99955_enable_psys(); + if (rv) + return rv; + + CPRINTS("PSYS from chg_adc: %d mW", + bd99955_psys_charger_adc()); + + return EC_SUCCESS; +} +DECLARE_CONSOLE_COMMAND(psys, console_command_psys, + NULL, + "Get the system power in mW", + NULL); +#endif /* CONFIG_CMD_CHARGER_PSYS */ + +#ifdef CONFIG_CMD_CHARGER_ADC_AMON_BMON +static int bd99955_amon_bmon_chg_adc(void) +{ + int i; + int reg; + int iout = 0; + + for (i = 0; i < BD99955_PMON_IOUT_ADC_READ_COUNT; i++) { + ch_raw_read16(BD99955_CMD_IOUT_DACIN_VAL, ®, + BD99955_EXTENDED_COMMAND); + iout += reg; + + /* Conversion Interval is 200us */ + usleep(200); + } + + /* + * Discharge current in mA + * IDCHG = iout * GIDCHG + * IADP = iout * GIADP + * + * VIDCHG = GIDCHG * (VSRN- VSRP) = GIDCHG * IDCHG / IDCHG_RES + * VIADP = GIADP * (VACP- VACN) = GIADP * IADP / IADP_RES + */ + return (iout * (5 << BD99955_IOUT_GAIN_SELECT)) / + (10 * BD99955_PMON_IOUT_ADC_READ_COUNT); +} + +static int bd99955_amon_bmon(int amon_bmon) +{ + int rv; + int reg; + int imon; + int sns_res; + + rv = ch_raw_read16(BD99955_CMD_PMON_IOUT_CTRL_SET, ®, + BD99955_EXTENDED_COMMAND); + if (rv) + return rv; + + /* Enable monitor */ + reg &= ~BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_MASK; + reg |= (BD99955_CMD_PMON_IOUT_CTRL_SET_IMON_INSEL | + BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_OUT_EN | + (BD99955_IOUT_GAIN_SELECT << 4)); + + if (amon_bmon) { + reg |= BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_SOURCE_SEL; + sns_res = CONFIG_CHARGER_SENSE_RESISTOR_AC; + } else { + reg &= ~BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_SOURCE_SEL; + sns_res = CONFIG_CHARGER_SENSE_RESISTOR; + } + + rv = ch_raw_write16(BD99955_CMD_PMON_IOUT_CTRL_SET, reg, + BD99955_EXTENDED_COMMAND); + if (rv) + return rv; + + imon = bd99955_amon_bmon_chg_adc(); + + CPRINTS("%cMON from chg_adc: %d uV, %d mA]", + amon_bmon ? 'A' : 'B', + imon * sns_res, + imon); + + return EC_SUCCESS; +} + +/** + * Get charger AMON and BMON current. + */ +static int console_command_amon_bmon(int argc, char **argv) +{ + int rv = EC_ERROR_PARAM1; + + /* Switch to AMON */ + if (argc == 1 || (argc >= 2 && argv[1][0] == 'a')) + rv = bd99955_amon_bmon(1); + + /* Switch to BMON */ + if (argc == 1 || (argc >= 2 && argv[1][0] == 'b')) + rv = bd99955_amon_bmon(0); + + return rv; +} +DECLARE_CONSOLE_COMMAND(amonbmon, console_command_amon_bmon, + "amonbmon [a|b]", + "Get charger AMON/BMON voltage diff, current", + NULL); +#endif /* CONFIG_CMD_CHARGER_ADC_AMON_BMON */ diff --git a/driver/charger/bd99955.h b/driver/charger/bd99955.h index 87a1e7bc67..5d96c8a962 100644 --- a/driver/charger/bd99955.h +++ b/driver/charger/bd99955.h @@ -124,6 +124,26 @@ enum bd99955_charge_port { #define BD99955_CMD_PROCHOT_IDCHG_SET 0x23 #define BD99955_CMD_PROCHOT_VSYS_SET 0x24 #define BD99955_CMD_PMON_IOUT_CTRL_SET 0x25 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_IMON_INSEL (1 << 9) +#define BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_INSEL (1 << 8) +#define BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_OUT_EN (1 << 7) +#define BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_SOURCE_SEL (1 << 6) +#define BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_MASK 0x30 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_40V 0x03 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_20V 0x02 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_10V 0x01 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_05V 0x00 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_OUT_EN (1 << 3) +#define BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_MASK 0x07 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_64UAW 0x06 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_32UAW 0x05 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_16UAW 0x04 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_08UAW 0x03 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_04UAW 0x02 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_02UAW 0x01 +#define BD99955_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_01UAW 0x00 +#define BD99955_PMON_IOUT_ADC_READ_COUNT 100 + #define BD99955_CMD_PMON_DACIN_VAL 0x26 #define BD99955_CMD_IOUT_DACIN_VAL 0x27 #define BD99955_CMD_VCC_UCD_SET 0x28 diff --git a/driver/charger/isl9237.c b/driver/charger/isl9237.c index e1ad06ad75..f32ca805e9 100644 --- a/driver/charger/isl9237.c +++ b/driver/charger/isl9237.c @@ -355,7 +355,7 @@ static void charger_disable_psys(void) } DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, charger_disable_psys, HOOK_PRIO_DEFAULT); -#ifdef CONFIG_CMD_PSYS +#ifdef CONFIG_CMD_CHARGER_PSYS #define PSYS_ADC_READ_COUNT 100 static int charger_get_system_power(void) { @@ -400,10 +400,10 @@ DECLARE_CONSOLE_COMMAND(psys, console_command_psys, NULL, "Get the system power in mW", NULL); -#endif /* CONFIG_CMD_PSYS */ +#endif /* CONFIG_CMD_CHARGER_PSYS */ #endif /* CONFIG_CHARGER_PSYS */ -#ifdef CONFIG_CHARGER_ADC_AMON_BMON +#ifdef CONFIG_CMD_CHARGER_ADC_AMON_BMON /** * Get charger AMON and BMON current. */ @@ -450,4 +450,4 @@ DECLARE_CONSOLE_COMMAND(amonbmon, console_command_amon_bmon, "amonbmon [a|b]", "Get charger AMON/BMON voltage diff, current", NULL); -#endif /* CONFIG_CHARGER_ADC_AMON_BMON */ +#endif /* CONFIG_CMD_CHARGER_ADC_AMON_BMON */ diff --git a/include/config.h b/include/config.h index df6ddcde4e..5ffd9f84e7 100644 --- a/include/config.h +++ b/include/config.h @@ -337,9 +337,6 @@ #undef CONFIG_CHARGER_V1 #undef CONFIG_CHARGER_V2 -/* Enable charger AMON_BMON ADC current detection */ -#undef CONFIG_CHARGER_ADC_AMON_BMON - /* Compile charger-specific code for these chargers (pick at most one) */ #undef CONFIG_CHARGER_BD99955 #undef CONFIG_CHARGER_BQ24707A @@ -528,6 +525,8 @@ #undef CONFIG_CMD_BATDEBUG #define CONFIG_CMD_BATTFAKE #define CONFIG_CMD_CHARGER +#undef CONFIG_CMD_CHARGER_ADC_AMON_BMON +#undef CONFIG_CMD_CHARGER_PSYS #define CONFIG_CMD_CHARGE_SUPPLIER_INFO #undef CONFIG_CMD_CHGRAMP #undef CONFIG_CMD_CLOCKGATES @@ -564,7 +563,6 @@ #define CONFIG_CMD_POWER_AP #define CONFIG_CMD_POWERINDEBUG #undef CONFIG_CMD_POWERLED -#undef CONFIG_CMD_PSYS #undef CONFIG_CMD_RTC_ALARM #undef CONFIG_CMD_SCRATCHPAD #define CONFIG_CMD_SHMEM |