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的简单研究相关推荐

  1. 简单研究用于监控数通设备的Zabbix模板:Template Module Interfaces SNMP与Template Module EtherLike-MIB SNMP

    本人的工作环境中已经有一套Zabbix平台用于监控1000台数量以上的交换机,该运维平台主要有如下作用: 查找某个区域的某台设备IP地址以方便管理员远程登录.查看/修改设备配置: 通过SNMP检测设备 ...

  2. [转载]3721驻留机制简单研究

    [转载]3721的驻留机制简单研究 Quaful@水木清华 简单研究了一下3721的机制,写在这里,作为心得笔记吧.大部分收获都来自 Softice + 反汇编,不一定适用于某些版本. 1. CnsM ...

  3. 泰山OFFICE技术讲座:竖排时中文标点的简单研究

    中文标点有两类,横排和竖排.那么,在竖排时,会产生什么差异呢?是否会因为竖排标点,产生布局的差异?于是进行了简单研究: 横排时,竖排标点,作为普通字符对待,没有特殊处理. 竖排时,竖排标点还是作为普通 ...

  4. OpenGL的简单研究-开端

    一直想要学习的但是没有学习的东西,大学一直在等待这个时间,终于可以闲下来研究一下这个部分的内容了. 计算机图形学,让计算机处理各种图像的东西,里面也存在很多算法和数学知识,很值得研究的一个领域,之前一 ...

  5. 对List.Sort的简单研究

    最近一直忙着修改项目中的bug,特别是一些绑定的列表排序,因为是中途加入的,所以我一般不改变别人的存储过程或者类方法,只在需要的时候帮其排序一下,不过非常郁闷...... 为什么呢???存储过程用得是 ...

  6. 视频类网站的简单研究

    今年做视频的网站越来多了,特别是一些新起的播客网,打乱了传统视频网站的模式,播客网的出现,让网民有更多免费视频观看的选择,也为视频搜索这业务打下了基础.我现在就说说自己所接触过的一些播客网,免费视频网 ...

  7. 对Windows10虚拟桌面的简单研究

     汗啊,逆向Windows可不是容易的事,对于我来说就更难了.. 所以,我就用一些工具和丰富的Windows软件开发经验来简单滴研究一下Windows10沸沸扬扬的"虚拟桌面" ...

  8. Dolphin social network——海豚社会网络数据集的简单研究

    1.海豚社会网络数据摘要: Lusseau等在新西兰对62只宽吻海豚的生活习性进行了长时间的观察,他们研究发现这些海豚的交往呈现出特定的模式,并构造了包含有62个结点的社会网络.如果某两只海豚经常一起 ...

  9. LeetCode一求素数算法优化的简单研究

    前言 1.求素数对于大多数人都比较简单,谁不知道啊.一个数n只存在1与自身能整除的数就为素数,并且编写代码也相对容易,很快就能写出. 2. 但是如果我现在要求优化求素数的算法呢?你能做到几步优化?从时 ...

最新文章

  1. Webots ROS
  2. fork+exit+php,php实现简单的守护进程创建、开启与关闭操作
  3. securecrt连接GNS3步骤
  4. Debian 忘记root密码的处理(passwd:command not found)
  5. 强化学习原理与python实现原理pdf_纯Python实现!Facebook发布PyTorch分布式强化学习库...
  6. 此次边路调整系统推荐射手走哪路_王者荣耀:廉颇“史诗级”改动,成吉思汗等射手降温!...
  7. 设计师和程序员-拓展知识关系网
  8. [BZOJ2339][HNOI2011]卡农
  9. 字典(JSON)与模型的转换
  10. 用c#转换word或excel文档为html文件,C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例...
  11. Coursera学科分类爬虫实例介绍
  12. 客户历程地图最佳实践 - 改善在线购书的体验
  13. 华为路由器OSPF配置
  14. CAN波特率计算公式
  15. 什么是独立主机?独立主机的优势有些?
  16. 云计算与云原生 — OpenShift 部署实践
  17. kindle for PC更新后无法打开解决方案
  18. 计算机ppt放映方式怎么改,ppt打开方式设置怎么设置
  19. 中国移动、天猫都在用的区块链抽奖,了解一下?
  20. 数据库原理-几种数据模型

热门文章

  1. 淘宝新店流量如何从0到1000
  2. 上海移动HG6145D光猫之超级用户登录方法
  3. mysql 统计表中条目数量的几种方法
  4. 新特性:TabLayout动态添加条目
  5. matlab编写多目标性能度量r、GD、Spacing、德尔塔
  6. JS:二叉树(2)——递归操作节点、构造二叉树
  7. 「分辨率比拼」还不够,4D成像雷达进入“软”竞争时代
  8. 【Unity 22】 Unity 力,扭矩,刚体,触发器的简单使用
  9. java-操作 Excel
  10. VC++ 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能