How kernel handle interrupts
From: anish kumar <hidden>
Date: 2012-12-21 10:53:38
On Fri, 2012-12-21 at 17:34 +0800, Woody Wu wrote:
? 2012-12-21 AM2:05?"anish singh" [off-list ref]? ??quoted
On Dec 20, 2012 6:30 AM, "Woody Wu" [off-list ref] wrote:quoted
Hi, List Where is the Kernel code that handles external interrupts? I wanttoquoted
quoted
have a look at it but haven't found out where it is. Actually, I have some basic questions about interrupt handling inLinux.quoted
quoted
1. After Kernel's ISR received an interrupt, I believe it willinvoke aquoted
quoted
handler defined in a device driver if any. But it should be the device driver's responsibility or kernel ISR's responsibilitytoquoted
quoted
clear (or acknowledge) the interrupt?If the interrupt in question is currently being handled then in the case of edge triggered interrupt we just mask the interrupt,setit pending and bail out.Once the interrupt handler completes then we check for pending interrupt and handle it.In level triggered we don't do that.quoted
Kerenel ISR -this is mixture of core kernel interrupt handling code+ your device driver interrupt handler(if this is chip driver which is supposed to get one interrupt and is reponsible for calling other interrupt handlers based on the chip register status then you do explicit masking unmasking yourself).quoted
If you device driver is a interrupt controller driver then youregister your driver with kernel interrupt handling code and need to write some callbacks such as .mask,.unmask and so on.This callbacks are called at appropiate places whenever the interrupt is raised.This interrupt is then passed to drivers who has requested for this interrupt by calling request_irq. Sorry not fully understand . My device is an interrupt line is back to inactive.Ethernet controller. It needs to response TX and RX interrupts triggered by the device itself. In this case , my driver is a chip driver or interrupt controller driver in your terms?
Your device is neither of these.
If my driver needs to do the mask and unmask job, what's the kernel API I should call?
You don't need to worry about mask and unmask job AFAIK.
And , I don't understand why there exists differences between level and edge triggered interrupts in terms of kernel handling.
Level type interrupts are active as long as the hardware line has the active level. This may require to mask the interrupt and unmask it after the associated handler has acknowledged the device, so the interrupt line is back to inactive. Edge interrupt occurs on the falling and/or rising edge of a hardware signal.The occurrence is latched into the irq controller hardware and must be acked in order to be re-enabled. Read the code /kerel/irq/chip.c(handle_edge_irq & handle_level_irq)
I know my questions might be basic , so would please tell me what's
If it was not basic then this question wouldn't be in kernelnewbies right :)?
the kernel code for ARM architecture doing these complex jobs as you explained?
You don't need to worry about it but if you want to know further then I suggest tracing the call flow from asm interrupt handler(I believe do_irq but not sure) in arm to handle_edge_irq call flow by adding some logs or just browsing the code.
Thanks in advance !quoted
quoted
2. My device, an AX88796B network controller, asserting theinterruptquoted
quoted
line in a level-triggered manner. Now I met problem with thedevice thatquoted
quoted
might caused by the CPU interrupt mode is not set aslevel-triggered byquoted
quoted
edge trigger. My CPU is Samsung S3C2410, an ARM920T poweredone. Doesquoted
quoted
anyone know usually where and how should I do this kind ofsetting?quoted
Just pass the parameter "level triggered" in request_irq in yourdevice driver.quoted
quoted
Thanks in advance. -- woody I can't go back to yesterday - because I was a different personthen.quoted
quoted
_______________________________________________ Kernelnewbies mailing list Kernelnewbies at kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies