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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ac97.c

?? 基于AMD Au1200(MIPS32處理器)的AC97驅動源碼
?? C
字號:
/*++
Copyright (c) 2000-2005  BSQUARE Corporation.  All rights reserved.

Module Name:

    ac97.c

Module Description:

    This module contains the platform independent code
    of AC97 register accesses

Author:

    GJS Nov 2000

Revision History:
    Jun Li, July, 2001
    Modified to seperate the AC97 code and the platform dependent code

--*/
#include <windows.h>
#include "ac97.h"

//#undef  DEBUGMSG
//#define DEBUGMSG(cond, msg)  NKDbgPrintfW##msg

//Global Volume levels
ULONG glVolume = 0;
ULONG grVolume = 0;



BOOL
AC97ResetRegisters(
    IN PSC_AC97 *pAC97
    )
{
    BOOL Status = FALSE;

    DEBUGMSG(1, (TEXT("+AC97ResetRegisters\r\n")));

    //
    //  Any write to the Reset register will reset
    //

    Status = AC97WriteReg(pAC97,
                          AC97_RESET,
                          0xffff);
    DEBUGMSG(1, (TEXT("-AC97ResetRegisters\r\n")));

    return Status;    
}


//
//  Returns Volume regardless of Mute state
//
BOOL
AC97GetMasterVolume(
    IN PSC_AC97 *pAC97,
    OUT ULONG   *LVol,
    OUT ULONG   *RVol
    
    )
{
    BOOL    Status;
    ULONG   Data;
    DEBUGMSG(1, (TEXT("+AC97GetMasterVolume\r\n")));

    Status = AC97ReadReg(pAC97,
                         AC97_MASTER_VOLUME,
                         &Data);
    
	        
    DEBUGMSG(1, (TEXT("AC97GetMasterVolume Data %x \r\n\r\n"),Data));
    DEBUGMSG(1, (TEXT("AC97GetMasterVolume Status %x \r\n\r\n"),Status));

    if (Status) {
        *LVol = (Data & VOLUME_LEFT_MASK) >> VOLUME_LEFT_SHIFT;
        *RVol = (Data & VOLUME_RIGHT_MASK) >> VOLUME_RIGHT_SHIFT;
    }

	
    return Status;
}


//
//   Set master volume - will overwrite MUTE
//
BOOL
AC97SetMasterVolume(
    IN PSC_AC97 *pAC97,
    IN ULONG    LVol,
    IN ULONG    RVol
    
    )
{
    BOOL    Status;
    ULONG   Data;

    Data = ((LVol << VOLUME_LEFT_SHIFT) & VOLUME_LEFT_MASK) |
        ((RVol << VOLUME_RIGHT_SHIFT) & VOLUME_RIGHT_MASK);
                    
    // pb1x00 boards use LINE_OUT on the codec
	// db1x00 boards use HP_OUT, so we set both here
	
	Status = AC97WriteReg(pAC97,
                          AC97_MASTER_VOLUME,
                          Data);
          
    Status = AC97WriteReg(pAC97,
                          AC97_ALT_LINE_LEVEL_OUT_VOLUME,
                          Data);
          
    return Status;
}




//
//  Returns Volume regardless of Mute state
//
BOOL
AC97GetPCMOutVolume(
    IN PSC_AC97 *pAC97,
    OUT ULONG   *LVol,
    OUT ULONG   *RVol
    
    )
{
    BOOL    Status;
    ULONG   Data;
  
    DEBUGMSG(1, (TEXT("+AC97GetPCMOutVolume\r\n")));

    Status = AC97ReadReg(pAC97,
                         AC97_PCM_OUT_VOLUME,
                         &Data);
  
    if (Status) {
        *LVol = (Data & VOLUME_LEFT_MASK) >> VOLUME_LEFT_SHIFT;
        *RVol = (Data & VOLUME_RIGHT_MASK) >> VOLUME_RIGHT_SHIFT;

    }
          
    return Status;
}



//
//   Set master volume - will overwrite MUTE
//
BOOL
AC97SetPCMOutVolume(
    IN PSC_AC97 *pAC97,
    IN ULONG    LVol,
    IN ULONG    RVol
    
    )
{
    BOOL    Status;
    ULONG   Data;


    Data = ((LVol << VOLUME_LEFT_SHIFT) & VOLUME_LEFT_MASK) |
        ((RVol << VOLUME_RIGHT_SHIFT) & VOLUME_RIGHT_MASK);

    Status = AC97WriteReg(pAC97,
                          AC97_PCM_OUT_VOLUME,
                          Data);
            
    return Status;
}




