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; } }
void Encoder::end() { int i, j; #if defined (DMP_DOS_BC) || (DMP_DOS_DJGPP) detachInterrupt(); io_DisableINT(); if(mode == MODE_NOSET) return; #elif defined (DMP_LINUX) lockMCMSIF(); if(mode == MODE_NOSET) {unLockMCMSIF(); return;} #endif mcsif_Disable(mcn, mdn); #if defined (DMP_DOS_BC) || (DMP_DOS_DJGPP) if(mode == MODE_CAPTURE) { disable_MCINT(mcn, SIFB_CAP1INTBIT); disable_MCINT(mcn, SIFB_CAP2INTBIT); disable_MCINT(mcn, SIFB_CAP3INTBIT); } else { disable_MCINT(mcn, SIFB_TRIGRESETBIT); disable_MCINT(mcn, SIFB_USEREVTBIT); } #endif mode = _mcmode[mcn] = MODE_NOSET; _setZPol = false; _dir = 0; #if defined (DMP_DOS_BC) || (DMP_DOS_DJGPP) io_RestoreINT(); #elif defined (DMP_LINUX) unLockMCMSIF(); #endif for(i=0; i<4; i++) { if(_encfunc[i] != NULL) break; for(j=0; j<3; j++) if(_pcapfunc[i][j] != NULL) break; } #if defined (DMP_DOS_BC) || (DMP_DOS_DJGPP) if(i == 4 && j == 3) { mc_outp(MC_GENERAL, 0x38, mc_inp(MC_GENERAL, 0x38) | (1L << mcn)); if(used_irq == 0xff) return; if(irq_UninstallISR(used_irq, (void*)name) == false) printf("irq_uninstall fail\n"); else used_irq = 0xff; } #endif }
void RTCZero::disableAlarm() { unsigned char tmp; if(RTCZeroInit == false || RTCZeroEnable == false) return; io_DisableINT(); alarmType = ALARMOFF; tmp = inpb_cmos(0x0B); outpb_cmos(0x0B, tmp & ~(0x20)); io_RestoreINT(); irq_UninstallISR(RTCIRQ, (void*)isrname_rtc); RTCZeroEnable = false; }
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 }
void Encoder::end() { int i, j; if(mode == MODE_NOSET) return; detachInterrupt(); io_DisableINT(); mcsif_Disable(mcn, mdn); if(mode == MODE_CAPTURE) { disable_MCINT(mcn, SIFB_CAP1INTBIT); disable_MCINT(mcn, SIFB_CAP2INTBIT); disable_MCINT(mcn, SIFB_CAP3INTBIT); } else { disable_MCINT(mcn, SIFB_TRIGRESETBIT); disable_MCINT(mcn, SIFB_USEREVTBIT); } mode = _mcmode[mcn] = MODE_NOSET; _setZPol = false; io_RestoreINT(); for(i=0; i<4; i++) { if(_encfunc[i] != NULL) break; for(j=0; j<3; j++) if(_pcapfunc[i][j] != NULL) break; } if(i == 4 && j == 3) { mc_outp(MC_GENERAL, 0x38, mc_inp(MC_GENERAL, 0x38) | (1L << mcn)); if(irq_UninstallISR(used_irq, (void*)name) == false) printf("irq_install fail\n"); else used_irq = 0xff; } }
DMPAPI(void) usb_Close(void *vusb) { USB_Device *usb = (USB_Device *)vusb; if (usb == NULL) { err_print((char*)"%s: USB device is null.\n", __FUNCTION__); return; } if (usb->InUse != 0) { io_DisableINT(); { io_outpb(usb->CFR, io_inpb(usb->CFR) & 0xFE); irq_UninstallISR(usb->nIRQ, (void *)usb); } io_RestoreINT(); irq_Close(); io_outpb(usb->CFR, 0x02); // Soft reset while (io_inpb(usb->CFR) & 0x02); #if defined DMP_DOS_DJGPP if (dma_Free(dma_handle) == false) err_print((char*)"%s: Free DMA buffer fail!!\n", __FUNCTION__); #endif ker_Mfree(usb->EP[0].SetupBuf); ker_Mfree(usb->EP[0].InBuf); ker_Mfree(usb->EP[0].OutBuf); ker_Mfree(usb->EP[1].InBuf); ker_Mfree(usb->EP[2].InBuf); ker_Mfree(usb->EP[2].OutBuf); if (io_Close() == false) err_print((char*)"%s: Close IO lib error!!\n", __FUNCTION__); usb->state = USB_DEV_POWERED; usb->InUse = 0; USB_Disconnect(); } DestoryQueue(usb->rcvd); DestoryQueue(usb->xmit); ker_Mfree((void *)usb); }