作者srx78 (srx)
看板LinuxDev
标题[问题] 中断处理的问题请教
时间Sat Feb 25 21:12:44 2012
想要请问一下
我碰到的问题是这样
如果遇到二个device 共用同一个interrupt pin
因此必须透过i2c去读pin的address来判别是谁发出的中断
可是在irqreturn_t这个中断处理函式
又不能去做i2c任何事情
我只好开一个workqueue去做ISR
这时候又遇到一个问题
在开完workqeue後, irqreturn_t立刻回传IRQ_HANDLED 告诉上层
但实际上我的workqueue事情却还没做完
导致系统当掉
一定要去判别发出的interrupt是哪个device
又必须立刻回传IRQ_HANDLED
这样该怎麽做?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.255.9.235
1F:→ gkk886:不清楚为何你先回传会当掉 也许可以试试等中断处理的部分用 02/25 23:42
2F:→ gkk886:wait_for_completion 然後workqueue处理时去complete? 02/25 23:43
3F:→ srx78:在中断处理不是不可休眠吗?可以使用wait_for_completion ? 02/26 01:13
4F:→ srx78:想再请问一下 02/26 22:10
5F:→ srx78:在irqreturn_t的function内,是不是真的不能使用i2c去读 02/26 22:11
6F:→ srx78:register的值,还是需要利用其他技巧才能使用i2c?? 02/26 22:11
7F:推 askacis:开一个kernel thread,中断来时唤醒该kthread去读值 02/26 23:30
8F:→ srx78:我现在就是这麽做,interrupt来我就利用一个work queue去读值 02/26 23:33
9F:→ srx78:根据读值结果,决定做哪个interrupt function 02/26 23:34
10F:→ srx78:可是问题是读值过程 我已经回传IRQ_HANDLED 02/26 23:35
11F:→ srx78:我要如何确保事情都做完了才回传IRQ_HANDLED 02/26 23:37
12F:→ gkk886:我的意思是你需要等i2c读值出来的部分去wait 02/27 01:12
13F:→ gkk886:中断时排工作到queue 然後工作被拿出来後读i2c值并complete 02/27 01:15
14F:→ admon:是不是因你把消除中断的code也挪进workqueue 所以中断一直发 02/27 17:30
15F:→ WPC001:disable_irq/enable_irq 02/27 19:07
16F:→ WPC001:disable_irq_no_sync 02/27 19:08
17F:→ admon:我说的code是 "清某个register"的动作 和楼上说的不同 02/27 20:56
18F:→ srx78:的确是把清register的动作在queue里面做 02/27 21:59
19F:→ srx78:不过本来就预期中断要一直过来~不懂为何要disable_irq?? 02/27 22:00
20F:→ srx78:中断连续过来是正常行为, 02/27 22:03
21F:→ srx78:可是卡在还没做完就回传IRQ_HANDLED,不知道如何等queue做完 02/27 22:03
22F:→ srx78:再回传~ 因为irqreturn_t内不能清register,所以必须开queue 02/27 22:04
23F:→ admon:1.消除中断的code必要留在isr内 否则workqueue可能没机会跑 02/28 11:14
24F:→ admon:2.如果只为了判断是否回IRQ_HANDLED,乾脆直接回IRQ_HANDLED 02/28 11:17
25F:→ admon:负面影响为randomness不准 (参考kernel/irq/handle.c) 02/28 11:21
26F:→ admon:那条irq line都不要设IRQF_SAMPLE_RANDOM罢了 02/28 11:22
27F:→ srx78:清中断的动作要用i2c,不能在isr里面做,kernel会当掉~ 02/28 16:22
28F:→ srx78:所以我才在work queue做,不过又变成我内文讲的状况 02/28 16:23
29F:→ srx78:work queue在清中断(判别中断),可是driver已回传IRQ_HANDLE 02/28 16:24
30F:→ admon:若不能从isr清中断, 那只能暂时把那条irq line disable, 02/28 21:48
31F:→ admon:直到你的workqueue跑完再enable那条irq line 02/28 21:49