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

📄 iis.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*=============================================================

	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 + -