Linux内核中断

Linux内核中断

ARM里当按下按键的时候,他首先会执行汇编文件start.s里面的异常向量表里面的irq,在irq里面进行一些操作

再跳转到C的do_irq();

进行操作:1)判断中断的序号;2)处理中断;3)清除中断;

Linux内核实现和ARM裸机实现中断的原理是一样的。

内核:当按键按下后依然到异常向量表,再到handler_irq函数(写死的),在handler_irq里面定义了一个数组,数组中每个成员里面存放的是结构体,在结构体里面有个函数指针,这个函数指针就指向了咱们自己提交函数的名字;(数组的下标是Linux内核的软中断号,它和硬件中断号之间有个映射关系)。内核实现中断时,在handler_irq函数里面把中断的寄存器都初始化好了,咱们只需要拿到软中断号,绑定我的中断处理函数就可以

1、注册中断

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)
功能:注册中断  
参数:
	@irq : 软中断号 gpio的软中断号
    @handler: 中断的处理函数
    @flags :中断的触发方式
    @name :名字   cat /proc/interrupts
	@dev  :向中断处理函数中传递参数 ,不想传就写为NULL
返回值:成功0,失败返回错误码

参数1:@irq : 软中断号 gpio的软中断号

//0-159 -> 160    GPIOB15 - >1*32+15   GPIOC7 -2*32+7

   软中断号 = gpio_to_irq(gpino号);//160--》 0-159

gpiono = m*32+n(n:组内的序号)

m:那一组  A B C D E(5组)

  0 1 2 3 4

例: gpioa28 = 0*32+28   gpiob8 =1*32+8   gpiob16 = 1*32+16

控制器中断号(ADC):

find -name irqs.h(在内核源码中找)

find -name irqs.h (位置路径./arch/arm/mach-s5p6818/include/mach/irqs.h)

find -name s5p6818_irq.h (位置路径./arch/arm/mach-s5p6818/include/mach/s5p6818_irq.h)

#define IRQ_PHY_ADC   (41 + 32)  //IRQ_PHY_ADC软中断号

参数2:@handler: 中断的处理函数

irqreturn_t (*irq_handler_t)(int irqno, void *dev);

IRQ_NONE        //中断没有处理完成

IRQ_HANDLED     //中断正常处理完成

参数3:@flags :中断的触发方式

#define IRQF_DISABLED 0x00000020 

//快速中断(在处理函数里面写了他,就先处理这个中断)

#define IRQF_SHARED 0x00000080    

//共享中断中断的接口较少,但是器件都想要中断,那管脚需要外接两个寄存器里面有中断状态标志位,看中断状态标志位有没有置位一个口不可以链接两个按键,按键没办法区分

#define IRQF_TRIGGER_RISING 0x00000001上升沿触发

#define IRQF_TRIGGER_FALLING 0x00000002下降沿出发

#define IRQF_TRIGGER_HIGH 0x00000004(高电平触发)

#define IRQF_TRIGGER_LOW 0x00000008 (低电平触发)

参数4:@name :名字   cat /proc/interrupts

参数5:@dev :向中断处理函数中传递参数 ,不想传就写为NULL

2、注销中断

void free_irq(unsigned int irq, void *dev_id)
	功能:注销中断
	参数:
		@irq :软中断号
		@dev_id:向中断处理函数中传递的参数,不想传就写为NULL    

Eg:按键所对应的中断号是多少?及找所对应的GPIO

第一步:找底板原理图,找到按键

第二步:拷贝网络标号,到核心板

及对应的软中断号为:gpio_to_irq gpiob8 = 1*32+8);

gpio_to_irq gpiob16 = 1*32+16

ARRAY_SIZE计算数组里面元素的个数;

中断号占用问题

[root@farsight]#insmod farsight_irq.ko 

[ 21.262000] request irq146 error

insmod: can't insert 'farsight_irq.ko': Device or resource busy

通过 cat /proc/interrupts

146:        GPIO  nxp-keypad

154:        GPIO  nxp-keypad

说明中断号已经被占用了

解决办法:在内核中将这个驱动删掉

1、如何确定驱动文件的名字是谁?

1)grep "nxp-keypad" * -nR

arch/arm/mach-s5p6818/include/mach/devices.h:48:

#define DEV_NAME_KEYPAD  "nxp-keypad"

2)grep "DEV_NAME_KEYPAD" * -nR

drivers/input/keyboard/nxp_io_key.c:324:.name = DEV_NAME_KEYPAD,

3)驱动文件的名字是nxp_io_key.c

4)找宏的名字,在Makefine里面知道;

2、如何从内核中将他去掉?

选项菜单的名字?Kconfig

config KEYBOARD_NXP_KEY

tristate "SLsiAP push Keypad support"

5)make menuconfig

<>SLsiAP push Keypad support

去掉图形化界面里面的*号后,可以把nxp_io_key.o删除掉,这样再次编译内核的时候就可以看出来nxp_io_key.c是否备编译,如果被编译就有对应的.o生成,如果不被编译,就不会生成nxp_io_key.o文件。

6)rm nxp_io_key.o

