我注册了中断函数:
printk(KERN_ERR "gpioc2: register irq start\n");
ret=request_irq(INT_GPIO_1, gpioc2_irq_interrupt,IRQF_SHARED,"gpioc2",(void *)(&am_gpio));
if (ret < 0)
{
printk(KERN_ERR "GPIOC_2: request_irq failed, ret=%d.\n", ret);
return ret;
};
gpioc2_fiq_flag=1;
printk(KERN_ERR "gpioc2: register irq success\n");
中断函数是一行打印:
static irqreturn_t gpioc2_irq_interrupt(int irq, void *dev_id)
{
printk(KERN_ERR "I get a reset key!!!\n");
aml_set_reg32_bits(P_SYS_CPU_0_IRQ_IN2_INTR_STAT_CLR, 1, 1, 1); // Write 1 to clear irq
tasklet_schedule(&mytasklet);
return IRQ_HANDLED;
}
编译完成后,启动时发现注册时居然执行了中断函数:
[ 7.191587@0] gpioc2: register irq start
[ 7.195459@0] gpioc2: register irq success
[ 7.199548@0] I get a reset key!!!
我屏蔽了中断也还是这样,怀疑是request_irq引起的,求大神指点
13 个解决方案
#1
把你的中断触发方式改一改
#2
我用的是下降沿出发,我再request_irq前都把中断屏蔽了,还是会在注册的时候调用
#3
注册的时候INT_GPIO_1是否有下降沿变化
#4
IRQF_SHARED -> IRQF_TRIGGER_FALLING | IRQF_SHARED
#5
1. 在哪里disable和enable的中断?
2. 根据输出,中断函数是在打印 register irq success之后,也就是request_irq之后,为啥说是在request_irq中执行的?
2. 根据输出,中断函数是在打印 register irq success之后,也就是request_irq之后,为啥说是在request_irq中执行的?
#6
申请中断成功后内核会调用一次中断服务函数
#7
若使用共享中断,那么中断处理函数自身需要能识别是否是自己的设备产 生了中断
发生中断时,内核并不判断究竟是共享中断线上的哪个设备产生了中断,它会循环 执行所有该中断线上注册的中断处理函数
发生中断时,内核并不判断究竟是共享中断线上的哪个设备产生了中断,它会循环 执行所有该中断线上注册的中断处理函数
#8
这个可以不用管,我遇到过加载驱动调用打开关闭函数的,不知道内核抽什么风,我也研究了许久,没啥发现,只能归结位内核安全检查之类的
#9
函数本身不会引起中断的触发。
但注册前,最好保证中断标志位是清零的,或者没有什么触发。
但注册前,最好保证中断标志位是清零的,或者没有什么触发。
#10
必定是符合中断条件了才进入ISR的。在注册中断ISR之前,应该要clear相关状态register。
#11
瞅了后面的回复才明白啥意思,原来描述的是 申请注册中断成功,没有硬件处罚但是却调用了中断响应函数???我觉得你还是把IRQF_SHARED 改改试试,这现象还真没遇到过
#12
#13
老贴了。 应该要在中断处理函数里判断下,是GPIO1里具体哪个IO的中断。
#1
把你的中断触发方式改一改
#2
把你的中断触发方式改一改
我用的是下降沿出发,我再request_irq前都把中断屏蔽了,还是会在注册的时候调用
#3
把你的中断触发方式改一改
我用的是下降沿出发,我再request_irq前都把中断屏蔽了,还是会在注册的时候调用
#4
IRQF_SHARED -> IRQF_TRIGGER_FALLING | IRQF_SHARED
#5
1. 在哪里disable和enable的中断?
2. 根据输出,中断函数是在打印 register irq success之后,也就是request_irq之后,为啥说是在request_irq中执行的?
2. 根据输出,中断函数是在打印 register irq success之后,也就是request_irq之后,为啥说是在request_irq中执行的?
#6
申请中断成功后内核会调用一次中断服务函数
#7
若使用共享中断,那么中断处理函数自身需要能识别是否是自己的设备产 生了中断
发生中断时,内核并不判断究竟是共享中断线上的哪个设备产生了中断,它会循环 执行所有该中断线上注册的中断处理函数
发生中断时,内核并不判断究竟是共享中断线上的哪个设备产生了中断,它会循环 执行所有该中断线上注册的中断处理函数
#8
这个可以不用管,我遇到过加载驱动调用打开关闭函数的,不知道内核抽什么风,我也研究了许久,没啥发现,只能归结位内核安全检查之类的
#9
函数本身不会引起中断的触发。
但注册前,最好保证中断标志位是清零的,或者没有什么触发。
但注册前,最好保证中断标志位是清零的,或者没有什么触发。
#10
必定是符合中断条件了才进入ISR的。在注册中断ISR之前,应该要clear相关状态register。
#11
瞅了后面的回复才明白啥意思,原来描述的是 申请注册中断成功,没有硬件处罚但是却调用了中断响应函数???我觉得你还是把IRQF_SHARED 改改试试,这现象还真没遇到过
#12
#13
老贴了。 应该要在中断处理函数里判断下,是GPIO1里具体哪个IO的中断。