summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVijay Hiremath <vijay.p.hiremath@intel.com>2016-06-14 14:22:47 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-06-27 17:14:03 -0700
commitdcac93af41db6a28f49a02cb168b431ee9ffa2d3 (patch)
tree74faba19a180195898ec3b4f0724a41d5e3ff89f
parent66b2f33e7dc929e64298f71707ce2f912b592129 (diff)
downloadchrome-ec-dcac93af41db6a28f49a02cb168b431ee9ffa2d3.tar.gz
BD99955: Added support for 'psys' & 'amonbmon' console commands
Added console commands for the debugging purpose psys - Can be used to measure the system power amonbmon - Can be used to measure AMON/BMON voltage diff, current BUG=chrome-os-partner:54273 BRANCH=none TEST=Manually tested on Amenia psys - Ran fish task and observed psys value changes. amonbmon - AMON & BMON voltage & current are same as measured across sense resistors. Change-Id: I6653e814d9b00efe7dae9ce1fbd7ddbc2356f8e0 Signed-off-by: Vijay Hiremath <vijay.p.hiremath@intel.com> Reviewed-on: https://chromium-review.googlesource.com/353043 Commit-Ready: Vijay P Hiremath <vijay.p.hiremath@intel.com> Tested-by: Vijay P Hiremath <vijay.p.hiremath@intel.com> Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r--board/amenia/board.c7
-rw-r--r--board/amenia/board.h13
-rw-r--r--board/chell/board.h2
-rw-r--r--board/elm/board.h2
-rw-r--r--board/glados/board.h2
-rw-r--r--board/oak/board.h3
-rw-r--r--board/reef/board.h10
-rw-r--r--board/wheatley/board.h2
-rw-r--r--driver/charger/bd99955.c159
-rw-r--r--driver/charger/bd99955.h20
-rw-r--r--driver/charger/isl9237.c8
-rw-r--r--include/config.h6
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, &reg,
+ 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, &reg,
+ 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, &reg,
+ 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, &reg,
+ 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