📄 iis_test.c
字号:
/*======================================================================
Project Name : S3C2450
Copyright 2007 by Samsung Electronics, Inc.
All rights reserved.
Project Description :
This software is only for verifying functions of the S3C2450.
Anybody can use this code without our permission.
File Name : iis_test.c
Description : S3C2450 IIS module test code
Author : Dongjin Kim
Dept : AP
Created Date : 2007.10.18
Version : 0.0
History
R0.0 (2007.10.18): draft
- S3C2450 IIS test code is derived from S3C2443 IIS test code.
- S3C2443 IIS test code is derived from S3C2413A IIS test code.
=======================================================================*/
#include "System.h"
#include "iis.h"
#include "audiolibrary.h"
#define CLK_PCLK_XTAL_12 0//I2S_CODEC_CLK
#define CLK_PCLK_EXTCLK_169344 1//nor update is needed
#define CLK_PCLK_EXTCLK_12 2
/*
CLK_EPLL_DIV_XTAL = 0x2;
CLK_EPLL_DIV_EXTCLK = 0x3;
CLK_EPLL_REF10_XTAL = 0x4;
CLK_EPLL_REF10_EXTCLK = 0x5;
CLK_EPLL_REF11_XTAL =0x6;
CLK_EPLL_REF11_EXTCLK =0x7;
CLK_EXT_CODEC_CLK = 0x8;
*/
#define PCLK_12__8_455 8455//I2S_CODEC_CLK_SPEED
#define PCLK_12__16_910 16910
#define PCLK_16_9344__16_9344 16934
/////////////////////////////////////////////////////
// Global variable
/////////////////////////////////////////////////////
extern IIS_State g_oI2SState;
int g_I2S_Port = I2S_PORT0;//default
int g_I2S_MasterSlave = I2S_MASTER;//default
int g_I2S_DmaPolling = I2S_DMA;//default
int g_I2S_Totch = 2;//default
/////////////////////////////////////////////////////
// Externs SFR & IP & Codec Functions
/////////////////////////////////////////////////////
//console.c
extern unsigned int AUTO_DownloadData(int downaddr);
//audiolibrary.c
extern unsigned int PCM_TestSourceDownload(unsigned int destaddr, char* string);
extern bool PCM_DATA_2chpattern_making( unsigned int* destsizeByte,
unsigned int destaddr, unsigned int totrepeat, int eachrepeat, int BitperCh);
extern bool PCM_DATA_masking(unsigned int destaddr, int datasizeByte, int bit, int Totalch, int maskingch);
extern bool PCM_DATA_2chexpanding(unsigned int destaddr, int destTotch, unsigned int* destsizeByte,
unsigned int orgaddr , int orgTotch, unsigned int orgsizeByte, int orgBit);
extern bool PCM_ContinuousPCM2FifoFormat_converting(unsigned int destaddr, unsigned int* destsizeByte, int destbit,
unsigned int orgaddr, int orgsizeByte, int orgbit);
//audiounittest.c
extern bool I2S_unittest();
//iis.c
extern void IIC_open( unsigned int freq); // Hz order.
extern void IIC_close( void);
extern void IIS_PlayWave_DMA(int port, unsigned char *start_addr, unsigned int play_size, int bitperch);
extern void I2S_Testdataprepare();
extern void I2S_Testdataprepare2();
extern void I2S_Testdataprepare3();
extern void I2S_Testdataprepare4();
extern bool I2S_SFR_test(int Port);
//iisnew.c
extern bool I2S_Setting(int port, int MasterSlave, int trx, int i2sformat, int rootfs, int bitclkfs, int ch, int bit, int DmaPolling);
extern void I2S_PCLK_speed_change(int speed, int fin);
extern bool I2S_MasterBasicTestSub( int Port,
int dataformat, int bit, int Totch,
unsigned int sourceaddr, unsigned int sourcesize);
extern bool I2S_ChannelTest(int testsource, int port, int dataformat, int totch, int bit, int maskingch, bool testsourceredownload);
//iis_codec.c
extern void I2SCODEC_SendWmData(unsigned char reg_addr, unsigned short data);
/////////////////////////////////////////////////////
// IP test Functions
/////////////////////////////////////////////////////
void I2S_Select_port(void);
void I2S_Select_dmapolling(void);
void I2S_SFR_test01(void);//1
bool I2S_Mastermode_I2S_linktest(void);//2
void I2S_Codec_interfaceTest(void);//3
bool I2S_CodecsoundoutDefaultTest(void);//5
bool I2S_CodecsoundoutTest(void);//6
bool I2S_CodecsoundoutTest2(void);//7
bool I2S_PlayingDatabitTest(void);//8
bool I2S_ChannelCummTest(int testsource, int port, int totch, int bit);//common
bool I2S_ChannelTestPattern(void);//9-1
bool I2S_ChannelTestWave(void);//9-2
bool I2S_DataformatTest(void);//10
bool I2S0_MasterClockSelectionTestEXT(void);//pclk -EXT
bool I2S0_MasterClockSelectionTest(void);
bool I2S0_SlaveClockSelectionTest0(void);
bool I2S0_SlaveClockSelectionTest1(void);
bool I2S_ClockSelectionTestSub( int Port, int Opmode,
int CodecClk, int ClkSpeed,
int CodecChip,
unsigned int sourceaddr, unsigned int sourcesize);
void I2S1_SFR_test(void);
/////////////////////////////////////////////////////
// Test functions Lists & Calls routine
/////////////////////////////////////////////////////
void * func_iisALL_test[][2]=
{
// "123456789012345678901"
//IIS Function Test Item
(void *)I2S_Mastermode_I2S_linktest, "I2S_Mastermode_I2S_linktest", //2
(void *)I2S_Codec_interfaceTest, "I2S Codec interface test", //3
(void *)I2S_CodecsoundoutDefaultTest, "I2S Codec sound out test(L+R) 16bit pcm",//5
(void *)I2S_CodecsoundoutTest, "I2S Codec sound out test(L+R) with wave pcm format(little endian continous) check",//6
(void *)I2S_CodecsoundoutTest2, "I2S Codec sound out test2(L/ R) ",//7
(void *)I2S_PlayingDatabitTest, "I2S Master Data bit test(24bit) ",//8
(void *)I2S_ChannelTestPattern, "I2S Master ch/bit test(Test pattern)",//9-1
(void *)I2S_ChannelTestWave, "I2S Master ch/bit test(wave file)",//9-2
(void *)I2S_DataformatTest, "I2S Master Data format test(i2s/msb/lsb)",//10
(void *)I2S0_MasterClockSelectionTestEXT,"I2S0 Master Clock selection test(PCLK-EXTCLK) ",
(void *)I2S0_MasterClockSelectionTest, "I2S0 Master Clock selection test ",
(void *)I2S_unittest, "Unit test for tool",
//IIS0+1 Function Test Item
0,0
};
//default setting :
// master : i2s0
// slave : wm8580
// PCLK(XTAL), 12Mhz,
// codec clock 16.934Mhz 44000Hz, 384fs,DMA, tx, i2s format, 2ch
// testpattern + 16bit
//2.
bool I2S_Mastermode_I2S_linktest(void)
{
bool bret;
int failnum;
printf("set om pin to 0 for XTAL\n" );
if(g_I2S_Port==I2S_PORT0)
printf("check I2S0 link CON19 LRCLK[3] bitclk[1] sdout[5] cdclk[2] sin[4] by logic analyzer auto triggered on lrclk\n" );
else
printf("check I2S0 link CON19 LRCLK[9] bitclk[7] sdout[11] cdclk[8] sin[10] by logic analyzer auto triggered on lrclk\n" );
printf("check sout bit 16b'1000 0000 0000 0001 for lrclk(low) 1'b1 is moving left\n" );
printf(" sout bit 16b'1000 0000 0000 0001 for lrclk(high) 1'b1 is moving right\n" );
//WM8580, master, PCLK,XTAL,12Mhz,
//codec clock 16.934Mhz 44000Hz, 384fs,DMA, tx, i2s format, 2ch
printf("test for 2ch 16 bit data out\n");
/*
PCM_DATA_2chpattern_making( &destsizeByte,
(unsigned int)0x31000000, 500000/5000,5000,16);
bret=I2S_MasterBasicTestSub(g_I2S_Port, I2S_FORMAT_I2S, 16, 2,
0x31000000, destsize);
//int Port, int bit, int Totch,
//unsigned int sourceaddr, unsigned int sourcesize)
*/
bret=I2S_ChannelTest(0, g_I2S_Port, I2S_FORMAT_I2S, 2, 16, 0, 1);//test pattern
//int testsource, int port, int totch, int bit, int maskingch, bool testsourceredownload)
if(!bret) failnum++;
printf("test for 2ch 24 bit data out\n");
bret=I2S_ChannelTest(0, g_I2S_Port, I2S_FORMAT_I2S, 2, 24, 0, 1);//test pattern
//int testsource, int port, int totch, int bit, int maskingch, bool testsourceredownload)
if(!bret) failnum++;
printf("test for 2ch 8 bit data out\n");
bret=I2S_ChannelTest(0, g_I2S_Port, I2S_FORMAT_I2S, 2, 8, 0, 1);//test pattern
//int testsource, int port, int totch, int bit, int maskingch, bool testsourceredownload)
if(!bret) failnum++;
if(failnum>0) return 0;
else return 1;
}
//3. I2S test
void I2S_Codec_interfaceTest(void)
{
IIC_open( (unsigned int)200000); // Serial EEPROM IIC clk = 200KHz
printf("codec write test, check SCL(FPGA IO b'd R187), SDA(FPGA IO b'd R186) line by logic analyzer, sigle triggered on scl, run to wait\n");
printf("\nready to press any key\n");
getchar();
printf("\ncheck 8b'00110100+0 , 8'b01101010+0, 8'b00000000+0\n");
I2SCODEC_SendWmData(53, 0x000); // Reset WM8580
printf("check wave form\n");
printf("\nready to press any key\n");
getchar();
printf("check 8b'00110100+0 , 8'b0110010+0, 8'b00000010+0\n");
I2SCODEC_SendWmData(50, 0x002); // All Digital running, ADC disable, DAC1,2,3 enable, DACs under control of DACPD[3:0]
printf("check wave form\n");
//codec read part should be added here
IIC_close();
printf("\n");
printf("press for finish\n");
getchar();
}
//with default setting check all with clock source selection playing are ok
// master : i2s0
// slave : wm8580
// PCLK(XTAL), 12Mhz,
// codec clock 16.934Mhz 44000Hz, 384fs,DMA, tx, i2s format, 2ch
//5. I2S Codec sound out test(L+R) by 16bit pcm wave file uart downloading
// pcm + 16bit
bool I2S_CodecsoundoutDefaultTest(void)
{
int failnum;
bool bret=0;
unsigned int destsize;
unsigned int orgsize;
orgsize=PCM_TestSourceDownload(PCM_TESTPLAYINGDATA_BASE, "please download 44000Hz 16bit 2ch stereo Wave pcm file\n");
printf("please set om[0] hardware pin to 0, and XTAL is installed with 12Mhz\n");
printf("if not, please turn off board, set, then restart this test\n");
//internal master
printf("\n16.934Mhz, 44000Hz, 384fs, i2s format, 2ch, 16bit wave file\n");
printf("\ncodec 2ch sound out(left+right) test with pcm format check to press any key\n");
getchar();
bret=I2S_MasterBasicTestSub(g_I2S_Port, I2S_FORMAT_I2S, 16, 2,
PCM_TESTPLAYINGDATA_BASE+4+0x2c, orgsize-0x2c);
//int Port, int bit, int Totch,
//unsigned int sourceaddr, unsigned int sourcesize)
if(!bret) failnum++;
if(failnum>0) return 0;
else return 1;
}
//with default setting check all with clock source selection playing are ok
// master : i2s0
// slave : wm8580
// PCLK(XTAL), 12Mhz,
// codec clock 16.934Mhz 44000Hz, 384fs,DMA, tx, i2s format, 2ch
//6. I2S PCM wave file format check
// pcm + 16bit(from 32bit to 16bit, 32bit to 24bit then to 16bit)
bool I2S_CodecsoundoutTest(void)
{
int failnum;
bool bret=0;
unsigned int destsizeByte;
unsigned int orgsize;
orgsize=PCM_TestSourceDownload(PCM_WAVEFILE_ORG_BASE, "please download 44000Hz 32bit 2ch stereo Wave pcm file\n");
printf("please set om[0] hardware pin to 0, and XTAL is installed with 12Mhz\n");
printf("if not, please turn off board, set, then restart this test\n");
//internal master
//2ch 32bit pcm to 16bit
PCM_ContinuousPCM2FifoFormat_converting(PCM_TESTPLAYINGDATA_BASE, &destsizeByte, 16,
PCM_WAVEFILE_ORG_BASE+4+0x2c, orgsize-0x2c, 32);
//unsigned int destaddr, unsigned int* destsize, int destbit,
//unsigned int orgaddr, int orgsize, int orgbit);
printf("\n16.934Mhz, 44000Hz, 384fs, i2s format, 2ch, 16bit wave file\n");
printf("\ncodec 2ch sound out(left+right) test with pcm format check to press any key\n");
getchar();
bret=I2S_MasterBasicTestSub(g_I2S_Port, I2S_FORMAT_I2S, 16, 2,
PCM_TESTPLAYINGDATA_BASE, destsizeByte);
//int Port, int bit, int Totch,
//unsigned int sourceaddr, unsigned int sourcesize)
if(!bret) failnum++;
//2ch 24bit pcm to 16bit
PCM_ContinuousPCM2FifoFormat_converting(PCM_TEMPORARILY_CONVERTING_BASE, &destsizeByte, 24,
PCM_WAVEFILE_ORG_BASE+4+0x2c, orgsize-0x2c, 32);
//unsigned int destaddr, unsigned int* destsize, int destbit,
//unsigned int orgaddr, int orgsize, int orgbit);
PCM_ContinuousPCM2FifoFormat_converting(0x3100000, &destsizeByte, 16,
PCM_TEMPORARILY_CONVERTING_BASE, destsizeByte, 24);
//unsigned int destaddr, unsigned int* destsize, int destbit,
//unsigned int orgaddr, int orgsize, int orgbit);
printf("\n16.934Mhz, 44000Hz, 384fs, i2s format, 2ch, 16bit wave file\n");
printf("\ncodec 2ch sound out(left+right) test with pcm format check to press any key\n");
getchar();
bret=I2S_MasterBasicTestSub(g_I2S_Port, I2S_FORMAT_I2S, 16, 2,
PCM_TESTPLAYINGDATA_BASE, destsizeByte);
//int Port, int bit, int Totch,
//unsigned int sourceaddr, unsigned int sourcesize)
if(!bret) failnum++;
if(failnum>0) return 0;
else return 1;
}
//with default setting check all with clock source selection playing are ok
// master : i2s0
// slave : wm8580
// PCLK(XTAL), 12Mhz,
// codec clock 16.934Mhz 44000Hz, 384fs,DMA, tx, i2s format, 2ch
//7. I2S Codec sound out test2(L/ R)
// pcm + 16bit
bool I2S_CodecsoundoutTest2(void)
{
int failnum;
bool bret=0;
//internal master
//1ch left : 2ch (right-high16) mask
bret = I2S_ChannelTest(1,g_I2S_Port,I2S_FORMAT_I2S,2,16, 2, 1);//wave
//int testsource, int port, int totch, int bit, int maskingch, bool testsourceredownload)
if(!bret) failnum++;
//2ch right : 1ch (left-low 16) mask
bret = I2S_ChannelTest(1,g_I2S_Port,I2S_FORMAT_I2S,2,16, 1, 1);//wave
//int testsource, int port, int totch, int bit, int maskingch, bool testsourceredownload
if(!bret) failnum++;
if(failnum>0) return 0;
return bret;
}
// master : i2s0
// slave : wm8580
// PCLK(XTAL), 12Mhz,
// codec clock 16.934Mhz 44000Hz, 384fs,DMA, tx, i2s format, 2ch
//8. I2S Master Data bit test(24bit)
bool I2S_PlayingDatabitTest(void)
{
printf("\ncodec 2ch 24bit sound out(left+right) test to press any key\n");
getchar();
return I2S_ChannelTest(1, g_I2S_Port, I2S_FORMAT_I2S, 2, 24, 0, 1);//wave
//int testsource, int port, int totch, int bit, int maskingch, bool testsourceredownload
}
//with default setting check all with clock source selection playing are ok
// master : i2s0
// slave : wm8580
// PCLK(XTAL), 12Mhz,
// codec clock 16.934Mhz 44000Hz, 384fs,DMA, tx, i2s format,
//9-1. pcm + 16bit + 6ch
bool I2S_ChannelTestPattern(void)
{
int i;
printf("Channel test by test pattern\n");
printf("2CH. 1. 16bit, 2. 24bit, 3. 8bit \n");
if(g_I2S_Port == I2S_PORT0)
{
printf("6CH. 4. 16bit, 5. 24bit, 6. 8bit \n");
printf("4CH. 7. 16bit, 8. 24bit, 9. 8bit \n");
}
i = GetIntNum();
if(i==1) return I2S_ChannelCummTest(0, g_I2S_Port, 2, 16);//test pattern
else if(i==2) return I2S_ChannelCummTest(0, g_I2S_Port, 2, 24);//test pattern
else if(i==3) return I2S_ChannelCummTest(0, g_I2S_Port, 2, 8);//test pattern
if(g_I2S_Port != I2S_PORT0) return 0;
if(i==4) return I2S_ChannelCummTest(0, g_I2S_Port, 6, 16);//test pattern
else if(i==5) return I2S_ChannelCummTest(0, g_I2S_Port, 6, 24);//test pattern
else if(i==6) return I2S_ChannelCummTest(0, g_I2S_Port, 6, 8);//test pattern
else if(i==7) return I2S_ChannelCummTest(0, g_I2S_Port, 4, 16);//test pattern
else if(i==8) return I2S_ChannelCummTest(0, g_I2S_Port, 4, 24);//test pattern
else if(i==9) return I2S_ChannelCummTest(0, g_I2S_Port, 4, 8);//test pattern
else return 0;
}
//with default setting check all with clock source selection playing are ok
// master : i2s0
// slave : wm8580
// PCLK(XTAL), 12Mhz,
// codec clock 16.934Mhz 44000Hz, 384fs,DMA, tx, i2s format,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -