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

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

?? i2s.cpp

?? 基于WINCE 的音頻驅動源碼
?? CPP
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

   
Module Name:	I2S.CPP

Abstract:		I2S Interface Routines for Samsung SC2440 CPU
  
Notes:			This code assumes that the CPU acts as the master that is 
				connected to a CODEC chip configured in slave mode.

				Some platforms require the audio CODEC chip to act as the master
				while the CPU's IIS controller is put into slave mode.  For these
				environments, the IIS_MASTER_MODE flag (located in I2S_Init())
				should be replaced with the IIS_SLAVE_MODE flag.

Environment:	Samsung SC2440 CPU and Windows 3.0 (or later)
    
-*/

#include <windows.h>
#include "i2s.h"

//------------------------------ GLOBALS -------------------------------------------
extern volatile	S3C2440A_IISBUS_REG *g_pIISregs;								// I2S control registers
extern volatile S3C2440A_IOPORT_REG *g_pIOPregs;								// GPIO registers (needed to enable SPI)
extern volatile S3C2440A_CLKPWR_REG	*g_pCLKPWRreg;							// CLCKPWR (needed to enable SPI clocks)
//----------------------------------------------------------------------------------

#ifdef DEBUG
#define ZONE_ERROR  1
#endif

#define DEFAULT_S3C2440A_PCLK (399651840 / 6)

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		I2S_Init()

Description:	Initializes the IIS bus and controller.

Notes:			This routine assumes that the control registers (see 
				the globals section above) have already been initialized.

Returns:		Boolean indicating success.
-------------------------------------------------------------------*/
BOOL I2S_Init()
{
	//----- 1. IMPORTANT: By default, the internal clock is disabled.  To configure the controller ------
	//					  we must first enable it.
//	StartI2SClock();
	g_pCLKPWRreg->CLKCON |= IIS_INTERNAL_CLOCK_ENABLE;		// Enable the CPU clock to the IIS controller
	//----- 2. Configure the GPIO pins for I2S mode -----
	//		   
	//		   I2SSDO	- GPE4
	//		   I2SSDI	- GPE3
	//		   I2SCDCLK	- GPE2
	//		   I2SSCLK	- GPE1
	//		   I2SLRCLK	- GPE0
	//
	// Port Init for IIS
	g_pIOPregs->GPEUP  |= 0x1f;
	//PG[4:0]=I2SSDI:I2SSDO:CDCLK:I2SSCLK:I2SLRCK
	g_pIOPregs->GPECON = ((g_pIOPregs->GPECON & 0xfffffc00) | 0x2aa);
	
	//----- 3. Configure the I2S controller with reasonable default values -----
	g_pIISregs->IISCON  = (TRANSMIT_DMA_REQUEST_ENABLE | IIS_PRESCALER_ENABLE);
	
	g_pIISregs->IISMOD  = (  MASTER_CLOCL_MPLLIN | IIS_MASTER_MODE | IIS_TRANSMIT_RECEIVE_MODE | ACTIVE_CHANNEL_LEFT
						   | SERIAL_INTERFACE_IIS_COMPAT | DATA_16_BITS_PER_CHANNEL
						   | MASTER_CLOCK_FREQ_384fs | SERIAL_BIT_CLOCK_FREQ_32fs);

	g_pIISregs->IISFCON = (  TRANSMIT_FIFO_ACCESS_DMA | TRANSMIT_FIFO_ENABLE  );
//						   | RECEIVE_FIFO_ACCESS_DMA  | RECEIVE_FIFO_ENABLE);		

	SetI2SClockRate(IS2LRCLK_44100);

	//----- 4. For power management purposes, shut the clocks off! -----
    StopI2SClock();

	// charlie
	g_pIISregs->IISCON |= IIS_INTERFACE_ENABLE;				// Enable the I2S clock
	
	return(TRUE);
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		I2S_Deinit()

Description:	Deinitializes the I2S bus and controller.

Notes:			This routine DOES NOT unmap the control registers;
				the caller is responsible for freeing this memory.

Returns:		Boolean indicating success.
-------------------------------------------------------------------*/
BOOL I2S_Deinit()
{
    //----- 1. Stop the I2S clocks -----
    StopI2SClock();

	return TRUE;
}



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		I2S_WriteData()

Description:	Outputs the specified data onto the I2S bus.

Notes:			This routine expects that the I2S clock is already
				running when it is called.

Returns:		Boolean indicating success.
-------------------------------------------------------------------*/
BOOL I2S_WriteData(LPWORD lpBuff, DWORD dwLen)
{
	static DWORD waitCount	= 0;
	static DWORD i			= 0;

	//----- 1. Check the parameters -----
	if(!lpBuff || (dwLen == 0))
	{
		DEBUGMSG(ZONE_ERROR, (TEXT("WAVEDEV.DLL:I2S_WriteData() - Invalid parameters!\r\n")));  
        goto WRITE_ERROR;
	}

//	StartI2SClock();

	//----- 2. Enable the transmit FIFO -----
	g_pIISregs->IISFCON |= TRANSMIT_FIFO_ENABLE;
	
	//----- 3. Write all of the bytes in the input buffer onto the I2S bus -----
	while(dwLen)
	{
		//----- 4. Write a FIFO's worth of data out onto the I2S bus ----- 
		if(dwLen > MAX_TRANSMIT_FIFO_ENTRIES)
		{
			i = MAX_TRANSMIT_FIFO_ENTRIES;

		}else
		{
			i = dwLen;
		}

		dwLen -= i;
		while(i--);
		{
			g_pIISregs->IISFIFO = *lpBuff++;
		}
	}

	StopI2SClock();
	return TRUE;

WRITE_ERROR:
	StopI2SClock();
	return FALSE;
}


//------------------------------------ Helper Routines ------------------------------------

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		StartI2SClock()

Description:	Enables the I2S clock that drives the audio codec chip.

Returns:		N/A
-------------------------------------------------------------------*/
VOID StartI2SClock(VOID)
{
	
	return;
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		StopI2SClock()

Description:	Disables the I2S clock that drives the audio codec chip.

Returns:		N/A
-------------------------------------------------------------------*/
VOID StopI2SClock(VOID)
{
	return;
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		SetI2SClockRate()

Description:	Sets the I2S clock that drives the audio codec chip:

Params:			ClockRate	IS2LRCLK_800		800   Khz
							IS2LRCLK_11025		11025 Khz
							IS2LRCLK_16000		16000 Khz
							IS2LRCLK_22050		22050 Khz
							IS2LRCLK_32000		32000 Khz
							IS2LRCLK_44100		44100 Khz
							IS2LRCLK_48000		48000 Khz
							IS2LRCLK_64000		64000 Khz
							IS2LRCLK_88200		88200 Khz
							IS2LRCLK_96000		96000 Khz

Returns:		N/A
-------------------------------------------------------------------*/
VOID SetI2SClockRate(DWORD ClockRate)
{
	BYTE  prescaler;
	DWORD codeclock, i2scdclk;
    PROCESSOR_INFO procInfo;
    DWORD dwBytesReturned;
    UINT32 s3c2440_pclk = DEFAULT_S3C2440A_PCLK;

	if(g_pIISregs->IISMOD & MASTER_CLOCL_MPLLIN)
	{
		return;
	}
	
    // Determine the CPU clock speed by querying the OAL.
    //
    if (!KernelIoControl(IOCTL_PROCESSOR_INFORMATION, NULL, 0, &procInfo, sizeof(PROCESSOR_INFO), &dwBytesReturned))
    {
        RETAILMSG(TRUE, (TEXT("WARNING: WAVEDEV.DLL: SetI2SClockRate: Failed to obtain processor frequency - using default value(%d).\r\n"), s3c2440_pclk));
    }
    else
    {
        s3c2440_pclk = procInfo.dwClockSpeed;
        RETAILMSG(TRUE, (TEXT("INFO: WAVEDEV.DLL: SetI2SClockRate:  Using processor frequency reported by the OAL (%d).\r\n"), s3c2440_pclk));
    }

    //----- 1. Set the clock rate  -----
	//		FORMAT:			bits[9:5] - Prescaler Control A
	//						bits[4:0] - Prescaler Control B
	//
	//						Range: 0-31 and the division factor is N+1 (a.k.a. 1-32)
	//
	//		The I2SLRCLK frequency is determined as follows:
	//
	//				I2SLRCLK = CODECLK / I2SCDCLK		and		(prescaler+1) = PCLK / CODECLK
	//
	//		Thus, rearranging the equations a bit we can see that:
	//
	//				prescaler = (PCLK / CODECLK) - 1 
	//		or
	//				prescaler = ((PCLK / (IS2LRCLK * IS2CDCLK)) - 1
	//	
	//	    NOTE: The following formula is actually used in order to avoid floating point arithmetic:
	//
	//				prescaler = ((PCLK + ((IS2LRCLK * IS2CDCLK) - 1)) / (IS2LRCLK * IS2CDCLK)) - 1
	//
	if(g_pIISregs->IISMOD & MASTER_CLOCK_FREQ_384fs)
	{
		i2scdclk = 384;				// Sampling frequency
	}else
	{
		i2scdclk = 256;				// Sampling frequency
	}

	codeclock = ClockRate * i2scdclk;
	prescaler = (BYTE)((s3c2440_pclk + (codeclock - 1)) / codeclock) - 1;
	RETAILMSG(1,(TEXT("Prescaler:%d\n"),prescaler));

	//----- IMPORTANT: Make sure we set both channel prescalers to the same value (see datasheet for details) -----
	g_pIISregs->IISPSR = ((prescaler << 5) + prescaler);

    return;
}




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产女同互慰高潮91漫画| 处破女av一区二区| 国产乱国产乱300精品| 日本精品一级二级| 精品少妇一区二区| 亚洲午夜av在线| 不卡视频免费播放| 久久久久久久久久久久久夜| 五月天久久比比资源色| 91麻豆swag| 中文字幕av一区二区三区免费看| 人妖欧美一区二区| 欧美性猛交xxxx黑人交| 亚洲美女一区二区三区| www.成人网.com| 国产欧美日韩视频一区二区| 久久国产精品72免费观看| 欧美猛男超大videosgay| 亚洲精品国产成人久久av盗摄| 成人一区二区视频| 国产欧美日韩卡一| 国产精品1024久久| 久久―日本道色综合久久| 精品中文av资源站在线观看| 日韩一区二区免费在线观看| 偷拍亚洲欧洲综合| 3d成人动漫网站| 午夜欧美在线一二页| 精品视频在线免费观看| 亚洲777理论| 在线不卡中文字幕| 日韩黄色小视频| 91.com在线观看| 蜜臀精品久久久久久蜜臀| 欧美一区二区三区四区视频 | 色综合久久中文综合久久97| 久久久国产一区二区三区四区小说| 经典一区二区三区| 久久中文字幕电影| 国产高清精品久久久久| 中文一区在线播放| 91丨porny丨中文| 亚洲一区二区三区中文字幕在线| 欧美亚洲动漫另类| 奇米影视在线99精品| 精品免费视频.| 国产91精品一区二区麻豆亚洲| 国产欧美日本一区二区三区| 成人a级免费电影| 亚洲一区二区在线免费看| 欧美精品在线观看一区二区| 狠狠色伊人亚洲综合成人| 亚洲国产精品二十页| 成人av在线一区二区| 亚洲图片有声小说| 欧美成人a∨高清免费观看| 风流少妇一区二区| 曰韩精品一区二区| 日韩欧美在线影院| 成人v精品蜜桃久久一区| 一二三区精品福利视频| 欧美成人福利视频| 97精品久久久午夜一区二区三区| 亚洲www啪成人一区二区麻豆| 欧美精品一区二区三区视频| av男人天堂一区| 免费成人在线影院| 亚洲欧洲精品一区二区三区| 正在播放一区二区| 粗大黑人巨茎大战欧美成人| 亚洲成人一区二区在线观看| 久久久久久97三级| 欧美日韩精品是欧美日韩精品| 国产中文字幕一区| 亚洲成在人线在线播放| 国产午夜亚洲精品羞羞网站| 欧美日韩精品电影| 国产91丝袜在线播放0| 午夜国产精品影院在线观看| 国产精品丝袜久久久久久app| 制服.丝袜.亚洲.另类.中文| 99re这里只有精品首页| 国产资源在线一区| 午夜av区久久| 亚洲人妖av一区二区| 精品999久久久| 欧美肥大bbwbbw高潮| 99久久免费精品高清特色大片| 久久99国产精品麻豆| 亚洲一区二区精品3399| 日韩美女视频19| 欧美国产丝袜视频| 26uuu另类欧美亚洲曰本| 欧美日韩一级二级| 色婷婷国产精品综合在线观看| 国产一区二区三区免费播放 | 久久国产精品一区二区| 亚洲国产精品一区二区www在线| 国产欧美精品在线观看| 久久久亚洲午夜电影| 欧美一级理论片| 91精品免费观看| 国产精品婷婷午夜在线观看| 欧美精品一区二区三区蜜桃| 欧美一区日韩一区| 欧美久久久一区| 在线播放中文一区| 欧美自拍偷拍午夜视频| 日本韩国欧美一区| 99国产精品一区| 色综合久久88色综合天天6| 91免费国产视频网站| av成人老司机| 色综合天天性综合| 一本高清dvd不卡在线观看 | 久久99精品国产麻豆不卡| 日韩精品一二三区| 日韩av中文字幕一区二区| 日韩电影一二三区| 久久超碰97中文字幕| 国产一区二区三区综合| 国产精品资源在线观看| 国产成人av一区二区三区在线| 国产精品91xxx| 波波电影院一区二区三区| 99久久综合国产精品| 一本色道**综合亚洲精品蜜桃冫| 色8久久精品久久久久久蜜| 欧美日韩卡一卡二| 日韩午夜激情av| 国产偷国产偷精品高清尤物 | 9久草视频在线视频精品| 99re这里只有精品首页| 欧美在线观看18| 日韩视频一区二区在线观看| 久久综合一区二区| 《视频一区视频二区| 一区二区三区四区亚洲| 日韩vs国产vs欧美| 国产精品综合视频| 95精品视频在线| 91精品免费在线| 国产欧美一区二区在线观看| 一区二区三区中文字幕| 日本不卡免费在线视频| 国产91精品欧美| 欧美视频日韩视频| 久久一二三国产| 亚洲日本欧美天堂| 美女视频免费一区| 91丝袜高跟美女视频| 日韩欧美国产小视频| 国产精品欧美一区二区三区| 亚洲成人免费影院| 国产成人精品免费| 欧美精品成人一区二区三区四区| 久久精品夜色噜噜亚洲aⅴ| 亚洲一区中文日韩| 国产激情一区二区三区| 欧美午夜影院一区| 国产色产综合产在线视频| 亚洲一区二区三区中文字幕 | 欧美激情艳妇裸体舞| 午夜免费欧美电影| www.欧美日韩国产在线| 日韩欧美国产高清| 一区二区久久久| 国产馆精品极品| 日韩色视频在线观看| 一区二区三区在线视频观看58 | 日本va欧美va欧美va精品| 成人福利视频在线看| 精品欧美久久久| 亚洲大片一区二区三区| 91一区二区在线观看| 久久你懂得1024| 久久国产三级精品| 欧美日韩精品三区| 亚洲最大色网站| 99re这里只有精品首页| 国产亚洲欧洲997久久综合| 日韩不卡一二三区| 欧美老女人在线| 夜色激情一区二区| 91丨九色porny丨蝌蚪| 国产精品美日韩| 粉嫩av一区二区三区| 久久一二三国产| 国产一区二区三区久久久| 欧美一区二区日韩一区二区| 亚洲成a天堂v人片| 精品视频在线免费观看| 亚洲国产综合91精品麻豆| 91色视频在线| 亚洲男人天堂av| 91久久久免费一区二区| 亚洲女人的天堂| 在线一区二区三区四区| 亚洲综合一二区| 欧美丝袜自拍制服另类|