Beispiel #1
0
void detachInterrupt(uint8_t interruptNum) {
	int i;
	mc = interruptNum/3;
	
	if(interruptNum >= EXTERNAL_NUM_INTERRUPTS) return;
	if(_userfunc[interruptNum] == NULL) return;
	
	mcsif_Disable(mc, md);
	sifIntMode[interruptNum%3](mc, md, MCPFAU_CAP_DISABLE);
	
	io_DisableINT();
	_userfunc[interruptNum] = NULL;
	io_RestoreINT();
	
	for(i=0; i<3; i++)
		if(_userfunc[mc*3+i] != NULL) break;
	if(i == 3) mcmsif_close(); else mcsif_Enable(mc, md);
	
	for(i=0; i<EXTERNAL_NUM_INTERRUPTS; i++)
		if(_userfunc[i] != NULL) break;
	if(i == EXTERNAL_NUM_INTERRUPTS)
	{
		if(irq_UninstallISR(used_irq, (void*)name) == false)
		    printf("irq_install fail\n");
		else
			used_irq = 0xff;
	}
}
DMPAPI(void) detachInterrupt(uint8_t interruptNum)
{
#if defined (DMP_LINUX)
    if(interruptNum > MAX_INTR_NUM + 1)
        return;

    OSSPINLOCK(idc.spinlock);
    idc.intr[interruptNum].used = false;
    uint8_t mc = interruptNum/3;
    lockMCMSIF();
    if(mc < 4 && !(idc.intr[mc*3].used) && !(idc.intr[mc*3 + 1].used) && !(idc.intr[mc*3 + 2].used))
        mcmsif_close(mc);
    unLockMCMSIF();
    OSSPINUNLOCK(idc.spinlock);
#elif defined (DMP_DOS_DJGPP)
    int i;
    mc = interruptNum/3;

    if(interruptNum >= EXTERNAL_NUM_INTERRUPTS) return;
    if(_userfunc[interruptNum] == NULL) return;

    mcsif_Disable(mc, md);
    sifIntMode[interruptNum%3](mc, md, MCPFAU_CAP_DISABLE);

    io_DisableINT();
    _userfunc[interruptNum] = NULL;
    io_RestoreINT();

    for(i=0; i<3; i++)
        if(_userfunc[mc*3+i] != NULL) break;
    if(i == 3) mcmsif_close(mc);
    else mcsif_Enable(mc, md);

    for(i=0; i<EXTERNAL_NUM_INTERRUPTS; i++)
        if(_userfunc[i] != NULL) break;
    if(i == EXTERNAL_NUM_INTERRUPTS)
    {
        if(irq_UninstallISR(used_irq, (void*)name) == false)
            printf("irq_install fail\n");
        else
            used_irq = 0xff;
    }
#endif
}