亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? psc_ac97.c

?? 基于AMD Au1200(MIPS32處理器)的AC97驅(qū)動(dòng)源碼
?? C
字號(hào):
/*++
Copyright (c) 2004  BSQUARE Corporation.  All rights reserved.

Module Name:

    psc_ac97.c

Module Description:

    This module contains the platform dependent code
    of AC97 audio driver for the Au1550

Author:

    Ian Rae  January 2004

Revision History:

--*/
#include <windows.h>
#include <bceddk.h>
#include <gpio.h>
#include "ac97.h"
#include "au1kac97.h"
#include "ac97aud.h"

#include <wavedbg.h>

#define ZONE_HACK 0

#define ZONE_AC97_ERROR ZONE_HACK
#define ZONE_AC97_FUNC  ZONE_HACK
#define ZONE_AC97_DMA   ZONE_HACK
#define ZONE_AC97_INTR  ZONE_HACK

ULONG gIntrAudio = SYSINTR_NOP;

extern HANDLE hAudioInterrupt;
extern PWAVE_DEVICE_INSTANCE WaveDevice;

BOOL
AC97ReadReg(
    IN PSC_AC97 *pAC97,
    IN ULONG    InReg,
    OUT ULONG   *Result
    )
{
    ULONG Data;
    ULONG Timeout=TIMEOUT*10;

	Data  = PSC_AC97_CDC_INDX_N(InReg);
	Data |= PSC_AC97_CDC_RD;

    WRITE_REGISTER_ULONG((PULONG)&pAC97->cdc, Data);

    while(Timeout) {
        if(READ_REGISTER_ULONG((PULONG)&pAC97->evnt)&PSC_AC97_EVNT_CD) break;
        Timeout--;
    }
	// Clear Command Done flag
	WRITE_REGISTER_ULONG((PULONG)&pAC97->evnt,PSC_AC97_EVNT_CD);


    if(Timeout) {
        Data = READ_REGISTER_ULONG((PULONG)&pAC97->cdc);
        Data &= PSC_AC97_CDC_DATA;
        *Result = Data;
        DEBUGMSG(ZONE_AC97_FUNC,(L"-Ac97ReadReg 0x%X\r\n",Data));
        return TRUE;
    }

    DEBUGMSG(ZONE_AC97_FUNC,(L"-Ac97ReadReg timeout\r\n"));
    return FALSE;
}    

BOOL
AC97WriteReg(
    IN PSC_AC97 *pAC97,
    IN ULONG    Reg,
    IN ULONG    Value
    )
{
    ULONG Data;
    ULONG Timeout=TIMEOUT*10;

    Data  = PSC_AC97_CDC_DATA_N(Value);
	Data |= PSC_AC97_CDC_INDX_N(Reg);
    
    WRITE_REGISTER_ULONG((PULONG)&pAC97->cdc, Data);

    while(Timeout) {
        if(READ_REGISTER_ULONG((PULONG)&pAC97->evnt)&PSC_AC97_EVNT_CD) break;
        Timeout--;
    }

	// Clear Command Done flag
	WRITE_REGISTER_ULONG((PULONG)&pAC97->evnt,PSC_AC97_EVNT_CD);

    if(Timeout) {
        return TRUE;
    }

    return FALSE;
}    

VOID
ShutdownDma(
    IN PWAVE_RESOURCE WaveResource
    )
{
    DEBUGMSG(ZONE_AC97_DMA, (TEXT("+ShutdownDma\r\n")));

	HalStopDMA(WaveResource->DMAChannel);

   	EnterCriticalSection(&WaveResource->CriticalSection);

    if(WaveResource->WaveDirection==WAPI_OUT) {
        WRITE_REGISTER_ULONG((PULONG)&WaveResource->AC97Ctrl->pcr, PSC_AC97_PCR_TP);
    } else {
        WRITE_REGISTER_ULONG((PULONG)&WaveResource->AC97Ctrl->pcr, PSC_AC97_PCR_RP);
    }

	WaveResource->DmaRunning = FALSE;
    
	LeaveCriticalSection(&WaveResource->CriticalSection);

	DEBUGMSG(ZONE_AC97_DMA, (TEXT("-ShutdownDma\r\n")));

}

