Commit 8528e582c4124634376de162bd7b949de39c1603
authorMichel Pollet <buserror@gmail.com>
Thu, 15 Mar 2012 14:16:34 +0000 (14:16 +0000)
committerMichel Pollet <buserror@gmail.com>
Thu, 15 Mar 2012 14:16:34 +0000 (14:16 +0000)
'filtered' interrupts didn't work if the initial value was the same as the
one used to raise the irq. Now it works properly, can could also be used
to track IRQs in the pool by usage.

Signed-off-by: Michel Pollet <buserror@gmail.com>
2 files changed:
simavr/sim/sim_irq.c
simavr/sim/sim_irq.h

index 0e4c56e85b2218d57051d3cb0a22012ec9839df3..68d218b134ec6580fd9af78f54dfd9d66c3f7d2d 100644 (file)
@@ -71,6 +71,7 @@ avr_init_irq(
 
        for (int i = 0; i < count; i++) {
                irq[i].irq = base + i;
+               irq[i].flags = IRQ_FLAG_INIT;
                if (pool)
                        _avr_irq_pool_add(pool, &irq[i]);
                if (names && names[i])
@@ -185,8 +186,11 @@ avr_raise_irq(
        if (!irq)
                return ;
        uint32_t output = (irq->flags & IRQ_FLAG_NOT) ? !value : value;
-       if (irq->value == output && (irq->flags & IRQ_FLAG_FILTERED))
+       // if value is the same but it's the first time, raise it anyway
+       if (irq->value == output &&
+                       (irq->flags & IRQ_FLAG_FILTERED) && !(irq->flags & IRQ_FLAG_INIT))
                return;
+       irq->flags &= ~IRQ_FLAG_INIT;
        avr_irq_hook_t *hook = irq->hook;
        while (hook) {
                avr_irq_hook_t * next = hook->next;
index d75c8e7466c32492994cd9fa9b54856d4ac23210..ed2d5e59b3a9f6a2012cd0396df545a806113a52 100644 (file)
@@ -55,6 +55,7 @@ enum {
        IRQ_FLAG_NOT            = (1 << 0),     //!< change polarity of the IRQ
        IRQ_FLAG_FILTERED       = (1 << 1),     //!< do not "notify" if "value" is the same as previous raise
        IRQ_FLAG_ALLOC          = (1 << 2), //!< this irq structure was malloced via avr_alloc_irq
+       IRQ_FLAG_INIT           = (1 << 3), //!< this irq hasn't been used yet
 };
 
 /*