linux驱动之中断(一) --- 设备树中描述中断

这篇具有很好参考价值的文章主要介绍了linux驱动之中断(一) --- 设备树中描述中断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文仅介绍如何在Linux驱动中使用中断
linux中的中断不可嵌套(中断不可打断其他中断)
不宜在中断中做耗时长的事情
耗时的事情应当放在中断下半部中

中断下半部是可以被其他中断打断的, 而且可以用线程来执行

内核对中断下半部有三种方式 1,软中断 2, tasklet(用软中断实现,会被其他中断打断) 3,工作队列(将tasklet丢到工作队列中, 由线程来执行) 4,线程化中断(中断函数线程化)

linux需要读取设备树来得到外设的中断信息

标题如何在设备树中描述中断信息

参考文档
内核Documentation\devicetree\bindings\interrupt-controller\interrupts.txt

  • 中断控制器(看得懂dtsi中的中断控制器节点)
    中断控制器的参考文档Documentation/devicetree/bindings/arm/gic.txt
    设备树中 中断控制器节点中必须有一个属性:interrupt-controller属性 表明它是“中断控制器”。
1 intc: interrupt-controller@00a01000 { 
2     compatible = "arm,cortex-a7-gic"; 
3     #interrupt-cells = <3>; 
4     interrupt-controller; 
5     reg = <0x00a01000 0x1000>, 
6            <0x00a02000 0x100>; 
7 };
1  gpio5: gpio@020ac000 { 
2      compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio"; 
3      reg = <0x020ac000 0x4000>; 
4      interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>, 
5               <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>; 
6      gpio-controller; 
7      #gpio-cells = <2>; 
8      interrupt-controller; 
9      #interrupt-cells = <2>; //注意这里把cell变成了2 引用这个中断控制器只要两个cell即可
10 };

第一个 cells:中断类型,0表示 SPI中断,1表示 PPI中断。
第二个 cells:中断号,对于 SPI中断来说中断号的范围为 0~987,对于 PPI中断来说中断
号的范围为 0~15。 并不是随便取值, 需要参考芯片手册里gpio对应的中断号
linux驱动之中断(一) --- 设备树中描述中断
第三个 cells:标志,bit[3:0]表示中断触发类型,
1 = low-to-high edge triggered,上升沿触发
2 = high-to-low edge triggered,下降沿触发
4 = active high level-sensitive,高电平触发
8 = active low level-sensitive,低电平触发
可以或运算同时包含

描述一个外设并应用中断(必须会写)

1 fxls8471@1e { 
2     compatible = "fsl,fxls8471"; 
3     reg = <0x1e>; 
4     position = <0>; 
5     interrupt-parent = <&gpio5>; 
6     interrupts = <0 8>; 
7 };

interrupt-parent属性指定用使用哪个中断控制器
interrupts 指定中断号 触发方式

获取设备树中的中断号的函数

对于platform_device
一个节点能被转换为platform_device,如果它的设备树里指定了中断属性,那么可以从platform_device中获得“中断资源”,函数如下,可以使用下列函数获得IORESOURCE_IRQ资源,即中断号

/**
 * platform_get_resource - get a resource for a device
 * @dev: platform device
 * @type: resource type   // 取哪类资源?IORESOURCE_MEM、IORESOURCE_REG
*                      // IORESOURCE_IRQ等
 * @num: resource index  // 这类资源中的哪一个?
 */
struct resource *platform_get_resource(struct platform_device *dev,
				       unsigned int type, unsigned int num);

对于I2C设备、SPI设备
对于I2C设备节点,I2C总线驱动在处理设备树里的I2C子节点时,也会处理其中的中断信息。一个I2C设备会被转换为一个i2c_client结构体,中断号会保存在i2c_client的irq成员里
对于SPI设备节点,SPI总线驱动在处理设备树里的SPI子节点时,也会处理其中的中断信息。一个SPI设备会被转换为一个spi_device结构体,中断号会保存在spi_device的irq成员里

调用of_irq_get获得中断号
如果你的设备节点既不能转换为platform_device,它也不是I2C设备,不是SPI设备,那么在驱动程序中可以自行调用of_irq_get函数去解析设备树,得到中断号
对于GPIO作为中断
可以使用int gpio_to_irq(unsigned int gpio)
或gpiod_to_irq获得中断号。
通用的获得中断号, 适用任意节点
编写驱动的时候需要用到中断号,我们用到中断号,中断信息已经写到了设备树里面,因
此可以通过 irq_of_parse_and_map函数从 interupts属性中提取到对应的设备号,函数原型如下:
unsigned int irq_of_parse_and_map(struct device_node *dev, int index)
dev:设备节点。
index:索引号,interrupts属性可能包含多条中断信息,通过 index指定要获取的信息。文章来源地址https://www.toymoban.com/news/detail-435559.html

到了这里,关于linux驱动之中断(一) --- 设备树中描述中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)

    代码自取 【14.key_tree_pinctrl_gpios_interrupt】: https://gitee.com/chenshao777/imx6-ull_-drivers 主要接口函数: 1. of_gpio_count (获得GPIO的数量) 2. kzalloc (向内核申请空间) 3. of_get_gpio (获取GPIO子系统标号) 4. gpio_to_irq (根据GPIO子系统标号得到软件中断号) 5. request_irq (根据软件中断号

    2024年02月12日
    浏览(51)
  • 从零开始理解Linux中断架构(7)--- Linux执行上下文之中断上下文

            当前运行的loop是一条执行流,中断程序运行开启了另外一条执行流,从上一节得知这是三种跳转的第三类,这个是一个大跳转。对中断程序的基本要求就是 中断执行完毕后要恢复到原来执行的程序 ,除了时间流逝外,原来运行的程序应该毫无感知。        

    2024年02月11日
    浏览(67)
  • Linux 块设备 EMMC 驱动介绍

    目录: 高质量文章导航-持续更新中 EMMC(Embedded Multi-Media Card)是一种用于存储和传输数据的嵌入式存储器(芯片),通常用于移动设备和嵌入式设备中。Linux内核提供了一个通用的EMMC驱动框架,可以支持各种不同的EMMC设备。 EMMC总线采用了典型的主从模式,其中主机控制器

    2024年02月10日
    浏览(40)
  • Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:《Linux驱动开发笔记(三

    2024年02月05日
    浏览(53)
  • Linux下字符设备驱动开发以及流程介绍

    首先我们介绍一下什么是字符设备,然后讲解一下字符设备开发的具体的流程,分别详细介绍每一个流程中涉及到的结构体以及知识点,最后我们编写代码实现字符设备的开发以及测试。 Linux内核设计哲学是把所有的东西都抽象成文件进行访问,这样对设备的访问都是通过文

    2024年02月01日
    浏览(41)
  • linux 设备驱动之tty_operaions数据结构介绍

    tty_operations 结构包含所有的函数回调, 可以被一个 tty 驱动设置和被 tty 核心调 用. 当前, 所有包含在这个结构中的的函数指针也在 tty_driver 结构中, 但是会很快被 只有一个这个结构的实例来替代. int (*open)(struct tty_struct * tty, struct file * filp); open 函数. void (*close)(struct tty_struct *

    2024年01月19日
    浏览(46)
  • 驱动开发 day8 (设备树驱动,按键中断实现led亮灭)

    //编译驱动  (注意Makefile的编译到移植到开发板的内核)         make arch=arm //清除编译生成文件         make clean ****************************************** //安装驱动         insmod mycdev.ko //卸载驱动         rmmod mycdev   需要在内核路径/arch/arm/boot/dts/  修改 stm32mp157a-fsmp1a-dts 文件 *

    2024年02月14日
    浏览(42)
  • 【Linux驱动】Linux的中断系统 | 中断的重要数据结构

    🐱作者:一只大喵咪1201 🐱专栏:《Linux驱动》 🔥格言: 你只管努力,剩下的交给时间! 如上图所示,本喵使用的 IMX6ULL 也是ARM架构,中断也是异常的一种,CPU在运行的过程中,会被各种异常打断,包括: 未定义指令异常 指令、数据访问异常 SWI(软中断) 快中断 中断 导致

    2024年02月02日
    浏览(35)
  • 【明解STM32】中断系统理论基础知识篇之中断寄存器功能原理

    目录 一、前言 二、寄存器概述 三、NVIC寄存器组 四、SCB寄存器组 五、中断屏蔽寄存器组 六、总结         在之前的STM32的中断系统理论基础知识之基本原理及NVIC中,分别中断的基本原理,中断的管理机制和中断的处理流程进行了较为详细的论述,读者通过全篇的阅读了

    2024年02月16日
    浏览(48)
  • 【明解STM32】中断系统理论基础知识篇之中断基本原理及NVIC

    目录 一、前言 二、基本原理概述 1、中断的作用 2、中断和异常 3、NVIC中断控制器 4、中断的分类 三、中断管理机制 1、中断向量 2、中断优先级 3、中断嵌套 四、中断处理流程 五、总结         中断是什么?举个例子来说,当我们正在工作时,突然电话响了,这时你会把

    2024年02月05日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包