先上code,
--------
/* retV is located at reply_abs_off_0, but it is discarded by the jni fn
* android_tvmanager_native_invoke.
* reply_rel_off_0: c runtime errno with negative sign such as -EINVAL
*/
static gk_s32 getMainBoardTemp(const Parcel &request, Parcel &reply)
{
gk_s32 nRetVal = -1;
int nCrtErrNo = -1;
gk_u32 temperatureRawData = 0, temperatureCelsiusDegree = 0;
do
{
gk_s32 gk_ret = MwDevCtrl::getLsadcInstance()->getValue(1, &temperatureRawData);
if(GK_SUCCESS != gk_ret)
{
nRetVal = -1;
nCrtErrNo = -EIO;
break;
}
/* raw data => celsius degree */
temperatureCelsiusDegree =
1/((std::log((1/(1-(float)temperatureRawData/255)*100000-100000)/100000)/3950) + 1/298.15f) - 273.15f;
nRetVal = 0;
nCrtErrNo = 0;
}while(false);
reply.writeInt32(nCrtErrNo);
if(0 == nCrtErrNo)
{
reply.writeInt32(temperatureRawData);
reply.writeInt32(temperatureCelsiusDegree);
}
return nRetVal;
}
--------
这里ADC测定值temperatureRawData范围是0~255,所以计算时折成比例
temperatureRawData/255
最后计算的temperatureCelsiusDegree就是温度摄氏度。
不同硬件板子的ADC范围可能不同,需要调节上面的255 max值。
实测满足一般主板温度检测用,且成本低廉。