⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ac97bus.c

📁 老外的一个开源项目
💻 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 + -