Exemplo n.º 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;
	}
}
Exemplo n.º 2
0
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
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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
}
Exemplo n.º 5
0
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;
	}
}
Exemplo n.º 6
0
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);
}