linux驱动学习(十二)之看门狗

news2024/10/6 12:34:19

一、看门狗定时器功能

1、产生复位信号:当系统受到由于噪声或者干扰而造成系统死机,看门狗产生一个复位信号。

2、普通定时器:16bits定时器,产生周期性的中断信号

二、看门狗系统框图

设置计数值以每隔10S就会产生一个复位信号:

第一分频值:PCLK/256 ---> 255+1 ---->781250
第二次分频值:128 ----> 781250/128 -->6103
计数值:6103 * 10 ---> 61030 不能大于 65536(0-65535) 16bits

三、看门狗定时器相关的寄存器

1、WTCON(控制寄存器)

2、WTDAT(数据寄存器)

3、WTCNT(计数寄存器)

4、WTCLRINT(清中断寄存器)

四、编程

#define WDT_START  _IO('W',0)
#define WDT_KEEPALIVE  _IO('W',1)
#define WDT_STOP  _IO('W',2)

static struct resource *gec6818_wdt_res = NULL;
static void __iomem *wdt_va_base = NULL; 
static void __iomem *wdt_va_con = NULL;//WDTCON  0XC0019000
static void __iomem *wdt_va_dat = NULL; //WDTDAT 0XC0019004
static void __iomem *wdt_va_cnt = NULL; //WDTCNT 0XC0019008
static void __iomem *wdt_va_clrint = NULL; //WTCLRINT 0XC001900C
static struct clk	*wdt_clock;
static unsigned long wdt_freq;

long gec6818_wdt_ioctl(struct file *file, unsigned int cmd, unsigned long args)
{
	printk("gec6818_wdt_ioctl\n");
	switch(cmd){
	case WDT_START:
		printk("WDT_START\n");
	    *(unsigned int*)wdt_va_con = (255<<8) | (3<<3) | (1<<2) | (1<<0);  //[15:8] [4:3] [2] [0]
		*(unsigned int*)wdt_va_con |= (1<<5); //开启看门狗功能
		break;
	case WDT_KEEPALIVE:
	    *(unsigned int*)wdt_va_cnt = 0XEE66;
		break;
	case WDT_STOP:
	    *(unsigned int*)wdt_va_cnt = 0;
		break;	
	default:
		return -ENOIOCTLCMD;/* No ioctl command */
		break;
	}
	
	return 0;
}

//[2]
static struct file_operations gec6818_wdt_ops = {
	.owner = THIS_MODULE,
	.open = gec6818_wdt_open,
	.unlocked_ioctl = gec6818_wdt_ioctl,
	.release = gec6818_wdt_release,//当应用程序调用close时,执行驱动程序中的接口函数
};

//[1] 定义混杂设备
static struct miscdevice wdt_misc = {
		.name = "wdt_drv",  //设备文件的名字
		.fops = &gec6818_wdt_ops,
		.minor = MISC_DYNAMIC_MINOR, //设置次设备号,MISC_DYNAMIC_MINOR --- 表示由系统动态分配一个次设备号
};
static int __init gec6818wdt_init(void) //执行insmod执行一次
{
	int ret;
	 // char temp;
	printk("gec6818wdt_init\n");
	//[3] 注册混杂设备
	 ret = misc_register(&wdt_misc);
	  if(ret < 0)
	  {
		  printk("misc_register error\n");
		  ret = -EBUSY;
		  goto misc_register_error;
	  }
	//申请物理内存区
	gec6818_wdt_res = request_mem_region(0XC0019000,0x1000,"WDTC_MEM");
	
	if(gec6818_wdt_res == NULL)
	{
		printk("request_mem_region error\n");
		ret = -EBUSY;
		goto request_mem_region_error;
	}
	 //动态映射
	 wdt_va_base = ioremap(0XC0019000,0x1000);
	if(wdt_va_base == NULL)
	{
		printk("ioremap error\n");
		ret = -EFAULT;
		goto ioremap_error;
		
	}
	 wdt_va_con = wdt_va_base + 0x00;
	 wdt_va_dat = wdt_va_base + 0x04;
	 wdt_va_cnt = wdt_va_base + 0x08;
	 wdt_va_clrint = wdt_va_base + 0x0C;
	 
	 /***************给程序设置时钟源*********************/
	 
	 wdt_clock = clk_get(NULL, "pclk");
	if (IS_ERR(wdt_clock)) {
		ret = PTR_ERR(wdt_clock);
		goto err_map;
	}

	clk_enable(wdt_clock);
	wdt_freq = clk_get_rate(wdt_clock);

	printk("wdt_freq = %luHz\n",wdt_freq);

	nxp_soc_peri_reset_set(RESET_ID_WDT);
	nxp_soc_peri_reset_set(RESET_ID_WDT_POR);

	 /**********************************************/
	 //给对应寄存器进行初始化
	 *(unsigned int*)wdt_va_con = 0; //默认看门狗关闭
	 *(unsigned int*)wdt_va_dat = 0XEE66;//61030 ---> 
	 *(unsigned int*)wdt_va_cnt = 0XEE66;
	 *(unsigned int*)wdt_va_clrint = 0;
	 

	return 0;
	err_map:
	ioremap_error:
	release_mem_region(0XC0019000,0x1000);
	gec6818_wdt_res = NULL;
	request_mem_region_error:
	misc_deregister(&wdt_misc);
	misc_register_error:
	return ret;	
}

