diff --git a/drivers/sensor/nordic/npm1300_charger/npm1300_charger.c b/drivers/sensor/nordic/npm1300_charger/npm1300_charger.c index ac19616045e..869f8f5848f 100644 --- a/drivers/sensor/nordic/npm1300_charger/npm1300_charger.c +++ b/drivers/sensor/nordic/npm1300_charger/npm1300_charger.c @@ -117,11 +117,19 @@ struct adc_results_t { #define DIETEMP_MSB_SHIFT 2U #define DIETEMP_LSB_MASK 0x03U -/* VBUS masks */ +/* VBUS detect masks */ #define DETECT_HI_MASK 0x0AU #define DETECT_HI_CURRENT 1500000 #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 */ #define DIETEMP_OFFSET_MDEGC 394670 #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: calc_dietemp(config, data->dietemp, valp); break; + case SENSOR_CHAN_NPM1300_CHARGER_VBUS_STATUS: + valp->val1 = data->vbus_stat; + valp->val2 = 0; + break; default: return -ENOTSUP; } @@ -399,6 +411,37 @@ static int npm1300_charger_attr_get(const struct device *dev, enum sensor_channe 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: return -ENOTSUP; } diff --git a/include/zephyr/drivers/sensor/npm1300_charger.h b/include/zephyr/drivers/sensor/npm1300_charger.h index eb13f959a46..d2a166340d1 100644 --- a/include/zephyr/drivers/sensor/npm1300_charger.h +++ b/include/zephyr/drivers/sensor/npm1300_charger.h @@ -12,6 +12,17 @@ enum sensor_channel_npm1300_charger { SENSOR_CHAN_NPM1300_CHARGER_STATUS = SENSOR_CHAN_PRIV_START, 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 diff --git a/samples/shields/npm1300_ek/prj.conf b/samples/shields/npm1300_ek/prj.conf index 975d56d4e50..3562f9d5c93 100644 --- a/samples/shields/npm1300_ek/prj.conf +++ b/samples/shields/npm1300_ek/prj.conf @@ -2,6 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 CONFIG_SHELL=y +CONFIG_LOG_CMDS=y CONFIG_LOG=y CONFIG_GPIO=y CONFIG_GPIO_SHELL=y diff --git a/samples/shields/npm1300_ek/src/main.c b/samples/shields/npm1300_ek/src/main.c index 47ed6214677..7ced0145662 100644 --- a/samples/shields/npm1300_ek/src/main.c +++ b/samples/shields/npm1300_ek/src/main.c @@ -80,13 +80,18 @@ void read_sensors(void) struct sensor_value temp; struct sensor_value error; struct sensor_value status; + struct sensor_value vbus_present; sensor_sample_fetch(charger); sensor_channel_get(charger, SENSOR_CHAN_GAUGE_VOLTAGE, &volt); sensor_channel_get(charger, SENSOR_CHAN_GAUGE_AVG_CURRENT, ¤t); sensor_channel_get(charger, SENSOR_CHAN_GAUGE_TEMP, &temp); - sensor_channel_get(charger, SENSOR_CHAN_NPM1300_CHARGER_STATUS, &status); - sensor_channel_get(charger, SENSOR_CHAN_NPM1300_CHARGER_ERROR, &error); + sensor_channel_get(charger, (enum sensor_channel)SENSOR_CHAN_NPM1300_CHARGER_STATUS, + &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); @@ -96,7 +101,8 @@ void read_sensors(void) printk("T: %s%d.%02d\n", ((temp.val1 < 0) || (temp.val2 < 0)) ? "-" : "", abs(temp.val1), 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)