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

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

?? i2s.cpp

?? windows CE 的BSP開發(fā)包.包含眾多的驅(qū)動(dòng)程序和OAL層的開發(fā)代碼
?? 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 SC2410 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 SC2410 CPU and Windows 3.0 (or later)
    
-*/

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

//------------------------------ GLOBALS -------------------------------------------
extern volatile	IISreg		*v_pIISregs;								// I2S control registers
extern volatile IOPreg		*v_pIOPregs;								// GPIO registers (needed to enable SPI)
extern volatile CLKPWRreg	*g_pCLKPWRreg;							// CLCKPWR (needed to enable SPI clocks)
//----------------------------------------------------------------------------------

//#define DEBUGMSG(a,b)	RETAILMSG(0,b)

#ifdef DEBUG
#define ZONE_ERROR  1
#endif


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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->rCLKCON |= 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
	//
//	charlie
//	v_pIOPregs->rGPECON |= (ENABLE_I2SSDO | ENABLE_I2SSDI | ENABLE_I2SCDCLK | ENABLE_I2SSCLK | ENABLE_I2SLRCLK);
//	v_pIOPregs->rGPEUP  |= DISABLE_I2S_PULLUPS;
	// Port Init for IIS
	v_pIOPregs->rGPEUP  |= 0x1f;
	//PG[4:0]=I2SSDI:I2SSDO:CDCLK:I2SSCLK:I2SLRCK
	v_pIOPregs->rGPECON = ((v_pIOPregs->rGPECON & 0xfffffc00) | 0x2aa);
	
	//----- 3. Configure the I2S controller with reasonable default values -----
//	v_pIISregs->rIISCON  = (TRANSMIT_DMA_REQUEST_ENABLE | RECEIVE_DMA_REQUEST_ENABLE | IIS_PRESCALER_ENABLE);
// charlie
	v_pIISregs->rIISCON  = (TRANSMIT_DMA_REQUEST_ENABLE | IIS_PRESCALER_ENABLE);
	

	//---------------------------------------------------------------------------------------------------------
	// On SMDK2410 board, Audio codec left/right outputs are mis-connected to a stereo headphone jack.
	// So, I define that active level of left/right channel is "HIGH for left channel" (ACTIVE_CHANNEL_RIGHT).
	//---------------------------------------------------------------------------------------------------------
	//v_pIISregs->rIISMOD  = (  IIS_MASTER_MODE | IIS_TRANSMIT_RECEIVE_MODE | ACTIVE_CHANNEL_LEFT
	v_pIISregs->rIISMOD  = (  IIS_MASTER_MODE | IIS_TRANSMIT_RECEIVE_MODE | ACTIVE_CHANNEL_RIGHT
						   | SERIAL_INTERFACE_IIS_COMPAT | DATA_16_BITS_PER_CHANNEL
						   | MASTER_CLOCK_FREQ_384fs | SERIAL_BIT_CLOCK_FREQ_32fs );
	//---------------------------------------------------------------------------------------------------------

	v_pIISregs->rIISFCON = (  TRANSMIT_FIFO_ACCESS_DMA | TRANSMIT_FIFO_ENABLE  );

	SetI2SClockRate(IS2LRCLK_44100);

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

	// charlie
	v_pIISregs->rIISCON |= 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 -----
	v_pIISregs->rIISFCON |= 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--);
		{
			v_pIISregs->rIISFIF = *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)
{
//	v_pIISregs->rIISCON &= ~IIS_INTERFACE_ENABLE;			// Disable the I2S clock
// charlie
//	g_pCLKPWRreg->rCLKCON &= ~IIS_INTERNAL_CLOCK_ENABLE;	// Disable the CPU clock to the SPI controller
	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;

    //----- 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(v_pIISregs->rIISMOD & MASTER_CLOCK_FREQ_384fs)
	{
		i2scdclk = 384;				// Sampling frequency
	}else
	{
		i2scdclk = 256;				// Sampling frequency
	}

	codeclock = ClockRate * i2scdclk;
	prescaler = (BYTE)((S2440PCLK + (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) -----
	v_pIISregs->rIISPSR = ((prescaler << 5) + prescaler);

    return;
}




?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品中文字幕乱码三区 | 高清免费成人av| 亚洲精品在线三区| 国产一区二区免费在线| 久久天天做天天爱综合色| 国产精品一品二品| 中文字幕欧美区| 色视频一区二区| 亚洲成av人**亚洲成av**| 欧美一二三区精品| 国产精品自拍网站| 亚洲欧美另类综合偷拍| 欧美三片在线视频观看| 天堂精品中文字幕在线| 精品国产乱码久久| 国产91精品一区二区麻豆网站 | 久久久久久久久久看片| 国产成人亚洲综合色影视| 亚洲天堂精品在线观看| 欧美午夜片在线观看| 麻豆91小视频| 中文字幕一区不卡| 欧美亚洲一区二区在线| 狠狠色伊人亚洲综合成人| 国产精品久久久久久久久动漫| 日本道精品一区二区三区 | 狠狠色丁香婷婷综合| 欧美激情一区在线| 欧美日韩免费在线视频| 国产精品一区二区不卡| 亚洲无人区一区| 国产亚洲欧美日韩在线一区| 欧美系列在线观看| 国产成人无遮挡在线视频| 亚洲综合无码一区二区| 久久久久久久久久久久电影| 在线亚洲欧美专区二区| 国产1区2区3区精品美女| 亚洲高清免费观看| 91精品国产高清一区二区三区蜜臀| 中文字幕在线观看不卡| 日韩欧美在线综合网| 99免费精品在线观看| 一二三区精品福利视频| 欧美日韩免费视频| 国产精品一区三区| 亚洲精选视频免费看| 亚洲精品乱码久久久久久| 国产一区三区三区| 亚洲最新视频在线播放| 亚洲一区二区三区视频在线播放| 日韩欧美久久久| 欧美系列日韩一区| av在线免费不卡| 精品一区二区在线播放| 日韩和欧美一区二区三区| 1024国产精品| 国产精品理论在线观看| ww亚洲ww在线观看国产| 欧美一区二区三区公司| 欧美日韩视频不卡| 在线观看一区日韩| 91浏览器打开| 91在线免费播放| 国产jizzjizz一区二区| 国产一区二区三区在线观看免费 | 欧美日韩你懂的| 色94色欧美sute亚洲线路一久| 成人av在线影院| 高清不卡一二三区| 国产成人亚洲综合a∨猫咪| 精品写真视频在线观看 | 亚洲日本va午夜在线影院| 久久久久亚洲蜜桃| 久久久不卡网国产精品二区| 精品国产免费人成电影在线观看四季 | 亚洲欧洲日韩一区二区三区| 久久精品日韩一区二区三区| 精品99一区二区| 久久亚洲影视婷婷| 2欧美一区二区三区在线观看视频| 精品sm捆绑视频| 久久精品一区二区三区不卡| 国产午夜精品在线观看| 日本一区二区动态图| 国产精品久久久久久久久果冻传媒| 国产精品久久久久三级| 伊人开心综合网| 亚洲成人av一区| 久久91精品国产91久久小草| 国产精品亚洲午夜一区二区三区| 高清不卡在线观看| 91免费看片在线观看| 在线精品国精品国产尤物884a| 欧美日韩一区高清| 欧美大肚乱孕交hd孕妇| 国产欧美日韩精品a在线观看| 国产精品不卡一区二区三区| 最新热久久免费视频| 亚洲大片免费看| 极品美女销魂一区二区三区| 不卡的电影网站| 欧美日韩久久久久久| 日韩免费观看高清完整版| 国产欧美日韩三区| 亚洲一区二区黄色| 国产精品一区二区在线观看网站| 成人精品小蝌蚪| 欧美无乱码久久久免费午夜一区| 日韩亚洲欧美成人一区| 国产精品毛片大码女人| 亚洲成a人v欧美综合天堂下载| 国产一区二区三区日韩| 色天天综合久久久久综合片| 日韩一二在线观看| 亚洲视频1区2区| 精品一区二区久久| 91福利资源站| 中文字幕国产一区| 天天av天天翘天天综合网色鬼国产 | 91福利精品第一导航| 精品久久久久久亚洲综合网| 亚洲欧美福利一区二区| 蜜芽一区二区三区| 99在线热播精品免费| 日韩色视频在线观看| 国产精品久久久久久久久果冻传媒| 日韩av一区二区三区四区| 成人免费高清视频在线观看| 日韩一区二区三区高清免费看看| 国产精品美女视频| 精品一区二区三区香蕉蜜桃 | 国产目拍亚洲精品99久久精品| 亚洲综合精品久久| 大尺度一区二区| 精品国偷自产国产一区| 亚洲综合在线电影| 成人精品亚洲人成在线| 精品国产在天天线2019| 一区二区三区自拍| 99久免费精品视频在线观看| 久久久久九九视频| 日韩国产精品大片| 在线观看欧美黄色| 亚洲男人的天堂网| eeuss鲁一区二区三区| 久久久精品天堂| 国内成+人亚洲+欧美+综合在线| 欧美日韩在线播放三区| 一区二区三区加勒比av| av在线综合网| 欧美国产成人在线| 丁香婷婷综合五月| 久久久久久久久久久久久久久99| 免费观看在线综合| 日韩一区二区不卡| 日本视频中文字幕一区二区三区| 欧美视频在线播放| 亚洲综合网站在线观看| 在线观看国产日韩| 亚洲一区二区三区四区不卡 | 欧美午夜片在线观看| 一区二区三区在线免费视频| 日本丶国产丶欧美色综合| 亚洲人成影院在线观看| 91蝌蚪porny| 亚洲猫色日本管| 91黄色免费观看| 亚洲www啪成人一区二区麻豆| 欧美日韩久久不卡| 男女男精品视频| 欧美成人vps| 国产91丝袜在线播放九色| 国产精品青草久久| 色诱亚洲精品久久久久久| 亚洲黄色av一区| 欧美嫩在线观看| 毛片av一区二区| 国产亚洲成aⅴ人片在线观看| 国产69精品久久久久毛片 | 久久综合五月天婷婷伊人| 久久精品久久99精品久久| 日韩精品专区在线| 国产麻豆视频精品| 国产精品久久久一本精品| 91丝袜美腿高跟国产极品老师 | 婷婷综合另类小说色区| 日韩精品在线网站| 国产成人av电影在线观看| 亚洲私人黄色宅男| 欧美日韩在线播| 久久疯狂做爰流白浆xx| 国产欧美一区二区三区在线老狼| 99视频精品在线| 亚洲成人黄色影院| 久久久精品人体av艺术| 91热门视频在线观看| 日本不卡视频一二三区| 久久婷婷综合激情| 99精品桃花视频在线观看|