263 lines
7.0 KiB
C
Raw Normal View History

2025-10-10 16:07:00 +08:00
#include <common/bk_include.h>
#include <common/bk_err.h>
#if ((CONFIG_SOC_BK7236XX) || (CONFIG_SOC_BK7239XX) || (CONFIG_SOC_BK7286XX)) && (CONFIG_OTP)
#include <driver/otp.h>
#elif (CONFIG_SOC_BK7256XX)
#include <driver/efuse.h>
#include "modules/chip_support.h"
#endif
#include <os/os.h>
#include <math.h>
#include <stdlib.h>
#include "temp_detect_pub.h"
#include "temp_detect.h"
#include "volt_detect.h"
#include "bk_saradc.h"
#include "sdmadc/sdmadc_driver.h"
#define TAG "sensor"
#define ADC_SWITCH_DELT 2
//TODO: move daemon code in temp_detect.c to this file
#if (CONFIG_TEMP_DETECT || CONFIG_VOLT_DETECT)
typedef struct {
beken_mutex_t lock;
float temperature;
float voltage;
} MCU_SENSOR_INFO;
MCU_SENSOR_INFO g_sensor_info;
#endif
#if ((CONFIG_SOC_BK7236XX) || (CONFIG_SOC_BK7239XX) || (CONFIG_SOC_BK7286XX)) && (CONFIG_OTP)
static bk_err_t bk_sensor_load_adc_cali_value(void)
{
uint16_t values[2];
bk_err_t result;
result = bk_otp_apb_read(OTP_GADC_CALIBRATION, (uint8_t *)&values, sizeof(values));
if ((result != BK_OK) || (values[0] == 0) || (values[1] == 0)) {
BK_LOGW(TAG, "uncali saradc value:[%x %x]\r\n", values[0], values[1]);
goto LOAD_SDMADC;
}
BK_LOGI(TAG, "saradc low value:[%x]\r\n", values[0]);
BK_LOGI(TAG, "saradc high value:[%x]\r\n", values[1]);
saradc_set_calibrate_val(&values[0], SARADC_CALIBRATE_LOW);
saradc_set_calibrate_val(&values[1], SARADC_CALIBRATE_HIGH);
LOAD_SDMADC:
result = bk_otp_apb_read(OTP_SDMADC_CALIBRATION, (uint8_t *)&values, sizeof(values));
if ((result != BK_OK) || (values[0] == 0) || (values[1] == 0)) {
BK_LOGW(TAG, "uncali sdmadc value:[%x %x]\r\n", values[0], values[1]);
goto FAILURE;
}
BK_LOGI(TAG, "sdmadc low value:[%x]\r\n", values[0]);
BK_LOGI(TAG, "sdmadc high value:[%x]\r\n", values[1]);
bk_sdmadc_set_calibrate_val(values[0], SARADC_CALIBRATE_LOW);
bk_sdmadc_set_calibrate_val(values[1], SARADC_CALIBRATE_HIGH);
return BK_OK;
FAILURE:
return BK_FAIL;
}
#elif (CONFIG_SOC_BK7256XX)
static bk_err_t bk_sensor_load_adc_cali_value(void)
{
UINT8 values[5];
float data = 0.0;
saradc_calibrate_val saradc_val;
bk_efuse_read_byte(6, &values[0]);
bk_efuse_read_byte(7, &values[1]);
bk_efuse_read_byte(8, &values[2]);
bk_efuse_read_byte(9, &values[3]);
if(((values[0] == 0xFF) && (values[2] == 0xFF))
||((values[0] == 0x00) && (values[1] == 0x00))
||(((values[1] == 0xFF) && (values[3] == 0xFF)) ||((values[1] == 0x00) && (values[3] == 0x00))))
{
BK_LOGW(TAG, "uncali adc value efuse 6,7,8,9:[%2x %02x %02x %02x]\r\n", values[0], values[1], values[2], values[3]);
bk_efuse_read_byte(18, &values[0]);
bk_efuse_read_byte(19, &values[1]);
bk_efuse_read_byte(20, &values[2]);
bk_efuse_read_byte(21, &values[3]);
if(((values[0] == 0xFF) && (values[2] == 0xFF))
||((values[0] == 0x00) && (values[1] == 0x00))
||(((values[1] == 0xFF) && (values[3] == 0xFF)) ||((values[1] == 0x00) && (values[3] == 0x00))))
{
BK_LOGW(TAG, "uncali adc value efuse 18,19,20,21:[%2x %02x %02x %02x]\r\n", values[0], values[1], values[2], values[3]);
bk_efuse_read_byte(12, &values[0]);
bk_efuse_read_byte(13, &values[1]);
bk_efuse_read_byte(14, &values[2]);
bk_efuse_read_byte(15, &values[3]);
if(((values[0] == 0xFF) && (values[2] == 0xFF))
||((values[0] == 0x00) && (values[1] == 0x00))
||(((values[1] == 0xFF) && (values[3] == 0xFF)) ||((values[1] == 0x00) && (values[3] == 0x00))))
{
BK_LOGW(TAG, "uncali adc value efuse 12,13,14,15:[%2x %02x %02x %02x]\r\n", values[0], values[1], values[2], values[3]);
goto FAILURE;
}
else
{
bk_efuse_read_byte(11, &values[4]);
if(CHIP_VERSION_C > bk_get_hardware_chip_id_version())
{
if((values[4]&0xC0) != 0x0)
goto FAILURE;
}
else
{
if((values[4]&0xC0) != 0xC0)
goto FAILURE;
}
}
}
}
saradc_val.low = values[1] & 0xFF;
saradc_val.low = (saradc_val.low << 8) | values[0];
saradc_val.high = values[3] & 0xFF;
saradc_val.high = (saradc_val.high << 8) | values[2];
data = (float)(saradc_val.high) / saradc_val.low;
if(abs(data - ADC_SWITCH_DELT) <= 0.02)
{
g_saradc_flag = 0x1;
}
else
g_saradc_flag = 0x0;
BK_LOGI(TAG, "saradc low value:[%x]\r\n", saradc_val.low);
BK_LOGI(TAG, "saradc high value:[%x]\r\n", saradc_val.high);
saradc_set_calibrate_val(&saradc_val.low, SARADC_CALIBRATE_LOW);
saradc_set_calibrate_val(&saradc_val.high, SARADC_CALIBRATE_HIGH);
return BK_OK;
FAILURE:
return BK_FAIL;
}
#else
static bk_err_t bk_sensor_load_adc_cali_value(void)
{
return BK_FAIL;
}
#endif
bk_err_t bk_sensor_init(void)
{
bk_err_t ret = BK_OK;
bk_sensor_load_adc_cali_value();
#if (CONFIG_TEMP_DETECT || CONFIG_VOLT_DETECT)
if (NULL == g_sensor_info.lock)
{
ret = rtos_init_mutex(&g_sensor_info.lock);
g_sensor_info.voltage = NAN;
g_sensor_info.temperature = NAN;
}
#endif
return ret;
}
bk_err_t bk_sensor_deinit(void)
{
bk_err_t ret = BK_OK;
#if (CONFIG_TEMP_DETECT || CONFIG_VOLT_DETECT)
if (NULL != g_sensor_info.lock)
{
ret = rtos_deinit_mutex(&g_sensor_info.lock);
g_sensor_info.lock = NULL;
g_sensor_info.voltage = NAN;
g_sensor_info.temperature = NAN;
}
#endif
return ret;
}
#if (CONFIG_TEMP_DETECT)
bk_err_t bk_sensor_set_current_temperature(float temperature)
{
if (NULL == g_sensor_info.lock)
{
return BK_ERR_NOT_INIT;
}
rtos_lock_mutex(&g_sensor_info.lock);
g_sensor_info.temperature = temperature;
rtos_unlock_mutex(&g_sensor_info.lock);
return BK_OK;
}
bk_err_t bk_sensor_get_current_temperature(float *temperature)
{
if (NULL == g_sensor_info.lock)
{
return BK_ERR_NOT_INIT;
}
if (isnan(g_sensor_info.temperature))
{
return BK_ERR_TRY_AGAIN;
}
if (NULL == temperature)
{
return BK_ERR_PARAM;
}
rtos_lock_mutex(&g_sensor_info.lock);
*temperature = g_sensor_info.temperature;
rtos_unlock_mutex(&g_sensor_info.lock);
return BK_OK;
}
#endif
#if (CONFIG_VOLT_DETECT)
bk_err_t bk_sensor_set_current_voltage(float voltage)
{
if (NULL == g_sensor_info.lock)
{
return BK_ERR_NOT_INIT;
}
rtos_lock_mutex(&g_sensor_info.lock);
g_sensor_info.voltage = voltage;
rtos_unlock_mutex(&g_sensor_info.lock);
return BK_OK;
}
bk_err_t bk_sensor_get_current_voltage(float *voltage)
{
if (NULL == g_sensor_info.lock)
{
return BK_ERR_NOT_INIT;
}
if (isnan(g_sensor_info.voltage))
{
return BK_ERR_TRY_AGAIN;
}
if (NULL == voltage)
{
return BK_ERR_PARAM;
}
rtos_lock_mutex(&g_sensor_info.lock);
*voltage = g_sensor_info.voltage;
rtos_unlock_mutex(&g_sensor_info.lock);
return BK_OK;
}
#endif