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 >