Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 44 additions & 1 deletion drivers/sensor/nordic/npm1300_charger/npm1300_charger.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down
11 changes: 11 additions & 0 deletions include/zephyr/drivers/sensor/npm1300_charger.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions samples/shields/npm1300_ek/prj.conf
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 9 additions & 3 deletions samples/shields/npm1300_ek/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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, &current);
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);

Expand All @@ -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)
Expand Down
Loading