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

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

?? i2s.cpp

?? 三星 ARM920T S3C2440A 400MHz bsp包
?? 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;
}




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线免费观看一区| 综合在线观看色| 国产精品伦理一区二区| 亚洲成人免费av| 成人av资源下载| 精品国产精品一区二区夜夜嗨| 亚洲精品综合在线| 国产成人精品一区二| 欧美一区二区三区免费大片 | 亚洲成人av电影| 国产福利91精品| 精品久久久久久久久久久久久久久| 国产精品传媒在线| 国产精品一区免费在线观看| 欧美一区二区成人6969| 午夜精品福利一区二区蜜股av| 99国产精品久久| 国产精品乱码一区二区三区软件| 久99久精品视频免费观看| 欧美性生活久久| 亚洲一区二区三区四区在线| 91丝袜呻吟高潮美腿白嫩在线观看| 国产欧美视频在线观看| 国产成人在线视频网址| 精品少妇一区二区三区日产乱码| 成人动漫av在线| 国产精品激情偷乱一区二区∴| 国产精品一区专区| 国产欧美日韩在线看| 国产原创一区二区| 精品国产乱码久久| 国产精品一二三四| 中文字幕av在线一区二区三区| 国产1区2区3区精品美女| 国产人久久人人人人爽| 成人在线视频一区二区| 国产精品欧美极品| 91小视频免费观看| 亚洲亚洲人成综合网络| 69av一区二区三区| 老汉av免费一区二区三区| 精品久久久网站| 国产成人综合亚洲网站| 中文字幕中文字幕中文字幕亚洲无线| 成人app软件下载大全免费| 亚洲精品伦理在线| 欧美三级在线播放| 97久久精品人人做人人爽| 国产一区不卡视频| 欧美另类高清zo欧美| 亚洲精品videosex极品| 欧美羞羞免费网站| 日韩精品亚洲专区| 久久蜜桃av一区精品变态类天堂| 国产 日韩 欧美大片| 亚洲一线二线三线视频| 日韩午夜在线观看| 高清在线不卡av| 一区二区三区**美女毛片| 正在播放一区二区| 成人黄色在线视频| 亚洲成av人片一区二区梦乃| 日韩午夜激情av| 99久久777色| 精油按摩中文字幕久久| 国产精品视频一区二区三区不卡| 欧美视频在线观看一区二区| 久久精品国产免费| 亚洲色图欧美在线| 亚洲国产va精品久久久不卡综合| 免费视频最近日韩| 亚洲午夜精品网| 九色综合狠狠综合久久| 国产清纯美女被跳蛋高潮一区二区久久w | 亚洲日本成人在线观看| 欧美日韩在线免费视频| 国产成人综合网| 日本午夜精品视频在线观看 | 艳妇臀荡乳欲伦亚洲一区| 日韩一区二区在线看片| 成人激情电影免费在线观看| 亚洲第一二三四区| 欧美激情一区二区三区蜜桃视频 | 91女人视频在线观看| 日韩激情中文字幕| 国产精品高潮呻吟| 亚洲电影视频在线| 一区二区三区丝袜| 色哦色哦哦色天天综合| 精品中文av资源站在线观看| 亚洲视频在线观看一区| 久久久另类综合| 91精品久久久久久蜜臀| 色成年激情久久综合| 成人激情视频网站| 国产综合色精品一区二区三区| 日韩电影在线观看电影| 亚洲伦理在线免费看| 中文字幕视频一区二区三区久| 日韩欧美亚洲国产另类| 精品视频一区二区不卡| 91一区在线观看| 成人激情免费网站| 成人黄色软件下载| 国产成人免费视频网站高清观看视频| 美女一区二区三区| 丝袜亚洲另类欧美综合| 国产成人综合在线播放| 激情欧美日韩一区二区| 精品在线一区二区三区| 蜜臀91精品一区二区三区 | 欧美色图在线观看| 在线免费亚洲电影| 精品污污网站免费看| 欧美老肥妇做.爰bbww| 欧美群妇大交群的观看方式| 欧美在线观看一二区| 欧美酷刑日本凌虐凌虐| 欧美一区二区三区在| 日韩一区二区高清| 欧美v日韩v国产v| 久久精品一区蜜桃臀影院| 中文字幕精品在线不卡| 国产精品毛片无遮挡高清| 亚洲视频一区在线观看| 亚洲一二三专区| 日本在线观看不卡视频| 精品亚洲porn| 成人一区二区三区视频 | 一区二区三区91| 亚洲成人精品在线观看| 日韩va亚洲va欧美va久久| 毛片一区二区三区| 国产二区国产一区在线观看| 成人18精品视频| 91福利在线导航| 欧美xxxxxxxx| 中文字幕亚洲欧美在线不卡| 亚洲国产精品一区二区www| 蜜桃视频在线一区| 成人精品gif动图一区| 欧美丝袜自拍制服另类| 欧美白人最猛性xxxxx69交| 国产欧美一区二区精品久导航| 中文字幕综合网| 蜜桃视频一区二区三区| 国产99久久久久久免费看农村| 91蝌蚪porny九色| 欧美一区二区三区视频在线| 欧美韩国日本一区| 香蕉久久一区二区不卡无毒影院| 九色综合狠狠综合久久| 色屁屁一区二区| 久久精品人人做人人爽97| 一区二区三区欧美日韩| 看片网站欧美日韩| 一本久久综合亚洲鲁鲁五月天| 91精品一区二区三区在线观看| 国产精品蜜臀av| 久久机这里只有精品| 色屁屁一区二区| 国产欧美日韩精品在线| 亚洲午夜视频在线| 成人午夜免费电影| 日韩欧美一区电影| 亚洲国产成人av| aaa欧美色吧激情视频| 精品免费国产一区二区三区四区| 中文字幕中文字幕一区| 精品一区二区三区视频在线观看| 一本大道av伊人久久综合| 国产午夜久久久久| 蜜桃视频在线一区| 欧美久久一二三四区| 悠悠色在线精品| 岛国精品一区二区| 久久影音资源网| 日韩电影在线免费观看| 亚洲欧美另类图片小说| 国产综合色产在线精品| 在线电影院国产精品| 一区二区久久久| eeuss鲁一区二区三区| 久久久99精品免费观看| 美国十次了思思久久精品导航| 欧美日韩在线播放一区| 亚洲激情男女视频| 99re成人在线| 国产精品久久看| 成人综合在线观看| 欧美国产一区在线| 国产成人午夜精品5599| 国产亚洲污的网站| 国产中文字幕精品| 精品国产电影一区二区| 国产伦精品一区二区三区在线观看| 精品国产一区二区在线观看| 麻豆成人久久精品二区三区红| 91精品国产全国免费观看| 日韩成人午夜电影|