上一篇记录了树莓派自带的gpio驱动(外链网址已屏蔽),在bcm2708_gpio.c实现gpio驱动的同时其实也实现了中断控制器的驱动,本文记录bcm2708_gpio.c中驱动的实现。

一·bcm2708_gpio_irq_init中断初始化函数建立gpio中断描述表

static void bcm2708_gpio_irq_init(struct bcm2708_gpio *ucb)

{

unsigned irq;

printk(KERN_ERR DRIVER_NAME": bcm2708_gpio_irq_init is not null!\n");

ucb->gc.to_irq = bcm2708_gpio_to_irq;//获取该端口对应的中断号

/*针对每一个IRQ Line建立irq_desc*/

for (irq = GPIO_IRQ_START; irq < (GPIO_IRQ_START + GPIO_IRQS); irq++) {

irq_set_chip_data(irq, ucb);//设置私有数据

irq_set_chip_and_handler(irq, &bcm2708_irqchip, handle_simple_irq);//同时设置irq_desc中的handle_irq回调和irq_chip指针

set_irq_flags(irq, IRQF_VALID);

}

bcm2708_gpio_irq.dev_id= ucb;//用于标示唯一性和传递私有结构体

setup_irq(IRQ_GPIO3, &bcm2708_gpio_irq);//IRQ_GPIO3响应bank1和bank2种所有的中断

}

这个函数是在本驱动的bcm2708_gpio_probe驱动初始化函数的最后面中调用的,作用是初始化中断。

1·首先赋值中断号转换函数

ucb->gc.to_irq = bcm2708_gpio_to_irq;//获取该端口对应的中断号

2.使用循环建立系统所有的中断描述表

irq_set_chip_data(irq, ucb);//设置私有数据

irq_set_chip_and_handler(irq, &bcm2708_irqchip, handle_simple_irq);//同时设置irq_desc中的handle_irq回调和irq_chip指针

3.注册IRQ_GPIO3这个中断。

这个中断是干嘛的?这个问题我找了好多帖子才大致有点了解。IRQ_GPIO3这个中断号的作用是,在bank1或者bank2中如果有任意一个引脚发生电平转换引发中断都会引起这个IRQ_GPIO3这个中断变量的中断。然后驱动便在这个IRQ_GPIO3中断的回调函数中(bcm2708_gpio_interrupt函数)进行扫描寄存器寻找发生中断的中断号,发生中断的即调用相应的回调函数。(下文分析)

二·IRQ_GPIO3中断的bcm2708_gpio_interrupt中断处理函数

static irqreturn_t bcm2708_gpio_interrupt(int irq, void *dev_id)