VOID
StartDma(
    IN PWAVE_RESOURCE WaveResource
    )
{
    DEBUGMSG(ZONE_AC97_DMA, (TEXT("+StartDma\r\n")));

    EnterCriticalSection(&WaveResource->CriticalSection);
    
    if(WaveResource->WaveDirection==WAPI_OUT) {
        WRITE_REGISTER_ULONG((PULONG)&WaveResource->AC97Ctrl->pcr, PSC_AC97_PCR_TS);
    } else {
        WRITE_REGISTER_ULONG((PULONG)&WaveResource->AC97Ctrl->pcr, PSC_AC97_PCR_RS);
    }
    
	HalStartDMA(WaveResource->DMAChannel);
    
	WaveResource->DmaRunning = TRUE;
    LeaveCriticalSection(&WaveResource->CriticalSection);

    DEBUGMSG(ZONE_AC97_DMA, (TEXT("-StartDma \r\n")));

}

DWORD
FindMicVolume(    
	IN PWAVE_DEVICE_INSTANCE WaveDevice
)
{
    HKEY    hkey;
    LONG Status;
    DWORD Value = AC97_DEFAULT_MICVOLUME;    
    DWORD Size = sizeof(Value);

	// Examine Mic Volume in registry
    //
    Status = RegOpenKeyEx(
        HKEY_LOCAL_MACHINE,
        AUDIO_REGKEY,
        0,
        0,
        &hkey);
    
    
    if (ERROR_SUCCESS == Status) {
        Status = RegQueryValueEx(hkey,
                                (TEXT("MicVolume")),
                                NULL,
                                NULL,
                                (PUCHAR)&Value,
                                &Size
                                );
    }

    if (hkey) {
        RegCloseKey(hkey);
    }

	return Value;
}


BOOL
InitializeInterrupt(
    IN PWAVE_DEVICE_INSTANCE WaveDevice
    )
{
	ULONG HwIntr;

    DEBUGMSG(ZONE_AC97_FUNC,(L"+Initialize Interrupt\r\n"));

    HwIntr = HalGetDMAHwIntr(WaveDevice->DMAChannelOutput);
	HwIntr |= HalGetDMAHwIntr(WaveDevice->DMAChannelInput) << 8;

	RETAILMSG(1,(TEXT("Hooking HWINTR %08X\r\n"),HwIntr));

	gIntrAudio = InterruptConnect(Internal, 0, HwIntr, 0);

    if (gIntrAudio == SYSINTR_NOP)
    {
        RETAILMSG(1,(L"Can not allocate SYSINTR\r\n"));
        goto ErrorReturn;
    }

    DEBUGMSG(ZONE_AC97_FUNC,(L"-Initialize Interrupt\r\n"));
    return TRUE;
  ErrorReturn:
    DEBUGMSG(ZONE_AC97_FUNC,(L"-Initialize Interrupt failed\r\n"));
    return FALSE;
}