/*
    This CODEC has a master volume and PCM volume
    The Master has a range from -46.5db to 0db in 1.5db steps
    
    00000 == 0db gain
    
    
    The PCM has a range of:
        +12db == 00000
        -34.5db == 11111
    again, in 1.5db steps.
    
    Hence, the entire volume range is +12db to -81db
    The range of volumes is 16-bits per channel
    Hence if 0xffff == 12db and 0x0000 == -81db 
    The are 62 possible volume settings (64 is close enough)
    
    However, it is best to keep the input stage (in this case PCM) at the lowest reasonable 
    value to prevent distortion, namely clipping.
    
*/
BOOLEAN
CodecSetVolume(
    IN PSC_AC97 *pAC97,
    IN ULONG    Volume
    )
{
    ULONG lVolume;
    ULONG rVolume;
    BOOLEAN test;
    ULONG VolLevel;

    DEBUGMSG(1, (TEXT("+CodecSetVolume\r\n")));

    VolLevel = (UCHAR) Volume & 0xff; // Get the Actual Level    

    glVolume = Volume & 0xffff;
    grVolume = (Volume >> 16) & 0xffff;
   
   
    // Now scale the volume to 00 - 0x3f
    // shift right by 10 bits
    lVolume = 0x3f - (glVolume >> 10);
    rVolume = 0x3f - (grVolume >> 10);
   
    DEBUGMSG(1,(TEXT("lVolume: %X rVolume: %X\r\n"),lVolume, rVolume));

    test = AC97SetMasterVolume( pAC97,  lVolume,   rVolume);
    
    return test;

}

ULONG
CodecGetVolume(
    IN PSC_AC97 *pAC97
    )
{
    ULONG lVolume;
    ULONG rVolume;
    IN ULONG Volume;

    DEBUGMSG(1, (TEXT("CodecGetVolume\r\n")));

   
    //
    // Use the globals to prevent rounding errosa instead of the line below
    //   
    //AC97GetMasterVolume( CodecDevice, &lVolume,  &rVolume);

    
    lVolume = glVolume;
    rVolume = grVolume;

    Volume = lVolume | (rVolume << 16);

    DEBUGMSG(1, (TEXT("CodecGetVolume Volume %x\r\n"),Volume));

    return Volume;
}

BOOL
CodecSetMasterMute(
    IN PSC_AC97 *pAC97
    )
{
    AC97WriteReg(pAC97,
                 AC97_ALT_LINE_LEVEL_OUT_VOLUME,
                 VOLUME_MUTE);
          

	return AC97WriteReg(pAC97,
                        AC97_MASTER_VOLUME,
                        VOLUME_MUTE);
}


BOOL
CodecClrMasterMute(
    IN PSC_AC97 *pAC97
    )
{
    ULONG lVolume;
    ULONG rVolume;

    // Return to previous setting
    lVolume = 0x1f - (glVolume >> 11);
    rVolume = 0x1f - (grVolume >> 11);

    return  AC97SetMasterVolume(pAC97,
                                lVolume,
                                rVolume);
}



BOOL
CodecSetSampleRate(
    IN PSC_AC97 *pAC97,
    IN ULONG    Hertz
    )
{
    BOOL Status = FALSE;    
    
    if (Hertz < 8000 || Hertz > 48000) {        
        DEBUGMSG(1,(L"CODEC: Rate not supported\r\n"));
        goto ErrorReturn;
    
    }
    
    Status = AC97WriteReg(pAC97,
                          AC97_EXTENDED_AUDIO_STATUS_CONTROL,
                          1);

    
    if (Status) {
        Status = AC97WriteReg(pAC97,
                              AC97_PCM_FRONT_DAC_RATE,
                              Hertz);
    }
    
ErrorReturn:
return Status;
}

BOOL
CodecSetADCSampleRate(
    IN PSC_AC97 *pAC97,
    IN ULONG    Hertz
    )
{
    BOOL Status = FALSE;    
    
    if (Hertz < 8000 || Hertz > 48000) {        
        DEBUGMSG(1,(L"CODEC: Rate not supported\r\n"));
        goto ErrorReturn;
    
    }
    
    Status = AC97WriteReg(pAC97,
                          AC97_EXTENDED_AUDIO_STATUS_CONTROL,
                          1);

    
    if (Status) {
        Status = AC97WriteReg(pAC97,
                              AC97_PCM_ADC_RATE,
                              Hertz);
    }
    
ErrorReturn:
return Status;
}


