Skip to content

Commit 9c64f43

Browse files
committed
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 <[email protected]>
1 parent 5f418f5 commit 9c64f43

File tree

4 files changed

+65
-4
lines changed

4 files changed

+65
-4
lines changed

drivers/sensor/nordic/npm1300_charger/npm1300_charger.c

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,19 @@ struct adc_results_t {
117117
#define DIETEMP_MSB_SHIFT 2U
118118
#define DIETEMP_LSB_MASK 0x03U
119119

120-
/* VBUS masks */
120+
/* VBUS detect masks */
121121
#define DETECT_HI_MASK 0x0AU
122122
#define DETECT_HI_CURRENT 1500000
123123
#define DETECT_LO_CURRENT 500000
124124

125+
/* VBUS status masks */
126+
#define STATUS_PRESENT_MASK 0x01U
127+
#define STATUS_CUR_LIMIT_MASK 0x02U
128+
#define STATUS_OVERVLT_PROT_MASK 0x04U
129+
#define STATUS_UNDERVLT_MASK 0x08U
130+
#define STATUS_SUSPENDED_MASK 0x10U
131+
#define STATUS_BUSOUT_MASK 0x20U
132+
125133
/* Dietemp calculation constants */
126134
#define DIETEMP_OFFSET_MDEGC 394670
127135
#define DIETEMP_FACTOR_MUL 3963000
@@ -250,6 +258,10 @@ int npm1300_charger_channel_get(const struct device *dev, enum sensor_channel ch
250258
case SENSOR_CHAN_DIE_TEMP:
251259
calc_dietemp(config, data->dietemp, valp);
252260
break;
261+
case SENSOR_CHAN_NPM1300_CHARGER_VBUS_STATUS:
262+
valp->val1 = data->vbus_stat;
263+
valp->val2 = 0;
264+
break;
253265
default:
254266
return -ENOTSUP;
255267
}
@@ -399,6 +411,37 @@ static int npm1300_charger_attr_get(const struct device *dev, enum sensor_channe
399411

400412
return 0;
401413

414+
case SENSOR_CHAN_NPM1300_CHARGER_VBUS_STATUS:
415+
ret = mfd_npm1300_reg_read(config->mfd, VBUS_BASE, VBUS_OFFSET_STATUS, &data);
416+
if (ret < 0) {
417+
return ret;
418+
}
419+
420+
switch ((enum sensor_attribute_npm1300_charger)attr) {
421+
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_PRESENT:
422+
val->val1 = (data & STATUS_PRESENT_MASK) != 0;
423+
break;
424+
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_CUR_LIMIT:
425+
val->val1 = (data & STATUS_CUR_LIMIT_MASK) != 0;
426+
break;
427+
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_OVERVLT_PROT:
428+
val->val1 = (data & STATUS_OVERVLT_PROT_MASK) != 0;
429+
break;
430+
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_UNDERVLT:
431+
val->val1 = (data & STATUS_UNDERVLT_MASK) != 0;
432+
break;
433+
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_SUSPENDED:
434+
val->val1 = (data & STATUS_SUSPENDED_MASK) != 0;
435+
break;
436+
case SENSOR_ATTR_NPM1300_CHARGER_VBUS_BUSOUT:
437+
val->val1 = (data & STATUS_BUSOUT_MASK) != 0;
438+
break;
439+
default:
440+
return -ENOTSUP;
441+
}
442+
val->val2 = 0;
443+
return 0;
444+
402445
default:
403446
return -ENOTSUP;
404447
}

include/zephyr/drivers/sensor/npm1300_charger.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@
1212
enum sensor_channel_npm1300_charger {
1313
SENSOR_CHAN_NPM1300_CHARGER_STATUS = SENSOR_CHAN_PRIV_START,
1414
SENSOR_CHAN_NPM1300_CHARGER_ERROR,
15+
SENSOR_CHAN_NPM1300_CHARGER_VBUS_STATUS,
16+
};
17+
18+
/* NPM1300 charger specific attributes */
19+
enum sensor_attribute_npm1300_charger {
20+
SENSOR_ATTR_NPM1300_CHARGER_VBUS_PRESENT = SENSOR_ATTR_PRIV_START,
21+
SENSOR_ATTR_NPM1300_CHARGER_VBUS_CUR_LIMIT,
22+
SENSOR_ATTR_NPM1300_CHARGER_VBUS_OVERVLT_PROT,
23+
SENSOR_ATTR_NPM1300_CHARGER_VBUS_UNDERVLT,
24+
SENSOR_ATTR_NPM1300_CHARGER_VBUS_SUSPENDED,
25+
SENSOR_ATTR_NPM1300_CHARGER_VBUS_BUSOUT,
1526
};
1627

1728
#endif

samples/shields/npm1300_ek/prj.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
CONFIG_SHELL=y
5+
CONFIG_LOG_CMDS=y
56
CONFIG_LOG=y
67
CONFIG_GPIO=y
78
CONFIG_GPIO_SHELL=y

samples/shields/npm1300_ek/src/main.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,18 @@ void read_sensors(void)
8080
struct sensor_value temp;
8181
struct sensor_value error;
8282
struct sensor_value status;
83+
struct sensor_value vbus_present;
8384

8485
sensor_sample_fetch(charger);
8586
sensor_channel_get(charger, SENSOR_CHAN_GAUGE_VOLTAGE, &volt);
8687
sensor_channel_get(charger, SENSOR_CHAN_GAUGE_AVG_CURRENT, &current);
8788
sensor_channel_get(charger, SENSOR_CHAN_GAUGE_TEMP, &temp);
88-
sensor_channel_get(charger, SENSOR_CHAN_NPM1300_CHARGER_STATUS, &status);
89-
sensor_channel_get(charger, SENSOR_CHAN_NPM1300_CHARGER_ERROR, &error);
89+
sensor_channel_get(charger, (enum sensor_channel)SENSOR_CHAN_NPM1300_CHARGER_STATUS,
90+
&status);
91+
sensor_channel_get(charger, (enum sensor_channel)SENSOR_CHAN_NPM1300_CHARGER_ERROR, &error);
92+
sensor_attr_get(charger, (enum sensor_channel)SENSOR_CHAN_NPM1300_CHARGER_VBUS_STATUS,
93+
(enum sensor_attribute)SENSOR_ATTR_NPM1300_CHARGER_VBUS_PRESENT,
94+
&vbus_present);
9095

9196
printk("V: %d.%03d ", volt.val1, volt.val2 / 1000);
9297

@@ -96,7 +101,8 @@ void read_sensors(void)
96101
printk("T: %s%d.%02d\n", ((temp.val1 < 0) || (temp.val2 < 0)) ? "-" : "", abs(temp.val1),
97102
abs(temp.val2) / 10000);
98103

99-
printk("Charger Status: %d, Error: %d\n", status.val1, error.val1);
104+
printk("Charger Status: %d, Error: %d, VBUS: %s\n", status.val1, error.val1,
105+
vbus_present.val1 ? "connected" : "disconnected");
100106
}
101107

102108
int main(void)

0 commit comments

Comments
 (0)