觉得有帮助的话,打赏一下呗。。

           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1826913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot依赖管理和自动配置

依赖管理和自动配置 依赖管理和自动配置依赖管理什么是依赖管理修改自动仲裁/默认版本号 starter场景启动器starter场景启动器基本介绍官方提供的starter第三方starter 自动配置自动配置基本介绍SpringBoot自动配置了哪些?如何修改默认配置如何修改默认扫描包结构resources\ap…

STM32学习笔记(一)--时钟树详解

&#xff08;1&#xff09;时钟概述&#xff1b;时钟是具有周期性的脉冲信号&#xff0c;最常用的是占空比50%的方波。&#xff08;时钟相当于单片机的脉搏&#xff1b;STM32本身非常复杂&#xff0c;外设非常的多&#xff0c;为了保持低功耗工作&#xff0c;STM32 的主控默认不…

亿达中国武汉园区入选“武汉市科技金融工作站”及“武汉市线下首贷服务站”

近日&#xff0c;武汉市2024科技金融早春行活动在深交所湖北资本市场培育基地举行。会上&#xff0c;第四批武汉市科技金融工作站试点单位名单及第五批武汉地区金融系统线下首贷服务站名单正式公布&#xff0c;武汉软件新城成功入选上述两个名单。 为缓解科技型企业融资难题&a…

远程问诊软件哪款好?选欣九康诊疗系统

近几年国家相继推出了支持发展“互联网医疗”的政策&#xff0c;如今随着相关政策的不断落实推进&#xff0c;市场上涌现出了一大批在线咨询、电子处方和远程问诊的医疗平台&#xff0c;而在面对种类如此繁多的医疗平台究竟选择哪款更好便成了医疗机构非常头疼的事情&#xff0…

【源码】综合股票币币合约交易所源码/etf交易所源码/美股港股台股交易所源码

支持多国语言 全开源可二开的一个版本&#xff01;支持虚拟货币 ETF 外汇 美股 A股 港股 台股。 前端是VUE开发&#xff08;带vue工程源码&#xff09;后端JAVA开发&#xff01;搭建也相对简单。 总的来说功能非常强大&#xff0c;适合线上运营的一个版本&#xff0c;有兴趣的可…

RabbitMQ无法删除unsynchronized队列及解决办法

一、故障环境 操作系统:CentOS7 RabbitMQ:3 nodes Cluster RabbitMQ version: 3.8.12 Erlang Version:22.3 Queue Type:Mirror,with polices 二、故障表现: 2.1 管理界面队列列表中存在部分队列镜像同步状态标红: 2.2 TPS为0,无消费者,其他节点镜像未同步且无法手动…

【SpringBoot】Spring Boot 中高级特性详解

文章目录 1. 异步处理1.1 什么是异步处理&#xff1f;1.2 实现异步处理1.2.1 启用异步支持1.2.2 使用 Async 注解1.2.3 调用异步方法 2. 安全管理2.1 Spring Security 集成2.2 基础安全配置2.2.1 添加依赖2.2.2 默认配置2.2.3 自定义用户认证 3. 监控和调试3.1 Spring Boot Act…

结构体对齐,与 触发 segment fault 为什么是 1024*132 ,而不是1024*128

1, 简单的小示例代码 按理说 malloc 的size 是 1024*128&#xff0c;这里却需要 1024*132才能及时触发 segmentation fault #include <stdlib.h> #include <stdio.h> #define SIZE 1024*131int main() {char *p 0;p malloc(SIZE);p[SIZE -1] a;free(p);printf(…

WWDC 2024 回顾:Apple Intelligence 的发布与解析

一年一度的苹果全球开发者大会&#xff08;WWDC&#xff09;如期而至&#xff0c;2024 年的 WWDC 再次成为科技界的焦点。本次发布会中&#xff0c;苹果正式推出了他们在 AI 领域的全新战略——Apple Intelligence。这一全新概念旨在为用户打造“强大、易用、全面、个性化、注重…

正运动邀您共聚2024深圳激光展,助力激光加工与智能制造!

■展会名称 2024深圳激光展 ■展会日期 2024年6月19日 - 21日 ■展馆地点 深圳国际会展中心&#xff08;新馆&#xff09; ■展位号 9H - D101 6月19至21日&#xff0c;深圳激光展将在中国深圳国际会展中心(新馆)举办。 激光加工在消费电子、光伏锂电新能源、半导体等行…

展厅设计要关注的基本点

1、设计方案 每个企业都会有不同的风格特色&#xff0c;找到一个合适企业的设计方案才是重点&#xff0c;所以在策划设计上要有一套个性化的方案。大到展厅内的结构&#xff0c;小到单个的展陈框架摆放&#xff0c;都要有详细的规划&#xff0c;这样才能够打造出一个效果突出的…

深度学习笔记: 最详尽估算送达时间系统设计

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 估算送达时间 1. 问题陈述 构建一个模型来估算在给定订单详情、市场条件和交通状况下的总送达时间。 为…

探索Docker容器网络

Docker容器已经成为现代应用部署的核心工具。理解Docker的网络模型对于实现高效、安全的容器化应用至关重要。在这篇博客中&#xff0c;我们将深入探讨Docker的网络架构&#xff0c;并通过一些代码例子来揭示其底层实现。 Docker网络模式 Docker提供了多种网络模式&#xff0c…

大模型系列:C-Eval中文大模型评测数据集介绍和实践

前言 C-Eval是目前权威的中文AI大模型评测数据集之一&#xff0c;用于考察大模型的知识和推理能力&#xff0c;本篇对C-Eval数据集做简要介绍&#xff0c;并演示如何使用C-Eval对大模型进行评测。 内容摘要 C-Eval整体结构概述C-Eval数据预览C-Eval的Prompt范式Python脚本实现…

第九十一周周报

学习目标&#xff1a; 论文 学习时间&#xff1a; 2024.6.8-2024.6.14 学习产出&#xff1a; 一、Consistency Models 扩散模型依赖于迭代采样过程导致生成缓慢&#xff0c;由此提出一致性模型&#xff0c;其可以直接将噪声映射至数据从而生成高质量样别。 根据给定的OD…

Kotlin编程实践-【Java如何调用Kotlin中带默认值参数的函数】

问题 如果你有一个带有默认参数值的 Kotlin 函数&#xff0c;如何从 Java 调用它而无须为每个参数显式指定值&#xff1f; 方案 为函数添加注解JvmOverloads。 也就是为Java添加重载方法&#xff0c;这样Java调用Kotlin的方法时就不用传递全部的参数了。 示例 在 Kotlin …

【数学】什么是傅里叶级数与傅里叶变换?

傅里叶级数与傅里叶变换 背景 傅里叶级数和傅里叶变换是数学和工程领域中的重要工具&#xff0c;特别是在信号处理、图像处理和物理学中。傅里叶级数用于将周期函数表示为正弦和余弦函数的和&#xff0c;而傅里叶变换用于将任意函数表示为频率的函数。 公式 傅里叶级数&…

本地GPT-window平台 搭建ChatGLM3-6B

一 ChatGLM-6B 介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;新一代开源模型 ChatGLM3-6B 已发布&#xff0c;拥有10B以下最强的基础模型&#xff0c;支持工具调用&#xff08;Function Call&#xff09;、代码执行&#xff08;Code Interpreter&…

Linux Centos 环境下搭建RocketMq集群(双主双从)

1、下载rocketmq的包 下载 | RocketMQ 2、配置环境变量 1、编辑环境变量文件&#xff1a;vim /etc/profile2、加入如下配置&#xff1a; #rocketmq 4.9.8 ROCKETMQ_HOME/home/rocketmq/rocketmq-4.9.8 export PATH${ROCKETMQ_HOME}/bin:${PATH}3、刷新配置&#xff1a;source…

Apollo9.0 PNC源码学习之Control模块(三)—— 基于双环PID的纵向控制

本文将对Apollo的纵向控制器进行讲解&#xff0c;看完本文&#xff0c;你将会对百度Apollo的纵向控制有更深的理解 前面文章&#xff1a; Apollo9.0 PNC源码学习之Control模块&#xff08;一&#xff09; Apollo9.0 PNC源码学习之Control模块&#xff08;二&#xff09; 1 纵向…