drivers: sensor: npm1300_charger: expose VBUS status

Add possibility to retrieve VBUS status of the nPM1300 charger through
its sensor APIs. Updated shields/npm1300_ek sample to use the new API.

Signed-off-by: Sergei Ovchinnikov <sergei.ovchinnikov@nordicsemi.no>
This commit is contained in:
Sergei Ovchinnikov 2024-11-14 10:48:42 +01:00 committed by Anas Nashif
commit 55c6a0eaa5
4 changed files with 65 additions and 4 deletions

View file

@ -117,11 +117,19 @@ struct adc_results_t {
#define DIETEMP_MSB_SHIFT 2U #define DIETEMP_MSB_SHIFT 2U
#define DIETEMP_LSB_MASK 0x03U #define DIETEMP_LSB_MASK 0x03U
/* VBUS masks */ /* VBUS detect masks */
#define DETECT_HI_MASK 0x0AU #define DETECT_HI_MASK 0x0AU
#define DETECT_HI_CURRENT 1500000 #define DETECT_HI_CURRENT 1500000
#define DETECT_LO_CURRENT 500000 #define DETECT_LO_CURRENT 500000
/* VBUS status masks */
#define STATUS_PRESENT_MASK 0x01U
#define STATUS_CUR_LIMIT_MASK 0x02U
#define STATUS_OVERVLT_PROT_MASK 0x04U
#define STATUS_UNDERVLT_MASK 0x08U
#define STATUS_SUSPENDED_MASK 0x10U
#define STATUS_BUSOUT_MASK 0x20U
/* Dietemp calculation constants */ /* Dietemp calculation constants */
#define DIETEMP_OFFSET_MDEGC 394670 #define DIETEMP_OFFSET_MDEGC 394670
#define DIETEMP_FACTOR_MUL 3963000 #define DIETEMP_FACTOR_MUL 3963000
@ -250,6 +258,10 @@ int npm1300_charger_channel_get(const struct device *dev, enum sensor_channel ch
case SENSOR_CHAN_DIE_TEMP: case SENSOR_CHAN_DIE_TEMP:
calc_dietemp(config, data->dietemp, valp); calc_dietemp(config, data->dietemp, valp);
break; break;
case SENSOR_CHAN_NPM1300_CHARGER_VBUS_STATUS:
valp->val1 = data->vbus_stat;
valp->val2 = 0;
break;
default: default:
return -ENOTSUP; return -ENOTSUP;
} }
@ -399,6 +411,37 @@ static int npm1300_charger_attr_get(const struct device *dev, enum sensor_channe
return 0; return 0;
case SENSOR_CHAN_NPM1300_CHARGER_VBUS_STATUS:
ret = mfd_npm1300_reg_read(config->mfd, VBUS_BASE, VBUS_OFFSET_STATUS, &data);
if (ret < 0) {
return ret;
}
switch ((enum sensor_attribute_npm1300_charger)attr) {
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_PRESENT:
val->val1 = (data & STATUS_PRESENT_MASK) != 0;
break;
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_CUR_LIMIT:
val->val1 = (data & STATUS_CUR_LIMIT_MASK) != 0;
break;
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_OVERVLT_PROT:
val->val1 = (data & STATUS_OVERVLT_PROT_MASK) != 0;
break;
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_UNDERVLT:
val->val1 = (data & STATUS_UNDERVLT_MASK) != 0;
break;
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_SUSPENDED:
val->val1 = (data & STATUS_SUSPENDED_MASK) != 0;
break;
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_BUSOUT:
val->val1 = (data & STATUS_BUSOUT_MASK) != 0;
break;
default:
return -ENOTSUP;
}
val->val2 = 0;
return 0;
default: default:
return -ENOTSUP; return -ENOTSUP;
} }

View file

