Fix charger values, again (#303)
* common: Add macros for min, max, clamp Simple macros, with no type checking. Signed-off-by: Tim Crawford <tcrawford@system76.com> * charger: Limit charger values to max valid value Use the maximum valid value instead of discarding bits. Fixes:6295f60172
("Fix smart charger values") Signed-off-by: Tim Crawford <tcrawford@system76.com> * charger/bq24780s: Fix charge current mask bq24780s uses bit 12 for 4096 a current weight. Fixes:6295f60172
("Fix smart charger values") Signed-off-by: Tim Crawford <tcrawford@system76.com> * oryp: Reduce charge current to 2A Signed-off-by: Tim Crawford <tcrawford@system76.com> * charger/bq24780s: Set RSENSE ratio option Signed-off-by: Tim Crawford <tcrawford@system76.com> Signed-off-by: Tim Crawford <tcrawford@system76.com>
This commit is contained in:
@ -13,6 +13,10 @@
|
|||||||
#define REG_CHARGE_VOLTAGE 0x15
|
#define REG_CHARGE_VOLTAGE 0x15
|
||||||
#define REG_DISCHARGE_CURRENT 0x39
|
#define REG_DISCHARGE_CURRENT 0x39
|
||||||
#define REG_INPUT_CURRENT 0x3F
|
#define REG_INPUT_CURRENT 0x3F
|
||||||
|
#define REG_CHARGE_OPTION_0 0x12
|
||||||
|
#define REG_CHARGE_OPTION_1 0x3B
|
||||||
|
#define REG_CHARGE_OPTION_2 0x38
|
||||||
|
#define REG_CHARGE_OPTION_3 0x37
|
||||||
|
|
||||||
// ChargeOption0 flags
|
// ChargeOption0 flags
|
||||||
// Low Power Mode Enable
|
// Low Power Mode Enable
|
||||||
@ -24,36 +28,63 @@
|
|||||||
// IDCHG Amplifier Gain
|
// IDCHG Amplifier Gain
|
||||||
#define SBC_IDCHC_GAIN ((uint16_t)(BIT(3)))
|
#define SBC_IDCHC_GAIN ((uint16_t)(BIT(3)))
|
||||||
|
|
||||||
|
// ChargeOption1 flags
|
||||||
|
// Independent Comparator Deglitch
|
||||||
|
#define SBC_CMP_DEG_1US (0b01 << 4)
|
||||||
|
// PMON Gain
|
||||||
|
#define SBC_PMON_RATIO BIT(9)
|
||||||
|
// Adapter:Battery RSENSE ratio
|
||||||
|
#define SBC_RSENSE_RATIO_1_1 (0b00 << 12)
|
||||||
|
#define SBC_RSENSE_RATIO_2_1 (0b01 << 12)
|
||||||
|
#define SBC_RSENSE_RATIO_1_2 (0b10 << 12)
|
||||||
|
// Battery depletion threshold
|
||||||
|
#define SBC_BAT_DEPL_VTH (0b11 << 14)
|
||||||
|
|
||||||
|
|
||||||
// Bits 0-5 are ignored. Bits 13-15 must be 0.
|
// Bits 0-5 are ignored. Bits 13-15 must be 0.
|
||||||
#define CHARGE_CURRENT_MASK 0x1FC0
|
#define CHARGE_CURRENT_MASK 0x1FC0
|
||||||
|
|
||||||
#if CHARGER_BATTERY_RSENSE == 5
|
#if CHARGER_BATTERY_RSENSE == 5
|
||||||
#define CHARGE_CURRENT ((CHARGER_CHARGE_CURRENT >> 1) & CHARGE_CURRENT_MASK)
|
#define CHARGE_CURRENT (MIN((CHARGER_CHARGE_CURRENT >> 1), CHARGE_CURRENT_MASK) & CHARGE_CURRENT_MASK)
|
||||||
#elif CHARGER_BATTERY_RSENSE == 10
|
#elif CHARGER_BATTERY_RSENSE == 10
|
||||||
#define CHARGE_CURRENT (CHARGER_CHARGE_CURRENT & CHARGE_CURRENT_MASK)
|
#define CHARGE_CURRENT (MIN(CHARGER_CHARGE_CURRENT, CHARGE_CURRENT_MASK) & CHARGE_CURRENT_MASK)
|
||||||
#elif CHARGER_BATTERY_RSENSE == 20
|
#elif CHARGER_BATTERY_RSENSE == 20
|
||||||
#define CHARGE_CURRENT ((CHARGER_CHARGE_CURRENT << 1) & CHARGE_CURRENT_MASK)
|
#define CHARGE_CURRENT (MIN((CHARGER_CHARGE_CURRENT << 1), CHARGE_CURRENT_MASK) & CHARGE_CURRENT_MASK)
|
||||||
#else
|
#else
|
||||||
#error Invalid battery RSENSE value
|
#error Invalid battery RSENSE value
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Bits 0-3, 15 are ignored.
|
// Bits 0-3, 15 are ignored.
|
||||||
#define CHARGE_VOLTAGE_MASK 0x7FF0
|
#define CHARGE_VOLTAGE_MASK 0x7FF0
|
||||||
#define CHARGE_VOLTAGE (CHARGER_CHARGE_VOLTAGE & CHARGE_VOLTAGE_MASK)
|
#define CHARGE_VOLTAGE (MIN(CHARGER_CHARGE_VOLTAGE, CHARGE_VOLTAGE_MASK) & CHARGE_VOLTAGE_MASK)
|
||||||
|
|
||||||
// Bits 0-6 are ignored. Bits 12-15 must be 0.
|
// Bits 0-6 are ignored. Bits 13-15 must be 0.
|
||||||
#define INPUT_CURRENT_MASK 0x0F80
|
#define INPUT_CURRENT_MASK 0x1F80
|
||||||
|
|
||||||
#if CHARGER_ADAPTER_RSENSE == 5
|
#if CHARGER_ADAPTER_RSENSE == 5
|
||||||
#define INPUT_CURRENT ((CHARGER_INPUT_CURRENT >> 1) & INPUT_CURRENT_MASK)
|
#define INPUT_CURRENT (MIN((CHARGER_INPUT_CURRENT >> 1), INPUT_CURRENT_MASK) & INPUT_CURRENT_MASK)
|
||||||
#elif CHARGER_ADAPTER_RSENSE == 10
|
#elif CHARGER_ADAPTER_RSENSE == 10
|
||||||
#define INPUT_CURRENT (CHARGER_INPUT_CURRENT & INPUT_CURRENT_MASK)
|
#define INPUT_CURRENT (MIN(CHARGER_INPUT_CURRENT, INPUT_CURRENT_MASK) & INPUT_CURRENT_MASK)
|
||||||
#elif CHARGER_ADAPTER_RSENSE == 20
|
#elif CHARGER_ADAPTER_RSENSE == 20
|
||||||
#define INPUT_CURRENT ((CHARGER_INPUT_CURRENT << 1) & INPUT_CURRENT_MASK)
|
#define INPUT_CURRENT (MIN((CHARGER_INPUT_CURRENT << 1), INPUT_CURRENT_MASK) & INPUT_CURRENT_MASK)
|
||||||
#else
|
#else
|
||||||
#error Invalid adapter RSENSE value
|
#error Invalid adapter RSENSE value
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (CHARGER_ADAPTER_RSENSE == 5 && CHARGER_BATTERY_RSENSE == 5) || \
|
||||||
|
(CHARGER_ADAPTER_RSENSE == 10 && CHARGER_BATTERY_RSENSE == 10) || \
|
||||||
|
(CHARGER_ADAPTER_RSENSE == 20 && CHARGER_BATTERY_RSENSE == 20)
|
||||||
|
#define RSENSE_RATIO SBC_RSENSE_RATIO_1_1
|
||||||
|
#elif (CHARGER_ADAPTER_RSENSE == 10 && CHARGER_BATTERY_RSENSE == 5) || \
|
||||||
|
(CHARGER_ADAPTER_RSENSE == 20 && CHARGER_BATTERY_RSENSE == 10)
|
||||||
|
#define RSENSE_RATIO SBC_RSENSE_RATIO_2_1
|
||||||
|
#elif (CHARGER_ADAPTER_RSENSE == 5 && CHARGER_BATTERY_RSENSE == 10) || \
|
||||||
|
(CHARGER_ADAPTER_RSENSE == 10 && CHARGER_BATTERY_RSENSE == 20)
|
||||||
|
#define RSENSE_RATIO SBC_RSENSE_RATIO_1_2
|
||||||
|
#else
|
||||||
|
#error Invalid adapter:battery RSENSE ratio
|
||||||
|
#endif
|
||||||
|
|
||||||
// XXX: Assumption: ac_last is initialized high.
|
// XXX: Assumption: ac_last is initialized high.
|
||||||
static bool charger_enabled = false;
|
static bool charger_enabled = false;
|
||||||
|
|
||||||
@ -65,7 +96,7 @@ int16_t battery_charger_disable(void) {
|
|||||||
// Set charge option 0 with 175s watchdog
|
// Set charge option 0 with 175s watchdog
|
||||||
res = smbus_write(
|
res = smbus_write(
|
||||||
CHARGER_ADDRESS,
|
CHARGER_ADDRESS,
|
||||||
0x12,
|
REG_CHARGE_OPTION_0,
|
||||||
SBC_EN_LWPWR |
|
SBC_EN_LWPWR |
|
||||||
SBC_WDTMR_ADJ_175S |
|
SBC_WDTMR_ADJ_175S |
|
||||||
SBC_PWM_FREQ_800KHZ |
|
SBC_PWM_FREQ_800KHZ |
|
||||||
@ -112,12 +143,22 @@ int16_t battery_charger_enable(void) {
|
|||||||
// Set charge option 0 with watchdog disabled
|
// Set charge option 0 with watchdog disabled
|
||||||
res = smbus_write(
|
res = smbus_write(
|
||||||
CHARGER_ADDRESS,
|
CHARGER_ADDRESS,
|
||||||
0x12,
|
REG_CHARGE_OPTION_0,
|
||||||
SBC_EN_LWPWR |
|
SBC_EN_LWPWR |
|
||||||
SBC_PWM_FREQ_800KHZ |
|
SBC_PWM_FREQ_800KHZ |
|
||||||
SBC_IDCHC_GAIN
|
SBC_IDCHC_GAIN
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Set the RSENSE ratio
|
||||||
|
res = smbus_write(
|
||||||
|
CHARGER_ADDRESS,
|
||||||
|
REG_CHARGE_OPTION_1,
|
||||||
|
SBC_CMP_DEG_1US |
|
||||||
|
SBC_PMON_RATIO |
|
||||||
|
RSENSE_RATIO |
|
||||||
|
SBC_BAT_DEPL_VTH
|
||||||
|
);
|
||||||
|
|
||||||
DEBUG("Charger enabled\n");
|
DEBUG("Charger enabled\n");
|
||||||
charger_enabled = true;
|
charger_enabled = true;
|
||||||
return 0;
|
return 0;
|
||||||
@ -149,10 +190,10 @@ void battery_debug(void) {
|
|||||||
command(Status, BATTERY_ADDRESS, 0x16);
|
command(Status, BATTERY_ADDRESS, 0x16);
|
||||||
|
|
||||||
DEBUG("Charger (bq24780s):\n");
|
DEBUG("Charger (bq24780s):\n");
|
||||||
command(ChargeOption0, CHARGER_ADDRESS, 0x12);
|
command(ChargeOption0, CHARGER_ADDRESS, REG_CHARGE_OPTION_0);
|
||||||
command(ChargeOption1, CHARGER_ADDRESS, 0x3B);
|
command(ChargeOption1, CHARGER_ADDRESS, REG_CHARGE_OPTION_1);
|
||||||
command(ChargeOption2, CHARGER_ADDRESS, 0x38);
|
command(ChargeOption2, CHARGER_ADDRESS, REG_CHARGE_OPTION_2);
|
||||||
command(ChargeOption3, CHARGER_ADDRESS, 0x37);
|
command(ChargeOption3, CHARGER_ADDRESS, REG_CHARGE_OPTION_3);
|
||||||
command(ChargeCurrent, CHARGER_ADDRESS, REG_CHARGE_CURRENT);
|
command(ChargeCurrent, CHARGER_ADDRESS, REG_CHARGE_CURRENT);
|
||||||
command(ChargeVoltage, CHARGER_ADDRESS, REG_CHARGE_VOLTAGE);
|
command(ChargeVoltage, CHARGER_ADDRESS, REG_CHARGE_VOLTAGE);
|
||||||
command(DishargeCurrent, CHARGER_ADDRESS, REG_DISCHARGE_CURRENT);
|
command(DishargeCurrent, CHARGER_ADDRESS, REG_DISCHARGE_CURRENT);
|
||||||
|
@ -21,14 +21,14 @@
|
|||||||
#define CHARGE_CURRENT_MASK 0x1FC0
|
#define CHARGE_CURRENT_MASK 0x1FC0
|
||||||
|
|
||||||
#if CHARGER_BATTERY_RSENSE == 5
|
#if CHARGER_BATTERY_RSENSE == 5
|
||||||
#define CHARGE_CURRENT ((CHARGER_CHARGE_CURRENT >> 1) & CHARGE_CURRENT_MASK)
|
#define CHARGE_CURRENT (MIN((CHARGER_CHARGE_CURRENT >> 1), CHARGE_CURRENT_MASK) & CHARGE_CURRENT_MASK)
|
||||||
// XXX: According to the datasheet, only 10 and 20 are valid.
|
// XXX: According to the datasheet, only 10 and 20 are valid.
|
||||||
#define BATTERY_RSENSE (RSENSE_10 << 8)
|
#define BATTERY_RSENSE (RSENSE_10 << 8)
|
||||||
#elif CHARGER_BATTERY_RSENSE == 10
|
#elif CHARGER_BATTERY_RSENSE == 10
|
||||||
#define CHARGE_CURRENT (CHARGER_CHARGE_CURRENT & CHARGE_CURRENT_MASK)
|
#define CHARGE_CURRENT (MIN(CHARGER_CHARGE_CURRENT, CHARGE_CURRENT_MASK) & CHARGE_CURRENT_MASK)
|
||||||
#define BATTERY_RSENSE (RSENSE_10 << 8)
|
#define BATTERY_RSENSE (RSENSE_10 << 8)
|
||||||
#elif CHARGER_BATTERY_RSENSE == 20
|
#elif CHARGER_BATTERY_RSENSE == 20
|
||||||
#define CHARGE_CURRENT ((CHARGER_CHARGE_CURRENT << 1) & CHARGE_CURRENT_MASK)
|
#define CHARGE_CURRENT (MIN((CHARGER_CHARGE_CURRENT << 1), CHARGE_CURRENT_MASK) & CHARGE_CURRENT_MASK)
|
||||||
#define BATTERY_RSENSE (RSENSE_20 << 8)
|
#define BATTERY_RSENSE (RSENSE_20 << 8)
|
||||||
#else
|
#else
|
||||||
#error Invalid battery RSENSE value
|
#error Invalid battery RSENSE value
|
||||||
@ -36,19 +36,19 @@
|
|||||||
|
|
||||||
// Bits 0-3, 15 are ignored.
|
// Bits 0-3, 15 are ignored.
|
||||||
#define CHARGE_VOLTAGE_MASK 0x7FF0
|
#define CHARGE_VOLTAGE_MASK 0x7FF0
|
||||||
#define CHARGE_VOLTAGE (CHARGER_CHARGE_VOLTAGE & CHARGE_VOLTAGE_MASK)
|
#define CHARGE_VOLTAGE (MIN(CHARGER_CHARGE_VOLTAGE, CHARGE_VOLTAGE_MASK) & CHARGE_VOLTAGE_MASK)
|
||||||
|
|
||||||
// Bits 0-6 are ignored. Bits 12-15 must be 0.
|
// Bits 0-6 are ignored. Bits 12-15 must be 0.
|
||||||
#define INPUT_CURRENT_MASK 0x0F80
|
#define INPUT_CURRENT_MASK 0x0F80
|
||||||
|
|
||||||
#if CHARGER_ADAPTER_RSENSE == 5
|
#if CHARGER_ADAPTER_RSENSE == 5
|
||||||
#define INPUT_CURRENT ((CHARGER_INPUT_CURRENT >> 2) & INPUT_CURRENT_MASK)
|
#define INPUT_CURRENT (MIN((CHARGER_INPUT_CURRENT >> 2), INPUT_CURRENT_MASK) & INPUT_CURRENT_MASK)
|
||||||
#define ADAPTER_RSENSE RSENSE_5
|
#define ADAPTER_RSENSE RSENSE_5
|
||||||
#elif CHARGER_ADAPTER_RSENSE == 10
|
#elif CHARGER_ADAPTER_RSENSE == 10
|
||||||
#define INPUT_CURRENT ((CHARGER_INPUT_CURRENT >> 1) & INPUT_CURRENT_MASK)
|
#define INPUT_CURRENT (MIN((CHARGER_INPUT_CURRENT >> 1), INPUT_CURRENT_MASK) & INPUT_CURRENT_MASK)
|
||||||
#define ADAPTER_RSENSE RSENSE_10
|
#define ADAPTER_RSENSE RSENSE_10
|
||||||
#elif CHARGER_ADAPTER_RSENSE == 20
|
#elif CHARGER_ADAPTER_RSENSE == 20
|
||||||
#define INPUT_CURRENT (CHARGER_INPUT_CURRENT & INPUT_CURRENT_MASK)
|
#define INPUT_CURRENT (MIN(CHARGER_INPUT_CURRENT, INPUT_CURRENT_MASK) & INPUT_CURRENT_MASK)
|
||||||
#define ADAPTER_RSENSE RSENSE_20
|
#define ADAPTER_RSENSE RSENSE_20
|
||||||
#else
|
#else
|
||||||
#error Invalid adapter RSENSE value
|
#error Invalid adapter RSENSE value
|
||||||
|
@ -22,7 +22,7 @@ CFLAGS+=-DPS2_TOUCHPAD=PS2_3
|
|||||||
CFLAGS+=\
|
CFLAGS+=\
|
||||||
-DCHARGER_ADAPTER_RSENSE=10 \
|
-DCHARGER_ADAPTER_RSENSE=10 \
|
||||||
-DCHARGER_BATTERY_RSENSE=10 \
|
-DCHARGER_BATTERY_RSENSE=10 \
|
||||||
-DCHARGER_CHARGE_CURRENT=3072 \
|
-DCHARGER_CHARGE_CURRENT=2048 \
|
||||||
-DCHARGER_CHARGE_VOLTAGE=17120 \
|
-DCHARGER_CHARGE_VOLTAGE=17120 \
|
||||||
-DCHARGER_INPUT_CURRENT=9230
|
-DCHARGER_INPUT_CURRENT=9230
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ CFLAGS+=-DPS2_TOUCHPAD=PS2_3
|
|||||||
CFLAGS+=\
|
CFLAGS+=\
|
||||||
-DCHARGER_ADAPTER_RSENSE=10 \
|
-DCHARGER_ADAPTER_RSENSE=10 \
|
||||||
-DCHARGER_BATTERY_RSENSE=10 \
|
-DCHARGER_BATTERY_RSENSE=10 \
|
||||||
-DCHARGER_CHARGE_CURRENT=3072 \
|
-DCHARGER_CHARGE_CURRENT=2048 \
|
||||||
-DCHARGER_CHARGE_VOLTAGE=13050 \
|
-DCHARGER_CHARGE_VOLTAGE=13050 \
|
||||||
-DCHARGER_INPUT_CURRENT=9230
|
-DCHARGER_INPUT_CURRENT=9230
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ CFLAGS+=-DPS2_TOUCHPAD=PS2_3
|
|||||||
CFLAGS+=\
|
CFLAGS+=\
|
||||||
-DCHARGER_ADAPTER_RSENSE=10 \
|
-DCHARGER_ADAPTER_RSENSE=10 \
|
||||||
-DCHARGER_BATTERY_RSENSE=10 \
|
-DCHARGER_BATTERY_RSENSE=10 \
|
||||||
-DCHARGER_CHARGE_CURRENT=3072 \
|
-DCHARGER_CHARGE_CURRENT=2048 \
|
||||||
-DCHARGER_CHARGE_VOLTAGE=13050 \
|
-DCHARGER_CHARGE_VOLTAGE=13050 \
|
||||||
-DCHARGER_INPUT_CURRENT=9230
|
-DCHARGER_INPUT_CURRENT=9230
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ CFLAGS+=-DPS2_TOUCHPAD=PS2_3
|
|||||||
CFLAGS+=\
|
CFLAGS+=\
|
||||||
-DCHARGER_ADAPTER_RSENSE=10 \
|
-DCHARGER_ADAPTER_RSENSE=10 \
|
||||||
-DCHARGER_BATTERY_RSENSE=10 \
|
-DCHARGER_BATTERY_RSENSE=10 \
|
||||||
-DCHARGER_CHARGE_CURRENT=3072 \
|
-DCHARGER_CHARGE_CURRENT=2048 \
|
||||||
-DCHARGER_CHARGE_VOLTAGE=13050 \
|
-DCHARGER_CHARGE_VOLTAGE=13050 \
|
||||||
-DCHARGER_INPUT_CURRENT=9230
|
-DCHARGER_INPUT_CURRENT=9230
|
||||||
|
|
||||||
|
@ -13,4 +13,8 @@
|
|||||||
|
|
||||||
#define BIT(X) (1UL << (X))
|
#define BIT(X) (1UL << (X))
|
||||||
|
|
||||||
|
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||||
|
#define CLAMP(val, min, max) (MIN(MAX(val, min), max))
|
||||||
|
|
||||||
#endif // _COMMON_MACRO_H
|
#endif // _COMMON_MACRO_H
|
||||||
|
Reference in New Issue
Block a user