{

unsignedlongedsr;

unsigned bank;inti;

unsigned gpio;

unsigned level_bits;struct bcm2708_gpio *gpio_data =dev_id;

printk(KERN_ERR DRIVER_NAME": bcm2708_gpio_interrupt %d\n", irq);/*循环两个bank中的中断*/

for (bank = 0; bank < GPIO_BANKS; bank++) {

edsr= readl(__io_address(GPIO_BASE) + GPIOEDS(bank));//获取该bank的基地址

level_bits = gpio_data->high[bank] | gpio_data->low[bank];

for_each_set_bit(i,&edsr, 32) {//循环寻找edsr中为1的位

gpio= i + bank * 32;//找出是哪个gpio

/*ack edge triggered IRQs immediately*/

if (!(level_bits & (1<

writel(1<

generic_handle_irq(gpio_to_irq(gpio));/*ack level triggered IRQ after handling them*/

if (level_bits & (1<

writel(1<

}

}returnIRQ_HANDLED;

}

本函数是IRQ_GPIO3中断向量的回调函数,作用是:扫描寄存器寻找发生中断的中断号,发生中断的即调用相应的回调函数。

1.for_each_set_bit(i, &edsr, 32) //循环寻找edsr中为1的位 即发生中断

2.generic_handle_irq(gpio_to_irq(gpio));//调用该中断向量的中断回调函数(驱动申请irq资源时会填写)gpio_to_irq(gpio)为发生中断的中断向量号

三·中断控制器回调函数

/*中断控制器*/

static struct irq_chip bcm2708_irqchip ={

.name= "GPIO",

.irq_enable= bcm2708_gpio_irq_unmask,//使能该irq,通常是直接调用irq_unmask()

.irq_disable = bcm2708_gpio_irq_mask,//禁止该irq,通常是直接调用irq_mask

.irq_unmask = bcm2708_gpio_irq_unmask,//取消屏蔽该irq

.irq_mask = bcm2708_gpio_irq_mask,//屏蔽该irq

.irq_set_type = bcm2708_gpio_irq_set_type,//设置irq的电气触发条件

};

内核为中断进行了抽象,必要的与平台相关的函数由irq_chip来表述。在这些回调函数中通通是通过写寄存器的方式来开启或者屏蔽中断。

四·打印实验

当我将gpio4同底线短接的时候就会连续发生IRQ_GPIO3中断。在应用层可以使用poll函数来监听这个事件进行相应的处理。

generic_handle_irq(gpio_to_irq(gpio));

linux 应用层gpio中断_树莓派官方自带gpio中断驱动bcm2708_gpio.c原理分析 linux 中断架构 中断子系统...相关推荐

  1. 树莓派linux下gpio驱动,树莓派官方自带gpio驱动bcm2708_gpio.c原理分析 linux gpio架构 gpio子系统...

    对树莓派gpio的操作有好多方法,比如mmap映射cpu内存,编写内核驱动模块等.这里推荐一篇文章外链网址已屏蔽 其实树莓派官方使用linux内核gpio驱动框架内置了一个驱动,让我们可以直接使用标准 ...

  2. 树莓派python gpio图形_树莓派GPIO功能学习

    前言 树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派的学习可以分为linux系统学习和linux驱动学习,利用树莓派制作LED流水灯应该算是驱动学习吧.树莓派来自国外,国外嵌入式开源领域具备良 ...

  3. hal库开启中断关中断_「正点原子NANO STM32开发板资料连载」第十章 外部中断实验...

    1)实验平台:ALIENTEK NANO STM32F411 V1开发板 2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第十章 外 ...

  4. linux源码头文件_您必须在2020年尝试的十大最佳Linux码头

    linux源码头文件 Who says Linux cannot be beautiful? Today we'll be going over the top 10 best Linux docks ...

  5. hal库开启中断关中断_[STM32]HAL库下GPIO按键中断与去抖问题分析(分析源码解决问题)...

    自上篇文章STM32 非阻塞HAL_UART_ReceiveIT解析与实际应用,具体总结了HAL库下套娃函数中如何看清库函数的脉络,更细致的认识调用的过程,以解决潜在的问题.又又又遇到了新的问题(GP ...

  6. python人脸识别门禁系统毕设_树莓派人脸识别门禁系统代码以及代码分析——opencv拍照调用FACE++处理...

    树莓派人脸识别门禁系统的总体设计 硬件包括:树莓派3B.电源模块.转5V降压模块.触摸感应传感器模块.声光报警模块和驱动模块. 由此设计出的人脸识别门禁系统总体结构框图如下: 总体结构框图 程序运行时 ...

  7. 国内用户最多的linux系统,Ubuntu 10.10 Beta 官方版—时下最受欢迎 用户最多的Linux开源操作系统...

    Ubuntu 10.10 Beta 版发布了!今天本来是想写篇正面介绍Linux操作系统的文章,作为Linux系统的领军者Ubuntu自然是我选择的对象,好吧,那就趁机一起介绍一下吧! Ubuntu是 ...

  8. linux 定位 踩内存_运维必备的问题定位工具及案例分析

    [摘要]本文主要介绍各种问题定位的工具,并结合案例分析问题. 1. 背景 有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源.这时候就需要登录服务器进一步深入分析问题的根源.那么分析问 ...

  9. linux java jar打包_【Java】Java程序打包成jar包在Linux上运行

    当需要把在Windows上开发的Java程序用在Linux上运行时,就需要吧该Java程序打包成jar包上传到Linux上去运行. 1.Java程序用MyEclipse打包成可运行的jar包 (1)在 ...

最新文章

  1. 复杂科学2021年度精选:从诺贝尔奖到未来科学
  2. DL之DenseNet:DenseNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  3. Android 实用开源控件
  4. 阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则
  5. 最近一段时间经历的事情即做事方式的总结
  6. Java集合---面试题
  7. ssh mysql环境搭建_Ubuntu下JDK+Tomcat+MySql环境的搭建
  8. 如何将zipoutputstream返回_嫦娥五号返回器要“跳”一下再回地球!这一“跳”大有讲究...
  9. opcache引起的“php-cgi.exe - FastCGI 进程意外退出”,事件ID487
  10. java Session缓存
  11. linux 命令打印,Linux终端打印命令使用介绍
  12. 使用Keras-yolov3来识别滑动验证码
  13. Facebook分享动态内容
  14. 夜神模拟器99%卡死打不开问题
  15. LittleVGL开发之显示中文字体以及矢量图标
  16. 1秒究竟等于多少毫秒?
  17. 永恒之蓝--Windows7
  18. Latex、如何将word中的表格转换为Latex代码
  19. 入侵检测与防御技术基础
  20. Flask项目能打包为单个exe文件运行?掌握原理后居然如此简单!

热门文章

  1. 基于STM32的贪吃蛇小游戏
  2. Android 7.0配置fileprovider共享文件 解决FileUriExposedException
  3. 笔记本重装系统(Win10)
  4. 电磁场与仿真软件(28)
  5. C++中的volatile(Primer读书笔记)
  6. NTP 时区+时间同步
  7. CDN--降低75%CDN成本!黑科技PCDN前世今生:定义、功能、架构、场景和优势
  8. Day04 关键字、标识符、变量及运算符
  9. 如何修复png图片?简单的方法
  10. Vue.js高仿饿了么外卖App学习记录