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:
parent
d81a8d452e
commit
55c6a0eaa5
4 changed files with 65 additions and 4 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue