Ejemplo n.º 1
0
static bool
enableIRQ(mrf::Object* obj, void*) {
    evgMrm *evg=dynamic_cast<evgMrm*>(obj);
    if(!evg)
        return true;

    /**
     * Enable PCIe interrputs (1<<30)
     *
     * Change by: tslejko
     * Reason: Support for cPCI EVG
     */
    WRITE32(evg->getRegAddr(), IrqEnable,
             EVG_IRQ_PCIIE          | //PCIe interrupt enable,
             EVG_IRQ_ENABLE         |
             EVG_IRQ_EXT_INP        |
             EVG_IRQ_STOP_RAM(0)    |
             EVG_IRQ_STOP_RAM(1)    |
             EVG_IRQ_START_RAM(0)   |
             EVG_IRQ_START_RAM(1)
    );
//     WRITE32(pReg, IrqEnable,
//         EVG_IRQ_ENABLE        |
//         EVG_IRQ_STOP_RAM1     |
//         EVG_IRQ_STOP_RAM0     |
//         EVG_IRQ_START_RAM1    |
//         EVG_IRQ_START_RAM0    |
//         EVG_IRQ_EXT_INP       |
//         EVG_IRQ_DBUFF         |
//         EVG_IRQ_FIFO          |
//         EVG_IRQ_RXVIO
//    );

    return true;
}
Ejemplo n.º 2
0
void
evgSeqRam::dealloc() {
    m_softSeq = 0;

    //clear interrupt flags
    BITSET32(m_pReg, IrqFlag, EVG_IRQ_STOP_RAM(m_id));	
    BITSET32(m_pReg, IrqFlag, EVG_IRQ_START_RAM(m_id));
}
Ejemplo n.º 3
0
void
evgMrm::isr(void* arg) {
    evgMrm *evg = (evgMrm*)(arg);

    epicsUInt32 flags = READ32(evg->m_pReg, IrqFlag);
    epicsUInt32 enable = READ32(evg->m_pReg, IrqEnable);
    epicsUInt32 active = flags & enable;
    
    if(!active)
        return;
    
    if(active & EVG_IRQ_STOP_RAM(0)) {
        if(evg->irqStop0_queued==0) {
            callbackRequest(&evg->irqStop0_cb);
            evg->irqStop0_queued=1;
        } else if(evg->irqStop0_queued==1) {
            WRITE32(evg->getRegAddr(), IrqEnable, enable & ~EVG_IRQ_STOP_RAM(0));
            evg->irqStop0_queued=2;
        }
    }

    if(active & EVG_IRQ_STOP_RAM(1)) {
        if(evg->irqStop1_queued==0) {
            callbackRequest(&evg->irqStop1_cb);
            evg->irqStop1_queued=1;
        } else if(evg->irqStop1_queued==1) {
            WRITE32(evg->getRegAddr(), IrqEnable, enable & ~EVG_IRQ_STOP_RAM(1));
            evg->irqStop1_queued=2;
        }
    }

    if(active & EVG_IRQ_EXT_INP) {
        if(evg->irqExtInp_queued==0) {
            callbackRequest(&evg->irqExtInp_cb);
            evg->irqExtInp_queued=1;
        } else if(evg->irqExtInp_queued==1) {
            WRITE32(evg->getRegAddr(), IrqEnable, enable & ~EVG_IRQ_EXT_INP);
            evg->irqExtInp_queued=2;
        }
    }

    WRITE32(evg->m_pReg, IrqFlag, flags);  // Clear the interrupt causes
    READ32(evg->m_pReg, IrqFlag);          // Make sure the clear completes before returning
    return;
}
Ejemplo n.º 4
0
void
evgMrm::process_eos1_cb(CALLBACK *pCallback) {
    void* pVoid;
    evgSeqRam* seqRam;

    callbackGetUser(pVoid, pCallback);
    seqRam = (evgSeqRam*)pVoid;
    if(!seqRam)
        return;

    {
        interruptLock ig;
        if(seqRam->m_owner->irqStop1_queued==2)
            BITSET32(seqRam->m_owner->getRegAddr(), IrqEnable, EVG_IRQ_STOP_RAM(1));
        seqRam->m_owner->irqStop1_queued=0;
    }

    seqRam->process_eos();
}