/* * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: drivers/dd/sndblst/portio.c (see also sndblst.h) * PURPOSE: Sound Blaster port I/O helper * PROGRAMMER: Andrew Greenwood * UPDATE HISTORY: * Sept 28, 2003: Created */ #include #include "sndblst.h" BOOLEAN WaitToSend(ULONG BasePort) { int TimeOut; DPRINT("WaitToSend "); // Check if it's OK to send for (TimeOut = SB_TIMEOUT; ! SB_READY_TO_SEND(BasePort) && TimeOut > 0; TimeOut --); // If a time-out occurs, we report failure if (! TimeOut) { DPRINT("FAILED\n"); return FALSE; } DPRINT("SUCCEEDED\n"); return TRUE; } BOOLEAN WaitToReceive(ULONG BasePort) { int TimeOut; DPRINT("WaitToReceive "); // Check if it's OK to receive for (TimeOut = SB_TIMEOUT; ! SB_READY_TO_RECEIVE(BasePort) && TimeOut > 0; TimeOut --); // If a time-out occurs, we report failure if (! TimeOut) { DPRINT("FAILED\n"); return FALSE; } DPRINT("SUCCEEDED\n"); return TRUE; } USHORT InitSoundCard(ULONG BasePort) { ULONG TimeOut; BOOLEAN Status; UCHAR DSP_Major, DSP_Minor; DPRINT("InitSoundCard() called\n"); DPRINT("Resetting sound card\n"); // if (!WaitToSend(BasePort)) // return FALSE; SB_WRITE_RESET(BasePort, 0x01); for (TimeOut = 0; TimeOut < 30000; TimeOut ++); // Wait a while SB_WRITE_RESET(BasePort, 0x00); // Check if it's OK to receive (some cards will ignore the above reset // command and so will not issue an ACK, so time out is NOT an error) DPRINT("Waiting for an ACK\n"); if (WaitToReceive(BasePort)) { // Check to make sure the reset was acknowledged: for (TimeOut = SB_TIMEOUT; (Status = (SB_READ_DATA(BasePort) != SB_DSP_READY) && (TimeOut > 0)); TimeOut --); } DPRINT("Querying DSP version\n"); if (! WaitToSend(BasePort)) return FALSE; SB_WRITE_DATA(BasePort, SB_GET_DSP_VERSION); if (! WaitToReceive(BasePort)) return FALSE; DSP_Major = SB_READ_DATA(BasePort); DSP_Minor = SB_READ_DATA(BasePort); DPRINT("DSP v%d.%d\n", DSP_Major, DSP_Minor); // if audio is disabled, // version tests return 0xFF everywhere if (DSP_Major == 0xFF && DSP_Minor == 0xFF) return FALSE; DPRINT("Sound card initialized!\n"); return (DSP_Major * 256) + DSP_Minor; }