mirror of
https://github.com/reactos/reactos.git
synced 2024-11-01 04:11:30 +00:00
112 lines
2.5 KiB
C
112 lines
2.5 KiB
C
/*
|
|
*
|
|
* 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 <ntddk.h>
|
|
#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;
|
|
}
|