【海思篇】【Hi3516DV300】十八、TSENSOR 芯片温度检测驱动 开发

一 芯片操作步骤

参考<<Hi3516DV300专业型Smart IP Camera SoC用户指南.pdf>>的3.10.5.2 芯片内部温度检测

芯片内部集成温度传感器(T-Sensor),温度的检测范围为-40~125℃。使能温度传感器数
据采集的流程如下:
T-sensor 相关的寄存器为 MISC 寄存器 MISC_CTRL45~MISC_CTRL50。
步骤 1 设置 T-Sensor 采集模式 MISC_CTRL45[30]。
步骤 2 如果设置为循环采集模式,需设置循环采集周期 MISC_CTRL45[27:20];如果设置为单次采集模式,可略过此步骤。
循环采集周期计算公式为:
T = N × 2 (ms)
其中 N=MISC_CTRL45[27:20]。
步骤 3 使能 T-Sensor MISC_CTRL45[31],开始温度采集。
步骤 4 软件读取 T-Sensor 采集到的温度码(十六进制值)。
单次采集模式下,只有 MISC_CTRL47[9:0]中记录的温度记录码 0 有效。
循环采集模式下,MISC_CTRL47[31:0]~MISC_CTRL50[31:0]记录了最近八次温度记录码 0~7,其中最新的温度记录值为温度记录码 0。
步骤 5 根据温度记录码计算出对应的温度值。
Temperature = (tsensor_result − 136)/793 × 165 − 40(℃)

注:tsensor_result 是步骤 4 中获取的温度记录码的十进制值。

二 驱动层实现

主要实现通过寄存器读写实现基本功能和文件设备操作的ioctl

依赖海思系统抽象层smp/a7_linux/osal

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/printk.h>
#include <linux/version.h>
#include <linux/of_platform.h>
#include <linux/types.h>
#include <asm/io.h>
#include "tsensor.h"
#include "hi_osal.h"

#define TSENSOR_MINOR    111

#define SYS_WRITEL(Addr, Value) ((*(volatile unsigned int *)(Addr)) = (Value))
#define SYS_READ(Addr)          (*((volatile int *)(Addr)))

static void  *reg_misc_base   =0;

static int mode  = 0;
static int circletime = 15; 

module_param(mode, int, 0600);
module_param(circletime, int, 0600);

MODULE_PARM_DESC(mode,"0: oneshot, 1: circle");
MODULE_PARM_DESC(circletime,"circle time (actual value = circle time x2) ms");

/* tsensor info */
static struct tsensor_info ident = {
    .support = 1,
    .enable = 0,
    .mode = 0, 
    .circletime = 15,
    .version = 0,
};

static inline void reg_write32(unsigned long value, unsigned long mask, unsigned long addr)
{
    unsigned long t;

    t = SYS_READ((const volatile void *)addr);
    t &= ~mask;
    t |= value & mask;
    SYS_WRITEL((volatile void *)addr, t);
}

/* single mode implement */
static unsigned long tsensor_get_singleshot(void)
{
    unsigned long val;
    reg_write32(0x0<<31, 0x1<<30, (uintptr_t)reg_misc_base+0x00B4); // oneshot mode
    reg_write32(0x0<<31, 0x1<<31, (uintptr_t)reg_misc_base+0x00B4); // tsensor disable
    reg_write32(0x1<<31, 0x1<<31, (uintptr_t)reg_misc_base+0x00B4); // tsensor enable
    
    val = SYS_READ((const volatile void *)reg_misc_base+0x00BC);
    printk("tsensor_get_singleshot val = %lu\n", val&0x3FF);
    return val&0x3FF;
}

/* circle mode implement */
static void tsensor_set_circle(int enable)
{
    unsigned long val;
    reg_write32(0x1<<30, 0x1<<30, (uintptr_t)reg_misc_base+0x00B4); // circle mode
    val = (circletime&0xFF)<<20;
    reg_write32(val, 0x0FF00000, (uintptr_t)reg_misc_base+0x00B4); // circle time
    reg_write32(0x0<<31, 0x1<<31, (uintptr_t)reg_misc_base+0x00B4); // tsensor disable
    if (enable)
    {
        reg_write32(0x1<<31, 0x1<<31, (uintptr_t)reg_misc_base+0x00B4); // tsensor enable
        printk("tsensor circle start\n");
    }
}

/* umap REG_MISC_BASE addr with disable tsensor */
static void tsensor_comm_exit(void)
{ 
    if (NULL != reg_misc_base)
    {
        reg_write32(0x0<<31, 0x1<<31, (uintptr_t)reg_misc_base+0x00B4); // tsensor disable
        
        iounmap(reg_misc_base);
        reg_misc_base = 0;
    }  
}

/* read (single/circle) mode tempeprate */
static void tsensor_update(void)
{
    unsigned long t;

   	/* read tsensor enable */
    t = SYS_READ((const volatile void *)reg_misc_base+0x00B4);
    ident.enable  = (t>>31)&0x1;

    /* read tsensor mode */
    t = SYS_READ((const volatile void *)reg_misc_base+0x00B4);
    ident.mode = (t>>30)&0x1;

    /* read circletime */
    t = SYS_READ((const volatile void *)reg_misc_base+0x00B4);
    ident.circletime = (t>>20)&0xFF;

    /* read temperature, if enable */
    if (ident.enable)
    {
        if (ident.mode) // circle mode
        {
            t = SYS_READ((const volatile void *)reg_misc_base+0x00BC);
            ident.temperature[0] = t&0x3FF;
            ident.temperature[1] = (t>>16)&0x3FF;

            t = SYS_READ((const volatile void *)reg_misc_base+0x00C0);
            ident.temperature[2] = t&0x3FF;
            ident.temperature[3] = (t>>16)&0x3FF;

            t = SYS_READ((const volatile void *)reg_misc_base+0x00C4);
            ident.temperature[4] = t&0x3FF;
            ident.temperature[5] = (t>>16)&0x3FF;

            t = SYS_READ((const volatile void *)reg_misc_base+0x00C8);
            ident.temperature[6] = t&0x3FF;
            ident.temperature[7] = (t>>16)&0x3FF;
        }
        else    // single mode
        {
            reg_write32(0x0<<31, 0x1<<31, (uintptr_t)reg_misc_base+0x00B4); // tsensor disable
            reg_write32(0x1<<31, 0x1<<31, (uintptr_t)reg_misc_base+0x00B4); // tsensor enable
            t = SYS_READ((const volatile void *)reg_misc_base+0x00BC);
            ident.temperature[0] = t&0x3FF;
        }
    }
    else
    {
        memset(ident.temperature, 0x00, sizeof(unsigned int)*8);
    }
}

static int tsensor_open(void *private_data)
{
    return 0;
}

static int tsensor_release(void *private_data)
{
    return 0;
}

static long tsensor_ioctl (unsigned int cmd, unsigned long arg, void *private_data)
{
    void *argp = (void *)arg;
    unsigned long *p = argp;
    unsigned long t;

    switch (cmd) {
        case TSIOC_GETSTATUS: // get tsensor enable/mode/circletime/temperature 
            tsensor_update();
            osal_memcpy(argp, &ident, sizeof(ident));
            return 0;
        case TSIOC_GETENABLE: // get tsensor enable
            t = SYS_READ((const volatile void *)reg_misc_base+0x00B4);
            *p = (t>>31)&0x1;
            return 0;

        case TSIOC_GETMODE:	// get tsensor mode
            t = SYS_READ((const volatile void *)reg_misc_base+0x00B4);
            *p = (t>>30)&0x1;
            return 0;

        case TSIOC_GETCIRCLETIME: // get tsensor circle time
            t = SYS_READ((const volatile void *)reg_misc_base+0x00B4);
            *p = (t>>20)&0xFF;
            return 0;

        case TSIOC_SETENABLE:	// set tsensor enable
            t = *p;
            if (t)
                reg_write32(0x1<<31, 0x1<<31, (uintptr_t)reg_misc_base+0x00B4);
            else
                reg_write32(0x0<<31, 0x1<<31, (uintptr_t)reg_misc_base+0x00B4);
            return 0;

        case TSIOC_SETMODE:	// set tsensor mode
            t = *p;
            if (t)
                reg_write32(0x1<<30, 0x1<<30, (uintptr_t)reg_misc_base+0x00B4);
            else
                reg_write32(0x0<<30, 0x1<<30, (uintptr_t)reg_misc_base+0x00B4);
            return 0;

        case TSIOC_SETCIRCLETIME:	// set tsensor circletime
            t = *p;
            if (t)
                reg_write32(0x1<<20, 0x0FF00000, (uintptr_t)reg_misc_base+0x00B4);
            else
                reg_write32(0x0<<20, 0x0FF00000, (uintptr_t)reg_misc_base+0x00B4);
            return 0;

        default:
            return -1;
    }

}

static struct osal_fileops tsensor_fops = {
 //   .write        = tsensor_write,
//    .ioctl        = tsensor_ioctl,
    .unlocked_ioctl = tsensor_ioctl,
    .open = tsensor_open,
    .release    = tsensor_release,
};

static struct osal_dev *tsensor_miscdev =  NULL;

static int __init hi_tsensor_init(void)
{
    int ret;
    reg_misc_base = (void*)ioremap(0x12030000, 0x10000);
    if (NULL == reg_misc_base)
    {
        goto out;
    }

    if (mode == 0)
    {
        tsensor_get_singleshot();
    }
    else
    {
        tsensor_set_circle(1);
    }

   	// create cdev
    tsensor_miscdev = osal_createdev("tsensor");
    if(NULL == tsensor_miscdev) {
        osal_printk("fail to create dev\n");
        goto out;
    }
    
    // register cdev
    osal_printk("register dev\n");
    tsensor_miscdev->minor = TSENSOR_MINOR;
    tsensor_miscdev->fops = &tsensor_fops;
    ret = osal_registerdevice(tsensor_miscdev);
    if (ret)
    {
        osal_printk("fail to register dev\n");
        goto tsensor_out;
    }

    osal_printk("hi_tsensor_init ok\n");
    return 0;
    
tsensor_out:
    osal_destroydev(tsensor_miscdev);
out:
    tsensor_comm_exit();

    return -1;
}

static void __exit hi_tsensor_exit(void)
{
    // unregister and destroy cdev
    osal_deregisterdevice(tsensor_miscdev);
    osal_destroydev(tsensor_miscdev);
    
    // tsenor disable and umap REG_MISC_BASE addr
    tsensor_comm_exit();
    osal_printk("hi_tsensor_exit ok\n");
    return;
}

