summaryrefslogtreecommitdiff
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
parent390edd58c877f62b4d9363e4f0172259d4d76148 (diff)
downloadrockbox-623cbd6e02869a1704969fd8faf87fbdf11e766d.tar.gz
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
-rw-r--r--firmware/SOURCES4
-rw-r--r--firmware/drivers/audio/imx233-codec.c33
-rw-r--r--firmware/target/arm/imx233/pcm-imx233.c72
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/audio-fuzeplus.c2
4 files changed, 99 insertions, 12 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 739f8e63db..b729a9b064 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -522,8 +522,10 @@ target/arm/imx233/usb-imx233.c
522#endif 522#endif
523#ifndef BOOTLOADER 523#ifndef BOOTLOADER
524#ifdef HAVE_IMX233_CODEC 524#ifdef HAVE_IMX233_CODEC
525target/arm/imx233/audioout-imx233.c
526target/arm/imx233/audioin-imx233.c
525target/arm/imx233/pcm-imx233.c 527target/arm/imx233/pcm-imx233.c
526target/arm/imx233/audiohw-imx233.c 528drivers/audio/imx233-codec.c
527#endif 529#endif
528target/arm/imx233/timer-imx233.c 530target/arm/imx233/timer-imx233.c
529#endif 531#endif
diff --git a/firmware/drivers/audio/imx233-codec.c b/firmware/drivers/audio/imx233-codec.c
index 769216af87..d99a4d0ca9 100644
--- a/firmware/drivers/audio/imx233-codec.c
+++ b/firmware/drivers/audio/imx233-codec.c
@@ -22,34 +22,61 @@
22#include "system.h" 22#include "system.h"
23#include "audiohw.h" 23#include "audiohw.h"
24#include "audio.h" 24#include "audio.h"
25#include "audioout-imx233.h"
26#include "audioin-imx233.h"
25 27
26/* TO FILL */
27const struct sound_settings_info audiohw_settings[] = 28const struct sound_settings_info audiohw_settings[] =
28{ 29{
29 [SOUND_VOLUME] = {"dB", 0, 1, -74, 6, -25}, 30 /* i.MX233 has half dB steps */
31 [SOUND_VOLUME] = {"dB", 0, 5, VOLUME_MIN / 10, VOLUME_MAX / 10, -25},
32 /* HAVE_SW_TONE_CONTROLS */
33 [SOUND_BASS] = {"dB", 0, 1, -24, 24, 0},
34 [SOUND_TREBLE] = {"dB", 0, 1, -24, 24, 0},
30 [SOUND_BALANCE] = {"%", 0, 1,-100, 100, 0}, 35 [SOUND_BALANCE] = {"%", 0, 1,-100, 100, 0},
31 [SOUND_CHANNELS] = {"", 0, 1, 0, 5, 0}, 36 [SOUND_CHANNELS] = {"", 0, 1, 0, 5, 0},
32 [SOUND_STEREO_WIDTH] = {"%", 0, 5, 0, 250, 100}, 37 [SOUND_STEREO_WIDTH] = {"%", 0, 5, 0, 250, 100},
38#ifdef HAVE_RECORDING
33 [SOUND_LEFT_GAIN] = {"dB", 1, 1, 0, 31, 23}, 39 [SOUND_LEFT_GAIN] = {"dB", 1, 1, 0, 31, 23},
34 [SOUND_RIGHT_GAIN] = {"dB", 1, 1, 0, 31, 23}, 40 [SOUND_RIGHT_GAIN] = {"dB", 1, 1, 0, 31, 23},
35 [SOUND_MIC_GAIN] = {"dB", 1, 1, 0, 1, 0}, 41 [SOUND_MIC_GAIN] = {"dB", 1, 1, 0, 1, 0},
42#endif
36 [SOUND_DEPTH_3D] = {"%", 0, 1, 0, 15, 0}, 43 [SOUND_DEPTH_3D] = {"%", 0, 1, 0, 15, 0},
37}; 44};
38 45
39void audiohw_init(void) 46int tenthdb2master(int tdb)
40{ 47{
48 /* Just go from tenth of dB to half to dB */
49 return tdb / 5;
41} 50}
42 51
43void audiohw_preinit(void) 52void audiohw_preinit(void)
44{ 53{
54 imx233_audioout_preinit();
55 imx233_audioin_preinit();
45} 56}
46 57
47void audiohw_postinit(void) 58void audiohw_postinit(void)
48{ 59{
60 imx233_audioout_postinit();
61 imx233_audioin_postinit();
49} 62}
50 63
51void audiohw_close(void) 64void audiohw_close(void)
52{ 65{
66 imx233_audioout_close();
67 imx233_audioin_close();
68}
69
70void audiohw_set_headphone_vol(int vol_l, int vol_r)
71{
72 /* Use playback volume if <0 and headphone volume if >0 */
73 imx233_audioout_set_dac_vol(MIN(0, vol_l), MIN(0, vol_r));
74 imx233_audioout_set_hp_vol(MAX(0, vol_l), MAX(0, vol_r));
75}
76
77void audiohw_set_frequency(int fsel)
78{
79 imx233_audioout_set_freq(fsel);
53} 80}
54 81
55void audiohw_set_recvol(int left, int right, int type) 82void audiohw_set_recvol(int left, int right, int type)
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 @@
22#include "config.h" 22#include "config.h"
23#include "audiohw.h" 23#include "audiohw.h"
24#include "pcm.h" 24#include "pcm.h"
25#include "audioin-imx233.h" 25#include "dma-imx233.h"
26#include "pcm-internal.h"
26#include "audioout-imx233.h" 27#include "audioout-imx233.h"
27 28
29static int locked = 0;
30static struct apb_dma_command_t dac_dma;
31static bool pcm_freezed = false;
32
33/**
34 * WARNING !
35 * Never reset the dma channel, otherwise it will halt the DAC for some reason
36 * */
37
38static void play(const void *addr, size_t size)
39{
40 dac_dma.next = NULL;
41 dac_dma.buffer = (void *)addr;
42 dac_dma.cmd = HW_APB_CHx_CMD__COMMAND__READ |
43 HW_APB_CHx_CMD__IRQONCMPLT |
44 HW_APB_CHx_CMD__SEMAPHORE |
45 size << HW_APB_CHx_CMD__XFER_COUNT_BP;
46 /* dma subsystem will make sure cached stuff is written to memory */
47 imx233_dma_start_command(APB_AUDIO_DAC, &dac_dma);
48}
49
50void INT_DAC_DMA(void)
51{
52 void *start;
53 size_t size;
54
55 pcm_play_get_more_callback(&start, &size);
56
57 if(size != 0)
58 {
59 play(start, size);
60 pcm_play_dma_started_callback();
61 }
62
63 imx233_dma_clear_channel_interrupt(APB_AUDIO_DAC);
64}
65
66void INT_DAC_ERROR(void)
67{
68}
69
28void pcm_play_lock(void) 70void pcm_play_lock(void)
29{ 71{
72 if(locked++ == 0)
73 imx233_dma_enable_channel_interrupt(APB_AUDIO_DAC, false);
30} 74}
31 75
32void pcm_play_unlock(void) 76void pcm_play_unlock(void)
33{ 77{
78 if(--locked == 0)
79 imx233_dma_enable_channel_interrupt(APB_AUDIO_DAC, true);
34} 80}
35 81
36void pcm_play_dma_stop(void) 82void pcm_play_dma_stop(void)
37{ 83{
84
38} 85}
39 86
40void pcm_play_dma_start(const void *addr, size_t size) 87void pcm_play_dma_start(const void *addr, size_t size)
41{ 88{
42 pcm_play_dma_stop(); 89 pcm_play_dma_stop();
43 90
44 (void) addr; 91 play(addr, size);
45 (void) size;
46} 92}
47 93
48void pcm_play_dma_pause(bool pause) 94void pcm_play_dma_pause(bool pause)
49{ 95{
50 (void) pause; 96 imx233_dma_freeze_channel(APB_AUDIO_DAC, pause);
97 pcm_freezed = pause;
51} 98}
52 99
53void pcm_play_dma_init(void) 100void pcm_play_dma_init(void)
@@ -58,22 +105,31 @@ void pcm_play_dma_init(void)
58void pcm_play_dma_postinit(void) 105void pcm_play_dma_postinit(void)
59{ 106{
60 audiohw_postinit(); 107 audiohw_postinit();
108 imx233_enable_interrupt(INT_SRC_DAC_DMA, true);
109 imx233_enable_interrupt(INT_SRC_DAC_ERROR, true);
110 imx233_dma_enable_channel_interrupt(APB_AUDIO_DAC, true);
61} 111}
62 112
63void pcm_dma_apply_settings(void) 113void pcm_dma_apply_settings(void)
64{ 114{
65 return; 115 audiohw_set_frequency(pcm_fsel);
66} 116}
67 117
68size_t pcm_get_bytes_waiting(void) 118size_t pcm_get_bytes_waiting(void)
69{ 119{
70 return 0; 120 struct imx233_dma_info_t info = imx233_dma_get_info(APB_AUDIO_DAC, DMA_INFO_AHB_BYTES);
121 return info.ahb_bytes;
71} 122}
72 123
73const void *pcm_play_dma_get_peak_buffer(int *count) 124const void *pcm_play_dma_get_peak_buffer(int *count)
74{ 125{
75 (void) count; 126 if(!pcm_freezed)
76 return NULL; 127 imx233_dma_freeze_channel(APB_AUDIO_DAC, true);
128 struct imx233_dma_info_t info = imx233_dma_get_info(APB_AUDIO_DAC, DMA_INFO_AHB_BYTES | DMA_INFO_BAR);
129 if(!pcm_freezed)
130 imx233_dma_freeze_channel(APB_AUDIO_DAC, false);
131 *count = info.ahb_bytes;
132 return (void *)info.bar;
77} 133}
78 134
79void pcm_rec_lock(void) 135void pcm_rec_lock(void)
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/audio-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/audio-fuzeplus.c
index fa4294fff1..1aac9e43e0 100644
--- a/firmware/target/arm/imx233/sansa-fuzeplus/audio-fuzeplus.c
+++ b/firmware/target/arm/imx233/sansa-fuzeplus/audio-fuzeplus.c
@@ -22,6 +22,8 @@
22#include "system.h" 22#include "system.h"
23#include "audiohw.h" 23#include "audiohw.h"
24#include "audio.h" 24#include "audio.h"
25#include "audioout-imx233.h"
26#include "audioin-imx233.h"
25 27
26void audio_input_mux(int source, unsigned flags) 28void audio_input_mux(int source, unsigned flags)
27{ 29{