BOOL
CodecPowerDown(
	IN PSC_AC97 *pAC97
	)
{
	BOOL Status = FALSE;
	ULONG Value = 0;

	//
	// The Codec must be powered down with sequential writes
	// to the Powerdown Ctrl/Stat Register.

	// Power down ADC.
	Value = PR0;
	Status = AC97WriteReg(pAC97,
						  AC97_POWER_CONTROL,
						  Value);
	if (!Status)
		goto ErrorReturn;

	// Power down DAC.
	Value |= PR1;
	Status = AC97WriteReg(pAC97,
						  AC97_POWER_CONTROL,
						  Value);
	if (!Status)
		goto ErrorReturn;

	// Power down analog mixer (VREF on).
	Value |= PR2;
	Status = AC97WriteReg(pAC97,
						  AC97_POWER_CONTROL,
						  Value);
	if (!Status)
		goto ErrorReturn;
	
	// Power down digital clk.
	Value |= PR5;
	Status = AC97WriteReg(pAC97,
						  AC97_POWER_CONTROL,
						  Value);
	if (!Status)
		goto ErrorReturn;

	// Power down headphone amp.
	Value |= PR6;
	Status = AC97WriteReg(pAC97,
						  AC97_POWER_CONTROL,
						  Value);
	if (!Status)
		goto ErrorReturn;

	// Finally power down AC-Link to stop the bit clk.
	Value |= PR4;
	Status = AC97WriteReg(pAC97,
						  AC97_POWER_CONTROL,
						  Value);

ErrorReturn:
	return Status;
}


