<p><br>
在 2012-12-21 PM6:53,&quot;anish kumar&quot; &lt;<a href="mailto:anish198519851985@gmail.com">anish198519851985@gmail.com</a>&gt;写道:<br>
&gt;<br>
&gt; On Fri, 2012-12-21 at 17:34 +0800, Woody Wu wrote:<br>
&gt; &gt;<br>
&gt; &gt; 在 2012-12-21 AM2:05,&quot;anish singh&quot; &lt;<a href="mailto:anish198519851985@gmail.com">anish198519851985@gmail.com</a>&gt;写<br>
&gt; &gt; 道:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; On Dec 20, 2012 6:30 AM, &quot;Woody Wu&quot; &lt;<a href="mailto:narkewoody@gmail.com">narkewoody@gmail.com</a>&gt; wrote:<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; Hi, List<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; Where is the Kernel code that handles external interrupts? I want<br>
&gt; &gt; to<br>
&gt; &gt; &gt; &gt; have a look at it but haven&#39;t found out where it is.<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; Actually, I have some basic questions about interrupt handling in<br>
&gt; &gt; Linux.<br>
&gt; &gt; &gt; &gt; 1. After Kernel&#39;s ISR received an interrupt, I believe it will<br>
&gt; &gt; invoke a<br>
&gt; &gt; &gt; &gt;    handler defined in a device driver if any. But it should be the<br>
&gt; &gt; &gt; &gt;    device driver&#39;s responsibility or kernel ISR&#39;s responsibility<br>
&gt; &gt; to<br>
&gt; &gt; &gt; &gt;    clear (or acknowledge) the interrupt?<br>
&gt; &gt; &gt; If the interrupt in question is currently being handled then in<br>
&gt; &gt; &gt; the case of edge triggered interrupt we just mask the interrupt,set<br>
&gt; &gt; it pending and bail out.Once the interrupt handler completes then we<br>
&gt; &gt; check for pending interrupt and handle it.In level triggered we don&#39;t<br>
&gt; &gt; do that.<br>
&gt; &gt; &gt; Kerenel ISR -this is mixture of core kernel interrupt handling code<br>
&gt; &gt; + your device driver interrupt handler(if this is chip driver which is<br>
&gt; &gt; supposed to get one interrupt and is reponsible for calling other<br>
&gt; &gt; interrupt handlers based on the chip register status then you do<br>
&gt; &gt; explicit masking unmasking yourself).<br>
&gt; &gt; &gt; If you device driver is a interrupt controller driver then you<br>
&gt; &gt; register your driver with kernel interrupt handling code and need to<br>
&gt; &gt; write some callbacks such as .mask,.unmask and so on.This callbacks<br>
&gt; &gt; are called at appropiate places whenever the interrupt is raised.This<br>
&gt; &gt; interrupt is then passed to drivers who has requested for this<br>
&gt; &gt; interrupt by calling request_irq.<br>
&gt; &gt;<br>
&gt; &gt; Sorry not fully understand . My device is an interrupt line is back to<br>
&gt; &gt; inactive.Ethernet controller. It needs to response TX and RX<br>
&gt; &gt; interrupts triggered by the device itself. In this case , my driver is<br>
&gt; &gt; a chip driver or interrupt controller driver in your terms?<br>
&gt; Your device is neither of these.<br>
&gt; &gt;<br>
&gt; &gt; If my driver needs to do the mask and unmask job, what&#39;s the kernel<br>
&gt; &gt; API I should call?<br>
&gt; You don&#39;t need to worry about mask and unmask job AFAIK.<br>
&gt; &gt;<br>
&gt; &gt; And , I don&#39;t understand why there exists differences between level<br>
&gt; &gt; and edge triggered interrupts in terms of kernel handling.<br>
&gt; Level type interrupts are active as long as the hardware line has the<br>
&gt; active level. This may require to mask the interrupt and unmask it after<br>
&gt; the associated handler has acknowledged the device, so the interrupt<br>
&gt; line is back to inactive.</p>
<p>This is a little confusing. You just said I don&#39;t need to worry mask and unmask things. But now you say I need to for the level triggered interrupts...  And, what&#39;s the mask and unmask APIs that I can call?</p>

<p>&gt; Edge interrupt occurs on the falling and/or rising edge of a hardware<br>
&gt; signal.The occurrence is latched into the irq controller hardware<br>
&gt; and must be acked in order to be re-enabled.<br>
&gt; Read the code /kerel/irq/chip.c(handle_edge_irq &amp; handle_level_irq)</p>
<p>Thanks for pointing me there.</p>
<p>&gt; &gt;<br>
&gt; &gt; I know my questions might be basic , so would please tell me what&#39;s<br>
&gt; If it was not basic then this question wouldn&#39;t be in kernelnewbies<br>
&gt; right :)?<br>
&gt; &gt;  the kernel code for ARM architecture doing these complex jobs as you<br>
&gt; &gt; explained?<br>
&gt; You don&#39;t need to worry about it but if you want to know further then I<br>
&gt; suggest tracing the call flow from asm interrupt handler(I believe<br>
&gt; do_irq but not sure) in arm to handle_edge_irq call flow by adding some<br>
&gt; logs or just browsing the code.</p>
<p>Okay I will be reading the code. If you have time please also be kind to help answer my previous questions in this message. Thanks a lot!</p>
<p>&gt; &gt;<br>
&gt; &gt; Thanks in advance !<br>
&gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; 2. My device, an AX88796B network controller, asserting the<br>
&gt; &gt; interrupt<br>
&gt; &gt; &gt; &gt;    line in a level-triggered manner. Now I met problem with the<br>
&gt; &gt; device that<br>
&gt; &gt; &gt; &gt;    might caused by the CPU interrupt mode is not set as<br>
&gt; &gt; level-triggered by<br>
&gt; &gt; &gt; &gt;    edge trigger.  My CPU is Samsung S3C2410, an ARM920T powered<br>
&gt; &gt; one.  Does<br>
&gt; &gt; &gt; &gt;    anyone know usually where and how should I do this kind of<br>
&gt; &gt; setting?<br>
&gt; &gt; &gt; Just pass the parameter &quot;level triggered&quot; in request_irq in your<br>
&gt; &gt; device driver.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; Thanks in advance.<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; --<br>
&gt; &gt; &gt; &gt; woody<br>
&gt; &gt; &gt; &gt; I can&#39;t go back to yesterday - because I was a different person<br>
&gt; &gt; then.<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; _______________________________________________<br>
&gt; &gt; &gt; &gt; Kernelnewbies mailing list<br>
&gt; &gt; &gt; &gt; <a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
&gt; &gt; &gt; &gt; <a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt;<br>
&gt;<br>
</p>