common/sensor/dev/nvme.c (39 lines of code) (raw):
#include <stdio.h>
#include "sensor.h"
#include "hal_i2c.h"
#include "pal.h"
#define NVMe_NOT_AVAILABLE 0x80
#define NVMe_TMP_SENSOR_FAILURE 0x81
uint8_t nvme_read(uint8_t sensor_num, int *reading)
{
if (!reading)
return SENSOR_UNSPECIFIED_ERROR;
uint8_t retry = 5;
int val;
bool is_drive_ready;
I2C_MSG msg;
msg.bus = sensor_config[SensorNum_SensorCfg_map[sensor_num]].port;
msg.slave_addr = sensor_config[SensorNum_SensorCfg_map[sensor_num]].slave_addr;
msg.data[0] = sensor_config[SensorNum_SensorCfg_map[sensor_num]].offset;
msg.tx_len = 1;
msg.rx_len = 4;
if (!i2c_master_read(&msg, retry)) {
/* Check SSD drive ready */
is_drive_ready = ((msg.data[1] & 0x40) == 0 ? true : false);
if (!is_drive_ready)
return SENSOR_NOT_ACCESSIBLE;
/* Check reading value */
val = msg.data[3];
if (val == NVMe_NOT_AVAILABLE)
return SENSOR_FAIL_TO_ACCESS;
else if (val == NVMe_TMP_SENSOR_FAILURE)
return SENSOR_UNSPECIFIED_ERROR;
} else
return SENSOR_FAIL_TO_ACCESS;
sensor_val *sval = (sensor_val *)reading;
sval->integer = val & 0xFF;
return SENSOR_READ_SUCCESS;
}
uint8_t nvme_init(uint8_t sensor_num)
{
sensor_config[SensorNum_SensorCfg_map[sensor_num]].read = nvme_read;
return SENSOR_INIT_SUCCESS;
}