3、make uImage  重新编译内核

7)make uImage

8)cp  arch/arm/boot/uImage ~/tftpboot

4、重新启动板子;
5、安装驱动:

6、然后按键,进行测试;

按键蜂鸣器驱动函数练习

驱动:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/printk.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <asm/io.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>

#define GPIONO(m,n) (m*32+n)
#define GPIO_NOB8 GPIONO(1,8)
#define GPIO_NOB16 GPIONO(1,16)
#define NAME "chrdev_dev"

//定义宏保存物理地址基地址
#define BUZZER_BASE 0xc001c000
int gpiono[]={GPIO_NOB8,GPIO_NOB16};
char *name[]={"interrupt_b8","interrupt_b16"};
int i;


//定义指针保存映射后的虚拟地址首地址
unsigned int *buz_addr = NULL;
//open  read  write  close
//中断处理函数
irqreturn_t irq_handler(int irq,void *arg)
{
    if(irq == gpio_to_irq(GPIO_NOB8))
    {
        *buz_addr |= (1 << 14);       //喇叭关闭
        printk(KERN_ALERT"+++++++++++++++++++++++++++++++++++\n");//设置为大于终端打印权限,不然只能在demsg中查看
    }
    if(irq == gpio_to_irq(GPIO_NOB16))
    {
        *buz_addr &= (~(1 << 14));       //喇叭关闭
        printk(KERN_ALERT"-----------------------------------\n");
    }
    return IRQ_HANDLED;
}
static int __init interrupt_init(void)
{
    //建立虚拟地址和物理地址之间的映射关系-控制喇叭
    buz_addr = (unsigned int *)ioremap(BUZZER_BASE, 40);
    if (buz_addr == NULL)
    {
        printk("ioremap red err.\n");
        return -EINVAL;
    }
    //初始化喇叭
    *(buz_addr + 8) &= (~(3 << 28)); //选择GPIOc14功能
    *(buz_addr + 8) |= (1 << 28);    //选择GPIOc14功能
    *(buz_addr + 1) |= (1 << 14);    //选择输出使能
    *buz_addr &= (~(1 << 14));       //喇叭关闭
    //注册中断
    for(i=0;i<sizeof(gpiono)/sizeof(int);i++)
    {
        if(request_irq(gpio_to_irq(gpiono[i]),irq_handler,IRQF_TRIGGER_FALLING,name[i],NULL)!=0)
        {
            printk("%s request_ire err.\n",name[i]);
            return -EINVAL;
        }
    }
    return 0;
}

static void __exit interrupt_exit(void)
{
    //注销中断
    for(i=0;i<sizeof(gpiono)/sizeof(int);i++)
    {
        free_irq(gpio_to_irq(gpiono[i]),NULL);
    }
    //取消映射
    iounmap(buz_addr);
    // //注销字符设备驱动
    // unregister_chrdev(major, NAME);
}
module_init(interrupt_init);
module_exit(interrupt_exit);
MODULE_LICENSE("GPL");

功能实现:按键控制蜂鸣器工作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/274047.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

macOS系统下载安装PyCharm社区版本的流程(详细)

第一步 进入PyCharm官网&#xff0c;链接&#xff1a;Get Your Educational Tool - JetBrains 第二步 选择下拉框&#xff0c;根据自己的电脑芯片选择下载版本&#xff08;芯片查看位置&#xff1a;设置-通用-关于本机&#xff09;然后点击Download按钮 ​​​​​​​ -- 第…