BOOL InitializeRegisters(PSC_AC97 *pAC)
{
	int timeout;
	BOOL status = TRUE;
	ULONG tmp;

	// Handle any platform specific initialization
#if defined(PLATFORM_AC97_PSC_INIT_CODE)
	PLATFORM_AC97_PSC_INIT_CODE
#endif

	// We seem to need this to be able to resume more than once
	// still working on explaining exactly why that is...
	tmp = READ_REGISTER_ULONG((PULONG)&pAC->cfg);

	// Reset and configure the PSC for AC97
	WRITE_REGISTER_ULONG((PULONG)&pAC->psc.sel, PSC_SEL_PS_AC97 | PSC_SEL_CLK_SERIAL);
	
	// Reset external codec
	WRITE_REGISTER_ULONG((PULONG)&pAC->rst, PSC_AC97_RST_RST);
	HalStallExecution(10000);
	WRITE_REGISTER_ULONG((PULONG)&pAC->rst, 0);

	// Enable the PSC
	WRITE_REGISTER_ULONG((PULONG)&pAC->psc.ctl, PSC_CTL_CE |PSC_CTL_EN);

	// wait for clock detect
	timeout = 1000;
	while (timeout && !((tmp=READ_REGISTER_ULONG((PULONG)&pAC->sts)) & PSC_AC97_STS_SR)) {
		HalStallExecution(1000);
		timeout--;
	}

	if (!timeout) {
		status = FALSE;
		goto ErrorReturn;
	}

	// configure the AC97 controller
	tmp = PSC_AC97_CFG_TRD_N(3) | 
	      PSC_AC97_CFG_RRD_N(3) | 
          PSC_AC97_CFG_LEN_N(7) | 
		  PSC_AC97_CFG_TXSLOT_N(3) | 
		  PSC_AC97_CFG_RXSLOT_N(3) | 
		  PSC_AC97_CFG_DE;

	WRITE_REGISTER_ULONG((PULONG)&pAC->cfg, tmp );

	// wait until the device is ready
	timeout = 1000;
	while (timeout && !((tmp=READ_REGISTER_ULONG((PULONG)&pAC->sts)) & PSC_AC97_STS_DR)) {
		HalStallExecution(1000);
		timeout--;
	}

	if (!timeout) {
		status = FALSE;
		goto ErrorReturn;
	}

	// mask all interrupts
	WRITE_REGISTER_ULONG((PULONG)&pAC->msk,0xFFFFFFFF);

ErrorReturn:
	return status;
}

