I tried to set   GPIOIC in the ISR, but the result was the same, a lot of
interrupts generated. I guess it is because I call
>> > qemu_set_irq(gPl061->irq, 1);
>> > sleep(1);
>> > qemu_set_irq(gPl061->irq, 0);
in a thread I created. And I don't know how to call these functions in a
qemu thread.


2013/8/28 Max Filippov <jcmvb...@gmail.com>

> On Wed, Aug 28, 2013 at 12:19 PM, she roy <she.min....@gmail.com> 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 <jcmvb...@gmail.com>
> >>
> >> On Wed, Aug 28, 2013 at 12:01 PM, she roy <she.min....@gmail.com>
> 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 <jcmvb...@gmail.com>
> >> >>
> >> >> On Tue, Aug 27, 2013 at 3:55 PM, she roy <she.min....@gmail.com>
> 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 <jcmvb...@gmail.com>
> >> >> >>
> >> >> >> On Tue, Aug 27, 2013 at 3:36 PM, she roy <she.min....@gmail.com>
> >> >> >> 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