ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

dsp_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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.