BOOL
InitializePlatform(
    IN PWAVE_DEVICE_INSTANCE WaveDevice
    )
{
    PSC_AC97         *pAC;
	PHYSICAL_ADDRESS PhyAdd;
	BOOL             status = TRUE;
	HANDLE           hGPIO = NULL;

#if (PLATFORM_AC97_PSC==0)
	PhyAdd.QuadPart = PSC0_PHYS_ADDR;
#elif (PLATFORM_AC97_PSC==1)
	PhyAdd.QuadPart = PSC1_PHYS_ADDR;
#elif (PLATFORM_AC97_PSC==2)
	PhyAdd.QuadPart = PSC2_PHYS_ADDR;
#elif (PLATFORM_AC97_PSC==3)
	PhyAdd.QuadPart = PSC3_PHYS_ADDR;
#else
#error PLATFORM_AC97_PSC must be defined in the range 0 to 3
#endif

	RETAILMSG(1,(L"Initializing PSC%d for AC97 operation\r\n",PLATFORM_AC97_PSC));

	WaveDevice->AC97Ctrl = MmMapIoSpace(PhyAdd,
								        sizeof(WaveDevice->AC97Ctrl),
								        FALSE);

	if(WaveDevice->AC97Ctrl==NULL) {
		DEBUGMSG(ZONE_AC97_ERROR,(L"Can not map AC97 Control registers\r\n"));
		goto ErrorReturn;
	}

    hGPIO = GPIO_Init();
    if(hGPIO==INVALID_HANDLE_VALUE) {
        DEBUGMSG(ZONE_AC97_ERROR,(L"AC97: Can not open GPIO device\r\n"));
        goto ErrorReturn;
    }

	// CPU dependent GPIO pin functionality
#if defined(CPU_AU1550)
    if(!GPIO_SetPinFunction(hGPIO,SYS_PINFUNC_S1)) {
        DEBUGMSG(ZONE_ERROR,(L"AC97: Can not set pinfunc for AC97\r\n"));
        goto ErrorReturn;
    }
#elif defined(CPU_AU1200) && (PLATFORM_AC97_PSC==0)
    if(!GPIO_ClearPinFunction(hGPIO,SYS_PINFUNC_P0B | (1<<18))) {
        DEBUGMSG(ZONE_ERROR,(L"SPI: Can not set pinfunc for AC97 \r\n"));
        goto ErrorReturn;
    }
    if(!GPIO_SetPinFunction(hGPIO,(1<<17))) {
        DEBUGMSG(ZONE_ERROR,(L"SPI: Can not set pinfunc for AC97 \r\n"));
        goto ErrorReturn;
    }
#elif defined(CPU_AU1200) && (PLATFORM_AC97_PSC==1)
    if(!GPIO_ClearPinFunction(hGPIO,SYS_PINFUNC_P1A)) {
        DEBUGMSG(ZONE_ERROR,(L"AC97: Can not set pinfunc for AC97\r\n"));
        goto ErrorReturn;
    }
    if(!GPIO_SetPinFunction(hGPIO,SYS_PINFUNC_P1C)) {
        DEBUGMSG(ZONE_AC97_ERROR,(L"AC97: Can not set pinfunc for AC97\r\n"));
        goto ErrorReturn;
    }
#endif

	// we are done with GPIO now
	CloseHandle(hGPIO);

	// find a Mic Volume
	WaveDevice->MicVolume = FindMicVolume(WaveDevice);

	pAC = WaveDevice->AC97Ctrl;
	
	status = InitializeRegisters(pAC);

	DEBUGMSG(ZONE_AC97_FUNC,(L"-Initialize Platform\r\n"));
    return status;

ErrorReturn:
	if(WaveDevice->AC97Ctrl) {
		MmUnmapIoSpace((PVOID)WaveDevice->AC97Ctrl,
		               sizeof(*WaveDevice->AC97Ctrl));
	}

	if(hGPIO) {
		CloseHandle(hGPIO);
	}

	DEBUGMSG(ZONE_AC97_FUNC,(L"-Initialize Platform failed\r\n"));
	return FALSE;
}
  
BOOLEAN
InitializeCodec(
    IN OUT PWAVE_DEVICE_INSTANCE WaveDevice
    )
{
    ULONG i;
    
    //
    //  Mute all channels 
    //
    for (i=AC97_ALT_LINE_LEVEL_OUT_VOLUME;i<=AC97_RECORD_GAIN;i+=2) {
        AC97WriteReg(WaveDevice->AC97Ctrl,i,VOLUME_MUTE);
    }

    //
    // Set True Stereo Line Out as 0dB
    //
    AC97WriteReg(WaveDevice->AC97Ctrl,AC97_ALT_LINE_LEVEL_OUT_VOLUME,0);
    AC97WriteReg(WaveDevice->AC97Ctrl,AC97_RECORD_GAIN,0x0f0f);

	// Set Mic Volume
    //
    AC97WriteReg(WaveDevice->AC97Ctrl,AC97_MIC_VOLUME,WaveDevice->MicVolume);

    //  Set PCM channel to default
    //
    AC97SetPCMOutVolume(WaveDevice->AC97Ctrl,  DEFAULT_PCM_VOLUME,   DEFAULT_PCM_VOLUME);

    return TRUE;
}