XUbuntu22.04之删除多余虚拟网卡和虚拟网桥(二百零四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

基础概念、思维习惯、知识图谱

说明&#xff1a; 刚开始写本文&#xff0c;因为本文涉及的内容会很多&#xff0c;部分内容要写清楚不容易&#xff0c;所以提前声明&#xff0c;现在只是第一阶段&#xff0c;先收集零散的内容&#xff0c;第二阶段再大刀阔斧地重构目录。 一&#xff0c;基础概念 1&#xf…

win桌面圣诞小插件分享

最终效果 文章目录 最终效果前言下载效果更多完结 前言 圣诞到了&#xff0c;最近有小伙伴问我有没有一些桌面圣诞小插件可以分享一下&#xff0c;所以我就特地去寻找了一些&#xff0c;感觉效果还不错&#xff0c;所以分享出来 下载 链接&#xff1a;https://pan.baidu.com…

css 设置鼠标覆盖显示菜单

鼠标覆盖到“全部分类”效果如下 鼠标放到“精品推荐”效果如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

猫冻干哪个牌子好又便宜?性价比高的5款主食冻干猫粮推荐

各位铲屎官都知道猫天性是食肉动物&#xff0c;无肉不欢的。而冻干猫粮对于猫咪来说是最好还原猫咪食肉天性的食物&#xff0c;不仅可以当成猫咪的主食&#xff0c;也可以用来给猫咪当成零食&#xff0c;帮助猫咪补充营养。冻干猫粮是经过真空冷冻干燥处理的鲜肉&#xff0c;能…

DRF从入门到精通五(路由组件、认证组件、权限组件、频率组件及认证、权限源码分析)

文章目录 一、路由组件REST framework提供了两个routeraction装饰器 二、认证组件(Authentication)三、权限组件(Permissions)内置权限类 四、频率组件(Throttling)五、权限组件源码分析六、认证组件源码分析 一、路由组件 对于视图集ViewSetMixin&#xff0c;我们除了可以自己…

python+selenium 定位到元素,无法点击的解决方法

今天小编就为大家分享一篇pythonselenium 定位到元素,无法点击的解决方法&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。一起跟随小编过来看看吧 selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (234.75, 22)…

github新建仓库推送代码教学

之前一直用gitee&#xff0c;准备转到github。因为一步一步尝试。如果是新手或许文章会有帮助 点击 new 创建 拉代码 Idea 打开 复制一个 pom 文件作为 maven 管理 提交代码 不出意外的出意外&#xff0c;报错 点击authorize JetBrains 失败 分析问题 本质就是没有…

搭建一个高效的Python开发环境

“工欲善其事&#xff0c;必先利其器”&#xff0c;这里我们来搭建一套高效的 Python 开发环境&#xff0c;为后续的数据分析做准备。 关于高效作业&#xff0c;对于需要编写 Python 代码进行数据分析的工作而言&#xff0c;主要涉及两个方面。 1. 一款具备强大的自动完成和错…

如何快速获取抖音新用户/用户信息

一、快速获取抖音用户信息意味着什么&#xff1f; 抖音是一款热门的短视频社交平台&#xff0c;拥有海量用户和高度活跃的商业生态。用户逐渐增多&#xff0c;庞大的用户也意味着隐藏着庞大的市场和商机&#xff0c;用户的偏好、关注点等信息都时刻影响着商业的效益&#xff0…

推特(Twitter)蓝V

点击个人订阅 这里需要一张visa卡才可以订阅&#xff0c;点击获取 订阅成功

2024 年混合云:趋势和预测

混合云环境对于 DevOps 团队变得越来越重要&#xff0c;主要是因为它们能够弥合公共云资源的快速部署与私有云基础设施的安全和控制之间的差距。这种环境的混合为 DevOps 团队提供了灵活性和可扩展性&#xff0c;这对于大型企业中的持续集成和持续部署 (CI/CD) 至关重要。 在混…

GitHub的2FA验证问题解决工具

文章目录 前言认识2FA开源工具使用&#xff1a;AuthenticatorPro获取AuthenticatorPro的安卓APK如何使用 参考文章 前言 打开GitHub跳出来这个提示&#xff0c;需要进行验证&#xff1a; 如何解决呢&#xff1f;方案有很多&#xff0c;我们可以使用开源的一个工具&#xff1a;…

查看ios app运行日志

摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具&#xff0c;该工具可以方便地查看iPhone设备上应用和系统运行时的实时日志和奔溃日志。同时还提供了奔溃日志分析查看模块&#xff0c;可以对苹果奔溃日志进行符号化、格式化和分析&#xff0c;极大地简化了开发者的调试…

基于机器视觉工业相机的Raw图像和Bitmap图像的保存和转换(C#代码,UI界面版)

基于机器视觉工业相机的Raw图像和Bitmap图像的保存和转换&#xff08;C#代码&#xff0c;UI界面版&#xff09; 工业相机图像格式工业相机实现Raw图像和Bitmap图像的保存和转换的技术背景在相机SDK中获取图像转换图像的代码分析工业相机回调函数里保存Bitmap图像数据工业相机图…

Sectigo的OV多域名通配符证书与通配符证书

Sectigo的OV多域名通配符SSL证书和通配符SSL证书都可以同时保护多个域名记录&#xff0c;但是Sectigo的OV多域名通配符SSL证书并不是多域名SSL证书加通配符SSL证书&#xff0c;而是多个泛域名&#xff0c;并不包括泛域名的主域名。今天就随SSL盾小编了解Sectigo旗下的OV多域名通…

【AI】人工智能爆发推进器之卷积神经网络

目录 一、什么是卷积神经网络 1. 卷积层&#xff08;Convolutional Layer&#xff09; 2. 激活函数&#xff08;Activation Function&#xff09; 3. 池化层&#xff08;Pooling Layer&#xff09; 4. 全连接层&#xff08;Fully Connected Layer&#xff09; 5. 训练过程…

部署YUM软件仓库

借助于YUM软件仓库.可以完成安装、卸载、自动升级rpm软件包等任务&#xff0c;能够自动查找并解 决rpm包之间的依赖关系&#xff0c;而无须管理员逐个.手工地去安装每个rpm包&#xff0c;使管理员在维护大量Linux 服务器时更加轻松自如。.特别是在拥有大量Linux主机的本地网络中…

代码随想录27期|Python|Day27|回溯算法|39.组合总和|40.组合总和II|131.分割回文串

39. 组合总和 在Day24组合问题的模版上加上了一个“可以重复选用当前值”的选项&#xff0c;递归中调用backtracking的idx由i 1改为i&#xff1a; self.backtracking(i, path, res, candidates, target) # 起始位置变成i,可以重复使用当前的值 class Solution(object):def…
最新文章