中断

1、中断处理函数的注册

中断处理函数的注册使用request_irq,该原型定义在linux/interrupt.h中,函数原型如下:

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);

irq为申请的中断号。

handler为中断处理函数指针,该函数指针定义如下:typedef irqreturn_t (*irq_handler_t)(int, void *);

flags有0或以下几种取值,定义在linux/interrupt.h中:

IRQ_DISABLED:用于中断处理函数运行时禁止所有中断。

IRQ_SHARED:用于共享中断。

IRQ_TIMER:用于处理特殊的system timer中断。

name为ASCII文本。

dev参数用于共享中断。

如果request_irq函数调用成功将返回0,否则返回错误码,例子如下(来自s3c2410_wdt.c):

ret = request_irq(wdt_irq->start, s3c2410wdt_irq, 0, pdev->name, pdev);
if (ret != 0) {
        dev_err(dev, "failed to install irq (%d)\n", ret);
        goto err_map;
}
中断处理函数定义在这里:

/* interrupt handler code */

static irqreturn_t s3c2410wdt_irq(int irqno, void *param)
{
        dev_info(wdt_dev, "watchdog timer expired (irq)\n");

        s3c2410wdt_keepalive();
        return IRQ_HANDLED;
}


2、释放中断

释放一个中断处理函数使用free_irq,函数原型如下:

void free_irq(unsigned int irq, void *dev);


3、禁止和启用中断

禁止中断使用disable_irq函数,启用中断使用enable_irq函数,原型如下:

void disable_irq(unsigned int irq);
void enable_irq(unsigned int irq);

// 2015.08.28 add
注意disable_irq和enable_irq必须成对出现,即只有调用了disable_irq函数,才能调用enable_irq函数,否则调用enable_irq会出现一个warning信息,信息内容大致如下:
Unbalanced enable for IRQ ...

// 2015.07.25 add

4. 中断唤醒

如果要使能中断具有唤醒系统功能,那么应该怎么做呢,这里有两个函数。

int enable_irq_wake(unsigned int irq);
int disable_irq_wake(unsigned int irq);

这两个函数通常应该分别在suspend、resume中被调用,同时,在request_irq时需要加上IRQF_NO_SUSPEND标志。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值