BOOL
CodecPowerUp(
	IN PSC_AC97 *pAC97
	)
{
	BOOL Status = FALSE;
	ULONG Value;
	INT Timeout = 1000;

	//
	// Reading the Codec Ready bit of the Controller
	// status register does not work, try reading
	// a Codec register until the Codec is ready.
	//
	while (!Status)
	{
		Status = AC97ReadReg(pAC97,
	                         AC97_POWER_CONTROL,
		                     &Value);
		Timeout--;
	}

	if (!Timeout)
		goto ErrorReturn;

	// Currently turned off components.
	Value = PR6 | PR5 | PR2 | PR1 | PR0;

	// Power up headphone amp.
	Value &= ~PR6;
	Status = AC97WriteReg(pAC97,
						  AC97_POWER_CONTROL,
						  Value);
	if (!Status)
		goto ErrorReturn;

	// Power up digital clk.
	Value &= ~PR5;
	Status = AC97WriteReg(pAC97,
						  AC97_POWER_CONTROL,
						  Value);
	if (!Status)
		goto ErrorReturn;

	// Power up analog mixer (VREF on).
	Value &= ~PR2;
	Status = AC97WriteReg(pAC97,
						  AC97_POWER_CONTROL,
						  Value);
	if (!Status)
		goto ErrorReturn;

	// Power up DAC.
	Value &= ~PR1;
	Status = AC97WriteReg(pAC97,
						  AC97_POWER_CONTROL,
						  Value);
	if (!Status)
		goto ErrorReturn;

	// Power up ADC.
	Value &= ~PR0;
	Status = AC97WriteReg(pAC97,
						  AC97_POWER_CONTROL,
						  Value);

ErrorReturn:
	return Status;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日本精品一区二区三区| 国产老肥熟一区二区三区| 91久久精品午夜一区二区| 中文字幕日韩欧美一区二区三区| 成人av免费在线观看| 亚洲视频一区二区免费在线观看| 99久久99久久综合| 一区二区三区中文字幕电影| 一本一本大道香蕉久在线精品| 亚洲欧美电影一区二区| 欧美日韩精品二区第二页| 免费成人在线影院| 国产亚洲一区二区三区四区| 成人高清视频免费观看| 亚洲丶国产丶欧美一区二区三区| 4hu四虎永久在线影院成人| 国产酒店精品激情| 亚洲女人****多毛耸耸8| 欧美精品三级在线观看| 国产精品影视在线观看| 一区二区三区在线视频免费观看| 日韩一区国产二区欧美三区| 成人中文字幕在线| 亚洲国产一区视频| 国产欧美日韩不卡| 欧美日韩国产天堂| 国产99久久久国产精品| 亚洲国产美国国产综合一区二区| 26uuu国产电影一区二区| 色婷婷一区二区三区四区| 日韩—二三区免费观看av| 国产欧美1区2区3区| 欧美人狂配大交3d怪物一区| 国产99精品视频| 日本视频免费一区| 亚洲免费资源在线播放| 欧美成人精品3d动漫h| 色婷婷亚洲婷婷| 国内精品伊人久久久久av一坑| 亚洲综合久久av| 国产日韩av一区二区| 欧美日韩国产影片| 不卡的电影网站| 经典三级视频一区| 亚洲电影第三页| 亚洲人成影院在线观看| 久久综合中文字幕| 7777精品伊人久久久大香线蕉超级流畅 | 欧美一区二区美女| 成人美女在线视频| 久久国产免费看| 丝袜美腿高跟呻吟高潮一区| 国产精品你懂的| 久久免费偷拍视频| 日韩一区二区免费电影| 欧美无人高清视频在线观看| 粉嫩高潮美女一区二区三区| 久久狠狠亚洲综合| 日韩电影在线观看电影| 亚洲狠狠爱一区二区三区| 亚洲视频电影在线| 国产精品入口麻豆九色| 国产亚洲精品aa| 欧美精品一区二区在线播放| 91精品午夜视频| 欧美视频第二页| 欧美怡红院视频| 一道本成人在线| 91网站在线播放| 99久久精品国产观看| 成人精品亚洲人成在线| 国产91丝袜在线18| 国产成人亚洲精品青草天美 | 久久超碰97中文字幕| 婷婷一区二区三区| 亚洲成人av一区二区三区| 亚洲欧美福利一区二区| 亚洲激情五月婷婷| 一区二区在线观看免费 | 欧美日韩成人综合天天影院 | 国产成人亚洲综合a∨婷婷图片| 六月丁香综合在线视频| 久久99国产乱子伦精品免费| 毛片av一区二区三区| 久久黄色级2电影| 国内精品久久久久影院一蜜桃| 国产乱码精品一区二区三区五月婷| 久久精品99国产精品| 韩国精品主播一区二区在线观看 | 日本欧美肥老太交大片| 免费成人在线观看视频| 久久99久久99精品免视看婷婷 | 亚洲色图.com| 夜夜夜精品看看| 性欧美大战久久久久久久久| 天堂蜜桃一区二区三区| 日本va欧美va精品发布| 国内精品写真在线观看 | 91福利精品第一导航| 欧美无乱码久久久免费午夜一区 | 日韩免费观看2025年上映的电影| 精品久久久久久久久久久久久久久 | 中文一区二区完整视频在线观看 | 国产精品蜜臀在线观看| 国产精品女人毛片| 亚洲午夜久久久久久久久电影院| 日日摸夜夜添夜夜添国产精品| 日本欧美一区二区| 成人晚上爱看视频| 欧美色爱综合网| 2020国产精品久久精品美国| 中文字幕欧美一| 婷婷国产v国产偷v亚洲高清| 国产制服丝袜一区| 色一情一乱一乱一91av| 日韩欧美成人一区二区| 综合久久给合久久狠狠狠97色| 亚洲高清在线精品| 国产一区二区三区视频在线播放 | 欧美视频一区二区三区四区| 日韩免费福利电影在线观看| 中文在线资源观看网站视频免费不卡| 一区二区三区免费观看| 另类小说一区二区三区| 94色蜜桃网一区二区三区| 91麻豆精品国产无毒不卡在线观看| wwww国产精品欧美| 亚洲国产美女搞黄色| 国产精品12区| 欧美久久久久免费| 国产精品久久久久婷婷二区次 | 经典三级在线一区| 欧美伊人久久大香线蕉综合69| 久久久久久久久久看片| 天堂在线亚洲视频| 91女厕偷拍女厕偷拍高清| 精品蜜桃在线看| 日韩精彩视频在线观看| 91免费国产视频网站| 久久精品视频网| 捆绑调教美女网站视频一区| 欧美日韩亚洲另类| 一区二区三区日韩欧美精品| 东方aⅴ免费观看久久av| 日韩欧美一级二级| 日韩中文字幕一区二区三区| 色综合天天综合给合国产| 国产嫩草影院久久久久| 精品一区二区三区免费毛片爱| 欧美日韩国产综合一区二区三区 | 国产精品国产自产拍高清av王其| 理论片日本一区| 欧美一卡2卡3卡4卡| 亚洲资源在线观看| 99精品热视频| 国产精品初高中害羞小美女文| 国产乱人伦偷精品视频不卡 | 欧美国产欧美综合| 韩国欧美一区二区| 久久在线观看免费| 久久国产精品第一页| 日韩三级在线观看| 日韩**一区毛片| 日韩精品中文字幕一区 | 国产麻豆精品视频| 久久久久久久久久美女| 国产成人免费视频一区| 欧美精品一区二区久久久| 久久精品国产亚洲aⅴ| 日韩精品专区在线影院观看| 久久成人久久鬼色| 久久美女高清视频| 国产.欧美.日韩| 国产精品视频麻豆| 99久久伊人网影院| 亚洲男人的天堂在线观看| 91麻豆免费视频| 亚洲国产精品久久不卡毛片 | 99热在这里有精品免费| 亚洲日本丝袜连裤袜办公室| 不卡电影一区二区三区| 亚洲男人电影天堂| 欧美久久久久免费| 韩国成人在线视频| 国产日韩一级二级三级| 91网上在线视频| 午夜精品久久久久久久蜜桃app| 91精品久久久久久久91蜜桃| 精东粉嫩av免费一区二区三区| 国产三级精品在线| 色偷偷88欧美精品久久久| 午夜激情综合网| 久久久精品日韩欧美| 不卡的av在线| 午夜精品福利在线| 久久综合资源网| 91网站在线播放| 蜜桃精品视频在线观看| 国产精品久久久久久久浪潮网站 | 波多野结衣一区二区三区 |