BOOL
InitializeDMA(
    IN PWAVE_DEVICE_INSTANCE WaveDevice
    )
{
    DEBUGMSG(ZONE_AC97_FUNC,(L"+InitializeDMA\r\n"));

    WaveDevice->DMAChannelOutput = HalAllocateDMAChannel();

    if(WaveDevice->DMAChannelOutput==NULL) {
        DEBUGMSG(ZONE_AC97_ERROR,(L"Can not allocate output DMA Channel\r\n"));
        goto ErrorReturn;
    }
    else {
        DEBUGMSG(ZONE_AC97_DMA,(L"Using DMA channel for AC97 output\r\n"));
    }
    
    HalInitDmaChannel(WaveDevice->DMAChannelOutput,
	                  DMA_AC97_TX,
	                  WaveDevice->DmaBufferSize,
					  TRUE);

    WaveDevice->DMAChannelInput = HalAllocateDMAChannel();

    if(WaveDevice->DMAChannelInput==NULL) {
        DEBUGMSG(ZONE_AC97_ERROR,(L"Can not allocate input DMA Channel\r\n"));
        goto ErrorReturn;
    }
    else {
        DEBUGMSG(ZONE_AC97_DMA,(L"Using DMA channel for AC97 input\r\n"));
    }

    HalInitDmaChannel(WaveDevice->DMAChannelInput,
	                  DMA_AC97_RX,
	                  WaveDevice->DmaBufferSize,
					  TRUE);

    DEBUGMSG(ZONE_AC97_FUNC,(L"-InitializeDMA\r\n"));    
    return TRUE;

ErrorReturn:

    DEBUGMSG(ZONE_AC97_FUNC,(L"-InitializeDMA failed\r\n"));    
    return FALSE;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美丝袜自拍制服另类| 欧美三级日韩三级国产三级| 亚洲一区二区三区四区不卡| 精品成人一区二区三区四区| 日本韩国精品在线| 国产麻豆午夜三级精品| 午夜在线电影亚洲一区| 亚洲天堂中文字幕| 国产日韩欧美精品一区| 欧美一区二区三区电影| 日本韩国一区二区三区| 成人性生交大片免费看中文网站| 人人超碰91尤物精品国产| 亚洲欧美国产三级| 国产欧美日韩麻豆91| 日韩女优毛片在线| 欧美酷刑日本凌虐凌虐| 一本色道久久综合精品竹菊| 国产.精品.日韩.另类.中文.在线.播放| 婷婷开心激情综合| 亚洲影院免费观看| 亚洲精品五月天| 亚洲欧洲国产专区| 日本一区二区不卡视频| 日韩三级视频中文字幕| 7799精品视频| 欧美一区二区精品| 3751色影院一区二区三区| 欧美在线不卡一区| 91成人网在线| 91国产免费观看| 欧美亚洲动漫制服丝袜| 欧美视频一区二区三区四区| 色狠狠色狠狠综合| 91福利国产精品| 精品视频在线免费观看| 欧美色窝79yyyycom| 欧美午夜理伦三级在线观看| 精品视频一区三区九区| 欧美无人高清视频在线观看| 欧美日本在线视频| 欧美卡1卡2卡| 欧美成va人片在线观看| 精品久久久久久无| 久久久www成人免费毛片麻豆 | 亚洲免费三区一区二区| |精品福利一区二区三区| 1000部国产精品成人观看| 中文字幕一区二区三区在线播放 | 成人av资源站| 99久久精品免费看| 色婷婷av一区二区三区之一色屋| 欧美主播一区二区三区美女| 欧美日韩久久久一区| 日韩小视频在线观看专区| 久久久久久免费| 中文字幕一区二区三| 亚洲国产精品影院| 另类小说图片综合网| 国产成人超碰人人澡人人澡| 色综合网站在线| 制服丝袜在线91| 国产日韩一级二级三级| 亚洲另类一区二区| 日韩电影在线观看网站| 黑人巨大精品欧美黑白配亚洲| 国产经典欧美精品| 欧美无砖砖区免费| 久久只精品国产| 一个色综合av| 国内成人精品2018免费看| www.日韩大片| 91精品国产欧美一区二区成人| 久久久久一区二区三区四区| 中文字幕亚洲在| 日韩成人av影视| av在线不卡电影| 欧美一区二区三区的| 国产日韩欧美激情| 亚洲成人综合视频| 国产美女在线观看一区| 在线视频欧美区| 精品欧美乱码久久久久久1区2区| 18欧美亚洲精品| 免费成人美女在线观看| www.爱久久.com| 日韩无一区二区| 一区二区高清免费观看影视大全| 激情综合网激情| 精品视频一区二区三区免费| 欧美国产精品v| 久久精品999| 欧美视频在线观看一区| 中文字幕 久热精品 视频在线| 香蕉加勒比综合久久| 欧美电影免费观看高清完整版在 | 中文字幕在线不卡| 亚洲一区二区四区蜜桃| 国产乱码字幕精品高清av| 欧美性欧美巨大黑白大战| 久久蜜桃av一区二区天堂 | 日韩av午夜在线观看| 99国产精品久久久久| 久久嫩草精品久久久久| 五月天亚洲婷婷| 91色视频在线| 欧美激情中文不卡| 精品影视av免费| 欧美群妇大交群中文字幕| 亚洲精品大片www| 成人免费不卡视频| 成人91在线观看| 91麻豆精品秘密| 国产三级欧美三级日产三级99| 婷婷久久综合九色国产成人| 在线观看日韩电影| 亚洲欧洲日产国码二区| 国产不卡高清在线观看视频| 精品第一国产综合精品aⅴ| 免费看欧美美女黄的网站| 欧美日韩国产天堂| 亚洲午夜三级在线| 在线视频国内自拍亚洲视频| 亚洲欧美激情视频在线观看一区二区三区| 福利一区在线观看| 久久久久97国产精华液好用吗| 激情综合亚洲精品| 欧美精品一区二区久久久 | 懂色av一区二区三区蜜臀| 2021中文字幕一区亚洲| 精品一区二区三区欧美| 精品福利一区二区三区免费视频| 偷拍一区二区三区四区| 欧美日韩国产一区| 青青草国产成人av片免费| 欧美人成免费网站| 美女一区二区在线观看| 日韩三级视频在线观看| 国产一区二区三区免费观看| 久久嫩草精品久久久精品一| 国产成人av电影在线观看| 国产精品久久久一区麻豆最新章节| 国产精品91xxx| 欧美韩国日本不卡| 波多野结衣一区二区三区| 亚洲欧美在线aaa| 色偷偷久久人人79超碰人人澡| 一区二区免费在线| 欧美日韩一级黄| 伦理电影国产精品| 久久精品欧美日韩精品| 成人黄色片在线观看| 亚洲日本一区二区| 9191久久久久久久久久久| 蜜臀精品久久久久久蜜臀| 久久色在线观看| 99re66热这里只有精品3直播| 亚洲伦在线观看| 欧美日韩的一区二区| 极品尤物av久久免费看| 国产精品久久777777| 欧美亚洲国产一区二区三区va | 97超碰欧美中文字幕| 亚洲一区二区精品3399| 欧美一区二区国产| 成人手机电影网| 一区二区激情小说| 精品欧美久久久| 91碰在线视频| 日本一道高清亚洲日美韩| 久久久国际精品| 欧美天天综合网| 国产一区二区久久| 亚洲免费观看高清完整版在线观看 | 国产成人精品一区二区三区四区| 亚洲精品午夜久久久| 日韩亚洲欧美在线| 一本大道综合伊人精品热热| 美女网站一区二区| 亚洲欧美二区三区| 精品国产在天天线2019| 91免费观看在线| 狠狠色狠狠色综合日日91app| 亚洲欧美日韩国产手机在线| 精品美女一区二区| 在线日韩国产精品| 高清在线成人网| 蜜芽一区二区三区| 一区二区三区中文免费| 久久综合中文字幕| 欧美日本一道本在线视频| 不卡高清视频专区| 久久精品国产亚洲高清剧情介绍 | 精品一区二区影视| 一区二区三区在线免费| 国产日韩欧美一区二区三区乱码| 欧美一区二区三区在线观看视频| av电影在线不卡| 韩国av一区二区三区四区| 香蕉久久夜色精品国产使用方法|