⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2s.c

📁 s3c6400 ADS下官方测试程序
💻 C
字号:
/**************************************************************************************
* 
*	Project Name : S3C6400 Validation
*
*	Copyright 2006 by Samsung Electronics, Inc.
*	All rights reserved.
*
*	Project Description :
*		This software is only for validating functions of the S3C6400.
*		Anybody can use this software without our permission.
*  
*--------------------------------------------------------------------------------------
* 
*	File Name : i2s.c
*  
*	File Description : This file implements the WM8753 driver functions for I2S.
*
*	Author : Sunil,Roe
*	Dept. : AP Development Team
*	Created Date : 2006/12/26
*	Version : 0.1 
* 
*	History
*	- Created(Sunil,Roe 2006/12/26)
*   
**************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "def.h"
#include "option.h"
#include "library.h"
#include "sfr6400.h"
#include "system.h"
#include "intc.h"
#include "gpio.h"

#include "i2s.h"

#define I2S(__n) 		( ( volatile oI2S_REGS * ) ( g_paI2SBase[__n] ) )

typedef struct tag_I2S_REGS
{
	u32 rI2SCON;
	u32 rI2SMOD;
	u32 rI2SFIC;
	u32 rI2SPSR;
	u32 rI2STXD;
	u32 rI2SRXD;
} 
oI2S_REGS;
 
// define global variables
void *			g_paI2SBase[I2S_CONNUM];

/*---------------------------------- APIs of rI2SCON ---------------------------------*/
//////////
// Function Name : I2S_SetI2STxerMode
// Function Description : 
//   This function implements selection of Tx/Rx Transfer mode
// Input : 	ucCon		- I2S controller number
//			eXferMode	- Tx/Rx mode
// Output : NONE
// Version : v0.1
void I2S_SetI2STxerMode(u8 ucCon, eI2S_XFER_MODE eXferMode)
{
	u32 uRegValue = 0;	

	uRegValue = I2S_GetRegValue(ucCon, eI2S_CON);
	// rI2SCON : TxDMAPause(6), RxDMAPause(5), TxCHPause(4), RxCHPause(3), TxDMAActive(2), RxDMAActive(1)
	switch(eXferMode)
	{
		case eI2S_XFER_TX : 
			uRegValue = uRegValue & ~( 0x3f << 1 ) | (0<<6) | (1<<5) | (0<<4) | (1<<3) | (1<<2) | (0<<1);
			break;
		case eI2S_XFER_RX : 
			uRegValue = uRegValue & ~( 0x3f << 1 ) | (1<<6) | (0<<5) | (1<<4) | (0<<3) | (0<<2) | (1<<1);
			break;
		case eI2S_XFER_BOTH : 
			uRegValue = uRegValue & ~( 0x3f << 1 ) | (0<<6) | (0<<5) | (0<<4) | (0<<3) | (1<<2) | (1<<1);
			break;
		default :
			break;
	}
	
	I2S_SetRegValue(ucCon, eI2S_CON, uRegValue);	
}

//////////
// Function Name : I2S_SetDMAPause
// Function Description : 
//   This function implements pause/resume of I2S Channel.
// Input : 	ucCon		- I2S controller number
//			eXferMode	- Tx/Rx mode
// Output : NONE
// Version : v0.1
void I2S_SetDMAPause(u8 ucCon, eI2S_XFER_MODE eXferMode, u8 ucPause)
{
	u32 uRegValue = 0;	

	uRegValue = I2S_GetRegValue(ucCon, eI2S_CON);
	uRegValue = uRegValue & ~( 0x1 << (6-eXferMode) ) | ( ucPause << (6-eXferMode));

	I2S_SetRegValue(ucCon, eI2S_CON, uRegValue);	
}

//////////
// Function Name : I2S_SetChPause
// Function Description : 
//   This function implements activation/deactivation of I2S.
// Input : 	ucCon		- I2S controller number
//			eXferMode	- Tx/Rx mode
// Output : NONE
// Version : v0.1
void I2S_SetChPause(u8 ucCon, eI2S_XFER_MODE eXferMode, u8 ucPause)
{
	u32 uRegValue = 0;	

	uRegValue = I2S_GetRegValue(ucCon, eI2S_CON);
	uRegValue = uRegValue & ~( 0x1 << (4-eXferMode) ) | ( ucPause << (4-eXferMode));

	I2S_SetRegValue(ucCon, eI2S_CON, uRegValue);	
}

