海思35系列平台Tsensor驱动开发(1)驱动编写

free-jdx 2020-09-18 11:28:51 5058
1. 前言

3559平台芯片内部内置了温度传感器,可用于实时检测芯片内部温度;

温度的检测范围为-40~125℃,支持设置温度上下限阈值报警输出。内部温度传感器提供了单次采集模式和循环采集模式两种选择。

软件开发分为驱动和用户态软件开发。

2. 查看芯片datasheet

3. 驱动软件编写

这里使用混杂设备进行驱动编写;

misc_register(&hitsensor_dev);

以下就是具体功能实现,主要根据芯片datasheet转化过来;

(1)设置温度采集模式
copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info));                
SYS_READ(tsensor_reg_base+0x70);   //MISC_CTRL28
if(hitsensor_info.value == 1)
{
    reg_data |= 1 << 30;
}   
else
{
    reg_data &= ~(1 << 30);
}
SYS_WRITEL(tsensor_reg_base+0x70, reg_data); 
(2)设置温度采集周期
copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info));
                tmp = (hitsensor_info.value >> 1) | 0x1;
                tmp = tmp & 0xFF;
                reg_data = SYS_READ(tsensor_reg_base+0x70);             //MISC_CTRL28
                reg_data &= 0xF0FFFFFF;
                reg_data |= tmp << 20;                          
                SYS_WRITEL(tsensor_reg_base+0x70, reg_data); 
(3)设置温度报警上限阈值
copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info));
                reg_data = (hitsensor_info.value&0x3FF) << 10;
                SYS_WRITEL(tsensor_reg_base+0x70, reg_data); 
(4)设置温度报警下线阈值
                copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info));
                reg_data = SYS_READ(tsensor_reg_base+0x70);
                reg_data |= hitsensor_info.value&0x3FF;
                SYS_WRITEL(tsensor_reg_base+0x70, reg_data);  
(5)使能启动温度采集
copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info));                
                reg_data = SYS_READ(tsensor_reg_base+0x70);     //MISC_CTRL28
                if(hitsensor_info.value == 1)
                {
                    reg_data |= 1 << 31;
                }   
                else
                {
                    reg_data &= ~(1 << 31);
                }
                SYS_WRITEL(tsensor_reg_base+0x70, reg_data);
(6)读取CPU温度值
copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info));
                tmp = SYS_READ(tsensor_reg_base+0x78);      //MISC_CTRL30
                hitsensor_info.value = tmp & 0x3FF;         
                copy_to_user((void __user *)arg, &hitsensor_info, sizeof(Hi_Tsensor_info));
            }
(7)读取温度报警上限标志
copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info));        
                tmp = SYS_READ(tsensor_reg_base+0x74);              //MISC_CTRL29
                hitsensor_info.value = tmp & 0x1;
                copy_to_user((void __user *)arg, &hitsensor_info, sizeof(Hi_Tsensor_info));
(8)读取温度报警下限标志
    copy_from_user(&hitsensor_info, (Hi_Tsensor_info*)arg, sizeof(Hi_Tsensor_info));                    
                tmp = SYS_READ(tsensor_reg_base+0x74);        //MISC_CTRL29
                hitsensor_info.value = (tmp >> 1) & 0x1;
                copy_to_user((void __user *)arg, &hitsensor_info, sizeof(Hi_Tsensor_info));

至此驱动的具体功能都已实现

4. 驱动编译

这里驱动可以不放在内核编译;
可以参考35xx平台的驱动编译方式;
路径如下:
drv/interdrv/sysconfig 【以sysconfig驱动为例】
参考这个Makefile即可

指定内核路径:
KERNELDIR ?=/xxx/osdrv/opensource/kernel/linux-4.9.y_multi-core

指定交叉工具链:
CROSS_COMPILE ?=aarch64-himix100-linux-

完整Makefile如下

DRIVER_NAME = hi_tsensor

PWD       = $(shell pwd)
export ARCH=arm64

CROSS_COMPILE   ?=aarch64-himix100-linux-

#KERNELDIR ?= /lib/modules/$(shell uname -r)/build
KERNELDIR ?=/xxx/xxx/osdrv/opensource/kernel/linux-4.9.y_multi-core
EXE                     = $(DRIVER_NAME).ko

obj-m := $(DRIVER_NAME).o
hi_tsensor-objs := Hi_Tsensor.o

.PHONY: all
all:
        @echo "  Making $@ ..."
ifneq ($(CROSS_COMPILE),)
        $(MAKE)  CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modules
else
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
ifneq ($(OUT),)
        cp -f $(EXE) $(OUT)/
endif
ifneq ($(INC),)
        cp -f *.h $(INC)/
endif

.PHONY: clean
clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules.order Module.symvers *.ko.unsigned

depend .depend dep:
        $(CC) $(CFLAGS) -M *.c > .depend

ifeq (.depend,$(wildcard .depend))
        include .depend
endif

编译完成,生成驱动ko文件

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
free-jdx
红包 1 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区