module_init(hi_tsensor_init);
module_exit(hi_tsensor_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("WEI(Cameray)");

三 应用层实现

基本功能函数:初始化、获取温度、转换温度、反初始化

/**
* @file    hi_hal_tsensor.c
*/

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <linux/ioctl.h>
#include <sys/ioctl.h>
#include <pthread.h>
#include <sys/prctl.h>

#include "tsensor.h"

#include "hi_appcomm.h"
#include "hi_type.h"
#include "hi_appcomm_util.h"
#include "hi_hal_tsensor.h"
#include "hi_hal_common.h"

#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */


#define HAL_TSENSOR_DEV "/dev/tsensor"
static HI_S32 s_s32HALTSENSORfd = HAL_FD_INITIALIZATION_VAL;

/**
* @brief    init temperature sensor
* @param[in] s32Mode: 0 oneshot, 1 circle 
* @param[in] s32Time_s: circle time, range: [1, 255]
* @return 0 success,non-zero error code.
* @exception    None
* @author    WEI
* @date      2021/02/02
*/
HI_S32 HI_HAL_TSENSOR_Init(HI_S32 s32Mode, HI_S32 s32Time_ms)
{
    HI_S32 s32Ret = HI_SUCCESS;
    if (s_s32HALTSENSORfd != HAL_FD_INITIALIZATION_VAL)
    {
        MLOGE("already init");
        return HI_HAL_EINITIALIZED;
    }

    if (s32Mode < 0 || s32Mode > 1)
    {
        MLOGE("Mode should not be 0 or 1. %d\n", s32Mode);
        return HI_HAL_EINVAL;
    }

    if (s32Time_ms < 1 || s32Time_ms > 255)
    {
        MLOGE("Circle time should not be less then 1 and bigger then 255. %d\n", s32Time_ms);
        return HI_HAL_EINVAL;
    }

    HI_CHAR szString[HI_APPCOMM_MAX_PATH_LEN] = {0};
    snprintf(szString, HI_APPCOMM_MAX_PATH_LEN, " mode=%d circletime=%d", s32Mode, s32Time_ms);

#if defined(__HI3516DV300__) 
    s32Ret = HI_insmod("/komod/tsensor.ko", szString);
    if(HI_SUCCESS != s32Ret && s32Ret != EEXIST)
    {
        MLOGE("insmod tsensor.ko: failed, errno(%d)\n", s32Ret);
        return HI_HAL_EINTER;
    }
#endif

    s_s32HALTSENSORfd = open(HAL_TSENSOR_DEV, O_RDWR);

    if (s_s32HALTSENSORfd < 0)
    {
        MLOGE("open [%s] failed\n",HAL_TSENSOR_DEV);
        return HI_HAL_EINVOKESYS;
    }

    s32Ret = ioctl(s_s32HALTSENSORfd, TSIOC_SETMODE, &s32Mode);
    if(-1 == s32Ret)
    {
        MLOGE("TSIOC_SETMODE: failed, errno(%d)\n", errno);
        return HI_HAL_EINTER;
    }
    MLOGI(BLUE"TSIOC_SETMODE: mode=%ds\n"NONE, s32Mode);

    s32Ret = ioctl(s_s32HALTSENSORfd, TSIOC_SETCIRCLETIME, &s32Time_ms);/**feed dog */
    if(-1 == s32Ret)
    {
        MLOGE("TSIOC_SETCIRCLETIME: failed, errno(%d)\n", errno);
        return HI_HAL_EINTER;
    }
    MLOGI(BLUE"TSIOC_SETMODE: mode=%ds\n"NONE, s32Time_ms);

    HI_U32 u32Enable = 1;
    s32Ret = ioctl(s_s32HALTSENSORfd, TSIOC_SETENABLE, &u32Enable);/**feed dog */
    if(-1 == s32Ret)
    {
        MLOGE("TSIOC_SETENABLE: failed, errno(%d)\n", errno);
        return HI_HAL_EINTER;
    }

    return HI_SUCCESS;
}

/**
* @brief    get temerature
* @param[out] pau32Temp: temperatue array, array size is 8. oneshot valid size is 1, circle valid size is 8.
* @return 0 success,non-zero error code.
* @exception    None
* @author    WEI
* @date      2021/02/02
*/
HI_S32 HI_HAL_TSENSOR_GetTemp(HI_U32 *pau32Temp)
{
    HI_S32 s32Ret = HI_SUCCESS;
    HI_S32 i;
    struct tsensor_info tsensor_info = {0};

    HI_APPCOMM_CHECK_POINTER(pau32Temp, HI_FAILURE);
    
    s32Ret = ioctl(s_s32HALTSENSORfd, TSIOC_GETSTATUS, &tsensor_info);
    if(-1 == s32Ret)
    {
        MLOGE("TSIOC_GETSTATUS: failed, errno(%d)\n", errno);
        return HI_HAL_EINTER;
    }

    memset(pau32Temp, 0x00, sizeof(HI_U32)*8);
    if (tsensor_info.mode) 
    {
        for (i = 0; i < ARRAY_SIZE(tsensor_info.temperature); i++)
        {
            pau32Temp[i] = tsensor_info.temperature[i];
        }
    }
    else
    {
        pau32Temp[0] = tsensor_info.temperature[i];
    }
    return HI_SUCCESS;
}
/**
* @brief    actual temperature convert
* @param[in] u32Temp: param from HI_HAL_TSENSOR_GetTemp
* @return float temperature. range: [-40, 125], other is invalid!
* @exception    None
* @author    WEI
* @date      2021/02/02
*/
HI_DOUBLE HI_HAL_TSENSOR_Convert(HI_U32 u32Temp)
{
    HI_DOUBLE fRet = u32Temp;
    fRet = (fRet - 136)/793*165 - 40;
    return fRet;
}

/**
* @brief    destroy tsensor task
* @return 0 success,non-zero error code.
* @exception    None
* @author    WEI
* @date      2021/02/02
*/
HI_S32 HI_HAL_TSENSOR_Deinit(HI_VOID)
{
    HI_S32 s32Ret;

    if (s_s32HALTSENSORfd == HAL_FD_INITIALIZATION_VAL)
    {
        MLOGE("tsensor not initialized,no need to close\n");
        return HI_HAL_ENOINIT;
    }
    s32Ret = close(s_s32HALTSENSORfd);
    if (0 > s32Ret)
    {
        MLOGE("tsensor fd[%d] close,fail,errno(%d)\n",s_s32HALTSENSORfd,errno);
        return HI_HAL_EINVOKESYS;
    }
    s_s32HALTSENSORfd = HAL_FD_INITIALIZATION_VAL;
    return HI_SUCCESS;
}

#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */

四 测试

int HI_PDT_TEST_TSENSOR()
{
    printf("tsensor in 100s\n");
    HI_S32 s32Cnt = 100;
    plan(102);
    cmp_ok(HI_HAL_TSENSOR_Init(1, 100), "==", 0, "HI_HAL_TSENSOR_Init");

    while(s32Cnt--)
    {
        HI_U32 au32Temp[8];
        cmp_ok(HI_HAL_TSENSOR_GetTemp(au32Temp), "==", 0, "HI_HAL_TSENSOR_GetTemp");
        printf("Temp[%f]: %d, %d, %d, %d, %d, %d, %d, %d\n", HI_HAL_TSENSOR_Convert(au32Temp[0]),
            au32Temp[0], au32Temp[1], au32Temp[2], au32Temp[3], 
            au32Temp[4], au32Temp[5], au32Temp[6], au32Temp[7]);
        sleep(1);
    }
    
    cmp_ok(HI_HAL_TSENSOR_Deinit(), "==", 0, "HI_HAL_TSENSOR_Deinit");
    done_testing();
}
tsensor in 100s
1..102
[04:25:01:671 ERROR-]:HI_insmod[212]:can't insert '/komod/tsensor.ko': File exists
[04:25:01:671 INFO-]:HI_HAL_TSENSOR_Init[82]:WDIOC_SETMODE: mode=1s
[04:25:01:671 INFO-]:HI_HAL_TSENSOR_Init[90]:WDIOC_SETMODE: mode=100s
ok 1 - HI_HAL_TSENSOR_Init
ok 2 - HI_HAL_TSENSOR_GetTemp
Temp[55.920555]: 597, 596, 597, 596, 597, 596, 597, 597
ok 3 - HI_HAL_TSENSOR_GetTemp
Temp[55.712484]: 596, 597, 597, 597, 597, 597, 597, 596
ok 4 - HI_HAL_TSENSOR_GetTemp
Temp[55.712484]: 596, 597, 597, 597, 597, 597, 597, 596
ok 5 - HI_HAL_TSENSOR_GetTemp
Temp[55.920555]: 597, 597, 596, 597, 596, 596, 597, 597
ok 6 - HI_HAL_TSENSOR_GetTemp
Temp[55.920555]: 597, 597, 597, 596, 597, 597, 597, 597
ok 7 - HI_HAL_TSENSOR_GetTemp
Temp[55.920555]: 597, 597, 597, 597, 597, 597, 597, 597
ok 8 - HI_HAL_TSENSOR_GetTemp
Temp[55.920555]: 597, 597, 597, 596, 596, 597, 597, 596
ok 9 - HI_HAL_TSENSOR_GetTemp
Temp[54.047919]: 588, 588, 588, 588, 588, 588, 589, 589
ok 10 - HI_HAL_TSENSOR_GetTemp
Temp[53.007566]: 583, 583, 583, 583, 582, 583, 583, 582
ok 11 - HI_HAL_TSENSOR_GetTemp
Temp[53.423707]: 585, 585, 585, 585, 585, 585, 584, 584
ok 12 - HI_HAL_TSENSOR_GetTemp
Temp[54.464061]: 590, 590, 590, 590, 590, 590, 590, 590
ok 13 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 14 - HI_HAL_TSENSOR_GetTemp
Temp[54.047919]: 588, 589, 589, 589, 589, 590, 590, 590
ok 15 - HI_HAL_TSENSOR_GetTemp
Temp[52.591425]: 581, 581, 581, 581, 581, 581, 581, 582
ok 16 - HI_HAL_TSENSOR_GetTemp
Temp[51.967213]: 578, 579, 579, 579, 579, 579, 579, 579
ok 17 - HI_HAL_TSENSOR_GetTemp
Temp[51.967213]: 578, 578, 578, 578, 578, 578, 578, 578
ok 18 - HI_HAL_TSENSOR_GetTemp
Temp[52.383354]: 580, 580, 580, 580, 580, 580, 580, 580
ok 19 - HI_HAL_TSENSOR_GetTemp
Temp[53.215637]: 584, 585, 585, 584, 584, 585, 585, 584
ok 20 - HI_HAL_TSENSOR_GetTemp
Temp[53.839849]: 587, 586, 587, 587, 587, 587, 587, 587
ok 21 - HI_HAL_TSENSOR_GetTemp
Temp[54.047919]: 588, 588, 588, 588, 588, 588, 588, 588
ok 22 - HI_HAL_TSENSOR_GetTemp
Temp[54.255990]: 589, 589, 589, 589, 589, 589, 589, 589
ok 23 - HI_HAL_TSENSOR_GetTemp
Temp[54.464061]: 590, 590, 590, 590, 590, 590, 590, 590
ok 24 - HI_HAL_TSENSOR_GetTemp
Temp[54.464061]: 590, 590, 590, 590, 590, 590, 590, 590
ok 25 - HI_HAL_TSENSOR_GetTemp
Temp[54.464061]: 590, 590, 591, 590, 591, 591, 591, 590
ok 26 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 27 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 28 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 29 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 592, 591
ok 30 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 592, 592, 591, 591, 591
ok 31 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 591, 592, 591, 591, 592
ok 32 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 33 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 591, 592, 592, 592, 592
ok 34 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 591, 592, 592, 592, 591
ok 35 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 591, 591, 592, 591, 592
ok 36 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 591, 591, 591, 591, 592, 592, 592
ok 37 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 591, 591, 592, 592, 592, 591, 591
ok 38 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 592, 592, 591, 592, 592, 592
ok 39 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 592, 592, 592, 592, 592, 591, 591
ok 40 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 591, 591, 592, 592, 591, 591, 592
ok 41 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 591, 592, 592, 592
ok 42 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 591, 591, 591, 591, 591, 592, 592
ok 43 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 44 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 591, 591, 591, 591, 591, 591, 592
ok 45 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 591, 591, 591, 591, 591, 591, 591
ok 46 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 47 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 48 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 49 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 50 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 590, 591, 591
ok 51 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 52 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 53 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 54 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 590, 591
ok 55 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 590, 591, 591
ok 56 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 57 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 590, 591
ok 58 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 59 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 60 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 61 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 62 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 63 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 64 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 65 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 66 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 67 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 68 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 592, 592, 591, 591, 591, 591, 591
ok 69 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 591, 591, 591, 591, 591, 591
ok 70 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 592, 591, 591, 592, 591, 592
ok 71 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 591, 592, 591, 591, 591, 591, 591
ok 72 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 592, 591, 592, 592, 592, 592, 591
ok 73 - HI_HAL_TSENSOR_GetTemp
Temp[54.672131]: 591, 592, 592, 592, 592, 592, 592, 591
ok 74 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 591, 592, 591
ok 75 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 591, 591, 591, 591, 592, 592, 592
ok 76 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 77 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 591, 592, 592, 591, 591
ok 78 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 79 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 591, 591, 592, 592, 592, 592, 592
ok 80 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 81 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 591, 592, 592, 591, 592, 592, 591
ok 82 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 83 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 84 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 85 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 86 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 591, 592, 592
ok 87 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 88 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 89 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 90 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 591, 592, 592, 592, 592, 592
ok 91 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 92 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 93 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 94 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 95 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 96 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 97 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 98 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 99 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 592
ok 100 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 593, 592, 592, 592, 592, 592, 592
ok 101 - HI_HAL_TSENSOR_GetTemp
Temp[54.880202]: 592, 592, 592, 592, 592, 592, 592, 593
ok 102 - HI_HAL_TSENSOR_Deinit
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
海思 Hi3516DV300是一款先进的视频处理芯片,用于安防监控、智慧家居、智能交通等领域。它具有高性能、低功耗和丰富的接口,并支持多种视频流输出格式。 关于Hi3516DV300的软硬件全套开发资料,海思官方提供了以下内容: 1. 芯片规格书:详细介绍了Hi3516DV300的主要技术参数、功能特性以及接口说明,可以帮助开发者了解和配置芯片。 2. 硬件设计指导:包括原理图、PCB布局、外围电路等设计资料,帮助开发者进行硬件开发,确保电路的正常运行和性能优化。 3. 软件开发指南:提供了丰富的软件开发资料,包括操作系统、驱动程序、应用程序等。其中,操作系统开发指南介绍了如何配置和使用Linux系统,驱动程序开发指南说明了如何编写和调试设备驱动程序,应用程序开发指南提供了开发示例和编程接口。 4. 示例代码和工具链:提供了各类示例代码,如图像处理、视频编码等,可供开发者参考和测试。同时,还提供了适用于Hi3516DV300的交叉编译工具链,方便开发者在主机上编译和调试代码。 5. SDK(软件开发工具包):包括完整的软件库和开发工具,帮助开发者构建应用程序。SDK提供了丰富的API接口和函数库,简化了开发流程,缩短了开发周期。 综上所述,海思Hi3516DV300提供了全套的软硬件开发资料,涵盖了芯片规格、硬件设计、软件开发、示例代码等方面,为开发者提供了丰富的参考和支持,帮助他们更好地进行产品开发和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值