arm驱动linux内核中断编程
三、使用模板
使用步骤:以外部中断为例
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]);
}
arm驱动linux内核中断编 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)