📄 iis.c
字号:
/*=================================================
File Name: Iis.c
Description: S3C2440A IIS controller Function Test
Version: 0.1
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 is supported.
===================================================*/
#include "2440addr.h"
#include "2440lib.h"
#include "def.h"
#include "iis.h"
//#define REC_LEN_IIS 0x200000
//YOYO
#define REC_LEN_IIS 0x20000
#define PLAY_IIS 0
#define RECORD_IIS 1
//#define DataCount 0x10000 //IIS Master/Slave Data Rx/Tx Count
//#define DataDisplay 0x100 //IIS Master Data Display Count
//#define PollMode 0 //Polling Mode
//#define DMA2Mode 1 //DMA2 Mode
#define L3C (1<<4) //GPB4 = L3CLOCK
#define L3D (1<<3) //GPB3 = L3DATA
#define L3M (1<<2) //GPB2 = L3MODE
//******************************************YOYO FM******
#define bool unsigned char
#define Enable (1)
#define Disable (0)
#define FM_CE (1<<6) //GPB6=FM_CE
#define FM_SCK (1<<7) //SPICLK1,GPG7
#define FM_SDA (1<<6) //SPIMOSI1,GPG6
#define FM_MUTE (1<<0) //GPB0=FM_MUTE
#define DATA_MASK 0x8000
#define MASK_1bit 0x0001;
/********************************************************
#define SET_SCK_SDA_SCE_OUTPUT rPCOND = 0x15
#define SET_SCK_SDA_SCE_LOW rPDATD = 0x00
#define SET_SDA_HIGH rPDATD |= 0x01
#define SET_SCK_HIGH rPDATD |= 0x02
#define SET_SCE_HIGH rPDATD |= 0x04
#define SET_SDA_LOW rPDATD &= (~0x01)
#define SET_SCK_LOW rPDATD &= (~0x02)
#define SET_SCE_LOW rPDATD &= (~0x04)
#define SET_SDA_OUTPUT rPCOND |= 0x01
#define SET_SCK_OUTPUT rPCOND |= 0x04
#define SET_SCE_OUTPUT rPCOND |= 0x10
#define DATA_MASK 0x8000
#define MASK_1bit 0x0001;
//********************************************************/
char which_Buf = 1;
char Rec_Done = 0;
char mute = 1;
char IIS_MasterClk_Sel = 0;
unsigned char *rec_buf;
unsigned char *Buf,*_temp;
unsigned int size, fs;
unsigned int save_B, save_E, save_PB, save_PE;
unsigned int channel;
U32 Data_Transfer_Rate;
int Data_Block_Size;
int Data_Unit_size;
extern U32 Pclk;
float IIS_Codec_CLK;
//extern void Calc_Clock(int print_msg);
//extern U32 Mdiv, Pdiv, Sdiv, Fclk, Hclk, Pclk, Hdivn, Pdivn, Hclk_Ratio, Pclk_Ratio, Ref_Cnt;
void ChangeDMA2(void);
void IIS_Port_Init(void);
void IIS_Port_Return(void);
void Download_Wave_File(void);
void Select_IIS_Master_CLK(void);
void IIS_RecSound_DMA1(unsigned char *start_addr, U32 rec_size);
void IIS_PlayWave_DMA2(unsigned char *start_addr, U32 play_size);
void _WrL3Addr(U8 data);
void _WrL3Data(U8 data,int halt);
void RrL3Data(void);
void Set_MUTE(bool Mute);
void __irq DMA1_Rec_Done(void);
void __irq DMA2_Done(void);
void __irq RxInt_YOYO(void);
void __irq Muting(void);
void * func_iis_test[][2]=
{
//IIS Function Test Item
(void *)Play_Wave_Iis, "Play Wave File. ",
(void *)Record_Sound_Iis, "Record Sound via MIC and Play it. ",
(void *)Speak_Power, "Speak Amplifer Enable",
0,0
};
void Init_FM(void)
{
rGPBCON &=~((3<<12)|(3<<0));
rGPBCON |=((1<<12)|(1<<0)); //Set GPB0,GPB6 output
rGPBUP |=(FM_CE|FM_MUTE);
rGPGCON &=~((3<<14)|(3<<12));
rGPGCON |=((1<<12)|(1<<14)); //Set GPG6,GPB7 output
rGPGUP |=(FM_SCK|FM_SDA);
rGPBDAT &=~(FM_CE); //SET FM_CE=0
}
void FM_Send_Data(int data)
{
int i,j;
Init_FM();
Set_MUTE(0);
rGPBDAT |=(FM_CE); //SET CE HIGH
rGPGDAT &=~(FM_SCK); //SET SCK LOW
for(j=0;j<8;j++);
for(i=0;i<16;i++)
{
if (((data << i) & DATA_MASK))
{
rGPGDAT |=(FM_SDA);
}
else
{
rGPGDAT &=~(FM_SDA); //SET_SDA_LOW;
}
for(j=0;j<8;j++); //SDA setup time
rGPGDAT |=(FM_SCK); //SET_SCK_HIGH;
for(j=0;j<8;j++);
rGPGDAT &=~(FM_SCK); //SET_SDA_LOW;
for(j=0;j<8;j++);
}
rGPBDAT &=~(FM_CE); // SPI_Stop();
for(j=0;j<8;j++);
}
/*
==============================================================================
Name : Transmit()
FD : Start transmitting of BH1418.
Details :Intialize transmitting
Input parameter: frequency: the transmitted frequency
Return value : Void
==============================================================================
*/
void Transmit(unsigned long frequency,unsigned char MONO)
{
unsigned int data=0;
unsigned int channel=0;
int i=0;
channel=frequency/100;
/// Set Program counter ///////
for(i=0;i<11;i++)
{
data|= (channel>>i) & MASK_1bit;
data=(data<<1);
}
/// Set Multiplexer MONO ////
data|= MONO&MASK_1bit;
/// Set phase detecor /////
data=(data<<2);
data&=(~0x03);
/// Set Test Mode /////
data=(data<<2);
data&=(~0x3);
Uart_Printf("\nchannel=%4.2f MHZ,0x%x,0x%x\n",(float)frequency/(float)1000,channel,data);
//while(1)
FM_Send_Data(data);
}
void Set_MUTE(bool Mute)
{
if(Mute)
{
rGPBDAT &=~(FM_MUTE);
}
else
{
rGPBDAT |=(FM_MUTE);
}
}
void FM_Transmitter(void)
{
char ch;
Uart_Printf("\nFM Transmitter Test.........2006/10/31 YOYO\n");
/******** For operating clock test *********/
Uart_Printf("Please Select FM Trasmitter Frequency 1. 99.7MHZ,MONO 2. 102.3MHZ 3.exit FM \nChoose : ");
ch = Uart_Getch();
switch (ch)
{
case '1' :
Transmit(99700,0);
Set_MUTE(Disable);
Uart_Printf("\nFM Tramsmitter is ON now!\n");
break;
case '3':
Set_MUTE(Enable);
break;
default:
break;
}
}
void IIS_Test(void)
{
int i;
while(1)
{
i=0;
Uart_Printf("\n\n================== IIS Function Test ==================\n\n");
while(1)
{ //display menu
Uart_Printf("%2d:%s",i,func_iis_test[i][1]);
i++;
if((int)(func_iis_test[i][0])==0)
{
Uart_Printf("\n");
break;
}
if((i%4)==0)
Uart_Printf("\n");
}
Uart_Printf("\n=======================================================\n");
Uart_Printf("\nPress Enter key to exit : ");
i = Uart_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]) )();
}
//Uart_Printf("\n====== IIS Test program end ======\n");
}
//Play Wave File
void Speak_Power(void)
{
int sel;
save_B = rGPBCON;
save_PB = rGPBUP;
//Uart_Printf("\nIIS Master Clock Source => MPLLin\n");
Uart_Printf("\nSelect Speaker Amplifer Enable or Disable\n");
Uart_Printf("0:Disable, 1:Enable\n");
sel = Uart_GetIntNum();
switch(sel)
{
case 0:
Speak_PowerUp(0);
break;
case 1:
Speak_PowerUp(1);
break;
default:
break;
}
Uart_Printf("Press any key to exit!!!\n");
Uart_Getch();
rGPBCON=save_B;
rGPBUP=save_PB;
}
void Play_Wave_Iis(void)
{
Uart_Printf("\nPlay Wave File.\n");
IIS_Port_Init();
Download_Wave_File();
Select_IIS_Master_CLK();
Speak_PowerUp(1);//YOYO
Init1341(PLAY_IIS);
IIS_PlayWave_DMA2(Buf + 0x30, size);
Speak_PowerUp(0);//YOYO
IIS_Port_Return();
mute = 1;
}
//Record Sound using MIC
void Record_Sound_Iis(void)
{
Uart_Printf("\nRecord Sound via MIC.\n");
IIS_Port_Init();
Select_IIS_Master_CLK();
Init1341(RECORD_IIS);
rec_buf = (unsigned char *)0x31000000;
IIS_RecSound_DMA1(rec_buf, REC_LEN_IIS);
////////////////////////////////////////////////////////////////////////
Init1341(PLAY_IIS);
IIS_PlayWave_DMA2(rec_buf, REC_LEN_IIS);
IIS_Port_Return();
mute = 1;
}
/* Sub-Routines */
//Setting Port related to IIS
void IIS_Port_Init(void)
{
save_B = rGPBCON;
save_E = rGPECON;
save_PB = rGPBUP;
save_PE = rGPEUP;
//----------------------------------------------------------
// PORT B GROUP
//Ports : GPB4 GPB3 GPB2
//Signal : L3CLOCK L3DATA L3MODE
//Setting: OUTPUT OUTPUT OUTPUT
// [9:8] [7:6} [5:4]
//Binary : 01 , 01 01
//----------------------------------------------------------
rGPBUP = rGPBUP & ~(0x7<<2) | (0x7<<2); //The pull up function is disabled GPB[4:2] 1 1100
rGPBCON = rGPBCON & ~(0x3f<<4) | (0x15<<4); //GPB[4:2]=Output(L3CLOCK):Output(L3DATA):Output(L3MODE)
//----------------------------------------------------------
// PORT E GROUP
//Ports : GPE4 GPE3 GPE2 GPE1 GPE0
//Signal : I2SSDO I2SSDI CDCLK I2SSCLK I2SLRCK
//Binary : 10 , 10 10 , 10 10
//----------------------------------------------------------
rGPEUP = rGPEUP & ~(0x1f) | 0x1f; //The pull up function is disabled GPE[4:0] 1 1111
rGPECON = rGPECON & ~(0x3ff) | 0x2aa; //GPE[4:0]=I2SSDO:I2SSDI:CDCLK:I2SSCLK:I2SLRCK
rGPFUP = ((rGPFUP & ~(1<<0)) | (1<<0)); //GPF0
rGPFCON = ((rGPFCON & ~(3<<0)) | (1<<1)); //GPF0=EINT0
rEXTINT0 = ((rEXTINT0 & ~(7<<0)) | (2<<0)); //EINT0=falling edge triggered
}
void IIS_Port_Return(void)
{
rGPBCON = save_B;
rGPECON = save_E;
rGPBUP = save_PB;
rGPEUP = save_PE;
}
void Download_Wave_File(void)
{
unsigned int temp,i;
pISR_UART1 = (unsigned)RxInt_YOYO;
rINTMSK = ~(BIT_UART1);
rINTSUBMSK = ~(BIT_SUB_RXD1);
//Non-cacheable area = 0x31000000 ~ 0x33feffff
Buf = (unsigned char *)0x31000000;
_temp = Buf;
Uart_Printf("\n\nDownload the PCM(no ADPCM) file by DNW serial port(With header)!!\n");
Uart_Printf("Download Start Address: 0x%x\n", Buf);
while(((unsigned int)_temp - (unsigned int)Buf) < 0x30)
{
Led_Display(0);
Delay(1500);
Led_Display(15);
Delay(1500);
}
//fIND FILE HEADER MARK YOYO
for (i=0;i<10;i++)
{
if(*Buf =='R' && *(Buf+1)=='I' && *(Buf+2) =='F' && *(Buf+3) == 'F') break;
Buf++;
}
Uart_Printf("Bytes: 0x%x 0x%x 0x%x 0x%x\n",*(Buf+7),*(Buf+6),*(Buf+5),*(Buf+4));
size = *(Buf+4) | *(Buf + 5)<<8 | *(Buf + 6)<<16 | *(Buf + 7)<<24;
// Buf=Buf+4;
Uart_Printf("Total file size:0x%x",size);
Uart_Printf("\nNow, Downloading... [ File Size : %7d 0]", size);
temp =size;
fs=0;
while(((unsigned int)_temp - (unsigned int)Buf) < size)
{
Uart_Printf("\b\b\b\b\b\b\b\b%7d ",(unsigned int)_temp - (unsigned int)Buf);
Delay(5000);
fs++;
if(fs>0x60000)
{
fs=0;
break;
}
}
Uart_Printf("\b\b\b\b\b\b\b\b%7d ]\n",(unsigned int)_temp - (unsigned int)Buf);
Delay(5000);
rINTSUBMSK |= BIT_SUB_RXD1;
rINTMSK |= BIT_UART1;
size = *(Buf + 0x28) | *(Buf + 0x29)<<8 | *(Buf + 0x2a)<<16 | *(Buf + 0x2b)<<24;
size = (size>>1)<<1;
//size = temp -0x30;
fs = *(Buf + 0x18) | *(Buf + 0x19)<<8;
channel=*(Buf+0x16);
Data_Transfer_Rate=*(Buf + 0x1c) | *(Buf + 0x1d)<<8 | *(Buf + 0x1e)<<16 | *(Buf + 0x1f)<<24;
Data_Block_Size=*(Buf + 0x20) | *(Buf + 0x21)<<8;
if(channel)
{
Data_Unit_size= Data_Block_Size*8/channel;
}
Uart_Printf("PCM File Data Size = %d\n", size);
Uart_Printf("Sampling Frequency of PCM data = %d Hz\n", fs);
Uart_Printf("Channel = %d\n",channel);
Uart_Printf("Data Transfer Baud Rate = %d\n", Data_Transfer_Rate);
Uart_Printf("Data Unit Length = %d bits\n",Data_Unit_size);
Uart_Printf("Data Bit Rate = %d bit/s",Data_Transfer_Rate/(channel*(Data_Unit_size/8)));
}
void IIS_RecSound_DMA1(unsigned char *start_addr, U32 rec_size)
{
pISR_DMA1 = (unsigned)DMA1_Rec_Done;
if (IIS_MasterClk_Sel == 0) //IIS Master Clock Source = PCLK
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -