common/sensor/sensor.h (173 lines of code) (raw):
#ifndef SENSOR_H
#define SENSOR_H
#include "sdr.h"
#include "pmbus.h"
#define sensor_poll_stack_size 2048
#define get_from_sensor 0x00
#define get_from_cache 0x01
#define MAX_SENSOR_SIZER 60
#define sensor_null 0xFF
#define sensor_fail 0xFF
#define SENSOR_NUM_MAX 0xFF
#define DEBUG_SENSOR 0
/* define sensor type */
#define type_tmp75 0x00
#define type_adc 0x01
#define type_peci 0x02
#define type_vr 0x03
#define type_hsc 0x04
#define type_nvme 0x05
#define type_pch 0x06
#define type_medusa 0x07
#define type_fan 0x08
enum ltc4282_offset {
LTC4282_ADJUST_OFFSET = 0x11,
LTC4282_VSENSE_OFFSET = 0x40,
LTC4282_POWER_OFFSET = 0x46,
LTC4282_VSOURCE_OFFSET = 0x3A,
};
enum adm1278_offset {
ADM1278_VSOURCE_OFFSET = 0x88,
ADM1278_CURRENT_OFFSET = 0x8C,
ADM1278_TEMP_OFFSET = 0x8D,
ADM1278_POWER_OFFSET = 0x97,
ADM1278_PEAK_IOUT_OFFSET = 0xD0,
ADM1278_PEAK_PIN_OFFSET = 0xDA,
ADM1278_EIN_EXT_OFFSET = 0xDC,
};
enum sensor_dev {
sensor_dev_tmp75 = 0,
sensor_dev_ast_adc = 0x01,
sensor_dev_intel_peci = 0x02,
sensor_dev_isl69259 = 0x03,
sensor_dev_adm1278 = 0x04,
sensor_dev_nvme = 0x05,
sensor_dev_pch = 0x06,
sensor_dev_mp5990 = 0x10,
sensor_dev_isl28022 = 0x11,
sensor_dev_pex89000 = 0x12,
sensor_dev_tps53689 = 0x13,
sensor_dev_xdpe15284 = 0x14,
sensor_dev_ltc4282 = 0x15,
sensor_dev_tmp431 = 0x16,
sensor_dev_max
};
typedef struct _sensor_val {
int16_t integer;
int16_t fraction;
} sensor_val;
struct tca9548 {
uint8_t addr;
uint8_t chan;
};
static inline int acur_cal_MBR(uint8_t sensor_num, int val)
{ // for better accuracy, enlarge SDR to two byte scale
if (SDR_M(sensor_num) == 0) {
return ((val << 8) * SDR_Rexp(sensor_num));
}
return ((val << 8) / SDR_M(sensor_num) * SDR_Rexp(sensor_num));
}
static inline int cal_MBR(uint8_t sensor_num, int val)
{
if (SDR_M(sensor_num) == 0) {
return (val * SDR_Rexp(sensor_num) + round_add(sensor_num, val));
}
return (val * SDR_Rexp(sensor_num) / SDR_M(sensor_num) + round_add(sensor_num, val));
}
enum {
SENSOR_READ_SUCCESS,
SENSOR_READ_ACUR_SUCCESS,
SENSOR_NOT_FOUND,
SENSOR_NOT_ACCESSIBLE,
SENSOR_FAIL_TO_ACCESS,
SENSOR_INIT_STATUS,
SENSOR_UNSPECIFIED_ERROR,
SENSOR_POLLING_DISABLE,
SENSOR_PRE_READ_ERROR,
SENSOR_POST_READ_ERROR,
SENSOR_READ_API_UNREGISTER,
SENSOR_READ_4BYTE_ACUR_SUCCESS
};
enum { SENSOR_INIT_SUCCESS, SENSOR_INIT_UNSPECIFIED_ERROR };
typedef struct _sensor_cfg__ {
uint8_t num;
uint8_t type;
uint8_t port; // port, bus, channel, etc.
uint8_t slave_addr;
uint8_t offset;
bool (*access_checker)(uint8_t);
int arg0;
int arg1;
int cache;
uint8_t cache_status;
bool (*pre_sensor_read_hook)(uint8_t, void *);
void *pre_sensor_read_args;
bool (*post_sensor_read_hook)(uint8_t, void *, int *);
void *post_sensor_read_args;
void *init_args;
/* if there is new parameter should be added, please add on above */
uint8_t retry;
uint8_t (*init)(uint8_t, int *);
uint8_t (*read)(uint8_t, int *);
} sensor_cfg;
/* INIT arg */
typedef struct _isl28022_init_arg {
/* value to set configuration register */
union {
uint16_t value;
struct {
uint16_t MODE : 3;
uint16_t SADC : 4;
uint16_t BADC : 4;
uint16_t PG : 2;
uint16_t BRNG : 2;
uint16_t RST : 1;
} fields;
} config;
/* R_shunt valus, unit: milliohm */
uint32_t r_shunt;
/* Initailize function will set following arguments, no need to give value */
bool is_init;
/* used when read current/power */
float current_LSB;
} isl28022_init_arg;
typedef struct _adc_asd_init_arg {
bool is_init;
} adc_asd_init_arg;
typedef struct _adm1278_init_arg {
/* value to set configuration register */
union {
uint16_t value;
struct {
uint16_t RSV1 : 1;
uint16_t VOUT_EN : 1;
uint16_t VIN_EN : 1;
uint16_t TEMP1_EN : 1;
uint16_t PMON_MODE : 1;
uint16_t RSV2 : 3;
uint16_t VI_AVG : 3;
uint16_t PWR_AVG : 3;
uint16_t SIMULTANEOUS : 1;
uint16_t TSFILT : 1;
} fields;
} config;
/* Rsense valus, unit: milliohm */
float r_sense;
/* Initailize function will set following arguments, no need to give value */
bool is_init;
} adm1278_init_arg;
typedef struct _pex89000_init_arg {
uint8_t idx;
struct k_mutex brcm_pciesw;
/* Initailize function will set following arguments, no need to give value */
bool is_init;
} pex89000_init_arg;
typedef struct _ltc4282_init_arg {
float r_sense;
} ltc4282_init_arg;
typedef struct _mp5990_init_arg {
/* value to sets the gain for output current reporting */
uint16_t iout_cal_gain;
/* value to sets the IMON based total over current fault limit */
uint16_t iout_oc_fault_limit;
/* Initailize function will set following arguments, no need to give value */
bool is_init;
} mp5990_init_arg;
extern bool enable_sensor_poll;
extern uint8_t SDR_NUM;
extern sensor_cfg *sensor_config;
extern uint8_t SensorNum_SensorCfg_map[SENSOR_NUM_MAX];
uint8_t get_sensor_reading(uint8_t sensor_num, int *reading, uint8_t read_mode);
void clear_unaccessible_sensor_cache();
bool sensor_init(void);
void sensor_poll_disable();
void sensor_poll_enable();
void clear_unaccessible_sensor_cache();
/* i2c-mux tca9548 */
bool tca9548_select_chan(uint8_t sensor_num, void *args);
#endif