当前位置: 首页 > news >正文

hi3519dv500 Tsensor驱动

hi3519dv500 Tsensor驱动

目录

  • 1. 前言
  • 2. Tsensor驱动
    • 2.1 需求
    • 2.2 实现方式
      • 2.2.1 芯片寄存器地址定义
      • 2.2.2 读取芯片内部温度实现
      • 2.2.3 配置Tsensor寄存器实现
    • 2.3 编译使用

1. 前言

完整tsensor驱动代码地址在:https://github.com/scavenger-caesar/hi3519dv500_tsensor_driver

user space的app代码地址: https://github.com/scavenger-caesar/hi3519dv500_tsensor_app

公司的hi3519dv500 soc产品高温拍照/拉流会发生死机情况, 想要读取芯片内部温度。查看了海思释放的文档和代码,居然使用率这么高的功能没有驱动! 那只能手搓一个来用一下。由于我用的是电鸿系统(看着像是openharmony系统改出来的), 后续的文件路径均是基于电鸿系统SDK的路径演示, 海思原生SDK的相对路径差不多一样

2. Tsensor驱动

2.1 需求

  1. 读取芯片内部温度
  2. 配置Tsensor寄存器

需求很简单, 所以也尽量用简单的方式实现。用字符设备驱动就可以实现上述的功能; 电鸿SDK如果想要添加使用设备树的驱动需要打成patch再添加到海思patch处理逻辑里,极其麻烦!所以使用和sys_config一样的module_init加载方式, 用misc驱动简单快速的实现Tsensor寄存器数据读写, 因为misc驱动可以省去字符设备注册的部分操作,只需专注于Tsensor寄存器读写(file_operations功能实现)即可

2.2 实现方式

简略实现如下:

module_init 加载驱动
|__misc_register   注册字符设备节点,给user space提供读写节点|__file_operations  实现Tsensor寄存器读写操作细节

2.2.1 芯片寄存器地址定义

从海思释放的《Hi3519DV500 超高清智慧视觉 SoC 用户指南.pdf》文档里3.11.10~3.11.11章节可以得知tsensor寄存器的基地址为:0x01102a000,并推断出长度为: 0x50(0x4c + 0x04,0x4c为最后一个寄存器的偏移地址,0x04为最后一个寄存器占用的长度);代码上就用一个结构体定义出完整的reg map再用devm_ioremap函数映射一下IO地址即可, 示例片段如下:

#define TSENSOR_BASE                    (0x01102a000)
#define TSENSOR_SIZE                    (0x50)
...
struct tsensor_regs {u32 ctrl0;          /* 0x00 */u32 ctrl1;          /* 0x04 */u32 ctrl2;          /* 0x08 */u32 ctrl3;          /* 0x0C */u32 ctrl4;          /* 0x10 */u32 ctrl5;          /* 0x14 */u32 reserved0[2];  /* 0x18, 0x1C */u32 int_mask;      /* 0x20 */u32 int_clr;       /* 0x24 */u32 int_raw;       /* 0x28 */u32 int_stat;      /* 0x2C */u32 reserved1[4];  /* 0x30–0x3C */u32 ctrl6;         /* 0x40 */u32 ctrl7;         /* 0x44 */u32 ctrl8;         /* 0x48 */u32 ctrl9;         /* 0x4C */
};
struct tsensor_priv {struct mutex lock; // 确保写操作原子性struct tsensor_regs __iomem *regs; // tsensor reg map
};...
static int __init ot_tsensor_init(void)
{...struct tsensor_priv *tpriv = NULL;...tpriv->regs = devm_ioremap(this_dev, TSENSOR_BASE, TSENSOR_SIZE);...
}

2.2.2 读取芯片内部温度实现

为了方便cat直接读取节点获取温度,需要实现file_operations的read操作。根据《Hi3519DV500 超高清智慧视觉 SoC 用户指南.pdf》文档说明,ctrl2 result0 为最新温度值,read操作里最简单的实现方法就是只读取这个寄存器即可。

2.2.3 配置Tsensor寄存器实现

寄存器配置特别适合使用file_operations的ioctl操作实现,代码片段如下:
tsensor.h

#ifndef __TSENSOR_H
#define __TSENSOR_H#include <linux/ioctl.h>
#include <linux/types.h>#define TSENSOR_MAGIC               'g'/* ioctl numbers for /dev/ot_tsensor */
#define GET_TSENSOR_EN              _IOR(TSENSOR_MAGIC, 0, __u8)
#define SET_TSENSOR_EN              _IOW(TSENSOR_MAGIC, 1, __u8)
#define GET_TSENSOR_MONITOR_EN      _IOR(TSENSOR_MAGIC, 2, __u8)
#define SET_TSENSOR_MONITOR_EN      _IOW(TSENSOR_MAGIC, 3, __u8)#define TSENSOR_EN                  BIT(31)
#define TSENSOR_MONITOR_EN          BIT(30)#endif /* __TSENSOR_H */

tsensor.c

