?? iis.h
字號:
#include "string.h"
#include "vxworks.h"
#include "s3c2410.h"
#include "2410lib.h"
#include "def.h"
#include "2410iis.h"
#include "s3c2410sio.h"
void ChangeDMA2(void);
void IIS_PortSetting(void);
void Test_Iis(void);
void Record_Iis(void);
void _WrL3Addr(U8 data);
void _WrL3Data(U8 data,int halt);
void DMA2_Done(void);
void DMA2_Rec_Done(void);
void RxInt(void);
void Muting(void);
void TR_Done(void);
#define L3C (1<<4)
#define L3D (1<<3)
#define L3M (1<<2)
#define PLAY 0
#define RECORD 1
/*#define REC_LEN 0x50000 */
#define REC_LEN 0x100000
#define DataCount 0x10000
#define DataDisplay 0x100
/*#define DataDisplay 0x10000
//#define DataCount 0x100 */
#define PollMode 0
#define DMA2Mode 1
unsigned char *Buf,*_temp;
unsigned short *rec_buf;
volatile unsigned int size = 0;
volatile unsigned int fs = 0;
volatile char which_Buf = 1;
volatile char Rec_Done = 0;
volatile char mute = 1;
/**************** [ Record_Iis ] ***************************************/
void Record_Iis(void)
{
unsigned int save_B, save_E, save_PB, save_PE;
Uart_TxEmpty(0);
ChangeClockDivider(1,1);
ChangeMPllValue(0x96,0x5,0x1);
Uart_Init(33857142,115200);
Uart_Printf("[ Record test using UDA1341 ]\n");
save_B = rGPBCON;
save_E = rGPECON;
save_PB = rGPBUP;
save_PE = rGPEUP;
IIS_PortSetting();
rec_buf = (unsigned short *)0x31000000;
pISR_DMA2 = (unsigned)DMA2_Rec_Done;
pISR_EINT0 = (unsigned)Muting;
rINTMSK = ~(BIT_DMA2);
Init1341(RECORD);
rDISRCC2 = (1<<1) + (1<<0);
rDISRC2 = ((U32)IISFIFO);
rDIDSTC2 = (0<<1) + (0<<0);
rDIDST2 = (int)rec_buf;
rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(1<<24)+(1<<23)+(1<<22)+(1<<20)+REC_LEN;
rDMASKTRIG2 = (0<<2) + (1<<1) + 0;
rIISMOD = (0<<8) + (1<<6) + (0<<5) + (0<<4) + (1<<3) + (0<<2) + (1<<0);
rIISPSR = (2<<5) + 2;
rIISCON = (0<<5) + (1<<4) + (1<<3) + (0<<2) + (1<<1);
rIISFCON = (1<<14) + (1<<12);
Uart_Printf("Press any key to start record!!!\n");
Uart_Getch();
Uart_Printf("Recording...\n");
rIISCON |= 0x1;
while(!Rec_Done);
rINTMSK = BIT_DMA2;
Rec_Done = 0;
Delay(10);
rIISCON = 0x0;
rDMASKTRIG2 = (1<<2);
rIISFCON = 0x0;
Uart_Printf("End of Record!!!\n");
Uart_Printf("Press any key to play recorded data\n");
Uart_Printf("If you want to mute or no mute push the 'EIN0' key repeatedly\n");
Uart_Getch();
size = REC_LEN * 2;
Uart_Printf("Size = %d\n",size);
Init1341(PLAY);
pISR_DMA2 = (unsigned)DMA2_Done;
rINTMSK = ~(BIT_DMA2 | BIT_EINT0);
rDISRCC2 = (0<<1) + (0<<0);
rDISRC2 = (int)rec_buf;
rDIDSTC2 = (1<<1) + (1<<0);
rDIDST2 = ((U32)IISFIFO);
rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(0<<22)+(1<<20)+(size/2);
rDMASKTRIG2 = (0<<2)+(1<<1)+0;
rIISMOD = (0<<8) + (2<<6) + (0<<5) + (0<<4) + (1<<3) + (0<<2) + (1<<0);
/* rIISPSR = (4<<5) + 4; //Prescaler_A/B=4 for 11.2896MHz*/
rIISCON = (1<<5)+(0<<4)+(0<<3)+(1<<2)+(1<<1);
rIISFCON = (1<<15) + (1<<13);
Uart_Printf("Press any key to exit!!!\n");
rIISCON |= 0x1;
while(!Uart_GetKey());
Delay(10);
rIISCON = 0x0;
rDMASKTRIG2 = (1<<2);
rIISFCON = 0x0;
size = 0;
rGPBCON = save_B;
rGPECON = save_E;
rGPBUP = save_PB;
rGPEUP = save_PE;
rINTMSK = (BIT_DMA2 | BIT_EINT0);
ChangeMPllValue(0xa1,0x3,0x1);
Uart_Init(0,115200);
mute = 1;
}
/******************[ Init1341 ]**************************************/
void Init1341(char mode)
{
/*Port Initialize
//----------------------------------------------------------
// 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
//---------------------------------------------------------- */
/* rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C);
rGPBUP = rGPBUP & ~(0x7<<2) |(0x7<<2);
rGPBCON = rGPBCON & ~(0x3f<<4) |(0x15<<4);
_WrL3Addr(0x14 + 2);
_WrL3Data(0x60,0);
_WrL3Addr(0x14 + 2);
_WrL3Data(0x20,0);
_WrL3Addr(0x14 + 2);
_WrL3Data(0x81,0); */
rGPBCON = rGPBCON & ~((1<<9)|(1<<7)|(1<<5)) | (1<<8)|(1<<6)|(1<<4);
rGPBUP = rGPBUP |(0x7<<2);
rGPBDAT |= (L3M);
rGPBDAT |= (L3C);
_WrL3Addr(0x14+2);
_WrL3Data(0x50,0);
_WrL3Addr(0x14+2);
_WrL3Data(0x10,0);
_WrL3Addr(0x14+2);
_WrL3Data(0x81,0);
/* _WrL3Addr(0x14+0);
_WrL3Data(0x0A,0); */
if(mode)
{
_WrL3Addr(0x14 + 2);
/* _WrL3Data(0xa2,0); //1,0,1,0, 0,0,10
//Status 1,Gain of DAC 0 dB,Gain of ADC 6dB,ADC non-inverting,DAC non-inverting
//,Single speed playback,ADC-On DAC-Off */
_WrL3Data(0xe3,0); /*1,1,1,0, 0,0,11
//Status 1,Gain of DAC 6 dB,Gain of ADC 6dB,ADC non-inverting,DAC non-inverting
//,Single speed playback,ADC-On DAC-On
// _WrL3Addr(0x14 + 0); //DATA0 (000101xx+00)
// _WrL3Data(0x3f,0); //00,11 1111 : Volume control (6 bits)
// _WrL3Data(0x00,0); //00,00 0000 : Volume control (6 bits) 0dB */
_WrL3Addr(0x14 + 0);
_WrL3Data(0x7b,0);
_WrL3Data(0xc4,0);
_WrL3Data(0x91,0);
_WrL3Data(0xc2,0);
/* _WrL3Data(0x4d,0); //010,0 11,01 : DATA0, MIC Amplifier Gain 9dB, input channel 1 select(input channel 2 off) */
_WrL3Data(0x59,0);
}
}
void ChangeDMA2(void)
{
if(which_Buf)
{
rDISRCC2 = (0<<1) + (0<<0);
rDISRC2 = (int)(Buf + 0x30);
}
else
{
rDISRCC2 = (0<<1) + (0<<0);
rDISRC2 = (int)(Buf + 0x30+(size/2));
}
}
void IIS_PortSetting(void)
{
rGPBUP = rGPBUP & ~(0x7<<2) | (0x7<<2);
rGPBCON = rGPBCON & ~(0x3f<<4) | (0x15<<4);
rGPEUP = rGPEUP & ~(0x1f) | 0x1f;
rGPECON = rGPECON & ~(0x3ff) | 0x2aa;
rGPFUP = ((rGPFUP & ~(1<<0)) | (1<<0));
rGPFCON = ((rGPFCON & ~(3<<0)) | (1<<1));
rEXTINT0 = ((rEXTINT0 & ~(7<<0)) | (2<<0));
}
void _WrL3Addr(U8 data)
{
S32 i,j;
rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | L3C;
for(j=0;j<4;j++);
for(i=0;i<8;i++)
{
if(data & 0x1)
{
rGPBDAT &= ~L3C;
rGPBDAT |= L3D;
for(j=0;j<4;j++);
rGPBDAT |= L3C;
rGPBDAT |= L3D;
for(j=0;j<4;j++);
}
else
{
rGPBDAT &= ~L3C;
rGPBDAT &= ~L3D;
for(j=0;j<4;j++);
rGPBDAT |= L3C;
rGPBDAT &= ~L3D;
for(j=0;j<4;j++);
}
data >>= 1;
}
rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);
}
void _WrL3Data(U8 data,int halt)
{
S32 i,j;
if(halt)
{
rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | L3C;
for(j=0;j<4;j++);
}
rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);
for(j=0;j<4;j++);
for(i=0;i<8;i++)
{
if(data & 0x1)
{
rGPBDAT &= ~L3C;
rGPBDAT |= L3D;
for(j=0;j<4;j++);
rGPBDAT |= (L3C | L3D);
for(j=0;j<4;j++);
}
else
{
rGPBDAT &= ~L3C;
rGPBDAT &= ~L3D;
for(j=0;j<4;j++);
rGPBDAT |= L3C;
rGPBDAT &= ~L3D;
for(j=0;j<4;j++);
}
data >>= 1;
}
rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);
}
void DMA2_Done(void)
{
ClearPending(BIT_DMA2);
WrUTXH0('@');
if(!which_Buf)
which_Buf = 1;
else
which_Buf = 0;
}
void DMA2_Rec_Done(void)
{
ClearPending(BIT_DMA2);
Rec_Done = 1;
}
void RxInt(void)
{
rSUBSRCPND = BIT_SUB_RXD0;
rSUBSRCPND;
ClearPending(BIT_UART0);
*_temp ++= RdURXH0();
}
void Muting(void)
{
ClearPending(BIT_EINT0);
if(mute)
{
_WrL3Addr(0x14 + 0);
_WrL3Data(0xa4,0);
mute = 0;
Uart_Printf("= Mute =\n");
}
else
{
_WrL3Addr(0x14 + 0);
_WrL3Data(0xa0,0);
mute = 1;
Uart_Printf("= No Mute =\n");
}
}
volatile int Tx_Done;
volatile int Rx_Done;
void TR_Done(void)
{
ClearPending(BIT_DMA2);
Rx_Done = 1;
Tx_Done = 1;
/* WrUTXH0('.');*/
}
void Iis_Tx(void)
{
unsigned int i, j;
unsigned short *txdata;
Tx_Done = 0;
Uart_TxEmpty(0);
Uart_Printf("[ IIS Slave Tx test ]\n");
IIS_PortSetting();
txdata = (unsigned short *)0x31000000;
for(i=0;i<DataCount;i++)
*(txdata+i) = i;
rIISMOD = (1<<8) + (2<<6) + (0<<5) + (1<<4) + (1<<3) + (0<<2) + (1<<0);
rIISPSR = (2<<5) + 2;
rIISFCON = (0<<15) + (1<<13);
rIISCON = (0<<5) + (0<<4) + (0<<3) + (1<<2) + (1<<1) + (0<<0);
rIISCON |=0x1;
for(i=0;i<DataCount;i++)
{
while( (rIISCON & 0x080) == 0x80 );
*IISFIFO = *(txdata+i);
}
Delay(10);
rIISCON = 0x0;
rDMASKTRIG2 = (1<<2);
rIISFCON = 0x0;
Uart_Printf("\nTx End...\n");
Uart_Printf("Last 256 Half-Word in 65KBytes transferred data\n");
for(i=0;i<DataDisplay;i++)
{
Uart_Printf("0x%x=",(txdata+0xff00+i));
Uart_Printf("%04x ",*(txdata+0xff00+i));
}
}
void Iis_Rx(void)
{
unsigned int i, j, k, count;
unsigned short *rxdata;
Rx_Done = 0;
Uart_TxEmpty(0);
#if PollMode
Uart_Printf("[ IIS Master Rx Polling mode test ]\n");
#endif
#if DMA2Mode
Uart_Printf("[ IIS Master Rx DMA2 mode test ]\n");
#endif
IIS_PortSetting();
pISR_DMA2= (unsigned)TR_Done;
rINTMSK = ~(BIT_DMA2);
rxdata=(unsigned short *)0x31000000;
for(i=0;i<DataCount;i++)
*(rxdata+i)=0x0;
#if DMA2Mode
rDISRCC2 = (1<<1) + (1<<0);
rDISRC2 = ((U32)IISFIFO);
rDIDSTC2 = (0<<1) + (0<<0);
rDIDST2 = (int)rxdata;
rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(1<<24)+(1<<23)+(1<<22)+(1<<20)+(DataCount);
rDMASKTRIG2 = (0<<2)+(1<<1)+0;
rIISMOD = (0<<8) + (1<<6) + (0<<5) + (1<<4) + (1<<3) + (0<<2) + (1<<0);
rIISPSR = (2<<5) + 2;
rIISFCON = (1<<14) + (1<<12);
rIISCON = (0<<5) + (1<<4) + (1<<3) + (0<<2) + (1<<1) + (0<<0);
#endif
#if PollMode
rIISMOD = (0<<8) + (1<<6) + (0<<5) + (1<<4) + (1<<3) + (0<<2) + (1<<0);
rIISPSR = (2<<5) + 2;
rIISFCON = (0<<14) + (1<<12);
rIISCON = (0<<5) + (0<<4) + (1<<3) + (0<<2) + (1<<1) + (0<<0);
#endif
rIISCON |= 0x1;
#if PollMode
count = DataCount;
while(0<count)
{
j = rIISFCON & 0x1f;
if(j == 0)
{
while(!j)
j = rIISFCON & 0x1f;
}
for(i=0;i<j;i++)
{
count--;
*rxdata++ = *IISFIFO;
}
}
#endif
#if DMA2Mode
while(!Rx_Done);
#endif
Delay(10);
rIISCON = 0x0;
rDMASKTRIG2 = (1<<2);
rIISFCON = 0x0;
Uart_Printf("Last 256 Half-Word in 65KBytes received data\n");
rxdata=(unsigned short *)0x31000000;
for(i=0;i<DataDisplay;i++)
{
Uart_Printf("0x%x=", (rxdata+0xff00+i));
Uart_Printf("%04x ",*(rxdata+0xff00+i));
}
rINTMSK = (BIT_DMA2);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -