3 Sound Blaster DSP support
7 Andrew Greenwood (silverblade@reactos.org)
10 2 July 2008 - Created (split from sbdsp.c)
13 Functions documented in sbdsp.h
28 KIRQL CurrentIrqLevel
= KeGetCurrentIrql();
29 BOOLEAN DataAvailable
= FALSE
;
31 /* Should be called from DriverEntry with this IRQL */
32 ASSERT(CurrentIrqLevel
== PASSIVE_LEVEL
);
34 WRITE_SB_DSP_RESET(BasePort
, 0x01);
35 SleepMs(50); /* Should be enough */
36 WRITE_SB_DSP_RESET(BasePort
, 0x00);
38 Expiry
= QuerySystemTimeMs() + Timeout
;
40 /* Wait for data to be available */
41 while ( (QuerySystemTimeMs() < Expiry
) || ( Timeout
== 0) )
43 if ( SB_DSP_DATA_AVAILABLE(BasePort
) )
50 if ( ! DataAvailable
)
52 return STATUS_TIMEOUT
;
55 /* Data is available - wait for the "DSP ready" code */
56 while ( (QuerySystemTimeMs() < Expiry
) || ( Timeout
== 0) )
58 if ( READ_SB_DSP_DATA(BasePort
) == SB_DSP_READY
)
60 return STATUS_SUCCESS
;
64 return STATUS_TIMEOUT
;
72 ULONG Expiry
= QuerySystemTimeMs() + Timeout
;
74 while ( (QuerySystemTimeMs() < Expiry
) || (Timeout
== 0) )
76 if ( SB_DSP_CLEAR_TO_SEND(BasePort
) )
78 return STATUS_SUCCESS
;
82 return STATUS_TIMEOUT
;
90 ULONG Expiry
= QuerySystemTimeMs() + Timeout
;
92 while ( (QuerySystemTimeMs() < Expiry
) || (Timeout
== 0) )
94 if ( SB_DSP_DATA_AVAILABLE(BasePort
) )
96 return STATUS_SUCCESS
;
100 return STATUS_TIMEOUT
;
111 Status
= SbDspWaitToWrite(BasePort
, Timeout
);
113 if ( Status
!= STATUS_SUCCESS
)
118 DbgPrint("SBDSP - Writing %02x\n", DataByte
);
119 WRITE_SB_DSP_DATA(BasePort
, DataByte
);
121 return STATUS_SUCCESS
;
134 return STATUS_INVALID_PARAMETER_2
;
137 Status
= SbDspWaitToRead(BasePort
, Timeout
);
139 if ( Status
!= STATUS_SUCCESS
)
144 *DataByte
= READ_SB_DSP_DATA(BasePort
);
145 DbgPrint("SBDSP - Read %02x\n", *DataByte
);
147 return STATUS_SUCCESS
;