Skip to content

Commit 3ae0d39

Browse files
seov-nordicjhedberg
authored andcommitted
drivers: sensor: npm13xx_charger: improve sample fetching
Change the npm13xx_charger fetch function to first trigger a sample and then block until the result is available. Signed-off-by: Sergei Ovchinnikov <sergei.ovchinnikov@nordicsemi.no>
1 parent 376d9cb commit 3ae0d39

File tree

3 files changed

+45
-46
lines changed

3 files changed

+45
-46
lines changed

drivers/mfd/mfd_npm13xx.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,13 +206,16 @@ int mfd_npm13xx_reg_write(const struct device *dev, uint8_t base, uint8_t offset
206206
return i2c_write_dt(&config->i2c, buff, sizeof(buff));
207207
}
208208

209-
int mfd_npm13xx_reg_write2(const struct device *dev, uint8_t base, uint8_t offset, uint8_t data1,
210-
uint8_t data2)
209+
int mfd_npm13xx_reg_write_burst(const struct device *dev, uint8_t base, uint8_t offset, void *data,
210+
size_t len)
211211
{
212212
const struct mfd_npm13xx_config *config = dev->config;
213-
uint8_t buff[] = {base, offset, data1, data2};
213+
struct i2c_msg msg[2] = {
214+
{.buf = (uint8_t []){base, offset}, .len = 2, .flags = I2C_MSG_WRITE},
215+
{.buf = data, .len = len, .flags = I2C_MSG_WRITE | I2C_MSG_STOP},
216+
};
214217

215-
return i2c_write_dt(&config->i2c, buff, sizeof(buff));
218+
return i2c_transfer_dt(&config->i2c, msg, 2);
216219
}
217220

218221
int mfd_npm13xx_reg_update(const struct device *dev, uint8_t base, uint8_t offset, uint8_t data,

drivers/sensor/nordic/npm13xx_charger/npm13xx_charger.c

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ struct npm13xx_charger_data {
7676
#define ADC_OFFSET_RESULTS 0x10U
7777
#define ADC_OFFSET_IBAT_EN 0x24U
7878

79+
#define ADC_CONV_TIME_US 250U
80+
7981
/* nPM13xx VBUS register offsets */
8082
#define VBUS_OFFSET_ILIMUPDATE 0x00U
8183
#define VBUS_OFFSET_ILIM 0x01U
@@ -302,6 +304,17 @@ int npm13xx_charger_sample_fetch(const struct device *dev, enum sensor_channel c
302304
struct npm13xx_charger_data *data = dev->data;
303305
struct adc_results_t results;
304306
int ret;
307+
k_timepoint_t conv_done;
308+
309+
/* Trigger current+voltage, NTC and die temp measurements (four in total) */
310+
ret = mfd_npm13xx_reg_write_burst(config->mfd, ADC_BASE, ADC_OFFSET_TASK_VBAT,
311+
(uint8_t []){1U, 1U, 1U}, 3U);
312+
if (ret != 0) {
313+
return ret;
314+
}
315+
316+
/* Set timepoint for conversion and read status registers in the meantime */
317+
conv_done = sys_timepoint_calc(K_USEC(ADC_CONV_TIME_US * 4));
305318

306319
/* Read charge status and error reason */
307320
ret = mfd_npm13xx_reg_read(config->mfd, CHGR_BASE, CHGR_OFFSET_CHG_STAT, &data->status);
@@ -314,6 +327,14 @@ int npm13xx_charger_sample_fetch(const struct device *dev, enum sensor_channel c
314327
return ret;
315328
}
316329

330+
/* Read vbus status */
331+
ret = mfd_npm13xx_reg_read(config->mfd, VBUS_BASE, VBUS_OFFSET_STATUS, &data->vbus_stat);
332+
if (ret != 0) {
333+
return ret;
334+
}
335+
336+
k_sleep(sys_timepoint_timeout(conv_done));
337+
317338
/* Read adc results */
318339
ret = mfd_npm13xx_reg_read_burst(config->mfd, ADC_BASE, ADC_OFFSET_RESULTS, &results,
319340
sizeof(results));
@@ -327,21 +348,6 @@ int npm13xx_charger_sample_fetch(const struct device *dev, enum sensor_channel c
327348
data->current = adc_get_res(results.msb_ibat, results.lsb_b, ADC_LSB_IBAT_SHIFT);
328349
data->ibat_stat = results.ibat_stat;
329350

330-
/* Trigger ntc and die temperature measurements */
331-
ret = mfd_npm13xx_reg_write2(config->mfd, ADC_BASE, ADC_OFFSET_TASK_TEMP, 1U, 1U);
332-
if (ret != 0) {
333-
return ret;
334-
}
335-
336-
/* Trigger current and voltage measurement */
337-
ret = mfd_npm13xx_reg_write(config->mfd, ADC_BASE, ADC_OFFSET_TASK_VBAT, 1U);
338-
if (ret != 0) {
339-
return ret;
340-
}
341-
342-
/* Read vbus status */
343-
ret = mfd_npm13xx_reg_read(config->mfd, VBUS_BASE, VBUS_OFFSET_STATUS, &data->vbus_stat);
344-
345351
return ret;
346352
}
347353

@@ -354,9 +360,10 @@ static int set_ntc_thresholds(const struct npm13xx_charger_config *const config)
354360
/* Ref: Datasheet Figure 14: Equation for battery temperature */
355361
uint16_t code = (1024 * res) / (res + config->thermistor_ohms);
356362

357-
int ret = mfd_npm13xx_reg_write2(
363+
int ret = mfd_npm13xx_reg_write_burst(
358364
config->mfd, CHGR_BASE, CHGR_OFFSET_NTC_TEMPS + (idx * 2U),
359-
code >> NTCTEMP_MSB_SHIFT, code & NTCTEMP_LSB_MASK);
365+
(uint8_t []){code >> NTCTEMP_MSB_SHIFT, code & NTCTEMP_LSB_MASK},
366+
2U);
360367

361368
if (ret != 0) {
362369
return ret;
@@ -377,9 +384,10 @@ static int set_dietemp_thresholds(const struct npm13xx_charger_config *const con
377384
DIETEMP_FACTOR_DIV;
378385
uint16_t code = DIV_ROUND_CLOSEST(numerator, DIETEMP_FACTOR_MUL);
379386

380-
int ret = mfd_npm13xx_reg_write2(
387+
int ret = mfd_npm13xx_reg_write_burst(
381388
config->mfd, CHGR_BASE, CHGR_OFFSET_DIE_TEMPS + (idx * 2U),
382-
code >> DIETEMP_MSB_SHIFT, code & DIETEMP_LSB_MASK);
389+
(uint8_t []){code >> DIETEMP_MSB_SHIFT, code & DIETEMP_LSB_MASK},
390+
2U);
383391

384392
if (ret != 0) {
385393
return ret;
@@ -582,16 +590,16 @@ int npm13xx_charger_init(const struct device *dev)
582590
ret = mfd_npm13xx_reg_write(config->mfd, CHGR_BASE, CHGR_OFFSET_ISET, idx);
583591
} else {
584592
/* Set charge current MSB and LSB and discharge limit for nPM1300 */
585-
ret = mfd_npm13xx_reg_write2(config->mfd, CHGR_BASE, CHGR_OFFSET_ISET, idx / 2U,
586-
idx & 1U);
593+
ret = mfd_npm13xx_reg_write_burst(config->mfd, CHGR_BASE, CHGR_OFFSET_ISET,
594+
(uint8_t []){idx / 2U, idx & 1U}, 2U);
587595
if (ret != 0) {
588596
return ret;
589597
}
590598

591-
ret = mfd_npm13xx_reg_write2(
599+
ret = mfd_npm13xx_reg_write_burst(
592600
config->mfd, CHGR_BASE, CHGR_OFFSET_ISET_DISCHG,
593-
npm1300_discharge_limits[config->dischg_limit_idx] / 2U,
594-
npm1300_discharge_limits[config->dischg_limit_idx] & 1U);
601+
(uint8_t []){npm1300_discharge_limits[config->dischg_limit_idx] / 2U,
602+
npm1300_discharge_limits[config->dischg_limit_idx] & 1U}, 2U);
595603
}
596604
if (ret != 0) {
597605
return ret;
@@ -628,18 +636,6 @@ int npm13xx_charger_init(const struct device *dev)
628636
return ret;
629637
}
630638

631-
/* Trigger current and voltage measurement */
632-
ret = mfd_npm13xx_reg_write(config->mfd, ADC_BASE, ADC_OFFSET_TASK_VBAT, 1U);
633-
if (ret != 0) {
634-
return ret;
635-
}
636-
637-
/* Trigger ntc and die temperature measurements */
638-
ret = mfd_npm13xx_reg_write2(config->mfd, ADC_BASE, ADC_OFFSET_TASK_TEMP, 1U, 1U);
639-
if (ret != 0) {
640-
return ret;
641-
}
642-
643639
/* Enable automatic temperature measurements during charging */
644640
ret = mfd_npm13xx_reg_write(config->mfd, ADC_BASE, ADC_OFFSET_TASK_AUTO, 1U);
645641
if (ret != 0) {

include/zephyr/drivers/mfd/npm13xx.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,18 +79,18 @@ int mfd_npm13xx_reg_read(const struct device *dev, uint8_t base, uint8_t offset,
7979
int mfd_npm13xx_reg_write(const struct device *dev, uint8_t base, uint8_t offset, uint8_t data);
8080

8181
/**
82-
* @brief Write two registers to npm13xx
82+
* @brief Write multiple registers to npm13xx
8383
*
8484
* @param dev npm13xx mfd device
8585
* @param base Register base address (bits 15..8 of 16-bit address)
86-
* @param offset Register offset address (bits 7..0 of 16-bit address)
87-
* @param data1 first byte of data to write
88-
* @param data2 second byte of data to write
86+
* @param offset First register offset address (bits 7..0 of 16-bit address)
87+
* @param data Pointer to buffer to write
88+
* @param len Number of bytes to write
8989
* @retval 0 If successful
9090
* @retval -errno In case of any bus error (see i2c_write_dt())
9191
*/
92-
int mfd_npm13xx_reg_write2(const struct device *dev, uint8_t base, uint8_t offset, uint8_t data1,
93-
uint8_t data2);
92+
int mfd_npm13xx_reg_write_burst(const struct device *dev, uint8_t base, uint8_t offset, void *data,
93+
size_t len);
9494

9595
/**
9696
* @brief Update selected bits in npm13xx register

0 commit comments

Comments
 (0)