微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm驱动linux内核中断编程

arm驱动linux内核中断编程

时间:11-19 来源:互联网 点击:

三、使用模板
使用步骤:以外部中断为例
a)定义结构体,相当于定义(void *dev_id)中的(void *)

struct pin_desc{//声明一个引脚描述的结构体pin_desc
unsigned int pin;//引脚值,参考数据手册及板子电路原理
unsigned int key_val;//值自已随便定义;看自己的项目需要
//...................
};

b)实例化结构体,相当于(void *dev_id)中的 dev_id

struct pin_desc pins_desc[3] = {//实例化结构体,以jz2440按键为列
{S3C2410_GPF0, 0x01},//S3C2410_GPFn在内核中定义好了
{S3C2410_GPF2, 0x02},
{S3C2410_GPG3, 0x03},
};

c)定义中断处理函数

static irqreturn_t irq_handle(int irq, void *dev__id){
struct pin_desc *pindesc = (struct pin_desc *)dev__id;
//................
return IRQ_RETVAL(IRQ_HANDLED);//返回IRQ_HANDLED表示中断已经处理
}

d)申请中断

request_irq(IRQ_EINT0, irq_handle, IRQ_TYPE_EDGE_BOTH, "s2", &pins_desc[0]);//IRQ_EINTn在内核中定义好了
request_irq(IRQ_EINT2, irq_handle, IRQ_TYPE_EDGE_BOTH, "s3", &pins_desc[1]);
request_irq(IRQ_EINT11, irq_handle, IRQ_TYPE_EDGE_BOTH, "s4", &pins_desc[2]);

e)释放内存

free_irq(IRQ_EINT0, &pins_desc[0]);
free_irq(IRQ_EINT2, &pins_desc[1]);
free_irq(IRQ_EINT11, &pins_desc[2]);

Tip:可以直接将IRQ_EINTn也在pins_desc定义,然后

int i = 0;
for(i = 0; i < 3; i++){
free_irq(pins_desc[i].irqnum, &pins_desc[i]);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top