⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 优龙PAX255开发板所带AC97声卡的测试程序源码
💻 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 + -