summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm/imx233/pcm-imx233.c
diff options
context:
space:
mode:
authorAmaury Pouly <pamaury@rockbox.org>2011-10-18 22:08:41 +0000
committerAmaury Pouly <pamaury@rockbox.org>2011-10-18 22:08:41 +0000
commit623cbd6e02869a1704969fd8faf87fbdf11e766d (patch)
tree12b6b715a481de7989787c1c065b4bfa10868865 /firmware/target/arm/imx233/pcm-imx233.c
parent390edd58c877f62b4d9363e4f0172259d4d76148 (diff)
downloadrockbox-623cbd6e02869a1704969fd8faf87fbdf11e766d.tar.gz
rockbox-623cbd6e02869a1704969fd8faf87fbdf11e766d.tar.bz2
rockbox-623cbd6e02869a1704969fd8faf87fbdf11e766d.zip
imx233/fuze+: implement pcm out and audio codec, update SOURCES
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30800 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/imx233/pcm-imx233.c')
-rw-r--r--firmware/target/arm/imx233/pcm-imx233.c72
1 files changed, 64 insertions, 8 deletions
diff --git a/firmware/target/arm/imx233/pcm-imx233.c b/firmware/target/arm/imx233/pcm-imx233.c
index 6dd678f506..fa13f9979e 100644
--- a/firmware/target/arm/imx233/pcm-imx233.c
+++ b/firmware/target/arm/imx233/pcm-imx233.c
@@ -22,32 +22,79 @@
#include "config.h"
#include "audiohw.h"
#include "pcm.h"
-#include "audioin-imx233.h"
+#include "dma-imx233.h"
+#include "pcm-internal.h"
#include "audioout-imx233.h"
+static int locked = 0;
+static struct apb_dma_command_t dac_dma;
+static bool pcm_freezed = false;
+
+/**
+ * WARNING !
+ * Never reset the dma channel, otherwise it will halt the DAC for some reason
+ * */
+
+static void play(const void *addr, size_t size)
+{
+ dac_dma.next = NULL;
+ dac_dma.buffer = (void *)addr;
+ dac_dma.cmd = HW_APB_CHx_CMD__COMMAND__READ |
+ HW_APB_CHx_CMD__IRQONCMPLT |
+ HW_APB_CHx_CMD__SEMAPHORE |
+ size << HW_APB_CHx_CMD__XFER_COUNT_BP;
+ /* dma subsystem will make sure cached stuff is written to memory */
+ imx233_dma_start_command(APB_AUDIO_DAC, &dac_dma);
+}
+
+void INT_DAC_DMA(void)
+{
+ void *start;
+ size_t size;
+
+ pcm_play_get_more_callback(&start, &size);
+
+ if(size != 0)
+ {
+ play(start, size);
+ pcm_play_dma_started_callback();
+ }
+
+ imx233_dma_clear_channel_interrupt(APB_AUDIO_DAC);
+}
+
+void INT_DAC_ERROR(void)
+{
+}
+
void pcm_play_lock(void)
{
+ if(locked++ == 0)
+ imx233_dma_enable_channel_interrupt(APB_AUDIO_DAC, false);
}
void pcm_play_unlock(void)
{
+ if(--locked == 0)
+ imx233_dma_enable_channel_interrupt(APB_AUDIO_DAC, true);
}
void pcm_play_dma_stop(void)
{
+
}
void pcm_play_dma_start(const void *addr, size_t size)
{
pcm_play_dma_stop();
- (void) addr;
- (void) size;
+ play(addr, size);
}
void pcm_play_dma_pause(bool pause)
{
- (void) pause;
+ imx233_dma_freeze_channel(APB_AUDIO_DAC, pause);
+ pcm_freezed = pause;
}
void pcm_play_dma_init(void)
@@ -58,22 +105,31 @@ void pcm_play_dma_init(void)
void pcm_play_dma_postinit(void)
{
audiohw_postinit();
+ imx233_enable_interrupt(INT_SRC_DAC_DMA, true);
+ imx233_enable_interrupt(INT_SRC_DAC_ERROR, true);
+ imx233_dma_enable_channel_interrupt(APB_AUDIO_DAC, true);
}
void pcm_dma_apply_settings(void)
{
- return;
+ audiohw_set_frequency(pcm_fsel);
}
size_t pcm_get_bytes_waiting(void)
{
- return 0;
+ struct imx233_dma_info_t info = imx233_dma_get_info(APB_AUDIO_DAC, DMA_INFO_AHB_BYTES);
+ return info.ahb_bytes;
}
const void *pcm_play_dma_get_peak_buffer(int *count)
{
- (void) count;
- return NULL;
+ if(!pcm_freezed)
+ imx233_dma_freeze_channel(APB_AUDIO_DAC, true);
+ struct imx233_dma_info_t info = imx233_dma_get_info(APB_AUDIO_DAC, DMA_INFO_AHB_BYTES | DMA_INFO_BAR);
+ if(!pcm_freezed)
+ imx233_dma_freeze_channel(APB_AUDIO_DAC, false);
+ *count = info.ahb_bytes;
+ return (void *)info.bar;
}
void pcm_rec_lock(void)