Example #1
0
void Timer::attachInterrupt(isrFunc f) {
    uint32_t irq = getIRQ();
    if (irq > 0) {
        Interrupt::attachInterrupt(irq, f);
        Interrupt::enableIRQ(irq);
    }
}
Example #2
0
void Timer::detatchInterrupt() {
    uint32_t irq = getIRQ();
    if (irq > 0) {
        Interrupt::disableIRQ(irq);
        Interrupt::detatchInterrupt(irq);
    }
}
Example #3
0
//******************************************************************************
//******************************************************************************
extern "C" ULONG  __cdecl __saveregs OSSIDC_EntryPoint(ULONG cmd, IDC16_PACKET FAR *packet)
{
 BOOL fPciDevice = TRUE;
 int  i;

   switch(cmd & 0xFFFF) 
   {
   case IDC16_INIT:
	break;

   case IDC16_EXIT:
	IDCTable.ProtIDCEntry = 0;
	break;

   case IDC16_SETIRQ:
   {
	IRQ *pIrq = pMakeIRQ((USHORT)packet->irq.irqnr);
	if(!pIrq) return FALSE;

	if(pIrq->bAddHandler(OSS_Irq_Handler) == FALSE) {
		DebugInt3();
		return FALSE;
	}

	if(pIrq->bEnableHandler(OSS_Irq_Handler) == FALSE) {
		DebugInt3();
		return FALSE;
	}
	return TRUE;
   }
   case IDC16_FREEIRQ:
   {
	IRQ *pIrq = getIRQ((USHORT)packet->irq.irqnr);
	if(!pIrq) return FALSE;

	if(pIrq->bDisableHandler(OSS_Irq_Handler) == FALSE) {
		DebugInt3();
		return FALSE;
	}
	return TRUE;
   }

   case IDC16_FIND_PNPDEVICE:
	fPciDevice = FALSE;
	//fall through	
   case IDC16_FIND_PCIDEVICE:
   {
    LDev_Resources* pResources;
    IDC_RESOURCE FAR *idcres = (IDC_RESOURCE FAR *)packet->finddev.pResource;

   	if(!pRM->bIsDevDetected(packet->finddev.devid, SEARCH_ID_DEVICEID, fPciDevice)) {
      		return 0;
   	}

   	pResources = pRM->pGetDevResources(packet->finddev.devid, SEARCH_ID_DEVICEID, fPciDevice);
   	if ((!pResources) || pResources->isEmpty()) {
      		return 0;
   	}
      	// Available device resources identified
	for(i=0;i<MAX_ISA_Dev_IO;i++) {
		idcres->io[i] = pResources->uIOBase[i];
		idcres->iolength[i] = pResources->uIOLength[i];
	}
	for(i=0;i<MAX_ISA_Dev_IRQ;i++) {
		idcres->irq[i] = pResources->uIRQLevel[i];
	}
	for(i=0;i<MAX_ISA_Dev_DMA;i++) {
		idcres->dma[i] = pResources->uDMAChannel[i];
	}
	for(i=0;i<MAX_ISA_Dev_MEM;i++) {
		idcres->mem[i] = pResources->uMemBase[i];
		idcres->memlength[i] = pResources->uMemLength[i];
	}
	delete pResources;
	return 1;
   }
   case IDC16_MALLOC:
   {
	LIN linaddr;
	ULONG near *addr16 = (ULONG near *)malloc((USHORT)packet->malloc.size+4);
	ULONG far *addr = (ULONG far *)addr16;

	if(addr16 == NULL) {
		return 0;
	}
	*addr = (ULONG)addr;
	if(DevHelp_VirtToLin(SELECTOROF(addr), OFFSETOF(addr), &linaddr)) {
		dprintf(("DevHelp_VirtToLin failed for %x:%x\n", SELECTOROF(addr), OFFSETOF(addr)));
		DebugInt3();
		return 0;
	}
	return linaddr;
   }
   case IDC16_FREE:
	free((void __near *)(void far *)packet->free.addr);
	break;
   case IDC16_VMALLOC:
	break;
   case IDC16_VMFREE:
	break;
   case IDC16_PROCESS:
   {
        PWAVESTREAM pStream;

	if(packet->process.type == IDC16_MIDI_IRQ) {
		MPU_401::processIrq(packet->process.streamid);
		break;
	}

	pStream = (PWAVESTREAM)FindActiveStream((packet->process.type == IDC16_WAVEOUT_IRQ) ? STREAM_WAVE_PLAY : STREAM_WAVE_CAPTURE,
                                                 packet->process.streamid);
	if(pStream) {
		pStream->Process();
		return 0;
	}
	dprintf(("Stream %lx not found or not active!", packet->process.streamid));
	break;
   }

   }
   return 0;
}