|
From: | she roy |
Subject: | Re: [Qemu-devel] Fwd: trigger a gpio interrupt inside qemu |
Date: | Wed, 28 Aug 2013 17:33:57 +0800 |
On Wed, Aug 28, 2013 at 12:19 PM, she roy <address@hidden> wrote:This register defines which event on the GPIO side causes PL061 to
> PL061 has a register GPIOIS to control if the interrupt is lever-triggered
> or edge-triggered, I will try this. Thanks.
generate IRQ. The IRQ it generates is always signalled by level.
You need to update GPIOIC register from your driver's ISR to clear it.
--
>
> 2013/8/28 Max Filippov <address@hidden>
>>
>> On Wed, Aug 28, 2013 at 12:01 PM, she roy <address@hidden> wrote:
>> > I tested qemu_irq_pulse(gPl061->irq); the guest did not generate an
>> > interrupt. so I changed to
>> >
>> > qemu_set_irq(gPl061->irq, 1);
>> > sleep(1);
>> > qemu_set_irq(gPl061->irq, 0);
>> >
>> > A lot of interrupts generated. Is it possible to generate just one
>> > interrupt?
>>
>> This looks like level-triggered interrupt behaviour. In such cases
>> interrupt handler
>> in the device driver is usually responsible for disabling IRQ line
>> while processing
>> interrupt. You can add a register to your device, writing to which would
>> call
>>
>> qemu_set_irq(gPl061->irq, 0)
>>
>> and write to that register from your driver's ISR.
>> Or you can choose an edge-triggered IRQ to play with.
>>
>> > 2013/8/27 Max Filippov <address@hidden>
>> >>
>> >> On Tue, Aug 27, 2013 at 3:55 PM, she roy <address@hidden> wrote:
>> >> > How to lower it? Thank you very much!
>> >> >
>> >>
>> >> qemu_set_irq(gPl061->irq, 0);
>> >>
>> >> Or you could try
>> >>
>> >> void pl061_raise_irq()
>> >> {
>> >> qemu_irq_pulse(gPl061->irq);
>> >> }
>> >>
>> >> > 2013/8/27 Max Filippov <address@hidden>
>> >> >>
>> >> >> On Tue, Aug 27, 2013 at 3:36 PM, she roy <address@hidden>
>> >> >> wrote:
>> >> >> > Is there somebody can help me to trigger a gpio interrupt inside
>> >> >> > qemu? I
>> >> >> > wrote a simple function to trigger a interrupt in pl061.c as
>> >> >> > follow:
>> >> >> > PL061State *gPl061;
>> >> >> > void pl061_raise_irq()
>> >> >> > {
>> >> >> > qemu_set_irq(gPl061->irq, 1);
>> >> >> > }
>> >> >>
>> >> >> [...]
>> >> >>
>> >> >> > But when i call pl061_raise_irq inside qemu once, the guest run
>> >> >> > into
>> >> >> > an
>> >> >> > infinite loop. it prints:
>> >> >> > ...
>> >> >> > irq:[927012]receive the irq at -12002...
>> >> >> > irq:[927013]receive the irq at -12002...
>> >> >> > irq:[927014]receive the irq at -12002...
>> >> >> > irq:[927015]receive the irq at -12002...
>> >> >> > irq:[927016]receive the irq at -12002...
>> >> >> > irq:[927017]receive the irq at -12002...
>> >> >> > irq:[927018]receive the irq at -12002...
>> >> >> > ...
>> >> >> > can somebody tell me what's wrong?
>> >> >>
>> >> >> You have raised IRQ in your pl061_raise_irq(), but you haven't
>> >> >> lowered
>> >> >> it.
>>
>> --
>> Thanks.
>> -- Max
>
>
Thanks.
-- Max
[Prev in Thread] | Current Thread | [Next in Thread] |