Skip to content

Commit a4446b1

Browse files
aasinclairfabiobaltieri
authored andcommitted
drivers: sensor: npm1300_charger: Added die temp measurement
Support for die temperature reading added Signed-off-by: Andy Sinclair <[email protected]>
1 parent 8fd6762 commit a4446b1

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

drivers/sensor/npm1300_charger/npm1300_charger.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ struct npm1300_charger_data {
3535
uint16_t voltage;
3636
uint16_t current;
3737
uint16_t temp;
38+
uint16_t dietemp;
3839
uint8_t status;
3940
uint8_t error;
4041
uint8_t ibat_stat;
@@ -66,6 +67,7 @@ struct npm1300_charger_data {
6667
/* nPM1300 ADC register offsets */
6768
#define ADC_OFFSET_TASK_VBAT 0x00U
6869
#define ADC_OFFSET_TASK_TEMP 0x01U
70+
#define ADC_OFFSET_TASK_DIE 0x02U
6971
#define ADC_OFFSET_CONFIG 0x09U
7072
#define ADC_OFFSET_NTCR_SEL 0x0AU
7173
#define ADC_OFFSET_TASK_AUTO 0x0CU
@@ -104,6 +106,7 @@ struct adc_results_t {
104106
#define ADC_LSB_MASK 0x03U
105107
#define ADC_LSB_VBAT_SHIFT 0U
106108
#define ADC_LSB_NTC_SHIFT 2U
109+
#define ADC_LSB_DIE_SHIFT 4U
107110
#define ADC_LSB_IBAT_SHIFT 4U
108111

109112
/* NTC temp masks */
@@ -151,6 +154,17 @@ static void calc_temp(const struct npm1300_charger_config *const config, uint16_
151154
valp->val2 = (int32_t)(fmodf(temp, 1.f) * 1000000.f);
152155
}
153156

157+
static void calc_dietemp(const struct npm1300_charger_config *const config, uint16_t code,
158+
struct sensor_value *valp)
159+
{
160+
/* Ref: Datasheet Figure 36: Die temperature (Celcius) */
161+
int32_t temp =
162+
DIETEMP_OFFSET_MDEGC - (((int32_t)code * DIETEMP_FACTOR_MUL) / DIETEMP_FACTOR_DIV);
163+
164+
valp->val1 = temp / 1000;
165+
valp->val2 = (temp % 1000) * 1000;
166+
}
167+
154168
static uint32_t calc_ntc_res(const struct npm1300_charger_config *const config, int32_t temp_mdegc)
155169
{
156170
float inv_t0 = 1.f / 298.15f;
@@ -230,6 +244,9 @@ int npm1300_charger_channel_get(const struct device *dev, enum sensor_channel ch
230244
valp->val1 = config->dischg_limit_microamp / 1000000;
231245
valp->val2 = config->dischg_limit_microamp % 1000000;
232246
break;
247+
case SENSOR_CHAN_DIE_TEMP:
248+
calc_dietemp(config, data->dietemp, valp);
249+
break;
233250
default:
234251
return -ENOTSUP;
235252
}
@@ -264,11 +281,12 @@ int npm1300_charger_sample_fetch(const struct device *dev, enum sensor_channel c
264281

265282
data->voltage = adc_get_res(results.msb_vbat, results.lsb_a, ADC_LSB_VBAT_SHIFT);
266283
data->temp = adc_get_res(results.msb_ntc, results.lsb_a, ADC_LSB_NTC_SHIFT);
284+
data->dietemp = adc_get_res(results.msb_die, results.lsb_a, ADC_LSB_DIE_SHIFT);
267285
data->current = adc_get_res(results.msb_ibat, results.lsb_b, ADC_LSB_IBAT_SHIFT);
268286
data->ibat_stat = results.ibat_stat;
269287

270-
/* Trigger temperature measurement */
271-
ret = mfd_npm1300_reg_write(config->mfd, ADC_BASE, ADC_OFFSET_TASK_TEMP, 1U);
288+
/* Trigger ntc and die temperature measurements */
289+
ret = mfd_npm1300_reg_write2(config->mfd, ADC_BASE, ADC_OFFSET_TASK_TEMP, 1U, 1U);
272290
if (ret != 0) {
273291
return ret;
274292
}
@@ -550,8 +568,8 @@ int npm1300_charger_init(const struct device *dev)
550568
return ret;
551569
}
552570

553-
/* Trigger temperature measurement */
554-
ret = mfd_npm1300_reg_write(config->mfd, ADC_BASE, ADC_OFFSET_TASK_TEMP, 1U);
571+
/* Trigger ntc and die temperature measurements */
572+
ret = mfd_npm1300_reg_write2(config->mfd, ADC_BASE, ADC_OFFSET_TASK_TEMP, 1U, 1U);
555573
if (ret != 0) {
556574
return ret;
557575
}

0 commit comments

Comments
 (0)