diff options
-rw-r--r-- | firmware/SOURCES | 4 | ||||
-rw-r--r-- | firmware/drivers/audio/imx233-codec.c | 33 | ||||
-rw-r--r-- | firmware/target/arm/imx233/pcm-imx233.c | 72 | ||||
-rw-r--r-- | firmware/target/arm/imx233/sansa-fuzeplus/audio-fuzeplus.c | 2 |
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 |
525 | target/arm/imx233/audioout-imx233.c | ||
526 | target/arm/imx233/audioin-imx233.c | ||
525 | target/arm/imx233/pcm-imx233.c | 527 | target/arm/imx233/pcm-imx233.c |
526 | target/arm/imx233/audiohw-imx233.c | 528 | drivers/audio/imx233-codec.c |
527 | #endif | 529 | #endif |
528 | target/arm/imx233/timer-imx233.c | 530 | target/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 */ | ||
27 | const struct sound_settings_info audiohw_settings[] = | 28 | const 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 | ||
39 | void audiohw_init(void) | 46 | int tenthdb2master(int tdb) |
40 | { | 47 | { |
48 | /* Just go from tenth of dB to half to dB */ | ||
49 | return tdb / 5; | ||
41 | } | 50 | } |
42 | 51 | ||
43 | void audiohw_preinit(void) | 52 | void audiohw_preinit(void) |
44 | { | 53 | { |
54 | imx233_audioout_preinit(); | ||
55 | imx233_audioin_preinit(); | ||
45 | } | 56 | } |
46 | 57 | ||
47 | void audiohw_postinit(void) | 58 | void audiohw_postinit(void) |
48 | { | 59 | { |
60 | imx233_audioout_postinit(); | ||
61 | imx233_audioin_postinit(); | ||
49 | } | 62 | } |
50 | 63 | ||
51 | void audiohw_close(void) | 64 | void audiohw_close(void) |
52 | { | 65 | { |
66 | imx233_audioout_close(); | ||
67 | imx233_audioin_close(); | ||
68 | } | ||
69 | |||
70 | void 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 | |||
77 | void audiohw_set_frequency(int fsel) | ||
78 | { | ||
79 | imx233_audioout_set_freq(fsel); | ||
53 | } | 80 | } |
54 | 81 | ||
55 | void audiohw_set_recvol(int left, int right, int type) | 82 | void 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 | ||
29 | static int locked = 0; | ||
30 | static struct apb_dma_command_t dac_dma; | ||
31 | static 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 | |||
38 | static 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 | |||
50 | void 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 | |||
66 | void INT_DAC_ERROR(void) | ||
67 | { | ||
68 | } | ||
69 | |||
28 | void pcm_play_lock(void) | 70 | void pcm_play_lock(void) |
29 | { | 71 | { |
72 | if(locked++ == 0) | ||
73 | imx233_dma_enable_channel_interrupt(APB_AUDIO_DAC, false); | ||
30 | } | 74 | } |
31 | 75 | ||
32 | void pcm_play_unlock(void) | 76 | void pcm_play_unlock(void) |
33 | { | 77 | { |
78 | if(--locked == 0) | ||
79 | imx233_dma_enable_channel_interrupt(APB_AUDIO_DAC, true); | ||
34 | } | 80 | } |
35 | 81 | ||
36 | void pcm_play_dma_stop(void) | 82 | void pcm_play_dma_stop(void) |
37 | { | 83 | { |
84 | |||
38 | } | 85 | } |
39 | 86 | ||
40 | void pcm_play_dma_start(const void *addr, size_t size) | 87 | void 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 | ||
48 | void pcm_play_dma_pause(bool pause) | 94 | void 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 | ||
53 | void pcm_play_dma_init(void) | 100 | void pcm_play_dma_init(void) |
@@ -58,22 +105,31 @@ void pcm_play_dma_init(void) | |||
58 | void pcm_play_dma_postinit(void) | 105 | void 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 | ||
63 | void pcm_dma_apply_settings(void) | 113 | void pcm_dma_apply_settings(void) |
64 | { | 114 | { |
65 | return; | 115 | audiohw_set_frequency(pcm_fsel); |
66 | } | 116 | } |
67 | 117 | ||
68 | size_t pcm_get_bytes_waiting(void) | 118 | size_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 | ||
73 | const void *pcm_play_dma_get_peak_buffer(int *count) | 124 | const 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 | ||
79 | void pcm_rec_lock(void) | 135 | void 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 | ||
26 | void audio_input_mux(int source, unsigned flags) | 28 | void audio_input_mux(int source, unsigned flags) |
27 | { | 29 | { |