首页
学习
活动
专区
圈层
工具
发布

Linux驱动开发-外部中断的注册使用(按键为例)

外部中断介绍 前面有篇文章使用杂项设备完成了按键驱动的编写,实现了按键轮询检测,通过read函数向应用层传递按键值,这篇文章使用按键为例,介绍Linux内核里中断的注册方法,使用中断的方式检测按键是否按下...,中断在单片机、设备驱动开发里使用的都非常多,可以更加实时的检测到按键触发的情况。...Linux内核提供了中断的注册接口: (1)注册中断 头文件 include\linux\interrupt.h 定义文件 include\linux\interrupt.h 函数原型 int.../blog-drawing-bed/raw/master/img/image-20211226144741837.png)] 2.2 驱动示例代码 insmod 安装驱动之后就直接注册按键中断,没有注册字符设备框架...printk("按键中断 驱动注册-安装成功.

6K40

Linux系统驱动之链式中断控制器驱动程序编写

资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 链式中断控制器驱动程序编写 资料下载 视频观看 1....驱动提供 handleC:处理GPIO 2号中断,handleC由GPIO驱动提供 屏蔽GPIO 2号中断:调用irq_dataB的irq_chip的函数,由GPIO驱动提供 处理:调用actions...链表中用户注册的函数 清除GPIO 2号中断:调用irq_dataB的irq_chip的函数,由GPIO驱动提供 1.2 irq_domain的核心作用 怎么把handleB、GPIO Domain、handleC...对于这些虚拟的中断控制器,我们没有真实按键,通过devmem指令写GIC的PENDING寄存器触发中断。 3. 编程 会涉及2个驱动程序:虚拟的中断控制器驱动程序,按键驱动程序,以及对应的设备树。

2.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux系统驱动之层级中断控制器驱动程序编写

    层级中断控制器驱动程序编写 1. 层级中断控制器的重要函数和结构体 1.1 回顾处理流程 1.2 irq_domain的核心作用 2. 硬件模型 3....下图中: handleA、irq_dataA由GIC驱动提供 irq_dataB由GPIO驱动提供,不需要handleB 假设GPIO模块下有4个引脚,都可以产生中断,分别链接到GIC的100~103...中记录(100,234) (101,235)(102,236) (103,237) 在GPIO domain中记录(0,234) (1,235)(2,236) (3,237) 对于KEY,注册中断时就是...irq_dataA->irq_chip的函数 调用irq_desc[236].action链表中用户注册的函数 unmask中断: 调用irq_desc[236].irq_data->irq_chip...对于这些虚拟的中断控制器,我们没有真实按键,通过devmem指令写GIC的PENDING寄存器触发中断。 3. 编程 会涉及2个驱动程序:虚拟的中断控制器驱动程序,按键驱动程序,以及对应的设备树。

    2K21

    Linux中断 - IDT

    [toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...pre-cpu的中断栈,还是使用IST的中断栈; type表示所中断是何种类型,目前有以下四种: enum { GATE_INTERRUPT = 0xE, //中断门 GATE_TRAP...传统系统调用相关 IDT 的设置 Linux系统启动过程中内核压解后最终都调用到start_kernel, 在这里会调用trap_init, 然后又会调用idt_setup_traps: void...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int

    8.7K10

    深入浅出:Linux设备驱动之中断与定时器

    Linux 的中断处理分为顶半部和底半部,顶半部完成尽可能少得的比较紧急的功能,往往只是简单的完成“登记中断”的工作,就是将底半部处理程序挂到该设备的底半部处理队列中去,中断处理机制如下图: ?...(与通常说的软中断(软件指令引发的中断),比如arm的swi是完全不同的概念) 在linux内核中,用softirq_action结构体表征一个软中断,这个结构体包含软中断处理函数指针和传递给函数的参数...使用open_softirq()函数可以注册软中断对应的处理函数,而raise_softirq()函数可以触发一个软中断。...驱动编程中,可以利用一组函数和数据结构来完成定时器触发工作或者某些周期性任务。...... } //驱动中某函数 xxx_func2(...) { ...

    3.9K102

    聊聊 Linux 中断机制

    我没有查到中断到底是何时引入的,但是从 Linux 问世以来就已经有了,而且 Linux 是基于 UNIX 开发的,可以认为 UNIX 就已经引入中断机制了,而且换个角度来说,UNIX 作为如此著名的操作系统...还有一种处理方式是轮询,现代计算机一般都包含输入输出设备,在轮询机制中,CPU 会不断的顺序询问每个设备是否需要提供服务,如果需要提供服务,CPU 就会转而为设备驱动进行服务;可以看到,这种轮询的方式性能较差...对于 Linux 内核来说,中断信号分为两类:硬件中断和软件中断,每个中断是由 0 - 255 之间的一个数字来标识。...(34) 接连从芯片 IRQ3 0x23(35) 串行口 2 IRQ4 0x24(36) 串行口 1 IRQ5 0x25(37) 并行口 2 IRQ6 0x26(38) 软盘驱动器 IRQ7 0x27(...另外,在设置中断描述符表 IDT 表时 Linux 内核使用了中断门和陷阱门两种门描述符。它们之间的区别在于对标志寄存器 EFLAGS 中的中断允许标志 IF 的影响。

    2.2K20

    Linux 中断处理浅析

    最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想....第三阶段 关中断条件下的中断处理 进入handle_IRQ_event函数, 调用对应的内核或内核模块通过request_irq函数注册的中断处理函数....注册的中断处理函数有个中断开关属性, 一般情况下, 中断处理函数总是在关中断的情况下进行的....而调用request_irq注册中断处理函数时也可以设置该中断处理函数在开中断的情况下进行, 这种情况比较少见, 因为这要求中断处理代码必须是可重入的....驱动程序可以直接向这个工作队列添加任务. 某些驱动程序还可能会创建并使用属于自己的工作队列.

    9.1K80

    内核驱动注册流程

    1.申请设备号 驱动结构体填充完毕后,需要注册到内核之中,其中有三种方法来注册设备驱动: (1) 动态注册申请设备号 + cdev 注册设备驱动 在不知道设备号的情况下,...通过动态注册驱动申请到的设备号并存到dev_t 类型中,通过cdev_init将驱动结构体ops赋值给cdev->ops,然后通过cdev_add将cdev结构体与设备号关联。...cdev卸载API: void cdev_del(structcdev *p) (2) 静态申请设备号 + cdev 注册设备驱动 在已知驱动主设备号的情况下,可以通过静态注册驱动。...,在/pro/device可查看 2.创建节点 设备注册进去后,需要创建节点才可以使驱动被调用。...注意:/sys/class/xx/device与/dev/device区别(xx表示设备类名,device表示设备名) 在驱动注册成功后,需要软件创建设备节点。

    1.8K10

    Linux驱动实践:中断处理函数如何【发送信号】给应用层?

    驱动程序 示例代码全貌 所有的操作都是在 ~/tmp/linux-4.15/drivers 目录下完成的。...> #include linux/sched/signal.h> #include linux/pid_namespace.h> #include linux/interrupt.h> // 中断号...因为它是共享的中断,因此当键盘被按下的时候,操作系统就会依次调用所有的中断处理函数,当然就包括我们的驱动程序所注册的这个函数。...根据之前的文章Linux驱动实践:驱动程序如何发送【信号】给应用程序?,应用程序必须主动把自己的 PID 告诉驱动模块才可以。...,1号中断的所有驱动程序: 再看一下设备号: $ cat /proc/devices 因为驱动注册在创建设备节点的时候,是动态请求系统分配的。

    4.3K51

    Linux驱动实践:中断处理中的【工作队列】 workqueue 是什么鬼?

    工作队列是什么 工作队列是Linux操作系统中,进行中断下半部分处理的重要方式! 从名称上可以猜到:一个工作队列就好像业务层常用的消息队列一样,里面存放着很多的工作项等待着被处理。...驱动程序 之前的几篇文章,在驱动程序中测试中断处理的操作流程都是一样的,因此这里就不在操作流程上进行赘述了。 这里直接给出驱动程序的全貌代码,然后查看 dmesg 的输出信息。...\n"); // 注册中断处理函数 if(request_irq(irq, myirq_handler, IRQF_SHARED, devname, &mydev)!...说明:驱动程序的初始化函数 myirq_init 被调用了,并且成功注册了 1 号中断的处理程序。 此时,按一下键盘上的 ESC 键。...操作系统在捕获到键盘中断之后,会依次调用此中断的所有中断处理程序,其中就包括我们注册的 myirq_handler 函数。

    2.7K40

    linux 中断机制《Rice linux 学习笔记》

    这篇文章以按键为例子讲解linux的中断原理,中断的架构,中断的实现。 在我们的开发中,检测按键是否触发,无非就两种方法—轮询和中断。作者认为两种方法最大的区别就是CPU的利用率。...Linux的中断原理: 中断:处理器异常的一种,它是一种特殊的电信号,用硬件发给处理器,处理器接收到中断后,会马上向操作系统反映此信号的到来,然后就由操作系统负责处理这些新到来的数据。...Linux中断的相关函数: 1、注册中断函数: 中断处理函数结构: typedef irqreturn_t (*irq_handler_t)(int, void*); 注册中断函数:int request_irq...Linux中断实现: 这里例子采用等待队列的方式实现(也就是上述的第二种方法)。...(IRQ_EINT0, &pins_desc[0]); return 0; } 中断函数的实现: button_irq函数的实现:该函数与请求中断注册的中断函数名保持一致。

    6.3K10

    linux内核缺页中断处理

    7.当磁盘中断发生时,表明该页已经被装入,页表已经更新可以反映他的位置,页框也标记位正常状态。 8.恢复发生缺页中断指令以前的状态,程序计数器重新指向这条指令。...9.调度引发缺页中断的进程,操作系统返回调用他的汇编例程 10.该例程恢复寄存器和其他状态信息,返回到用户空间继续执行,就好像缺页中断没有发生过。...linux内核对缺页异常的处理流程很复杂,但是基本思想和上述流程差不多。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...), "=r" (x) : "m"(__m(addr)), "i"(errret), "0"(err)) //"m"(__m(addr)), "i"(4), "0"(4)) 经过以上分析,对linux

    12.9K22

    Linux内核硬中断 软中断的原理和实现

    linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。...) // 是否处于硬中断 #define in_softirq() (softirq_count()) // 是否处于软中断 三、硬中断 (1)注册中断处理函数 注册中断处理函数: /** * irq...: 要分配的中断号 * handler: 要注册的中断处理函数 * flags: 标志(一般为0) * name: 设备名(dev->name) * dev: 设备(struct net_device...*/ }; 目前已注册的软中断有10种,定义为一个全局数组: static struct softirq_action softirq_vec[NR_SOFTIRQS]; enum { HI_SOFTIRQ

    25.4K22

    Linux驱动实践:一起来梳理【中断】的前世今生(附代码)

    目录 Linux 中断的知识点梳理 中断的分类 中断号和中断向量 中断服务程序ISR 上半部分和下半部分 中断处理的注册和注销 API 实操:捕获键盘中断 示例代码 驱动程序传参 IO编址:IO端口和IO...大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【Linux 中断的注册和处理】。 在前两篇文章中,描述的是在应用层如何调用驱动函数来控制GPIO,以及在驱动中如何发送发送信号给应用层。...中断处理的注册和注销 API 所谓的中断注册,就是告诉操作系统:我对哪个中断感兴趣。 当这些中断发生的时候,请通知我。通知的方式就是:调用一个预先注册好的回调函数。...驱动程序可以通过函数 request_irq(),向操作系统注册,并且激活指定的中断线: int request_irq(unsigned int irq, irq_handler_t...再来看一下 dmesg 的输出信息: 成功注册了中断号1的处理函数! 此时,按几次键盘左上角的 ESC 键,然后再查看 dmesg 的输出信息: 以上,就是最简单的中断注册和相应的中断处理函数!

    1.8K30
    领券