1.Cortex-A系列的中断的简介
中断的基本概念:(interrupt)
中断本质上是系统内部的异常机制,当中断产生之后,他会停下当前正在执行的任务,转而去做其他的事情,在停下当前正在执行的任务之前,要先入栈(保护现场,其他的事情做完之后,我们要继续执行先前的任务,就需要先恢复现场(出栈)。
linux下的中断一般是分为两类:
软中断: 信号、软件定时器
硬中断:跟硬件相关的,如:按键
A系类的芯片支持的中断的类型:
SGI:软件生成中断;
PPI:私有外设中断;
SPI:共享的外设的中断,使用的比较多的中断的类型;
A系列的芯片:
可以设置中断的优先级;
可以使能或者失能中断;
在linux系统中,中断其实就是一个编号,要想使用某个中断我们必须先知道这个中断的编号;
在系统里要想查看中断的使用情况 : cat /proc/interrupts
2.linux的外部中断的介绍
外部中断输入spi的共享中断,中断并不能直接使用硬件的中断号,要想使用中断必须借助与内核提供的函数,将引脚转换成linux认同的中断号。
3.linux中断注册相关的API
函数的原型:int gpio_to_irq(unsigned int gpio)
功能:将一个GPIO口转换成中断号
头文件:<linux/gpio.h>
参数:unsigned int gpio:你要转换成中断号的GPIO口的编号
返回值:成功返回要使用的中断号
有了中断号之后就可以对中断进行注册 等等相关的操作;
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数的原型:void enable_irq(unsigned int irq)
功能:使能中断
头文件:<linux/irq.h>
参数:unsigned int irq:就是前边你通过gpio_to_irq获取到的中断号
函数的返回值:无
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数的原型: void disable_irq(unsigned int irq)
功能:失能中断号
函数的头文件 :<linux/irq.h>
函数的参数:unsigned int irq:中断号
函数的返回值:无
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数的原型:
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev);
功能:向内核注册一个中断
头文件:<linux/interrupt.h>
参数:
unsigned int irq:中断号
irq_handler_t handler:中断的服务函数,当产生中断的时候会调用此函数
irqreturn_t (*irq_handler_t)(int, void *)
unsigned long flags,:触发的方式
IRQF_TRIGGER_FALLING:下降沿
IRQF_TRIGGER_RISING:上升沿
IRQF_TRIGGER_HIGH:高电平
IRQF_TRIGGER_LOW:低电平
const char *name:中断的名字 会出现在/proc/interrupts这个文件里
void *dev:跟中断服务函数传的私有数据 一般不用
返回值:
成功返回 0
失败返回 负数
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数的原型:void free_irq(unsigned int irq, void *dev_id)
功能:注销一个中断
头文件:<linux/interrupt.h>
参数:
irq:中断号
void *dev_id:要和中断注册函数的最后一个参数dev相同
函数的返回值:无