📄 iis.c
字号:
/*=============================================================
File Name: Iis.c
Description: S3C2460 IIS Controller Function Test
Version: 0.1
History:
0.0: 2004. 07. 08, Ported and tested by Y. H. Lee
- This code works with UDA1341TS IIS CODEC on SMDK2460 board.
- IIS master Tx test: Play recorded wav data.
- IIS master Rx test: Record sound wav data on the memory via MIC-in or Line-in.
- IIS maser clock selection (PCLK, I2S EXTCLK, EPLL, or UPLL ref. CLK) is added.
- Recording sound via Line-In is available.
0.1: Tx and Rx simultaneously is available.
0.2: below function is added
- pause/re-play, stop/play function during playing
0.3: code modified
- code related to EXTCLK using is modified
S3C2460X IIS test code is derived from following S3C2440A IIS test code.
...
File Name: Iis.c
Description: S3C2440A IIS controller Function Test
Version: 0.2
History:
0.0: 2002. 03. 06, Programming Start by SOP.
0.1: 2004. 02. 04, Modified by Y. H. Lee.
- IIS Master Tx: Play Sample Wave File.
- IIS Master Rx: Record Sound using MIC and Play it.
- IIS maser clock selection (PCLK or MPLLin) is supported.
0.2: 2004. 04. 26, Modified by Y. H. Lee.
- Recording Sound via Line-In is available in the SMDK2440 base board (Rev 0.19).
==============================================================*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "option.h"
#include "2460addr.h"
#include "2460lib.h"
#include "2460slib.h"
#include "iis.h"
#include "PLL.h"
#define REC_LEN_IIS 0xfffff*4 //Max value of DMA Transfer Counter (20bit) = 0xfffff, Date Size=Word (4bytes)
//#define REC_LEN_IIS 0x3ffff*4
#define PLAY_IIS 0
#define RECORD_MICIn 1
#define RECORD_LineIn 2
#define RECORD_PLAY_Simul 3
#define L3D (1<<7) //GPJ7 = L3DATA
#define L3C (1<<6) //GPJ6 = L3CLOCK
#define L3M (1<<5) //GPJ5 = L3MODE
char mute = 1;
char which_Buf = 1;
volatile char Rec_Done = 0;
char IIS_MasterClk_Sel = 0;
unsigned char *Buf,*_temp;
//org
//unsigned char *rec_buf = (unsigned char *)0x11000000;
//unsigned char *rec_buf1 = (unsigned char *)(0x11000000 + REC_LEN_IIS);
//khs(050909)
unsigned char *rec_buf = (unsigned char *)_NONCACHE_STARTADDRESS;
unsigned char *rec_buf1 = (unsigned char *)(_NONCACHE_STARTADDRESS + REC_LEN_IIS);
unsigned int size, fs;
unsigned int save_GPA_CON, save_GPA_UP, save_GPJ_CON, save_GPJ_UP;
float IIS_Codec_CLK;
void IIS_Port_Init(void);
void IIS_Port_Return(void);
void Init1341(int);
unsigned short IIS_Select_SamplingRate(void);
void Select_IIS_Master_CLK(void);
void Select_PCLK(void);
void Select_EXTCLK(void);
void Select_EPLL(void);
void Select_UPLL_Ref_CLK(void);
void IIS_RecSound_DMA1( int mode, unsigned int rec_size);
void IIS_RecSound_DMA1_Repeat(unsigned char *start_addr, unsigned int rec_size);
void IIS_PlayWave_DMA2(unsigned char *start_addr, unsigned int play_size);
void IIS_Paly_Rec_Simul(unsigned char *start_addr, unsigned int play_size);
void _WrL3Addr(unsigned char data);
void _WrL3Data(unsigned char data,int halt);
void __irq DMA1_Rec_Done(void);
void __irq DMA2_Done(void);
void __irq Play_Rec_Simul(void);
void * func_iis_test[][2]=
{
//IIS Function Test Item
(void *)RecordSound_ViaMICIn_Playit, "Record Sound via MIC-In and Play it. ",
(void *)RecordSound_ViaLineIn_Playit, "Record Sound via Line-In and Play it. ",
(void *)Record_Play_Simultaneously, "Record and Play Simultaneously. ",
0,0
};
void IIS_Test(void)
{
int i;
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();
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]) )();
}
}
//Record Sound via Line-In
void RecordSound_ViaLineIn_Playit(void)
{
printf("\nRecord Sound via Line-In and Play it.\n");
IIS_Port_Init();
Select_IIS_Master_CLK();
Init1341(RECORD_LineIn);
IIS_RecSound_DMA1(RECORD_LineIn, REC_LEN_IIS);
Init1341(PLAY_IIS);
IIS_PlayWave_DMA2(rec_buf, REC_LEN_IIS);
IIS_Port_Return();
mute = 1;
}
//Record Sound via MIC-In
void RecordSound_ViaMICIn_Playit(void)
{
printf("\nRecord Sound via MIC-In and Play it.\n");
IIS_Port_Init();
Select_IIS_Master_CLK();
Init1341(RECORD_MICIn);
IIS_RecSound_DMA1(RECORD_MICIn, REC_LEN_IIS);
Init1341(PLAY_IIS);
IIS_PlayWave_DMA2(rec_buf, REC_LEN_IIS);
IIS_Port_Return();
mute = 1;
}
void Record_Play_Simultaneously(void)
{
printf("\nRecord and Play Simultaneously.\n");
IIS_Port_Init();
Select_IIS_Master_CLK();
Init1341(RECORD_LineIn);
IIS_RecSound_DMA1(RECORD_LineIn, REC_LEN_IIS);
Init1341(RECORD_PLAY_Simul);
IIS_Paly_Rec_Simul(rec_buf, REC_LEN_IIS);
Init1341(PLAY_IIS);
IIS_PlayWave_DMA2(rec_buf1, REC_LEN_IIS);
IIS_Port_Return();
}
//Sub-Routines
//Setting Port related to IIS
void IIS_Port_Init(void)
{
save_GPA_CON = rGPACON;
save_GPA_UP = rGPAPU;
save_GPJ_CON = rGPJCON;
save_GPJ_UP = rGPJPU;
//----------------------------------------------------------
//PORT J GROUP
//Ports : GPJ5 GPJ6 GPJ7
//Signal : L3MODE L3CLOCK L3DATA
//Setting: OUTPUT OUTPUT OUTPUT
// [11:10] [13:12] [15:14]
//Binary : 01 01 01
//----------------------------------------------------------
rGPJCON = rGPJCON & ~(0x3<<10) & ~(0x3<<12) & ~(0x3<<14);
rGPJCON |= (0x1<<10) |(0x1<<12) |(0x1<<14);
rGPJPU = rGPJPU & ~(0x7<<5) | (0x7<<5);
//-------------------------------------------------------------------------------
//PORT A GROUP
//Ports : GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
//Signal : I2S LRCLK I2S EXTCLK I2S DO I2S DI I2S CLK I2S CDCLK
//Binary : 10, 10, 10, 10, 10, 10
//-------------------------------------------------------------------------------
rGPACON = rGPACON & ~(0xfff) | 0xaaa;
rGPAPU = rGPAPU & ~(0x3f) | 0x3f;
}
void IIS_Port_Return(void)
{
rGPJCON = save_GPJ_CON;
rGPJPU = save_GPJ_UP;
rGPACON = save_GPA_CON;
rGPAPU = save_GPJ_UP;
}
unsigned short IIS_Select_SamplingRate(void)
{
int i;
printf("\nSelect ADC/DAC Rate\n");
printf("0:11.025kHz, 1:22.05kHz, 2:44.1kHz\n");
i = GetIntNum();
switch(i)
{
case 0:
return 11025;
break;
case 1:
return 22050;
break;
case 2:
return 44100;
break;
default:
return 44100;
break;
}
}
void Select_IIS_Master_CLK(void)
{
int sel;
unsigned short Sampling_Rate;
//printf("\nIIS Master Clock Source => MPLLin\n");
printf("\nSelect IIS Master Clock Source\n");
printf("0:PCLK, 1:IIS EXTCLK, 2:EPLL, 3:UPLL Ref. CLK\n");
sel = GetIntNum();
switch(sel)
{
case 0://In case of IIS Master Clock Source = PCLK
Select_PCLK();
break;
case 1://In case of IIS Master Clock Source = EXTCLK
Select_EXTCLK();
break;
case 2://In case of IIS Master Clock Source = EPLL
Select_EPLL();
break;
case 3://In case of IIS Master Clock Source = UPLL Ref. CLK
Select_UPLL_Ref_CLK();
break;
default :
Select_EPLL();
break;
}
}
void Select_PCLK(void)
{
rCLKSRCCON |= (1<<6);
rCLKSRCCON |= (1<<11);
rCLKDIVCON &= ~(0xf<<24); //12/1=12 MHz
rCLKSRCCON |= (1<<15); //IIS Clock Source Selection: External Codec Clock
//IIS Pre-scaler Setting
rIISPSR &= ~(1<<10);
rIISPSR |= (5<<5) |5;
//In case PCLK = 50 MHz, IIS Codec CLK = 50/(5+1) = 8.34MHz
printf("\nIIS Master CLK(PCLK) = %4.2f MHz", (float)PCLK/1000000);
IIS_Codec_CLK = (float)PCLK/6;
printf("\nIIS Codec CLK = %4.2f MHz", IIS_Codec_CLK/1000000);
IIS_MasterClk_Sel = 0;
}
void Select_EXTCLK(void)
{
unsigned short Sampling_Rate;
printf("\nIf real I2S_EXTCLK is being supplied, press 'y',otherwise, press 'n' key\n");
if(getchar() =='y')
{
Sampling_Rate = IIS_Select_SamplingRate();
rCLKSRCCON &= ~(1<<15); //IIS Clock Source Selection: External Codec Clock
if(Sampling_Rate==44100)
{
rIISPSR = (1<<10)|(0<<5)|0; //IIS Codec CLK=16.9344MHz
IIS_Codec_CLK = (float)16934400;
}
else if(Sampling_Rate==22050)
{
rIISPSR = (1<<10)|(1<<5)|1; //IIS Codec CLK=8.4672 MHz
IIS_Codec_CLK = (float)16934400/2;
}
else if(Sampling_Rate==11025)
{
rIISPSR = (1<<10)|(3<<5)|3; //IIS Codec CLK=4.2336 MHz
IIS_Codec_CLK = (float)16934400/4;
}
printf("\nIIS Master CLK(EXTCLK: GPA4) = %4.4f MHz", (float)16934400/1000000);
printf("\nIIS Codec CLK = %4.4f MHz", IIS_Codec_CLK/1000000);
}
else //* test using PCLK via CLKOUT
{
SetCLKOUT(4); //* khs.050512 : select PCLK for CLKOUT
rCLKSRCCON &= ~(1<<15); //IIS Clock Source Selection: External Codec Clock
rIISPSR = (1<<10) | (2<<5) | (2); //IIS Codec CLK=PCLK/3
IIS_Codec_CLK = (float) PCLK/3;
printf("\nBe sure that IISEXTCLK pin is connected with CLKOUT pin\n");
printf("\nAnd then, press 'Enter'\n");
while(!Uart_GetKey()); //wait until key is input
printf("\nIIS Master CLK(PCLK) = %4.4f MHz", (float)PCLK/1000000);
printf("\nIIS Codec CLK = %4.4f MHz", IIS_Codec_CLK/1000000);
printf("\nSampling Rate = %2.2f KHz", IIS_Codec_CLK/384/1000);
}
IIS_MasterClk_Sel == 1;
}
void Select_EPLL(void)
{
SetEPLL( 72, 3, 1); //EPLL =96MHz
Delay(100);
rIISPSR = (1<<10)|(1<<5)|1; //Source Clock is External Codec Clock or EPLL Clock, 48/2 =24MHz
rCLKSRCCON |= (1<<6);
rCLKSRCCON &= ~(1<<11);
rCLKDIVCON |= (1<<24); //96/2=48 MHz
rCLKSRCCON |= (1<<15); //IIS Clock Source Selection
{
char sel;
printf("\nSelect whether s/w work-around is adopted or not(y/n)\n");
sel=getchar();
if(sel=='y')
{
rGPACON &= ~(3<<8);
Delay(10);
rGPACON |= (1<<9);
printf("\ns/w work-around is adopted..\n");
}
else
printf("\ns/w work-around is not adopted..\n");
}
printf("\nIIS Master CLK(EPLL) = %4.2f MHz", (float)96000000/1000000);
IIS_Codec_CLK = (float)96000000/4;
printf("\nIIS Codec CLK = %4.2f MHz", IIS_Codec_CLK/1000000);
IIS_MasterClk_Sel = 2;
}
void Select_UPLL_Ref_CLK(void)
{
rIISPSR = (1<<10)|(0<<5)|0; //Source Clock is External Codec Clock or EPLL Clock
rCLKSRCCON &= ~(1<<6);
rCLKSRCCON &= ~(1<<11);
rCLKDIVCON &= ~(0xf<<24); //12/1=12 MHz
rCLKSRCCON |= (1<<15); //IIS Clock Source Selection
rGPACON &= ~(3<<8);
Delay(10);
rGPACON |= (1<<9);
printf("\nIIS Master CLK(UPLL Ref. CLK) = %4.2f MHz", (float)12000000/1000000);
IIS_Codec_CLK = (float)12000000;
printf("\nIIS Codec CLK = %4.2f MHz", IIS_Codec_CLK/1000000);
IIS_MasterClk_Sel == 3;
}
//Initialization of UDA1341 Audio Codec using L3 Interface
void Init1341(int mode)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -