stac9766.h
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:5k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. class STAC9766
  2. {
  3. public:
  4. STAC9766::STAC9766();
  5.     ~STAC9766();
  6.     // Power Management
  7.     ULONG SetPowerState( ULONG ulState );
  8.     // DMA control
  9.     MMRESULT AllocDMAChannel (ULONG ulDirection, 
  10.                               ULONG ulSize, 
  11.                               PULONG pulChannelIndex);
  12.     BOOL FreeDMAChannel (ULONG ulChannelIndex);
  13. ULONG GetNumFreeDMAChannels(ULONG ulDirection);
  14.     void GetDMABuffer(      ULONG ulChannelIndex, 
  15.                               PULONG pulBufferSize,
  16.                               PVOID* ppvVirtAddr);
  17.     
  18.     void InitDMAChannel(      ULONG ulChannelIndex, 
  19.                               DMAINTHANDLER pfHandler,
  20.                               PVOID pvContext);
  21.     void SetDMAChannelFormat( ULONG ulChannelIndex,
  22.                               ULONG ulChannels,
  23.                               ULONG ul16Bit,
  24.                               ULONG ulSampleRate );
  25.     void SetDMAChannelBuffer( ULONG ulChannelIndex,
  26.                               ULONG ulBufferLength,
  27.                               ULONG ulSamplesPerInt );
  28.     void StartDMAChannel( ULONG ulChannelIndex );
  29.     void StopDMAChannel( ULONG ulChannelIndex );
  30.     void PauseDMAChannel( ULONG ulChannelIndex );
  31.     void SetDMAInterruptPeriod( ULONG ulChannelIndex, ULONG ulSamplesPerInt);
  32.     void SetDMALooping (ULONG ulChannelIndex, BOOL fIsLooping);
  33.     void SetDMAVolume (ULONG ulChannelIndex, USHORT usVolLeft, USHORT usVolRight);
  34.     ULONG GetDMAPosition( ULONG ulChannelIndex );
  35.     void SetDMAPosition( ULONG ulChannelIndex, ULONG ulPosition );
  36.     // Codec control
  37.     void WriteCodecRegister( UCHAR Reg, USHORT Val);
  38.     USHORT ReadCodecRegister( UCHAR Reg );
  39.     void RMWCodecRegister (UCHAR Reg, USHORT Mask, USHORT Value); // Reg = (Reg & Mask) | Value
  40.     USHORT GetCodecRegisterValue( UCHAR Reg );
  41.     ULONG Codec_SetPowerState( ULONG ulNewState );
  42. // PCI routines
  43. BOOL AudioInitialize(CRegKey * pKey);
  44.     BOOL MapDevice (CRegKey * pKey);
  45.     // Sample Rate Converter
  46.     void InitSRC( BOOLEAN fEnable );
  47.     USHORT SRCRegRead( USHORT reg );
  48.     void SRCRegWrite( USHORT reg, USHORT val );
  49.     void SRCSetRate ( ULONG ulChannelIndex, USHORT wSampleRate );
  50.     ULONG SRCPollIOReg ();
  51.     void SRCWaitForFrame1 ();
  52.     void SRCSaveRegisterState( void );
  53.     void SRCRestoreRegisterState( void );
  54.     // global variables pointing to pre-allocated memory
  55. private:
  56.     // Interrupts
  57.     UCHAR GetInterruptSource( void );
  58.     void AckDMAInterrupt( UCHAR ucIntSrc );
  59.     // Register Access
  60.     VOID HwPagedIOWrite( UCHAR Page, ULONG pAddr, ULONG ulData );
  61.     ULONG HwPagedIORead( UCHAR Page, ULONG pAddr );
  62.     ULONG HwRegRMW ( UCHAR Reg, ULONG dwBitMask, ULONG dwSetBits );
  63.     USHORT HwRegRMW ( UCHAR Reg, USHORT wBitMask, USHORT wSetBits );
  64.     UCHAR HwRegRMW ( UCHAR Reg, UCHAR bBitMask, UCHAR bSetBits );
  65.     // Member Variable
  66.     PUCHAR m_pPciAddr;
  67.     DWORD   m_dwPciLength;
  68.     DWORD m_dwDeviceID;             // the PCI Device ID
  69.     DWORD m_dwRevisionID;        // the PCI chip revision
  70.     HANDLE m_hIsrHandler;       // installable ISR handler
  71.     DWORD m_dwBusNumber;
  72.     DWORD m_dwInterfaceType;
  73.     ULONG m_ulDRegs[12];  // STAC9766 direct registers
  74.     ULONG m_ulIRegs[16];  // STAC9766 indirect registers
  75.     // power management
  76.     ULONG m_ulPowerState; // STAC9766 power state
  77.     UCHAR m_ucSerialControl;
  78.     UCHAR m_ucDeviceControl;
  79.     ULONG m_ulDRegsPMContext[12];  
  80.     ULONG m_ulIRegsPMContext[64];
  81.     USHORT m_usCRegsPMContext[40];
  82.     USHORT m_usSRCRegsPMContext[20];
  83.     // codec
  84.     USHORT m_usCRegs[40]; // AC97 CoDec registers
  85.     ULONG m_ulCodecVendorID;
  86.     ULONG m_ulCodecRevision;
  87.     ULONG m_ulCodecPowerState; // current power state of the AC97 Codec
  88.     // DMA
  89. #define NUM_DMACHANNELS 3
  90.     DMACHANNEL m_dmachannel[NUM_DMACHANNELS]; // info about dma channel states
  91. // PCI related variables
  92. DWORD m_IntrAudio; // Interrupt ID
  93. BOOL m_fIsMapped; // must call MmUnmapIoSpace when destroyed
  94.     // Initialization
  95.     void InitHardware();
  96.     // Power Management
  97.     void SaveSTAC9766Context( void );
  98.     void RetoreSTAC9766Context( void );
  99.     // AC97 Codec
  100.     void InitCodec();
  101.     void Codec_WaitForPowerState( USHORT usState );
  102.     void Codec_SaveRegisterState( USHORT *pusRegisters );
  103.     void Codec_RestoreRegisterState( USHORT *pusRegisters );
  104.     // UART
  105.     void InitUART();
  106.     UCHAR UARTWaitForTxRdy();
  107. // IST
  108. static DWORD WINAPI IST_Startup(LPVOID lpParameter);
  109. void IST();
  110. HANDLE m_hISTInterruptEvent;
  111. BOOL   m_bExitIST;
  112. HANDLE m_hISThread;
  113. CRITICAL_SECTION m_csPageLock;
  114. };