📄 main.c
字号:
/********************************************
* AUDIO TEST for FS-PXA255
* 2006-3-14 LIQM
*
*******************************************/
#define DMA_REG_BASE 0x40000000
#define DMA_CHN_BASE 0x40000200
#define REG_CLOCK_EN 0x41300004 //clock enable register,bit 2 for AC97
#define ADC_DELAY_TIME 1000
#define AC97_WAV_IN 0x40500040
#define AC97_WAV_OUT AC97_WAV_IN
#define AC97_GLOBAL_CTR 0x4050000c
#define AC97_REG_BASE 0x40500000
#define CODEC_REG_BASE 0x40500200
#define DCSR0 REGVALUE(DMA_REG_BASE)
#define DSADR0 REGVALUE(DMA_CHN_BASE+4)
#define DTADR0 REGVALUE(DMA_CHN_BASE+8)
#define DCMD0 REGVALUE(DMA_CHN_BASE+0xC)
#define DRCMR_WAV_IN REGVALUE(DMA_REG_BASE+0x12C)
#define DRCMR_WAV_OUT REGVALUE(DMA_REG_BASE+0x130)
#define AC97_REG_CAR REGVALUE(AC97_REG_BASE+0x20)
#define AC97_WAV_VOL 0x18
#define AC97_HPN_VOL 0x4
#define AC97_REC_GAIN 0x1C
#define AC97_MIC_VOL 0x0E
#include "systypes.h"
//__align(8) is required by DMA for external memory
void WriteAC97Reg(U32 reg,U32 data)
{
AC97_REG_CAR = 1;
REGVALUE(CODEC_REG_BASE|(reg << 1)) = data;
while(AC97_REG_CAR);//wait for codec ready
}
void InitWaveIn()
{
WriteAC97Reg(AC97_MIC_VOL , 0x40);//20db
WriteAC97Reg(AC97_REC_GAIN , 0);//0 db
DCSR0 |= (1 << 30);//non descriptor
DSADR0 = AC97_WAV_IN;
DTADR0 = 0xA1000000;
// width(4B) size(32B) wait src rqt incre dst
DCMD0 = (3 << 14) | (3 << 16) | (1 << 29) | (1 << 30);
DRCMR_WAV_IN = 0x80;//use channel 0
}
void DeinitWaveIn()
{
WriteAC97Reg(AC97_MIC_VOL , 0x8000);//mute
WriteAC97Reg(AC97_REC_GAIN ,0x8000);//mute
DRCMR_WAV_IN = 0;
}
void InitWaveOut()
{
WriteAC97Reg(AC97_HPN_VOL,8);//open headphone
WriteAC97Reg(AC97_WAV_VOL,8);//wave out volumn
DCSR0 |= (1 << 30);//non descriptor
DSADR0 = 0xA1000000;
DTADR0 = AC97_WAV_OUT;
// width(4B) size(32B) wait dst rqt incre src
DCMD0 = (3 << 14) | (3 << 16) | (1 << 28) | (1u << 31);
DRCMR_WAV_OUT = 0x80;//use channel 0
}
void DeinitWaveOut()
{
WriteAC97Reg(AC97_HPN_VOL , 0x8000);//mute
WriteAC97Reg(AC97_WAV_VOL ,0x8000);//mute
DRCMR_WAV_OUT = 0;
}
void Transfer()
{
DCMD0 |= 0x1FFC ;
DCSR0 |= (1u << 31);//run dma
while(DCSR0 & (1u << 31));//wait for dma finish
}
#pragma arm section code = "MainEntry"
int main(PUTILS utils)
{
U32 len = 128;
utils->puts(" uCDragon FS-PXA255 AUDIO[WM9705] Test \n");
utils->puts(" Record data goes to 0xA1000000 \n");
REGVALUE(REG_CLOCK_EN) |= 4; //enable clock for ac97
REGVALUE(AC97_GLOBAL_CTR) |= 2; //bit 1 for cold reset
utils->delay(ADC_DELAY_TIME);
InitWaveIn();
utils->puts(" Recording about 5 minutes...\n ");
while(len --) {
Transfer();
utils->putch('*');
}
DeinitWaveIn();
InitWaveOut();
len = 128;
utils->puts("\n Playing sound recorded...\n ");
while(len --) {
Transfer();
utils->putch('*');
}
DeinitWaveOut();
REGVALUE(AC97_GLOBAL_CTR) &=(~2); //bit 1 for cold reset
REGVALUE(REG_CLOCK_EN) &=(~4); //disable clock for ac97
}
#pragma arm section code
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -