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 }