From a119c44c7ec7a383dafbb391f052aaade0b6c981 Mon Sep 17 00:00:00 2001 From: Maurus Cuelenaere Date: Thu, 4 Dec 2008 18:26:19 +0000 Subject: Ingenic targets: * Clean up codec & PCM + functional changes * LCD: Don't wait on DMAC in lcd_unlock() * SADC: add battery mutex + other changes * NAND: add mutex * USB rework (still not working) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19327 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c | 47 +++++++++++++++++------- 1 file changed, 34 insertions(+), 13 deletions(-) (limited to 'firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c') diff --git a/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c b/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c index 0343723493..5549ce4dbf 100644 --- a/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c +++ b/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c @@ -27,13 +27,14 @@ #include "pcm.h" #include "jz4740.h" + /**************************************************************************** ** Playback DMA transfer **/ void pcm_postinit(void) { - audiohw_postinit(); /* implemented not for all codecs */ + audiohw_postinit(); pcm_apply_settings(); } @@ -61,29 +62,55 @@ void pcm_set_frequency(unsigned int frequency) { (void) frequency; /* TODO */ + + /* + __i2s_set_oss_sample_size(frequency); + i2s_codec_set_samplerate(frequency); + */ } static void play_start_pcm(void) { pcm_apply_settings(); - - /* TODO */ + + __aic_enable_transmit_dma(); + __aic_enable_replay(); + + REG_DMAC_DCCSR(DMA_AIC_TX_CHANNEL) |= DMAC_DCCSR_EN; } static void play_stop_pcm(void) { - /* TODO */ + REG_DMAC_DCCSR(DMA_AIC_TX_CHANNEL) = (REG_DMAC_DCCSR(DMA_AIC_TX_CHANNEL) | DMAC_DCCSR_HLT) & ~DMAC_DCCSR_EN; + + __aic_disable_transmit_dma(); + __aic_disable_replay(); } void pcm_play_dma_start(const void *addr, size_t size) { - (void)addr; - (void)size; - /* TODO */ + REG_DMAC_DCCSR(DMA_AIC_TX_CHANNEL) = 0; + REG_DMAC_DSAR(DMA_AIC_TX_CHANNEL) = PHYSADDR((unsigned long)addr); + REG_DMAC_DTAR(DMA_AIC_TX_CHANNEL) = PHYSADDR((unsigned long)AIC_DR); + REG_DMAC_DTCR(DMA_AIC_TX_CHANNEL) = size; + REG_DMAC_DRSR(DMA_AIC_TX_CHANNEL) = DMAC_DRSR_RS_AICOUT; + REG_DMAC_DCMD(DMA_AIC_TX_CHANNEL) = ( DMAC_DCMD_SAI| DMAC_DCMD_DAI | DMAC_DCMD_SWDH_32 | DMAC_DCMD_DS_32BIT | DMAC_DCMD_DWDH_32 + | DMAC_DCMD_TIE); play_start_pcm(); } +void DMA_CALLBACK(DMA_AIC_TX_CHANNEL)(void) +{ + if( REG_DMAC_DCCSR(DMA_AIC_TX_CHANNEL) & DMAC_DCCSR_TT ) + __aic_disable_transmit_dma(); +} + +size_t pcm_get_bytes_waiting(void) +{ + return REG_DMAC_DTCR(DMA_AIC_TX_CHANNEL); +} + void pcm_play_dma_stop(void) { play_stop_pcm(); @@ -110,12 +137,6 @@ void pcm_play_dma_pause(bool pause) } -size_t pcm_get_bytes_waiting(void) -{ - /* TODO */ - return 0; -} - #ifdef HAVE_RECORDING /* TODO */ void pcm_rec_dma_init(void) -- cgit v1.2.3