linux中setup_irq和remove_irq

参考文章:https://www.cnblogs.com/hoys/archive/2012/05/30/2525996.html

  1. Setup_irq

Setup_irq通常是直接注册irqaction,并没针对相应中断线进行错误检测,如该irq 线是否已经被占用等。因此setup_irq通常只用在特定的中断线上,如System timer。除系统时钟驱动外,大部份驱动还是通过request_irq注册中断。

/**
 *	setup_irq - setup an interrupt
 *	@irq: Interrupt line to setup
 *	@act: irqaction for the interrupt
 *
 * Used to statically setup interrupts in the early boot process.
 */
int setup_irq(unsigned int irq, struct irqaction *act)
{
	int retval;
	struct irq_desc *desc = irq_to_desc(irq);

	if (WARN_ON(irq_settings_is_per_cpu_devid(desc)))
		return -EINVAL;
	chip_bus_lock(desc);
	retval = __setup_irq(irq, desc, act);
	chip_bus_sync_unlock(desc);

	return retval;
}

用法示例:

static irqreturn_t timer3_interrupt(int irq, void *dev_id)
{
    __raw_writel(0x01, REG_TIMER_ISR(TIMER3)); /* clear TIF0 */      
	nuc_timer3_func();                
    return IRQ_HANDLED;
}
static struct irqaction timer3_irq = {
    .name           = "timer3",
    .flags          =  IRQF_TIMER | IRQF_IRQPOLL,
    .handler        = timer3_interrupt,
};
setup_irq(IRQ_TIMER3, &timer3_irq );
  1. remove_irq
    与setup_irq对应的应该是remove_irq,而不是free_irq,不然在卸载终端的时候会一直报错。特别注意。
/**
 *	remove_irq - free an interrupt
 *	@irq: Interrupt line to free
 *	@act: irqaction for the interrupt
 *
 * Used to remove interrupts statically setup by the early boot process.
 */
void remove_irq(unsigned int irq, struct irqaction *act)
{
	struct irq_desc *desc = irq_to_desc(irq);

	if (desc && !WARN_ON(irq_settings_is_per_cpu_devid(desc)))
	    __free_irq(irq, act->dev_id);
}

示例用法

remove_irq(IRQ_TIMER3,&timer3_irq );
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值