@@ -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+
154168static 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