📄 iis.c
字号:
/*======================================================================
Project Name : S3C2450
Copyright 2006 by Samsung Electronics, Inc.
All rights reserved.
Project Description :
This software is only for verifying functions of the S3C2443.
Anybody can use this code without our permission.
File Name : iis.c
Description : S3C2443 IIS module code
Author : Junon Jeon
Dept : AP
Created Date : 2006.06.02
Version : 0.0
History
R0.0 (2006.06.02): Junon draft
- S3C2443 IIS test code is derived from S3C2413A IIS test code.
=======================================================================*/
#include "System.h"
#include "iis.h"
#include "SfrReadWriten.h"
#include "PLL.h"
#include "codec.h"
#include "codecexterns.h"
#include "6channelid.h"
#include "tada.h"
#define IIS_BUFFER 0x31000000
#define IIS_BUFFER2 0x32000000
#define REC_LEN_IIS 0xfffff*4 //Max value of DMA Transfer Counter (20bit) = 0xfffff, Date Size=Word (4bytes)
/////////////////////////////////////////////////////
// Global variable
/////////////////////////////////////////////////////
IIS_State g_oI2SState;
IIS_Statistic g_oI2Sunderrun[I2S_MAX_UNDERRUN_STATIC];
IIS_Addr g_oI2Splaybuffer[2];
DMA_info g_oDmainfo[2];//0: tx rx tx tx rx
//1: rx tx rx
// Global variables
char which_Buf = 1;
volatile char Play_Done = 0;
volatile char Rec_Done = 0;
unsigned int g_underruncnt=0;
unsigned char *Buf,*_temp;
unsigned char *rec_buf = (unsigned char *)(IIS_BUFFER+0x28);
unsigned char *rec_buf1 = (unsigned char *)(IIS_BUFFER + REC_LEN_IIS);
unsigned int size, fs;
unsigned int save_GPE_CON, save_GPB_CON;
unsigned int save_GPE_DAT, save_GPB_DAT;
unsigned int save_GPE_SEL, save_GPB_SEL;
unsigned int save_GPE_UDP, save_GPB_UDP;
unsigned int save_GPL_CON, save_GPJ_CON;
unsigned int save_GPL_DAT, save_GPJ_DAT;
unsigned int save_GPL_SEL, save_GPJ_SEL;
unsigned int save_GPL_UDP, save_GPJ_UDP;
float IIS_Codec_CLK;
//SFR test
REGINFOn sRegInfoI2S0[] =
{
//01234567890123 address reset uPrivateBitMask(1:do check)
// value
{"rIISCON0 [17]- interrupt status ", 0x55000000, 18-1, RW, 0xC600, DPPB, 0x1007f,0},
{"rIISMOD0 ", 0x55000004, 22-1, RW, 0x0 , DPDB, 0,0},
{"rIISFIC0 ", 0x55000008, 29-1, RW, 0x0 , DPPB, 0xe0e0e0e0,0},
{"rIISPSR0 ", 0x5500000c, 16-1, RW, 0x0 , DPDB, 0,0},
{"rIISTXD0 ", 0x55000010, 32-1, WO, 0x0 , DPDB, 0,0},
{"rIISRXD0 ", 0x55000014, 32-1, RO, 0x0 , DPDB, 0,0},
};
REGINFOn sRegInfoI2S1[] =
{
//01234567890123
{"rIISCON1 [17]- interrupt status ", 0x55000100, 18-1, RW, 0x600, DPPB, 0x1007f,0},
{"rIISMOD1 ", 0x55000104, 16-1, RW, 0x0 , DPDB, 0,0},
{"rIISFIC1 ", 0x55000108, 16-1, RW, 0x0 , DPPB, 0xe0e0,0},
{"rIISPSR1 ", 0x5500010c, 16-1, RW, 0x0 , DPDB, 0,0},
{"rIISTXD1 ", 0x55000110, 32-1, WO, 0x0 , DPDB, 0,0},
{"rIISRXD1 ", 0x55000114, 32-1, RO, 0x0 , DPDB, 0,0},
};
//Externs
extern bool TestSFRn(const REGINFOn* psRegInfo, int count);//sfrreadwriten.c
extern unsigned int DownloadData(void);//console.c
//iinew.c
extern bool PCM_testpatternmemcopy(unsigned int testaddr, unsigned char totch, unsigned char bitperch);
// Functions
void I2S_SFR_test01(void);//1
// GPIO port setting
void IIS_Port_Init(void);
void IIS_Port_Return(void);
void I2S_VariableInit(void);
// IIS library
void Select_PCLK(int port, unsigned int pdf);
void Select_EXTCLK(int port, unsigned int pdf);
bool Select_EPLL(int port, unsigned int pdf);
void Select_EPLL_Ref_CLK(int port, unsigned int pdf);
void I2S_INT_Underrun_init(void);
void down_wav(void);
void __irq Isr_I2S_Interrupt(void);
void __irq DMA1_Rec_Done(void);
void __irq DMA2_Done(void);
void __irq Play_Rec_Simul(void);
void Play_Iis(void);
void Play_Iis_logic(void);
void Play_Iis_logic_underrun(void);
void RecordSound_Playit(void);
void RecordSound_ViaLineIn_Playit_logic(void);
void RecordSound_ViaMICIn_Playit(void);
void RECORD_PLAY_SIMtaneously(void);
void I2S_DMA_Play_init(int port, unsigned char *start_addr, unsigned int pcm_size, int bitperch);
bool I2S_DMA_updateTx();
void I2S_DMA_finishTX();
void I2S_tx_finish();
void I2S_DMA_Rec_init(int port, unsigned char *start_addr, unsigned int pcm_size, int bitperch);
bool I2S_DMA_updateRx();
void I2S_rx_finish();
void IIS_PlayWave_DMA(int port, unsigned char *start_addr);
void IIS_PlayWave_Polling(int port, unsigned char *start_addr, unsigned int play_size, int bitperch);
void IIS_PlayWave_Polling_logic(int port, unsigned char *start_addr, unsigned int play_size, int bitperch);
void IIS_RecSound_DMA(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize);
void IIS_RecSound_Polling(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize);
void IIS_RecSound_Polling_logic(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize);
void IIS_Paly_Rec_Simultaneously_DMA();
void IIS_RecSound_DMA1_Repeat(unsigned int uRecBufferAddr, unsigned int uPcmRecByteSize);
void ISS0_sample0();
void ISS0_Demo1();
void ISS0_Demo2();
void I2S_2chDemo(void);
void * func_iis_test[][2]=
{
//IIS Function Test Item
// "123456789012345678901"
(void *)I2S_Select_port, "Select I2S port",
(void *)I2S_SFR_test01, "I2S SFR reset & read/write test ",//1
(void *)I2S_Select_MasterSlave, "Select I2S Master/Slave",
(void *)I2S_Select_testsource, "Select test pcm source select",
(void *)I2S_ClockSettingPathsetting, "Select I2S clock setting",
(void *)I2S_setETC, "Select dataformat/DMAPolling/enable underrun interrupt",
(void *)I2S_selectsetting, "Select setting for record",
(void *)Play_Iis, "Play Wave ",
(void *)Play_Iis_logic, "Play Wave(polling logic)",
(void *)Play_Iis_logic_underrun, "Play Wave(dma logic under run test)",
(void *)RecordSound_Playit, "Record & Play",
(void *)RecordSound_ViaLineIn_Playit_logic, "Record(LineIn) & Play(polling logic)",
(void *)RECORD_PLAY_SIMtaneously, "Record and Play Simultaneously. \n",
(void *)I2S_2chDemo, "tada 22.050KHz 2ch 16bit 1sec",
(void *)ISS0_sample0, "6channel id 11.025khz 5.1ch 16bit 5sec",
(void *)ISS0_Demo1, "Crouching Tiger 48khz 5.1ch 16bit 54sec",
(void *)ISS0_Demo2, "Crouching Tiger 48khz 5.1ch 16bit 37sec",
0,0
};
void Test_IIS(void)
{
int i;
I2S_VariableInit();
while(1)
{
i=0;
printf("\n\n================== IIS Function Test =====================\n\n");
while(1)
{ //display menu
printf("%2d:%s",i,func_iis_test[i][1]);
i++;
if((int)(func_iis_test[i][0])==0)
{
printf("\n");
break;
}
if((i%1)==0)
printf("\n");
}
printf("\n==========================================================\n");
printf("Select #Item or Press Enter key to exit : ");
i = GetIntNum();
//i = 2;
if(i==-1) break; // return.
if(i>=0 && (i<((sizeof(func_iis_test)-1)/8)) ) // select and execute...
( (void (*)(void)) (func_iis_test[i][0]) )();
}
}
//should execute at first
bool I2S_SFR_test(int Port)
{
bool bret;
if(Port == 0)
bret=TestSFRn(sRegInfoI2S0, sizeof(sRegInfoI2S0)/sizeof(REGINFOn));
else if(Port == 1)
bret=TestSFRn(sRegInfoI2S1, sizeof(sRegInfoI2S1)/sizeof(REGINFOn));
return bret;
}
//============================== [ IIS Drivers ] ===============================
//set default setting
void I2S_VariableInit(void)
{
g_oI2SState.CodecID = WM8580;
g_oI2SState.Port = I2S_PORT0;
g_oI2SState.MasterSlave = I2S_MASTER;
g_oI2SState.Txrmode = I2S_MODE_TX;
g_oI2SState.LineMic = CODEC_LINEIN;
g_oI2SState.recordSec = 10;
g_oI2SState.BitperCh = 16;
g_oI2SState.SyncClkFreq = 48000;
g_oI2SState.Totch = 2;
g_oI2SState.maskingch = 0x3f & ~(0x3<<0);
g_oI2SState.ClkSrc = I2S_EPLL;
g_oI2SState.CDCLKFreqFs = 384;
g_oI2SState.CDCLKFreq = g_oI2SState.SyncClkFreq * g_oI2SState.CDCLKFreqFs;
g_oI2SState.BitClkFS = 32;
g_oI2SState.Dataformat = I2S_FORMAT_I2S;
g_oI2SState.DmaPolling = I2S_DMA;
g_oI2SState.benUnderInt = 1;
g_oI2SState.ben24bittest = 0;//polling underrun, overrun test
}
// Setting Port related to IIS
//port num
void IIS_Port_Init()
{
/*
save_GPG_CON = rGPGCON; // L3
//----------------------------------------------------------
//PORT G GROUP
//Ports : GPG0 GPG1 GPG2
//Signal : L3MODE L3DATA L3CLK
//Setting: OUTPUT OUTPUT OUTPUT
// [1:0] [3:2] [5:4]
//Binary : 01 01 01
//----------------------------------------------------------
rGPGCON = rGPGCON & ~(0x3f) | (1<<4)|(1<<2)|(1); // output setting
*/
if(g_oI2SState.Port == I2S_PORT0)
{
save_GPE_CON = rGPECON; // IIC, IIS
save_GPE_SEL = rGPESEL; // IIC, IIS
save_GPE_UDP = rGPEUDP; // IIC, IIS
save_GPB_SEL = rGPBSEL; // IIS
save_GPB_UDP = rGPBUDP; // IIS
//IIS0
//-------------------------------------------------------------------------------
//PORT E GROUP
//Ports : GPE4 GPE3 GPE2 GPE1 GPE0
//Signal : I2S DO I2S DI CDCLK I2S SCLK I2S LRCLK
//con : 10, 10, 10, 10, 10
//pullup : 0
//Sel : 0
//-------------------------------------------------------------------------------
rGPESEL = 0;//GPE select
rGPECON = rGPECON & ~(0x3ff) | 0x2aa; // IIS function setting
rGPEUDP = rGPEUDP & ~((U32)(0x3ff)) | ((U32)(0x0));//pull_up_down disable
//-------------------------------------------------------------------------------
//PORT B GROUP
//Ports : GPB10 GPB9
//Signal : I2S DO_2 I2S DO_1
//con : xx, xx,
//pullup : 0, 0,
//Sel : 1 1
//-------------------------------------------------------------------------------
rGPBSEL = rGPBSEL & ~((U32)(0x3<<3)) | ((U32)(0x3<<3)); // IIS function setting
rGPBUDP = rGPBUDP & ~((U32)(0xf<<18)) | ((U32)(0x0<<18));//pull_up_down disable
}
else
{
save_GPL_CON = rGPLCON; // IIS1
save_GPL_SEL = rGPLSEL; // IIS1
save_GPL_UDP = rGPLUDP; // IIS1
save_GPJ_CON = rGPJCON; // IIS1
save_GPJ_SEL = rGPJSEL; // IIS1
save_GPJ_UDP = rGPJUDP; // IIS1
//IIS1
//-------------------------------------------------------------------------------
//PORT L GROUP
//Ports : GPL7 GPL6 GPL5 GPL4
//Signal : I2S SDO SDI CDCLK SCLK
//con : 11, 11, 11, 11
//pullup : 0
//Sel : 0
//-------------------------------------------------------------------------------
rGPLSEL = 0;//GPL
rGPLCON = rGPLCON & ~((U32)(0xff<<8)) | ((U32)(0xff<<8)); // IIS function setting
rGPLUDP = rGPLUDP & ~((U32)(0xff<<8)) | ((U32)(0x0<<8)); // pull_up_down disable
//-------------------------------------------------------------------------------
//PORT J GROUP
//Ports : GPJ13
//Signal : I2S1 LRCK
//con : 11
//pullup : 0
//Sel : 0
//-------------------------------------------------------------------------------
rGPJSEL = 0;//GPJ
rGPJCON = rGPJCON & ~((U32)(0x3<<26)) | ((U32)(0x3<<26)); // IIS function setting
rGPJUDP = rGPJUDP & ~((U32)(0x3<<26)) | ((U32)(0x0<<26));//pull_up_down disable
}
}
void I2S_SetToGPIO(int port)
{
if(port == I2S_PORT0)
{
//IIS0
//-------------------------------------------------------------------------------
//PORT E GROUP
//Ports : GPE4 GPE3 GPE2 GPE1 GPE0
//Signal : I2S DO I2S DI CDCLK I2S SCLK I2S LRCLK
//con : 10, 10, 10, 00, 00
//pullup : 0
//Sel : 0
//-------------------------------------------------------------------------------
rGPESEL = 0;//GPE select
rGPECON = rGPECON & ~(0x3ff) | 0x2a0; // input
rGPEUDP = rGPEUDP & ~((U32)(0x3ff)) | ((U32)(0x0));//pull_up_down disable
}
else
{
//IIS1
//-------------------------------------------------------------------------------
//PORT L GROUP
//Ports : GPL7 GPL6 GPL5 GPL4
//Signal : I2S SDO SDI CDCLK SCLK
//con : 11, 11, 11, 0
//pullup : 0
//Sel : 0
//-------------------------------------------------------------------------------
rGPLSEL = 0;//GPL
rGPLCON = rGPLCON & ~((U32)(0xff<<8)) | ((U32)(0xfc<<8)); // input
rGPLUDP = rGPLUDP & ~((U32)(0xff<<8)) | ((U32)(0x0<<8)); // pull_up_down disable
//-------------------------------------------------------------------------------
//PORT J GROUP
//Ports : GPJ13
//Signal : I2S1 LRCK
//con : 0
//pullup : 0
//Sel : 0
//-------------------------------------------------------------------------------
rGPJSEL = 0;//GPJ
rGPJCON = rGPJCON & ~((U32)(0x3<<26)) | ((U32)(0x0<<26)); // input
rGPJUDP = rGPJUDP & ~((U32)(0x3<<26)) | ((U32)(0x0<<26));//pull_up_down disable
}
}
//gpe0 : i2s0 lrck , gpe1: i2s0 sclk
//gpj13 : i2s1 lrck , gpl4: i2s1 sclk
bool I2S_ClockTEST(int port)
{
bool bLRCLK, bSCLK;
bool bLRCLKold=0, bSCLKold=0;
int cntLRtoggle=0, cntSCLKtoggle=0;
int i=0;
bool bret = 0;
while(1)
{
bSCLK = (port==I2S_PORT0)? (rGPEDAT>>1)&0x1 : (rGPLDAT>>4)&0x1;
bLRCLK = (port==I2S_PORT0)? rGPEDAT&0x1 : (rGPJDAT>>13)&0x1;
if(bSCLK != bSCLKold) cntSCLKtoggle ++;
if(bLRCLK != bLRCLKold) cntLRtoggle ++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -