Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendsp_io.c
Go to the documentation of this file.
00001 /* 00002 ReactOS Sound System 00003 Sound Blaster DSP support 00004 General I/O 00005 00006 Author: 00007 Andrew Greenwood (silverblade@reactos.org) 00008 00009 History: 00010 2 July 2008 - Created (split from sbdsp.c) 00011 00012 Notes: 00013 Functions documented in sbdsp.h 00014 */ 00015 00016 #include "precomp.h" 00017 00018 NTSTATUS 00019 SbDspReset( 00020 IN PUCHAR BasePort, 00021 IN ULONG Timeout) 00022 { 00023 ULONG Expiry; 00024 BOOLEAN DataAvailable = FALSE; 00025 00026 /* Should be called from DriverEntry with this IRQL */ 00027 ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); 00028 00029 WRITE_SB_DSP_RESET(BasePort, 0x01); 00030 SleepMs(50); /* Should be enough */ 00031 WRITE_SB_DSP_RESET(BasePort, 0x00); 00032 00033 Expiry = QuerySystemTimeMs() + Timeout; 00034 00035 /* Wait for data to be available */ 00036 while ( (QuerySystemTimeMs() < Expiry) || ( Timeout == 0) ) 00037 { 00038 if ( SB_DSP_DATA_AVAILABLE(BasePort) ) 00039 { 00040 DataAvailable = TRUE; 00041 break; 00042 } 00043 } 00044 00045 if ( ! DataAvailable ) 00046 { 00047 return STATUS_TIMEOUT; 00048 } 00049 00050 /* Data is available - wait for the "DSP ready" code */ 00051 while ( (QuerySystemTimeMs() < Expiry) || ( Timeout == 0) ) 00052 { 00053 if ( READ_SB_DSP_DATA(BasePort) == SB_DSP_READY ) 00054 { 00055 return STATUS_SUCCESS; 00056 } 00057 } 00058 00059 return STATUS_TIMEOUT; 00060 } 00061 00062 NTSTATUS 00063 SbDspWaitToWrite( 00064 IN PUCHAR BasePort, 00065 IN ULONG Timeout) 00066 { 00067 ULONG Expiry = QuerySystemTimeMs() + Timeout; 00068 00069 while ( (QuerySystemTimeMs() < Expiry) || (Timeout == 0) ) 00070 { 00071 if ( SB_DSP_CLEAR_TO_SEND(BasePort) ) 00072 { 00073 return STATUS_SUCCESS; 00074 } 00075 } 00076 00077 return STATUS_TIMEOUT; 00078 } 00079 00080 NTSTATUS 00081 SbDspWaitToRead( 00082 IN PUCHAR BasePort, 00083 IN ULONG Timeout) 00084 { 00085 ULONG Expiry = QuerySystemTimeMs() + Timeout; 00086 00087 while ( (QuerySystemTimeMs() < Expiry) || (Timeout == 0) ) 00088 { 00089 if ( SB_DSP_DATA_AVAILABLE(BasePort) ) 00090 { 00091 return STATUS_SUCCESS; 00092 } 00093 } 00094 00095 return STATUS_TIMEOUT; 00096 } 00097 00098 NTSTATUS 00099 SbDspWrite( 00100 IN PUCHAR BasePort, 00101 IN UCHAR DataByte, 00102 IN ULONG Timeout) 00103 { 00104 NTSTATUS Status; 00105 00106 Status = SbDspWaitToWrite(BasePort, Timeout); 00107 00108 if ( Status != STATUS_SUCCESS ) 00109 { 00110 return Status; 00111 } 00112 00113 DbgPrint("SBDSP - Writing %02x\n", DataByte); 00114 WRITE_SB_DSP_DATA(BasePort, DataByte); 00115 00116 return STATUS_SUCCESS; 00117 } 00118 00119 NTSTATUS 00120 SbDspRead( 00121 IN PUCHAR BasePort, 00122 OUT PUCHAR DataByte, 00123 IN ULONG Timeout) 00124 { 00125 NTSTATUS Status; 00126 00127 if ( ! DataByte ) 00128 { 00129 return STATUS_INVALID_PARAMETER_2; 00130 } 00131 00132 Status = SbDspWaitToRead(BasePort, Timeout); 00133 00134 if ( Status != STATUS_SUCCESS ) 00135 { 00136 return Status; 00137 } 00138 00139 *DataByte = READ_SB_DSP_DATA(BasePort); 00140 DbgPrint("SBDSP - Read %02x\n", *DataByte); 00141 00142 return STATUS_SUCCESS; 00143 } Generated on Sun May 27 2012 04:36:12 for ReactOS by
1.7.6.1
|