@ -12,6 +12,17 @@
enum sensor_channel_npm1300_charger { enum sensor_channel_npm1300_charger {
SENSOR_CHAN_NPM1300_CHARGER_STATUS = SENSOR_CHAN_PRIV_START, SENSOR_CHAN_NPM1300_CHARGER_STATUS = SENSOR_CHAN_PRIV_START,
SENSOR_CHAN_NPM1300_CHARGER_ERROR, SENSOR_CHAN_NPM1300_CHARGER_ERROR,
SENSOR_CHAN_NPM1300_CHARGER_VBUS_STATUS,
};
/* NPM1300 charger specific attributes */
enum sensor_attribute_npm1300_charger {
SENSOR_ATTR_NPM1300_CHARGER_VBUS_PRESENT = SENSOR_ATTR_PRIV_START,
SENSOR_ATTR_NPM1300_CHARGER_VBUS_CUR_LIMIT,
SENSOR_ATTR_NPM1300_CHARGER_VBUS_OVERVLT_PROT,
SENSOR_ATTR_NPM1300_CHARGER_VBUS_UNDERVLT,
SENSOR_ATTR_NPM1300_CHARGER_VBUS_SUSPENDED,
SENSOR_ATTR_NPM1300_CHARGER_VBUS_BUSOUT,
}; };
#endif #endif

View file

@ -2,6 +2,7 @@
# SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: Apache-2.0
CONFIG_SHELL=y CONFIG_SHELL=y
CONFIG_LOG_CMDS=y
CONFIG_LOG=y CONFIG_LOG=y
CONFIG_GPIO=y CONFIG_GPIO=y
CONFIG_GPIO_SHELL=y CONFIG_GPIO_SHELL=y

View file

@ -80,13 +80,18 @@ void read_sensors(void)
struct sensor_value temp; struct sensor_value temp;
struct sensor_value error; struct sensor_value error;
struct sensor_value status; struct sensor_value status;
struct sensor_value vbus_present;
sensor_sample_fetch(charger); sensor_sample_fetch(charger);
sensor_channel_get(charger, SENSOR_CHAN_GAUGE_VOLTAGE, &volt); sensor_channel_get(charger, SENSOR_CHAN_GAUGE_VOLTAGE, &volt);
sensor_channel_get(charger, SENSOR_CHAN_GAUGE_AVG_CURRENT, &current); sensor_channel_get(charger, SENSOR_CHAN_GAUGE_AVG_CURRENT, &current);
sensor_channel_get(charger, SENSOR_CHAN_GAUGE_TEMP, &temp); sensor_channel_get(charger, SENSOR_CHAN_GAUGE_TEMP, &temp);
sensor_channel_get(charger, SENSOR_CHAN_NPM1300_CHARGER_STATUS, &status); sensor_channel_get(charger, (enum sensor_channel)SENSOR_CHAN_NPM1300_CHARGER_STATUS,
sensor_channel_get(charger, SENSOR_CHAN_NPM1300_CHARGER_ERROR, &error); &status);
sensor_channel_get(charger, (enum sensor_channel)SENSOR_CHAN_NPM1300_CHARGER_ERROR, &error);
sensor_attr_get(charger, (enum sensor_channel)SENSOR_CHAN_NPM1300_CHARGER_VBUS_STATUS,
(enum sensor_attribute)SENSOR_ATTR_NPM1300_CHARGER_VBUS_PRESENT,
&vbus_present);
printk("V: %d.%03d ", volt.val1, volt.val2 / 1000); printk("V: %d.%03d ", volt.val1, volt.val2 / 1000);
@ -96,7 +101,8 @@ void read_sensors(void)
printk("T: %s%d.%02d\n", ((temp.val1 < 0) || (temp.val2 < 0)) ? "-" : "", abs(temp.val1), printk("T: %s%d.%02d\n", ((temp.val1 < 0) || (temp.val2 < 0)) ? "-" : "", abs(temp.val1),
abs(temp.val2) / 10000); abs(temp.val2) / 10000);
printk("Charger Status: %d, Error: %d\n", status.val1, error.val1); printk("Charger Status: %d, Error: %d, VBUS: %s\n", status.val1, error.val1,
vbus_present.val1 ? "connected" : "disconnected");
} }
int main(void) int main(void)