//////////
// Function Name : I2S_SetDMAActive
// Function Description : 
//   This function implements activation/deactivation of I2S DMA.
// Input : 	ucCon		- I2S controller number
//			eXferMode	- Tx/Rx mode
// Output : NONE
// Version : v0.1
void I2S_SetDMAActive(u8 ucCon, eI2S_XFER_MODE eXferMode, u8 ucActive)
{
	u32 uRegValue = 0;	

	uRegValue = I2S_GetRegValue(ucCon, eI2S_CON);
	uRegValue = uRegValue & ~( 0x1 << (2-eXferMode) ) | ( ucActive << (4-eXferMode));

	I2S_SetRegValue(ucCon, eI2S_CON, uRegValue);	
}

//////////
// Function Name : I2S_SetActive
// Function Description : 
//   This function implements activation/deactivation of I2S.
// Input : 	ucCon		- I2S controller number
//			eXferMode	- Tx/Rx mode
// Output : NONE
// Version : v0.1
void I2S_SetActive(u8 ucCon, u8 ucActive)
{
	u32 uRegValue = 0;	

	uRegValue = I2S_GetRegValue(ucCon, eI2S_CON);
	uRegValue = uRegValue & ~( 0x1 << 0 ) | ( ucActive << 0);

	I2S_SetRegValue(ucCon, eI2S_CON, uRegValue);	
}

/*---------------------------------- APIs of rI2SMOD ---------------------------------*/
//////////
// Function Name : I2S_SetCodecClkSrc
// Function Description : 
//   This function implements selection of Master/Slave mode.
// Input : 	ucCon 		- I2S controller number
//			eClkSrc 		- Codec Clock Source (Internal/External)
// Output : NONE
// Version : v0.1
void I2S_SetCodecClkSrc(u8 ucCon, eI2S_CLK_SRC eClkSrc)
{
	u32 uRegValue = 0;	

	uRegValue = I2S_GetRegValue(ucCon, eI2S_MOD);
	uRegValue = uRegValue & ~( 0x1 << 12 ) | ( eClkSrc << 12);

	I2S_SetRegValue(ucCon, eI2S_MOD, uRegValue);	
}

//////////
// Function Name : I2S_SetMasterSlaveMode
// Function Description : 
//   This function implements selection of Master/Slave mode.
// Input : ucCon 		- I2S controller number
//			eMSMode - Master/Slave mode
// Output : NONE
// Version : v0.1
void I2S_SetMasterSlaveMode(u8 ucCon, eI2S_MS_MODE eMSMode)
{
	u32 uRegValue = 0;	

	uRegValue = I2S_GetRegValue(ucCon, eI2S_MOD);

	uRegValue = uRegValue & ~(3<< 10 ) | (eMSMode << 10);

	I2S_SetRegValue(ucCon, eI2S_MOD, uRegValue);
	
}

//////////
// Function Name : I2S_SetInterfaceMode
// Function Description : 
//   This function implements selection of Master/Slave mode.
// Input : ucCon 		- I2S controller number
//			eMSMode - Master/Slave mode
// Output : NONE
// Version : v0.1
void I2S_SetInterfaceMode(u8 ucCon, eI2S_XFER_MODE eXferMode, eI2S_CLOCK_POLARITY eClkPolarity, 
										eI2S_DATA_FORMAT eDataFormat, u8 ucCodecClk, u8 ucBClk, u8 ucBLth)
{
	u32 uRegValue = 0;	

	uRegValue = I2S_GetRegValue(ucCon, eI2S_MOD);
	// rI2SMOD : TxerMode(8), LowForLeft&HightForRight(7), I2SFormat(5), I2SRootClk(3), BitClk(1), BitLength(0)
	uRegValue = uRegValue & ~(0x3ff) | (eXferMode << 8) | (eClkPolarity << 7) | (eDataFormat << 5) | (ucCodecClk << 3) | (ucBClk << 1) | (ucBLth << 0);

	I2S_SetRegValue(ucCon, eI2S_MOD, uRegValue);

}

