?? ac97_example.c
字號:
/***********************************************************************
* $Workfile: ac97_example.c $
* $Revision: 1.1 $
* $Author: WellsK $
* $Date: Dec 03 2003 09:16:48 $
*
* Project: AC97 DMA mode driver example
*
* Description:
* A AC97 driver (DMA mode) example using a set buffer. This example
* is ideal for playing sound data that has been preformatted and is
* not streamed.
*
* Revision History:
* $Log: //smaicnt2/pvcs/VM/sharpmcu/archives/sharpmcu/software/csps/lh7a400/bsps/sdk7a400/examples/ac97_dma_play/ac97_example.c-arc $
*
* Rev 1.1 Dec 03 2003 09:16:48 WellsK
* Corrected DMA status response check and added logic to
* disable DMA after sample has been processed.
*
* Rev 1.0 Oct 22 2003 11:34:06 WellsK
* Initial revision.
*
*
***********************************************************************
* SHARP MICROELECTRONICS OF THE AMERICAS MAKES NO REPRESENTATION
* OR WARRANTIES WITH RESPECT TO THE PERFORMANCE OF THIS SOFTWARE,
* AND SPECIFICALLY DISCLAIMS ANY RESPONSIBILITY FOR ANY DAMAGES,
* SPECIAL OR CONSEQUENTIAL, CONNECTED WITH THE USE OF THIS SOFTWARE.
*
* SHARP MICROELECTRONICS OF THE AMERICAS PROVIDES THIS SOFTWARE SOLELY
* FOR THE PURPOSE OF SOFTWARE DEVELOPMENT INCORPORATING THE USE OF A
* SHARP MICROCONTROLLER OR SYSTEM-ON-CHIP PRODUCT. USE OF THIS SOURCE
* FILE IMPLIES ACCEPTANCE OF THESE CONDITIONS.
*
* COPYRIGHT (C) 2001 SHARP MICROELECTRONICS OF THE AMERICAS, INC.
* CAMAS, WA
**********************************************************************/
#include "abl_types.h"
#include "abl_arm922t_cp15_driver.h"
#include "abl_irq_fiq.h"
#include "lh7a400_ac97_driver.h"
#include "lh7a400_timer_driver.h"
#include "lh7a400_int_driver.h"
#include "lh7a400_csc_driver.h"
#include "lh7a400_dma_driver.h"
#include "sdk7a400_cpld_driver.h"
#include "sma_landed16.h"
/***********************************************************************
*
* Function: c_entry
*
* Purpose: DMA mode AC97 driver example
*
* Processing:
* See function. This example sets up the CODEC to play a stereo
* sample on the PCM output.
*
* Parameters: None
*
* Outputs: None
*
* Returns: Always returns 1
*
* Notes: None
*
**********************************************************************/
int c_entry(void)
{
INT_32 ac97dev1, iter, xa;
AC97_VOLUME_T vol;
AC97_MIX_GAIN_T mix;
AC97_TONE_T tone;
AC97_CHANNEL_CONFIG_T chcfg;
DMAC_CHANNEL_T dmach;
UNS_32 *phyaddr;
/* Disable interrupts */
disable_irq_fiq();
/* Set virtual address of MMU table (needed for VIC driver
functions) */
cp15_set_vmmu_addr((UNS_32 *) cp15_get_ttb());
/* Initialize CPLD */
cpld_init();
/* Initialize interrupt system */
int_initialize(0xC0000000);
/* Install standard IRQ dispatcher at ARM IRQ vector */
int_install_handler(IRQ_VEC, (PFV) irq_dispatcher);
/* Open the AC97 controller channel #1 */
if ((ac97dev1 = ac97_open(AAC, 0)) == (INT_32) NULL)
{
return 0;
}
/* Reset AC97 CODEC power and allow a small delay (300mS) for
device to re-initialize correctly */
ac97_ioctl(ac97dev1, AC97_DO_RESET, 1);
timer_wait_us(TIMER1, (300 * 1000));
/* Make sure all DMA channels are disabled */
for (dmach = DMAC_USB_TX; dmach <= DMAC_AAC_TX2; dmach++)
{
dmac_stop(dmach);
}
/* Enable DMA clock */
csc_enable_dma(TRUE);
/* Install DMA handler in the IRQ dispatcher */
int_install_irq_handler(INT_DMAINTR, (PFV) dmac_isr);
/* Enable DMA interrupts */
int_enable(INT_DMAINTR);
/* Enable IRQ interrupts in the ARM core */
enable_irq();
/* Set CODEC volumes to MAX (all CODEC outputs) */
vol.mute = FALSE;
vol.left = AC97_MAX_VOL;
vol.right = AC97_MAX_VOL;
vol.select = MASTER_OUT;
ac97_ioctl(ac97dev1, AC97_SET_VOL, (INT_32) &vol);
vol.select = AUX_OUT;
ac97_ioctl(ac97dev1, AC97_SET_VOL, (INT_32) &vol);
vol.select = MONO_OUT;
ac97_ioctl(ac97dev1, AC97_SET_VOL, (INT_32) &vol);
/* Mute all CODEC mixer channels */
mix.mute = FALSE;
mix.left = AC97_MIX_GN_MIN;
mix.right = AC97_MIX_GN_MIN;
for (xa = BEEP_OUT; xa < PCM_OUT; xa++)
{
mix.select = (AC97_MIX_GAIN_SEL_T) xa;
ac97_ioctl(ac97dev1, AC97_SET_MIXGAIN, (INT_32) &mix);
}
/* Set PCM output channel to max gain in mixer (volume) */
mix.mute = FALSE;
mix.left = AC97_REC_GN_MAX;
mix.right = AC97_REC_GN_MAX;
mix.select = PCM_OUT;
ac97_ioctl(ac97dev1, AC97_SET_MIXGAIN, (INT_32) &mix);
/* Set bass and treble tone control to bypass */
tone.bass_gain = AC97_TONE_BYPASS;
tone.treble_gain = AC97_TONE_BYPASS;
ac97_ioctl(ac97dev1, AC97_SET_TONE, (INT_32) &tone);
/* Play sample using DMA (must use compact mode) */
chcfg.srate = BPSEC_8000;
chcfg.ssize = BPSAM_16;
chcfg.channels = 2;
chcfg.compact = TRUE;
chcfg.dir = PLAYBACK;
chcfg.tmode = AC97_DMA;
/* Play sample 3 times at different rates */
for (iter = 0; iter < 3; iter++)
{
/* Configure the AC97 for DMA audio playback. The DMA channel
will be returned by this call when tmode is set to AC97_DMA
as the transfer mode */
dmach = (DMAC_CHANNEL_T)
ac97_ioctl(ac97dev1, AC97_SET_CHANNEL, (INT_32) &chcfg);
/* The DMA controller requires physical address, so translate
the audio data to a physical address first */
phyaddr = (UNS_32 *)
cp15_map_virtual_to_physical((UNS_32 *) sma_landed16);
/* For the selected DMA channel, start the transfer */
dmac_start(dmach, phyaddr, (SMA_LANDED16_NUM_SAMPLES *
2 * sizeof (UNS_16)), TRUE);
/* Check for DMA sample to complete by monitoring the DMA
status */
while (dmac_get_status(dmach) != DMA_DISABLED);
/* Stop DMA */
dmac_stop(dmach);
/* Next sample rate */
chcfg.srate++;
}
/* Disable DMA clock */
csc_enable_dma(FALSE);
/* Disable DMA interrupt in the interrupt controller */
int_disable(INT_DMAINTR);
/* Disable ARM core IRQ interrupts */
disable_irq();
return 1;
}
#ifndef __GNUC__
/* With ARM and GHS toolsets, the entry point is main() - this will
allow the linker to generate wrapper code to setup stacks, allocate
heap area, and initialize and copy code and data segments. For GNU
toolsets, the entry point is through __start() in the crt0_gnu.asm
file, and that startup code will setup stacks and data */
int main(void)
{
return c_entry();
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -