inwudriver-weibo/bsp/drivers/tsensor/tsensor.c

120 lines
4.0 KiB
C

/*
* Copyright (c) CompanyNameMagicTag 2019-2019. All rights reserved.
* Description: tsensor driver implementatioin.
* Author: CompanyName
* Create: 2019-06-03
*/
#include "tsensor.h"
#include <soc_mdm_tsensor.h>
#include <soc_mdm_time.h>
#include <dw21_platform_rom.h>
typedef struct {
td_u64 start_tick;
td_bool tsensor_start;
td_u8 pad[7]; /* reserved 7B */
} ext_tsensor_start_s;
ext_tsensor_start_s g_tsensor_state;
td_u32 uapi_tsensor_start(ext_tsensor_mode mode, td_u32 ms)
{
td_u32 tmp_val = 0;
if (mode >= EXT_TSENSOR_MODE_MAX) {
return EXT_ERR_INVALID_PARAMETER;
}
if (ms % 2 != 0) { /* 2 */
return EXT_ERR_INVALID_PARAMETER;
}
ms = ms / 2; /* 2 */
/* stop tsensor */
uapi_tsensor_stop();
UAPI_REG_READ32(EXT_TSENSOR_REG_BASE + TSENSOR_TEMPEN_CTL, tmp_val);
tmp_val &= 0xFFFF00FF;
tmp_val |= (td_u32)ms << 8; /* 8 */
UAPI_REG_WRITE32(EXT_TSENSOR_REG_BASE + TSENSOR_TEMPEN_CTL, tmp_val);
if (mode == EXT_TSENSOR_MODE_16_POINTS_SINGLE) {
ext_reg_setbit(EXT_TSENSOR_REG_BASE + TSENSOR_TEMPEN_CTL, TSENSOR_TEMPEN_CTL_SINGLE);
} else if (mode == EXT_TSENSOR_MODE_16_POINTS_LOOP) {
ext_reg_setbit(EXT_TSENSOR_REG_BASE + TSENSOR_TEMPEN_CTL, TSENSOR_TEMPEN_CTL_LOOP);
} else if (mode == EXT_TSENSOR_MODE_1_POINT_LOOP) {
ext_reg_setbit(EXT_TSENSOR_REG_BASE + TSENSOR_TEMPEN_CTL, TSENSOR_TEMPEN_CTL_LOOP);
ext_reg_setbit(EXT_TSENSOR_REG_BASE + TSENSOR_TEMPEN_CTL, TSENSOR_TEMPEN_CTL_CNT16_BYPASS);
}
g_tsensor_state.start_tick = uapi_get_tick64();
g_tsensor_state.tsensor_start = TD_TRUE;
return EXT_ERR_SUCCESS;
}
EXT_PRV td_float uapi_tsensor_code_to_temperature(td_u16 code)
{
return (td_float)((code - TSENSOR_LOW_CODE_VALUE) * TSENSOR_TEMPERATURE_D_VALUE /
(td_float)TSENSOR_CODE_D_VALUE +
TSENSOR_TEMPERATURE_LOW);
}
EXT_PRV td_u16 uapi_tsensor_temperature_to_code(td_float temp)
{
if (temp < TSENSOR_TEMPERATURE_LOW || temp > TSENSOR_TEMPERATURE_HIGH) {
return EXT_TSENSOR_INVALID_CODE;
}
return (td_u16)((temp - TSENSOR_TEMPERATURE_LOW) * (td_float)TSENSOR_CODE_D_VALUE / TSENSOR_TEMPERATURE_D_VALUE) +
TSENSOR_LOW_CODE_VALUE;
}
td_u32 uapi_tsensor_set_outtemp_threshold(td_float low_temp, td_float high_temp)
{
if ((low_temp < TSENSOR_TEMPERATURE_LOW) || (high_temp > TSENSOR_TEMPERATURE_HIGH)
|| (low_temp > high_temp)) {
return EXT_ERR_INVALID_PARAMETER;
}
/* write temp code low and high limit */
td_u16 high_temp_code = (td_u16)uapi_tsensor_temperature_to_code(high_temp);
td_u16 low_temp_code = (td_u16)uapi_tsensor_temperature_to_code(low_temp);
td_u32 tmp_val = (td_u32)(high_temp_code << 16) + (td_u32)low_temp_code; /* 16 */
UAPI_REG_WRITE32(EXT_TSENSOR_REG_BASE + TSENSOR_LIMIT_CTL, tmp_val);
return EXT_ERR_SUCCESS;
}
td_u32 uapi_tsensor_read_temperature(td_float *temperature, ext_tsensor_temp num)
{
td_u32 temperature_code = 0;
if (temperature == TD_NULL || num >= EXT_TSENSOR_TEMP_MAX) {
return EXT_ERR_INVALID_PARAMETER;
}
if (g_tsensor_state.tsensor_start == TD_FALSE) {
return EXT_ERR_FAILURE;
}
if (uapi_get_tick64() - g_tsensor_state.start_tick < TSENSOR_DLY_20MS) {
return EXT_ERR_FAILURE;
}
UAPI_REG_READ32(EXT_TSENSOR_REG_BASE + TSENSOR_TEMP0 + ((td_u32)num << 2), temperature_code); /* 2 */
temperature_code &= 0x000003FF;
*temperature = uapi_tsensor_code_to_temperature((td_u16)temperature_code);
return EXT_ERR_SUCCESS;
}
td_void uapi_tsensor_stop(td_void)
{
/* disable tsensor */
ext_reg_clrbit(EXT_TSENSOR_REG_BASE + TSENSOR_TEMPEN_CTL, TSENSOR_TEMPEN_CTL_LOOP);
ext_reg_clrbit(EXT_TSENSOR_REG_BASE + TSENSOR_TEMPEN_CTL, TSENSOR_TEMPEN_CTL_SINGLE);
ext_reg_clrbit(EXT_TSENSOR_REG_BASE + TSENSOR_TEMPEN_CTL, TSENSOR_TEMPEN_CTL_CNT16_BYPASS);
g_tsensor_state.tsensor_start = TD_FALSE;
return;
}