📄 ac97bus.c
字号:
// Copyright (c) David Vescovi. All rights reserved.
// Part of Project DrumStix
// Windows Embedded Developers Interest Group (WE-DIG) community project.
// http://www.we-dig.org
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
//
// File: ac97bus.c
//
// Support for AC97 bus.
//
//------------------------------------------------------------------------------
#include "bsp.h"
static volatile AC97_REG_T *g_pAC97Regs = NULL;
static HANDLE hAC97Mutex = NULL;
//static BOOL WriteAC97Raw(UINT8 Offset, UINT16 Data);
//static BOOL ReadAC97Raw(UINT8 Offset, UINT16 *pData);
//TODO: add refference counter
BOOL InitAC97(BOOL InPowerHandler)
{
PHYSICAL_ADDRESS RegPA;
if (g_pAC97Regs == NULL)
{
RegPA.QuadPart = PXA255_BASE_REG_PA_AC97;
g_pAC97Regs = (volatile AC97_REG_T *) MmMapIoSpace(RegPA, 0x400, FALSE);
}
hAC97Mutex = CreateMutex(NULL, FALSE, AC97_MUTEX_NAME);
if (!g_pAC97Regs || hAC97Mutex == NULL)
{
DEBUGMSG(TRUE, (TEXT("ERROR: Failed to allocate AC97 resource.\r\n")));
g_pAC97Regs = NULL;
hAC97Mutex = NULL;
return(FALSE);
}
return(TRUE);
}
BOOL DeInitAC97(BOOL InPowerHandler)
{
if (g_pAC97Regs)
{
VirtualFree((void *)g_pAC97Regs, 0, MEM_RELEASE);
g_pAC97Regs = NULL;
}
hAC97Mutex = NULL;
return(TRUE);
}
BOOL GetAC97Lock(void)
{
if (WaitForSingleObject(hAC97Mutex, 3000) == WAIT_OBJECT_0)
{
return(TRUE);
}
else
{
return(FALSE);
}
}
BOOL ReleaseAC97Lock(void)
{
if (!g_pAC97Regs) return(FALSE);
g_pAC97Regs->CAR &= ~CAR_CAIP;
ReleaseMutex(hAC97Mutex);
return(TRUE);
}
BOOL ReadAC97(UINT8 Offset, UINT16 *pData)
{
BOOL retVal = FALSE;
if (GetAC97Lock() == TRUE)
{
retVal = ReadAC97Raw(Offset, pData);
ReleaseAC97Lock();
}
return(retVal);
}
BOOL WriteAC97(UINT8 Offset, UINT16 Data)
{
BOOL retVal = FALSE;
if (GetAC97Lock() == TRUE)
{
retVal = WriteAC97Raw(Offset, Data);
ReleaseAC97Lock();
}
return(retVal);
}
BOOL ColdResetAC97(void)
{
if (g_pAC97Regs)
{
g_pAC97Regs->GCR &= ~GCR_nCOLD_RST;
g_pAC97Regs->GCR |= GCR_nCOLD_RST;
return(TRUE);
}
return(FALSE);
}
BOOL ReadAC97Raw(UINT8 Offset, UINT16 *pData)
//static BOOL ReadAC97Raw(UINT8 Offset, UINT16 *pData)
{
P_VUINT32_T DerivedAddr;
g_pAC97Regs->GSR |= GSR_SDONE ;
g_pAC97Regs->GSR &= ~GSR_RDCS;
while((g_pAC97Regs->CAR & CAR_CAIP) == TRUE)
{ ; }
DerivedAddr = (P_VUINT32_T) ((P_UINT8_T) g_pAC97Regs->pPRICODECAUD + (Offset << 1));
*pData = (UINT16) *DerivedAddr;
while((g_pAC97Regs->GSR & GSR_SDONE) == FALSE)
{ ; }
g_pAC97Regs->GSR |= GSR_SDONE;
*pData = (UINT16) *DerivedAddr;
while((g_pAC97Regs->GSR & GSR_SDONE) == FALSE)
{ ; }
if(g_pAC97Regs->GSR & GSR_RDCS)
{
g_pAC97Regs->GSR &= ~GSR_RDCS;
DEBUGMSG(1,(TEXT("RawAC97Read: Error timeout!\r\n")));
return(FALSE);
}
else
{
return(TRUE);
}
}
BOOL WriteAC97Raw(UINT8 Offset, UINT16 Data)
//static BOOL WriteAC97Raw(UINT8 Offset, UINT16 Data)
{
P_VUINT32_T DerivedAddr;
while(g_pAC97Regs->CAR & CAR_CAIP)
{ ; }
DerivedAddr = (P_VUINT32_T) ((P_UINT8_T)g_pAC97Regs->pPRICODECAUD + (Offset << 1));
g_pAC97Regs->GSR |= GSR_CDONE;
*DerivedAddr = Data;
while((g_pAC97Regs->GSR & GSR_CDONE)==0)
{ ; }
g_pAC97Regs->GSR |= GSR_CDONE;
return(TRUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -