📄 i2s.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 + -