/*************************************************************************** * NAME: INIT.C ** COPYRIGHT: ** "Copyright (c) 1992, by FORTE ** ** "This software is furnished under a license and may be used, ** copied, or disclosed only in accordance with the terms of such ** license and with the inclusion of the above copyright notice. ** This software or any other copies thereof may not be provided or ** otherwise made available to any other person. No title to and ** ownership of the software is hereby transfered." **************************************************************************** * CREATION DATE: 11/18/92 *--------------------------------------------------------------------------* * VERSION DATE NAME DESCRIPTION *> 1.0 11/18/92 Original ***************************************************************************/ #include #include #include "forte.h" #include "gf1proto.h" #include "osproto.h" #include "gf1hware.h" #include "gf1os.h" #include "extern.h" #include "ultraerr.h" #include "irq.h" #include "dma.h" extern IRQ_ENTRY _gf1_irq[]; extern DMA_ENTRY _gf1_dma[]; extern ULTRA_DATA _gf1_data; int UltraPing(unsigned int port) { unsigned char val0,val1; unsigned char save_val0; unsigned char save_val1; /* save current values ... */ save_val0 = UltraPeekData(port,0L); save_val1 = UltraPeekData(port,1L); UltraPokeData(port,0L,0xAA); UltraPokeData(port,1L,0x55); val0 = UltraPeekData(port,0L); val1 = UltraPeekData(port,1L); /* restore data to old values ... */ UltraPokeData(port,0L,save_val0); UltraPokeData(port,1L,save_val1); if ((val0 == (unsigned char)0xAA) && (val1 == (unsigned char)0x55)) return(ULTRA_OK); else return(NO_ULTRA); } int UltraProbe(unsigned int port) { int val; _gf1_data.base_port = port; _gf1_data.midi_data = port + GF1_MIDI_DATA; _gf1_data.midi_control = port + GF1_MIDI_CTRL; _gf1_data.voice_select = port + GF1_PAGE; _gf1_data.reg_select = port + GF1_REG_SELECT; _gf1_data.data_low = port + GF1_DATA_LOW; _gf1_data.data_hi = port + GF1_DATA_HI; _gf1_data.irq_status = port + GF1_IRQ_STAT; _gf1_data.dram_data = port + GF1_DRAM; _gf1_data.mix_control = port + GF1_MIX_CTRL; _gf1_data.timer_control = port + GF1_TIMER_CTRL; _gf1_data.timer_data = port+ GF1_TIMER_DATA; _gf1_data.irq_control = port + GF1_IRQ_CTRL; /* Pull a reset on the GF1 */ outp(_gf1_data.reg_select,MASTER_RESET); outp(_gf1_data.data_hi,0x00); /* Wait a little while ... */ gf1_delay(); gf1_delay(); /* Release Reset */ outp(_gf1_data.reg_select,MASTER_RESET); outp(_gf1_data.data_hi,GF1_MASTER_RESET); gf1_delay(); gf1_delay(); val = UltraPing(port); return(val); } void UltraSetInterface(int dram,int adc,int gf1,int midi) // int dram; /* dram dma chan */ // int adc; /* adc dma chan */ // int gf1; /* gf1 irq # */ // int midi; /* midi irq # */ { unsigned char gf1_irq, midi_irq, dram_dma=0, adc_dma=0; unsigned char irq_control, dma_control; unsigned char mix_image; ENTER_CRITICAL; /* Don't need to check for 0 irq #. Its latch entry = 0 */ gf1_irq = _gf1_irq[gf1].latch; midi_irq = _gf1_irq[midi].latch; midi_irq <<= 3; /* Set latch to 0 if dma channel is 0 */ /* This takes this channel off line ... */ if (dram != 0) dram_dma = _gf1_dma[dram-1].latch; if (adc != 0) adc_dma = _gf1_dma[adc-1].latch; adc_dma <<= 3; irq_control = dma_control = 0x0; mix_image = _gf1_data.mix_image;/* init image to everything disabled */ irq_control |= gf1_irq; if((gf1 == midi) && (gf1 != 0)) { irq_control |= 0x40; } else { irq_control |= midi_irq; } dma_control |= dram_dma; if((dram == adc) && (dram != 0)) { dma_control |= 0x40; } else { dma_control |= adc_dma; } /* Set up for Digital ASIC */ outp(_gf1_data.base_port+0x0f,0x5); outp(_gf1_data.mix_control,mix_image); outp(_gf1_data.irq_control,0x0); outp(_gf1_data.base_port+0x0f,0x0); /* First do DMA control register */ outp( _gf1_data.mix_control, mix_image ); outp( _gf1_data.irq_control, dma_control|0x80 ); /* IRQ CONTROL REG */ outp( _gf1_data.mix_control, mix_image|0x40 ); outp( _gf1_data.irq_control, irq_control ); /* First do DMA control register */ outp( _gf1_data.mix_control, mix_image ); outp( _gf1_data.irq_control, dma_control ); /* IRQ CONTROL REG */ outp( _gf1_data.mix_control, mix_image|0x40 ); outp( _gf1_data.irq_control, irq_control ); /* IRQ CONTROL, ENABLE IRQ */ /* just to Lock out writes to irq\dma register ... */ outp( _gf1_data.voice_select, 0 ); /* enable output & irq, disable line & mic input */ mix_image |= 0x09; outp( _gf1_data.mix_control, mix_image ); /* just to Lock out writes to irq\dma register ... */ outp( _gf1_data.voice_select, 0x0 ); /* put image back .... */ _gf1_data.mix_image = mix_image; LEAVE_CRITICAL; }