...
static long tsensor_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{struct miscdevice *mdev = file->private_data;struct tsensor_priv *tpriv = dev_get_drvdata(mdev->this_device);u32 reg_value;__u8 val;int ret = 0;if (!tpriv || !tpriv->regs)return -ENODEV;mutex_lock(&tpriv->lock);switch(cmd){case GET_TSENSOR_EN:reg_value = readl(&tpriv->regs->ctrl0);val = (reg_value & TSENSOR_EN) ? 1 : 0;if (copy_to_user((__u8 __user *)arg, &val, sizeof(__u8)))ret = -EFAULT;break;case SET_TSENSOR_EN:if (copy_from_user(&val, (__u8 __user *)arg, sizeof(__u8))){ret = -EFAULT;break;}val = !!val;if (val)writel(readl(&tpriv->regs->ctrl0) | TSENSOR_EN, &tpriv->regs->ctrl0);elsewritel(readl(&tpriv->regs->ctrl0) & ~TSENSOR_EN, &tpriv->regs->ctrl0);break;case GET_TSENSOR_MONITOR_EN:reg_value = readl(&tpriv->regs->ctrl0);val = (reg_value & TSENSOR_MONITOR_EN) ? 1 : 0;if (copy_to_user((__u8 __user *)arg, &val, sizeof(__u8)))ret = -EFAULT;break;case SET_TSENSOR_MONITOR_EN:if (copy_from_user(&val, (__u8 __user *)arg, sizeof(__u8))){ret = -EFAULT;break;}val = !!val;if (val)writel(readl(&tpriv->regs->ctrl0) | TSENSOR_MONITOR_EN, &tpriv->regs->ctrl0);elsewritel(readl(&tpriv->regs->ctrl0) & ~TSENSOR_MONITOR_EN, &tpriv->regs->ctrl0);break;}mutex_unlock(&tpriv->lock);return 0;
}
...

2.3 编译使用

示例展示的是电鸿SDK的目录结构

编译目录结构

编译目录结构

../source/cfg.mak

export CONFIG_OT_LSADC=y
export CONFIG_OT_WDG=y
export CONFIG_OT_SYSCFG=y
+ export CONFIG_OT_TSENSOR=y

../source/interdrv/Makefile

    sub_dir += sysconfig
endif+ifeq ($(CONFIG_OT_TSENSOR), y)
+    sub_dir += tsensor
+endifclean_dir:= $(foreach dir, $(sub_dir), $(patsubst %, %_clean, $(dir))).PHONY: all clean $(sub_dir) $(clean_dir)

..source/out/include/autoconf.h

	#define CONFIG_OT_LSADC 1
#define CONFIG_OT_WDG 1
#define CONFIG_OT_SYSCFG 1
+#define CONFIG_OT_TSENSOR 1/** Debug Config

做完这些修改后就可以使用openharmony的hb编译方式编译生成ot_tsensor.ko文件, 放入设备后用insmod命令即可加载驱动

http://www.jsqmd.com/news/425048/

相关文章:

  • 基于深度学习的YOLO目标检测+智能计数系统之木材数量计数图像数据集 树木卡车图像计数数据集 detr图像数据集第10115期
  • TinyTeams.xyz:小团队创造大奇迹的科技名人堂
  • 基于机器学习的无人机的人群密度分析图像数据集 人员密度图像识别 无人机巡逻巡检人群数据集 cnn人员密度检测
  • 对于 UTF-16 的高低代理项码点的解析
  • 具身智能2026年产业图谱:智平方引领下的技术分化与价值落地
  • 春晚带火具身智能!2026 核心技术推荐 五强企业解锁智能新未来
  • PMMA塑料光纤怎么提高耐热性
  • 【系统分析师】10.4 问题分析
  • DSA期末考情分析
  • 实战笔记】手把手拆解S7-1200四轴伺服控制系统
  • 2026线上英语启蒙课实测对比:这几家最靠谱,家长闭眼选不踩坑 - 品牌测评鉴赏家
  • 线上英语机构剑桥授权教材真假难辨?避坑指南,家长直接抄作业 - 品牌测评鉴赏家
  • 小学生剑桥原版教材线上课推荐|家长实测不踩坑,选课直接抄作业 - 品牌测评鉴赏家
  • 基于 Lexical 实现变量输入编辑器
  • 5个优质线上少儿英语平台推荐!家长闭眼抄作业,选课不踩坑 - 品牌测评鉴赏家
  • 实测精选!2026少儿剑桥英语线上机构推荐,避坑不花冤枉钱 - 品牌测评鉴赏家
  • 中考英语提分慌?4家高口碑辅导机构实测推荐!家长闭眼冲不踩坑 - 品牌测评鉴赏家
  • LangGraph4j 学习系列(6)-并行工作流
  • 不踩坑!2026初中英语辅导机构实测推荐,家长闭眼抄作业 - 品牌测评鉴赏家
  • 2026小学英语辅导机构推荐|家长必看!避开坑,选对机构少走弯路 - 品牌测评鉴赏家
  • 盘点|2026十大高中语文教育机构!家长选课不踩坑,提分有方向 - 品牌测评鉴赏家
  • 高考阅读平均分58%?实测4家顶尖线上机构,避坑不踩雷 - 品牌测评鉴赏家
  • 高考文言文翻译难提分?这几家线上机构帮你逆袭 - 品牌测评鉴赏家
  • 高中文言文线上辅导哪家强?实测4家靠谱机构,避坑不花冤枉钱 - 品牌测评鉴赏家
  • 3 月做题记录
  • 新高考语文写作提分攻略:6家宝藏线上机构实测,精准击破4大写作痛点! - 品牌测评鉴赏家
  • 高中语文阅读提分难?实测五家热门线上机构,避坑指南+精准推荐 - 品牌测评鉴赏家
  • 高中语文阅读提分秘籍:线上辅导机构大揭秘 - 品牌测评鉴赏家
  • 救命!高中语文不用瞎刷题这5个神仙平台,从基础到拔高全搞定 - 品牌测评鉴赏家
  • 齿轮齿条转向器装配图(CAD)