qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] Fwd: trigger a gpio interrupt inside qemu


From: Max Filippov
Subject: Re: [Qemu-devel] Fwd: trigger a gpio interrupt inside qemu
Date: Wed, 28 Aug 2013 12:27:33 +0400

On Wed, Aug 28, 2013 at 12:19 PM, she roy <address@hidden> wrote:
> PL061 has a register GPIOIS to control if the interrupt is lever-triggered
> or edge-triggered, I will try this. Thanks.

This register defines which event on the GPIO side causes PL061 to
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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]