101 lines
2.0 KiB
C
101 lines
2.0 KiB
C
/*
|
|
* Copyright (c) 2021 Leonard Pollak
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_DRIVERS_SENSOR_INA219_INA219_H_
|
|
#define ZEPHYR_DRIVERS_SENSOR_INA219_INA219_H_
|
|
|
|
/* Device register addresses */
|
|
#define INA219_REG_CONF 0x00
|
|
#define INA219_REG_V_SHUNT 0x01
|
|
#define INA219_REG_V_BUS 0x02
|
|
#define INA219_REG_POWER 0x03
|
|
#define INA219_REG_CURRENT 0x04
|
|
#define INA219_REG_CALIB 0x05
|
|
|
|
/* Config register shifts and masks */
|
|
#define INA219_RST BIT(15)
|
|
#define INA219_BRNG_MASK 0x1
|
|
#define INA219_BRNG_SHIFT 13
|
|
#define INA219_PG_MASK 0x3
|
|
#define INA219_PG_SHIFT 11
|
|
#define INA219_ADC_MASK 0xF
|
|
#define INA219_BADC_SHIFT 7
|
|
#define INA219_SADC_SHIFT 3
|
|
#define INA219_MODE_MASK 0x7
|
|
|
|
/* Bus voltage register */
|
|
#define INA219_VBUS_GET(x) ((x) >> 3) & 0x3FFF
|
|
#define INA219_CNVR_RDY(x) ((x) >> 1) & 0x1
|
|
#define INA219_OVF_STATUS(x) x & 0x1
|
|
|
|
/* Mode fields */
|
|
#define INA219_MODE_NORMAL 0x3 /* shunt and bus, triggered */
|
|
#define INA219_MODE_SLEEP 0x4 /* ADC off */
|
|
#define INA219_MODE_OFF 0x0 /* Power off */
|
|
|
|
/* Others */
|
|
#define INA219_SIGN_BIT(x) ((x) >> 15) & 0x1
|
|
#define INA219_V_BUS_MUL 0.004f
|
|
#define INA219_SI_MUL 0.00001f
|
|
#define INA219_POWER_MUL 20
|
|
#define INA219_WAIT_STARTUP 40
|
|
#define INA219_WAIT_MSR_RETRY 100
|
|
#define INA219_SCALING_FACTOR 4096000
|
|
|
|
struct ina219_config {
|
|
struct i2c_dt_spec bus;
|
|
uint16_t current_lsb;
|
|
uint16_t r_shunt;
|
|
uint8_t brng;
|
|
uint8_t pg;
|
|
uint8_t badc;
|
|
uint8_t sadc;
|
|
uint8_t mode;
|
|
};
|
|
|
|
struct ina219_data {
|
|
uint16_t config;
|
|
uint16_t v_bus;
|
|
uint16_t power;
|
|
uint16_t current;
|
|
uint16_t calib;
|
|
uint32_t msr_delay;
|
|
};
|
|
|
|
static int ina219_init(const struct device *dev);
|
|
|
|
static inline int ina219_conv_delay(uint8_t delay_idx)
|
|
{
|
|
switch (delay_idx) {
|
|
case 0:
|
|
return 84;
|
|
case 1:
|
|
return 148;
|
|
case 2:
|
|
return 276;
|
|
case 3:
|
|
return 532;
|
|
case 9:
|
|
return 1060;
|
|
case 10:
|
|
return 2013;
|
|
case 11:
|
|
return 4260;
|
|
case 12:
|
|
return 8510;
|
|
case 13:
|
|
return 17020;
|
|
case 14:
|
|
return 34050;
|
|
case 15:
|
|
return 68100;
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
#endif /* ZEPHYR_DRIVERS_SENSOR_INA219_INA219_H_ */
|