/*---------------------------------- APIs of rI2SFIC ---------------------------------*/
//////////
// Function Name : I2S_FlushFIFO
// Function Description : 
//   This function implements the I2S FIFO Flush.
// Input : ucCon 		- I2S port number
// Output : NONE
// Version : v0.1
void I2S_FlushFIFO(u8 ucCon, eI2S_FLUSH_MODE eFlushMode, u8 ucFlushFlag)
{
	u32 uRegValue = 0;	

	// FIFO Flush
	uRegValue = I2S_GetRegValue(ucCon, eI2S_FIC);

	if ( eFlushMode == eI2S_FLUSH_BOTH )
	{
		uRegValue |= (ucFlushFlag << 15) | ( ucFlushFlag << 7);
	}
	else if ( eFlushMode == eI2S_FLUSH_TX )
	{
		uRegValue = (ucFlushFlag << 15)  + 0;
	}
	else if ( eFlushMode == eI2S_FLUSH_RX )
	{
		uRegValue = (ucFlushFlag << 7)  + 0;
	}
	
	I2S_SetRegValue(ucCon, eI2S_FIC, uRegValue);
}

/*---------------------------------- APIs of rI2SPSR ---------------------------------*/
//////////
// Function Name : I2S_SetPreScaler
// Function Description : 
//   This function implements the I2S Clock Prescaler.
// Input : ucCon 		- I2S controller number
//			ucPSRActiveFlag	- Pre-scaler Active
//			usPSRDivValue	- Pre-scaler division value.
// Output : NONE
// Version : v0.1
void I2S_SetPreScaler(u8 ucCon, u8 ucPSRActiveFlag, u16 usPSRDivValue)
{
	u32 uRegValue = 0;	

	// FIFO Flush
	uRegValue = I2S_GetRegValue(ucCon, eI2S_PSR);

//	uRegValue = (ucPSRActiveFlag << 15) | usPSRDivValue;
	uRegValue = (ucPSRActiveFlag << 15) | (usPSRDivValue<<8);

	I2S_SetRegValue(ucCon, eI2S_PSR, uRegValue);
}
/*---------------------------------- APIs of rI2STXD ---------------------------------*/

/*---------------------------------- APIs of rI2SRXD ---------------------------------*/

/*---------------------------------- APIs of general I2S ---------------------------------*/
//////////
// Function Name : I2S_SetBaseAddr
// Function Description : This function gets the address of I2S Registers.
// Input : 	ucCon		- I2S controller number
// Output : 	uBaseAddress	- the baseaddress of I2S registers
// Version : v0.1
void I2S_SetBaseAddr(u8 ucCon, u32 uBaseAddress)
{
	g_paI2SBase[ucCon] = (void *)uBaseAddress;
}
//////////
// Function Name : I2S_GetRegAddr
// Function Description : This function gets the address of I2S Registers.
// Input : 	ucI2SRegId		- the Id of I2S Registers
// Output : 	*puI2SReg		- the value of specified register
// Version : v0.1
u32 I2S_GetRegAddr(u8 ucCon, eI2S_Id uI2SRegId)
{
	volatile u32 *	puI2SBaseAddr;
	volatile u32 *	puI2SReg;	
	u32			uI2SRegAddr = 0;

	puI2SBaseAddr			= &(I2S(ucCon)->rI2SCON);
	puI2SReg				= puI2SBaseAddr + uI2SRegId;

	uI2SRegAddr			= (u32)puI2SReg;
	return uI2SRegAddr;	
}

//////////
// Function Name : I2S_GetRegValue
// Function Description : This function gets the value of I2S Registers.
// Input : 	ucI2SRegId		- the Id of I2S Registers
// Output : 	*puI2SReg		- the value of specified register
// Version : v0.1
u32 I2S_GetRegValue(u8 ucCon, eI2S_Id uI2SRegId)
{
	volatile u32 *	puI2SBaseAddr;
	volatile u32 *	puI2SReg;	

	puI2SBaseAddr			= &(I2S(ucCon)->rI2SCON);
	puI2SReg				= puI2SBaseAddr + uI2SRegId;

	return *puI2SReg;	
}

//////////
// Function Name : I2S_SetRegValue
// Function Description : This function sets the value of I2S Registers.
// Input : 	ucI2SRegId		- the Id of I2S Registers
//			uValue			- the value of register
// Output : 	NONE
// Version : v0.1
void I2S_SetRegValue(u8 ucCon, eI2S_Id uI2SRegId, u32 uValue)
{
	volatile u32 *	puI2SBaseAddr;
	volatile u32 *	puI2SReg;	

	puI2SBaseAddr		= &(I2S(ucCon)->rI2SCON);
	puI2SReg			= puI2SBaseAddr + uI2SRegId;
	*puI2SReg			= uValue;
}







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -