request_threaded_irq及IRQF_ONESHOT的简单研究
https://blog.csdn.net/melo_fang/article/details/78224326
最近有对request_threaded_irq以及IRQF_ONESHOT进行了一下研究,
首先是通过TP驱动的IRQ来做实验,中断为低有效,gpio默认状态为输入高电平,驱动内部代码为:
ret =request_threaded_irq(touchdev->irq,NULL,zinitix_touch_work,IRQF_TRIGGER_FALLING| IRQF_ONESHOT , ZINITIX_DRIVER_NAME ,touch_dev);
这里先把下降沿出发改成了低电平触发发现烧录之后,正常work
即request_threaded_irq(touchdev->irq,NULL,zinitix_touch_work,IRQF_TRIGGER_LOW | IRQF_ONESHOT , ZINITIX_DRIVER_NAME,touch_dev);
思考之后,觉得对于TP的场景,下降沿和低电平应该都是可以的。推测改成上升沿触发之后TP会失效,因为TP的工作原理是拉低触发中断,之后需要中断处理函数的结尾发命令给TP的IC去把中断pin拉回高电平。实验验证:改成上升沿触发后,TP工作失效,触屏无反应
进一步想研究IRQF_ONESHOT的状态。如果根据网上的结论,即one_shot为保证中断在底半部threaded_handler执行完之后才会继续接受中断,那么这个标识理论上在我们TP的工作模式下,如果是下降沿触发应该不需要添加标识。这里对下降沿触发和低电平触发,分别拿掉了IRQF_ONESHOT,发现都无法正常work。通过adb抓取log ,发现原因是irq申请失败,同时失败log为grnirq:Threaded irq requested with handler=NULLand !ONE_SHOT for irq 420.
requset_thread_irq函数中,如果我们对于顶半部的申请用的是NULL,那么系统会使用默认的顶半部,然后会进入__setup_irq函数,函数中有一个判断是如果顶半部为默认的handler而且中断标识里没有IRQF_ONESHOT,那么处于安全考虑,会返回失败。
将代码给出
else if (new->handler == irq_default_primary_handler &&
!(desc->irq_data.chip->flags &IRQCHIP_ONESHOT_SAFE)) {
/*
* The interrupt was requested with handler =NULL, so
* we use the default primary handler for it.But it
* does not have the oneshot flag set. Incombination
* with level interrupts this is deadly,because the
* default primary handler just wakes thethread, then
* the irq lines is reenabled, but the devicestill
* has the level irq asserted. Rinse andrepeat....
*
* While this works for edge type interrupts,we play
* it safe and reject unconditionally becausewe can't
* say for sure which type this interruptreally
* has. The type flags are unreliable as the
* underlying chip implementation can overridethem.
*/
pr_err("Threadedirq requested with handler=NULL and !ONESHOT for irq %d\n",
irq);
ret= -EINVAL;
gotoout_mask;
}
这里考虑手动在驱动中添加了一个和系统默认的handler同样功能的函数irq_primary_handler,进行试验。
所以在驱动中,
1. 使用request_threaded_irq来申请中断时,通常的处理的使用NULL来使用系统默认的primary_handler,这时IRQF_ONESHOT标识不可少,否则中断会申请失败
2. IRQF_ONESHOT的作用是保证thread_handler函数执行完整,才会接受下一个中断信号
request_threaded_irq及IRQF_ONESHOT的简单研究相关推荐
- 简单研究用于监控数通设备的Zabbix模板:Template Module Interfaces SNMP与Template Module EtherLike-MIB SNMP
本人的工作环境中已经有一套Zabbix平台用于监控1000台数量以上的交换机,该运维平台主要有如下作用: 查找某个区域的某台设备IP地址以方便管理员远程登录.查看/修改设备配置: 通过SNMP检测设备 ...
- [转载]3721驻留机制简单研究
[转载]3721的驻留机制简单研究 Quaful@水木清华 简单研究了一下3721的机制,写在这里,作为心得笔记吧.大部分收获都来自 Softice + 反汇编,不一定适用于某些版本. 1. CnsM ...
- 泰山OFFICE技术讲座:竖排时中文标点的简单研究
中文标点有两类,横排和竖排.那么,在竖排时,会产生什么差异呢?是否会因为竖排标点,产生布局的差异?于是进行了简单研究: 横排时,竖排标点,作为普通字符对待,没有特殊处理. 竖排时,竖排标点还是作为普通 ...
- OpenGL的简单研究-开端
一直想要学习的但是没有学习的东西,大学一直在等待这个时间,终于可以闲下来研究一下这个部分的内容了. 计算机图形学,让计算机处理各种图像的东西,里面也存在很多算法和数学知识,很值得研究的一个领域,之前一 ...
- 对List.Sort的简单研究
最近一直忙着修改项目中的bug,特别是一些绑定的列表排序,因为是中途加入的,所以我一般不改变别人的存储过程或者类方法,只在需要的时候帮其排序一下,不过非常郁闷...... 为什么呢???存储过程用得是 ...
- 视频类网站的简单研究
今年做视频的网站越来多了,特别是一些新起的播客网,打乱了传统视频网站的模式,播客网的出现,让网民有更多免费视频观看的选择,也为视频搜索这业务打下了基础.我现在就说说自己所接触过的一些播客网,免费视频网 ...
- 对Windows10虚拟桌面的简单研究
汗啊,逆向Windows可不是容易的事,对于我来说就更难了.. 所以,我就用一些工具和丰富的Windows软件开发经验来简单滴研究一下Windows10沸沸扬扬的"虚拟桌面" ...
- Dolphin social network——海豚社会网络数据集的简单研究
1.海豚社会网络数据摘要: Lusseau等在新西兰对62只宽吻海豚的生活习性进行了长时间的观察,他们研究发现这些海豚的交往呈现出特定的模式,并构造了包含有62个结点的社会网络.如果某两只海豚经常一起 ...
- LeetCode一求素数算法优化的简单研究
前言 1.求素数对于大多数人都比较简单,谁不知道啊.一个数n只存在1与自身能整除的数就为素数,并且编写代码也相对容易,很快就能写出. 2. 但是如果我现在要求优化求素数的算法呢?你能做到几步优化?从时 ...
最新文章
- Webots ROS
- fork+exit+php,php实现简单的守护进程创建、开启与关闭操作
- securecrt连接GNS3步骤
- Debian 忘记root密码的处理(passwd:command not found)
- 强化学习原理与python实现原理pdf_纯Python实现!Facebook发布PyTorch分布式强化学习库...
- 此次边路调整系统推荐射手走哪路_王者荣耀:廉颇“史诗级”改动,成吉思汗等射手降温!...
- 设计师和程序员-拓展知识关系网
- [BZOJ2339][HNOI2011]卡农
- 字典(JSON)与模型的转换
- 用c#转换word或excel文档为html文件,C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例...
- Coursera学科分类爬虫实例介绍
- 客户历程地图最佳实践 - 改善在线购书的体验
- 华为路由器OSPF配置
- CAN波特率计算公式
- 什么是独立主机?独立主机的优势有些?
- 云计算与云原生 — OpenShift 部署实践
- kindle for PC更新后无法打开解决方案
- 计算机ppt放映方式怎么改,ppt打开方式设置怎么设置
- 中国移动、天猫都在用的区块链抽奖,了解一下?
- 数据库原理-几种数据模型
热门文章
- 淘宝新店流量如何从0到1000
- 上海移动HG6145D光猫之超级用户登录方法
- mysql 统计表中条目数量的几种方法
- 新特性:TabLayout动态添加条目
- matlab编写多目标性能度量r、GD、Spacing、德尔塔
- JS:二叉树(2)——递归操作节点、构造二叉树
- 「分辨率比拼」还不够,4D成像雷达进入“软”竞争时代
- 【Unity 22】 Unity 力,扭矩,刚体,触发器的简单使用
- java-操作 Excel
- VC++ 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能