linux内核中断之看门狗
一:内核中断
linux内核中的看门狗中断跟之前的裸板的中断差不多,在编写驱动之前,需要线把内核自带的watch dog模块裁剪掉,要不然会出现错误;在Device Drivers /Watchdog Timer Support /S3C2410 Watchdo
在内核中,我们处理一个中断,必须先注册一个中断号,注册中断的函数是:
- request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
- const char *name, void *dev)
- {
- return request_threaded_irq(irq, handler, NULL, flags, name, dev);
- }
irq是要申请的硬件中断号。
handler 是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev参数将被传递给它。
flags 是中断处理的属性,若 设置了IRQF_DISABLED ,则表示中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程 序不屏蔽;若设置了IRQF_SHARED ,则表示多个设备共享中断,若设置了IRQF_SAMPLE_RANDOM,表示对系统熵有贡献,对系统获取随机数有好处。
name设置中断名称,通常是设备驱动程序的名称 在cat /proc/interrupts中可以看到此名称。
dev在中断共享时会用到,一般设置为这个设备的设备结构体或者为NULL
request_irq()返回0表示成功,返回-INVAL表示中断号无效或处理函数指针为NULL,返回-EBUSY表示中断已经被占用且不能共享。
在开发板上通过cat /proc/interrupts查看中断有没有注册成功:
下面代码实现是按键(key1)控制dog,dog控制灯,按键第一次按下灯闪,再次按下灯灭
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/io.h>
- #include <linux/irq.h>
- #include <linux/interrupt.h>
- #include <linux/clk.h>
- #include <linux/gpio.h>
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("bunfly");
- irqreturn_t do_irq(int irq, void *data);
- void led_on();
- void led_off();
- void wt_on();
- void wt_off();
- unsigned long gpio_virt;
- unsigned long *gpm4con, *gpm4dat;
- unsigned long wt_virt;
- unsigned long *wtcon, *wtdat, *wtcnt, *wtclrint;
- struct clk *wtclk;
- int et_irq = ;
- int bunfly_init()
- {
- int ret = ;
- et_irq = gpio_to_irq(EXYNOS4_GPX3());//EXINT()获取外部中断号
- ret = request_irq(et_irq, do_irq, IRQ_TYPE_EDGE_FALLING, "key 1", );//注册按键中断
- if(ret < ) { //中断号 //处理函数
- printk("request_irq error\n");
- return ;
- }
- wtclk = clk_get(NULL, "watchdog");//设置时钟频率
- clk_enable(wtclk);
- ret = request_irq(IRQ_WDT, do_irq, IRQF_SHARED, "wangcai", );//注册watchdog中断
- if(ret < ) {
- printk("request_irq\n");
- return ;
- }
- gpio_virt = ioremap(0x11000000, SZ_4K);//led的物理地址到虚拟地址
- gpm4con = gpio_virt + 0x02e0;
- gpm4dat = gpio_virt + 0x02e4;
- wt_virt = ioremap(0x10060000, SZ_4K);//dog的物理地址到虚拟地址
- wtcon = wt_virt + 0x00;
- wtdat = wt_virt + 0x04;
- wtcnt = wt_virt + 0x08;
- wtclrint = wt_virt + 0x0c;
- return ;
- }
- void bunfly_exit()
- {
- printk("this is bunfly_exit\n");
- }
- module_init(bunfly_init);
- module_exit(bunfly_exit);
- irqreturn_t do_irq(int irq, void *data)
- {
- if(irq == et_irq) {//判断是否为按键中断
- static int flags = ;
- printk("key 1 down\n");
- if(flags) {
- wt_on();
- flags = ;
- }
- else {
- wt_off();
- led_off();
- flags = ;
- }
- }
- if(irq == IRQ_WDT) {//判断是否为狗中断
- *wtclrint = ;//清中断
- static int flags = ;
- if(flags) {
- led_on();
- flags = ;
- }
- else {
- led_off();
- flags = ;
- }
- }
- return IRQ_HANDLED;//处理完成
- }
- void led_on()
- {
- *gpm4con &= ~0xffff;
- *gpm4con |= 0x1111;
- *gpm4dat = 0x0;
- }
- void led_off()
- {
- *gpm4con &= ~0xffff;
- *gpm4con |= 0x1111;
- *gpm4dat = 0xf;
- }
- void wt_on()
- {
- *wtdat = 0x8000;
- *wtcnt = 0x8000;
- *wtcon = ( << ) | ( << ) | ( << ) | ( << );
- }
- void wt_off()
- {
- *wtcon = ;
- }
linux内核中断之看门狗的更多相关文章
- Linux 内核中断内幕
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/index.html#resources Linux 内核中断内幕 ...
- Linux内核中断和异常分析(中)
在linux内核中,每一个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线.所有现在存在的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连,上次讲到单片机的时候,我就讲到了单片机 ...
- Linux内核中断顶半部和底半部的理解
文章目录 中断上半部.下半部的概念 实现中断下半部的三种方法 软中断 软中断模版 tasklet tasklet函数模版 工作队列 工作队列函数模版 进程上下文和中断上下文 软中断和硬中断的区别 硬中 ...
- Linux编程之《看门狗进程》
Intro 当我们编写服务器代码时,为了让自己的服务器在意外崩溃时能够及时的重启,软件看门狗就显示出它的作用了,该看门狗进程是通过fork一个子进程(业务进程),父进程一旦捕获到了子进程的结束信号就重 ...
- Linux 下如何使用看门狗
Linux内核有集成WD的选项.将其使能后,系统里就会有watchdog的设备驱动:/dev/watchdog.这样,在应用程序里只需打开这个设备使用即可:#include <fcntl.h ...
- Linux内核中断学习
1.内核中断概述 (1)在OS环境下编写中断处理函数与之前在裸机中编写中断处理函数的方式是不一样的,在Linux内核中提供了一套用来管理硬件中断资源的软件体系架构. (2)在操作系统中,中断号与gpi ...
- linux内核--中断处理程序
一个设备的中断处理程序是它设备驱动程序的一部分--设备驱动程序是用于对设备进行管理的内核代码.中断处理程序与其他内核函数的真正区别在于,中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断 ...
- Linux内核中断和异常分析(上)
中断,通常被定义为一个事件.打个比方,你烧热水,水沸腾了,这时候你要去关掉烧热水的电磁炉,然后再去办之前手中停不下来的事情.那么热水沸腾就是打断你正常工作的一个信号机制.当然,还有其它的情况,我们以后 ...
- Linux内核中断和异常分析(下)
这节,我们继续上,中(以前的日志有)篇目进行分析,结合一个真实的驱动案例来描述linux内核中驱动的中断机制,首先我们先了解一下linux内核中提供的中断接口. 这个接口我们需要包含一个头文件:#in ...
随机推荐
- platform_driver_probe与platform_driver_register的区别
Platform Device and Drivers 从<linux/platform_device.h>我们可以了解Platform bus上面的驱动模型接口:platform_de ...
- ubuntu virtualbox xp无声音解决
太简单了,记录一下解决方法,进入xp,打开设备管理器,对着ac97设备驱动 点右键,点更新驱动,更新一下就ok了. 这时候去控制面板,就可以看到有音频设备了. 具体步骤如下: 第一步,virtualb ...
- Dynamics CRM 请求服务时报access is denied错误
在javascript脚本里使用ODATA向组织服务发请求时报错,请求被拒绝了,后经人点拨得知是脚本跨域的问题,原因如下:访问系统我用的是IP地址,但通过 Xrm.Page.context. cont ...
- 【Android 应用开发】Android - 按钮组件详解
总结了Android中常用的按钮用法 示例源码下载地址 : -- CSDN : http://download.csdn.net/detail/han1202012/6852091 -- GitHu ...
- SQLServer 基础
1当设计表时,对表进行结构性的修改(如将原来可以null的改为不可null),直接改则不允许保存修改,需要选择 工具----选项----designers—表设计器和数据库设计器---阻止保持要求重新 ...
- 【freeradius2.x】 安装和学习
虚拟机中centos 安装和学习 radius2 版本是2.2.x 的使用等知识 安装 为了测试方面,yum安装 yum -y install freeradius* 配置文件的位置是 /etc/ra ...
- MIDle生命周期详解,以及工作原理
当MIDlet被应用程序管理器成功地初始化之后,就开始展开了它的生命周期.MIDlet的生命周期完全由应用程序管理器控制,也就是说,当MIDlet要从一个状态变成另外一个状态时,应用程序管理器会调用对 ...
- objective-c 2.0的字面量Literals
obj-c 2.0增加了许多核心对象字面量的简单语法,向ruby学习吗? 直接上代码: #import <Foundation/Foundation.h> int main(void){ ...
- unix命令自我总结
三种参数类型 1⃣时间日期: cal times time 2⃣文字处理: ctl+v 输入控制字符 ${#str} str字符串长度 expr length $abc 同上 typeset -i x ...
- Dubbo性能调优参数及原理
本文是针对 Dubbo 协议调用的调优指导,详细说明常用调优参数的作用域及源码. Dubbo调用模型 常用性能调优参数 参数名 作用范围 默认值 说明 备注 threads provider 200 ...