?? 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 "System.h"
#include "2413addr.h"
#include "console.h"
#include "iis.h"
#include "PLL.h"
#define IIS_BUFFER 0x31000000
#define REC_LEN_IIS 0xfffff*4 //Max value of DMA Transfer Counter (20bit) = 0xfffff, Date Size=Word (4bytes)
#define PLAY_IIS 0
#define RECORD_MICIn 1
#define RECORD_LineIn 2
#define RECORD_PLAY_Simul 3
#define L3C (1<<4) //GPB4 = L3CLOCK
#define L3D (1<<3) //GPB3 = L3DATA
#define L3M (1<<2) //GPB2 = L3MODE
char mute = 1;
char which_Buf = 1;
volatile char Rec_Done = 0;
char IIS_MasterClk_Sel = 0;
unsigned char *Buf,*_temp;
unsigned char *rec_buf = (unsigned char *)0x31000028;
unsigned char *rec_buf1 = (unsigned char *)(0x31000000 + REC_LEN_IIS);
unsigned int size, fs;
unsigned int save_GPE_CON, save_GPB_CON;
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 Play_Iis(void);
void Select_PCLK(void);
//void Select_EXTCLK(void);
//void Select_EPLL(void);
//void Select_UPLL_Ref_CLK(void);
//void down_wav(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 Rx_IIS_Int(void);
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 *)Play_Iis, "Play Wave. ",
// (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(); //gh0522.cha
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]) )();
}
}
void down_wav(void)
{
//Non-cacheable area = 0x11000000 ~ 0x13cf0000
Buf = (unsigned char *)IIS_BUFFER;
_temp = Buf;
printf("Download the PCM(no ADPCM) file by DNW serial port(With header)!!\n");
printf("Download address is %xh\n", Buf);
while(((unsigned int)_temp - (unsigned int)Buf) < 4)
{
//Uart_Printf("\ndata=%d",size);
Led_Display(0);
Delay(1500);
Led_Display(15);
Delay(1500);
}
printf("\ndata=%x",size);
//Uart_Getch();
size = *(Buf) | *(Buf + 1)<<8 | *(Buf + 2)<<16 | *(Buf + 3)<<24;
printf("\ndata=%x",size);
//Uart_Getch();
printf("\nNow, Downloading... [ File Size : %8d( 0)]",size);
while(((unsigned int)_temp - (unsigned int)Buf) < (size)){
printf("\b\b\b\b\b\b\b\b\b%8d)",(unsigned int)_temp - (unsigned int)Buf);
Delay(5000);
}
printf("\b\b\b\b\b\b\b\b\b%8d)]\n",(unsigned int)_temp - (unsigned int)Buf);
rINTSUBMSK |= BIT_SUB_RXD1;
rINTMSK |= BIT_UART1;
size = *(Buf + 0x2c) | *(Buf + 0x2d)<<8 | *(Buf + 0x2e)<<16 | *(Buf + 0x2f)<<24;
size = (size>>1)<<1; //for 44B0X
fs = *(Buf + 0x1c) | *(Buf + 0x1d)<<8 | *(Buf + 0x1e)<<16 | *(Buf + 0x1f)<<24;
printf("Sample Size = %d\n",size/2);
printf("Sampling Frequency = %d Hz\n",fs);
printf("\n[ Now play the wave file .....]\n");
printf("If you want to mute or no mute push the 'EIN0' key repeatedly\n");
}
void Play_Iis(void)
{
//pISR_UART1 = (unsigned)Rx_IIS_Int;
//pISR_DMA1 = (unsigned)DMA1_IISSDO_Done;
printf("\n just only Play it.puhahahahah\n");
// down_wav();
IIS_Port_Init();
Select_PCLK();
//Select_IIS_Master_CLK();
//IIS_Select_SamplingRate();
//Init1341(RECORD_LineIn);
//IIS_RecSound_DMA1(RECORD_LineIn, REC_LEN_IIS);
Init1341(PLAY_IIS);
IIS_PlayWave_DMA2(rec_buf, 464000);
IIS_Port_Return();
mute = 1;
}
//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_GPE_CON = rGPECON;
save_GPB_CON = rGPBCON;
//----------------------------------------------------------
//PORT B GROUP
//Ports : GPB2 GPB4 GPB3
//Signal : L3MODE L3CLOCK L3DATA
//Setting: OUTPUT OUTPUT OUTPUT
// [11:10] [13:12] [15:14]
//Binary : 01 01 01
//----------------------------------------------------------
rGPBCON = rGPBCON & ~(0x3<<4) & ~(0x3<<6) & ~(0x3<<8);
rGPBCON |= (0x1<<4) |(0x1<<6) |(0x1<<8);
//-------------------------------------------------------------------------------
//PORT E GROUP
//Ports : GPE4 GPE3 GPE2 GPE1 GPE0
//Signal : I2S DO I2S DI CDCLK I2S CLK I2S LRCLK
//Binary : 10, 10, 10, 10, 10, 10
//-------------------------------------------------------------------------------
rGPECON = rGPECON & ~(0x3ff) | 0x2aa;
}
void IIS_Port_Return(void)
{
rGPBCON = save_GPB_CON;
rGPECON = save_GPE_CON;
}
void Select_PCLK(void)
{
rCLKSRC |= (1<<6);
rCLKSRC |= (1<<11);
rCLKDIVN &= ~(0xf<<24); //12/1=12 MHz
rCLKSRC |= (1<<15); //IIS Clock Source Selection: External Codec Clock
//IIS Pre-scaler Setting
rIISPSR &= 0;
rIISPSR |= (1<<15) |(0<<8);
//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/7;
printf("\nIIS Codec CLK = %4.2f MHz", IIS_Codec_CLK/1000000);
IIS_MasterClk_Sel = 0;
}
//Initialization of UDA1341 Audio Codec using L3 Interface
void Init1341(int mode)
{
//----------------------------------------------------------
//PORT B GROUP
//Ports : GPB3 GPB4 GPB2
//Signal : L3DATA L3CLOCK L3MODE
//Setting: OUTPUT OUTPUT OUTPUT
// [7:6] [9:8] [5:4]
//Binary : 01 01 01
//----------------------------------------------------------
rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C); //Start condition : L3M=H, L3C=H
rGPBCON = rGPBCON & ~(0x3<<4) & ~(0x3<<6) & ~(0x3<<8);
rGPBCON |= (0x1<<4) |(0x1<<6) |(0x1<<8);
//L3 Interface
_WrL3Addr(0x14 + 2); //STATUS (000101xx+10)
_WrL3Data(0x50,0); //0,1,01, 000,0 : Status 0,Reset, 384fs,IIS-bus,no DC-filtering
_WrL3Addr(0x14 + 2); //STATUS (000101xx+10)
_WrL3Data(0x81,0); //bit[7:0] => 1,0,0,0, 0,0,01
//Record Sound via MIC-In
if(mode == 1)
{
_WrL3Addr(0x14 + 2); //STATUS (000101xx+10)
_WrL3Data(0xa2,0); //bit[7:0] => 1,0,1,0,0,0,10
_WrL3Addr(0x14 + 0); //DATA0 (000101xx+00)
_WrL3Data(0xc2, 0); //1100 0,010 : Extended addr(3bits), 010
_WrL3Data(0xf2, 0); //111,100,10 : DATA0, MIC Amplifier Gain 21dB, input channel 2 select (input channel 1 off)
}
}
void IIS_RecSound_DMA1(int mode, unsigned int rec_size)
{
pISR_DMA1 = (unsigned)DMA1_Rec_Done;
ClearPending(BIT_DMA1);
//rSUBSRCPND=(BIT_DMA1);
rIISCON = (0<<5)+(1<<4) + (1<<3) + (1<<1);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -