diff options
Diffstat (limited to 'firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c')
-rw-r--r-- | firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c | 91 |
1 files changed, 85 insertions, 6 deletions
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c index 4c9cc337a5..df88e16854 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * \/ \/ \/ \/ \/ | 7 | * \/ \/ \/ \/ \/ |
8 | * $Id$ | 8 | * $Id$ |
9 | * | 9 | * |
10 | * Copyright (C) 2007 by Karl Kurbjun | 10 | * Copyright (C) 2007 and 2009 by Karl Kurbjun |
11 | * | 11 | * |
12 | * This program is free software; you can redistribute it and/or | 12 | * This program is free software; you can redistribute it and/or |
13 | * modify it under the terms of the GNU General Public License | 13 | * modify it under the terms of the GNU General Public License |
@@ -18,16 +18,20 @@ | |||
18 | * KIND, either express or implied. | 18 | * KIND, either express or implied. |
19 | * | 19 | * |
20 | ****************************************************************************/ | 20 | ****************************************************************************/ |
21 | #include <stdlib.h> | ||
21 | #include "system.h" | 22 | #include "system.h" |
22 | #include "kernel.h" | 23 | #include "kernel.h" |
23 | #include "logf.h" | 24 | #include "logf.h" |
24 | #include "audio.h" | 25 | #include "audio.h" |
25 | #include "sound.h" | 26 | #include "sound.h" |
26 | #include "file.h" | 27 | #include "file.h" |
28 | #include "dsp-target.h" | ||
29 | #include "dsp/ipc.h" | ||
30 | #include "mmu-arm.h" | ||
27 | 31 | ||
28 | void pcm_postinit(void) | 32 | void pcm_postinit(void) |
29 | { | 33 | { |
30 | 34 | audiohw_postinit(); | |
31 | } | 35 | } |
32 | 36 | ||
33 | const void * pcm_play_dma_get_peak_buffer(int *count) | 37 | const void * pcm_play_dma_get_peak_buffer(int *count) |
@@ -38,17 +42,28 @@ const void * pcm_play_dma_get_peak_buffer(int *count) | |||
38 | 42 | ||
39 | void pcm_play_dma_init(void) | 43 | void pcm_play_dma_init(void) |
40 | { | 44 | { |
41 | 45 | IO_INTC_IRQ0 = 1 << 11; | |
46 | IO_INTC_EINT0 |= 1 << 11; | ||
47 | |||
48 | IO_DSPC_HPIB_CONTROL = 1 << 10 | 1 << 9 | 1 << 8 | 1 << 7 | 1 << 3 | 1 << 0; | ||
49 | |||
50 | dsp_reset(); | ||
51 | dsp_load(dsp_image); | ||
42 | } | 52 | } |
43 | 53 | ||
44 | void pcm_dma_apply_settings(void) | 54 | void pcm_dma_apply_settings(void) |
45 | { | 55 | { |
56 | audiohw_set_frequency(pcm_fsel); | ||
46 | } | 57 | } |
47 | 58 | ||
48 | void pcm_play_dma_start(const void *addr, size_t size) | 59 | void pcm_play_dma_start(const void *addr, size_t size) |
49 | { | 60 | { |
50 | (void) addr; | 61 | unsigned long sdem_addr=(unsigned long)addr - CONFIG_SDRAM_START; |
51 | (void) size; | 62 | /* Initialize codec. */ |
63 | DSP_(_sdem_addrl) = sdem_addr & 0xffff; | ||
64 | DSP_(_sdem_addrh) = sdem_addr >> 16; | ||
65 | DSP_(_sdem_dsp_size) = size; | ||
66 | dsp_wake(); | ||
52 | } | 67 | } |
53 | 68 | ||
54 | void pcm_play_dma_stop(void) | 69 | void pcm_play_dma_stop(void) |
@@ -73,5 +88,69 @@ void pcm_play_dma_pause(bool pause) | |||
73 | 88 | ||
74 | size_t pcm_get_bytes_waiting(void) | 89 | size_t pcm_get_bytes_waiting(void) |
75 | { | 90 | { |
76 | return 0; | 91 | return DSP_(_sdem_dsp_size)-DSP_(_sdem_level); |
92 | } | ||
93 | |||
94 | void DSPHINT(void) | ||
95 | { | ||
96 | static unsigned char *start; | ||
97 | static size_t size; | ||
98 | register pcm_more_callback_type get_more; /* No stack for this */ | ||
99 | |||
100 | unsigned int i; | ||
101 | char buffer[80]; | ||
102 | |||
103 | IO_INTC_IRQ0 = 1 << 11; | ||
104 | |||
105 | switch (dsp_message.msg) | ||
106 | { | ||
107 | case MSG_DEBUGF: | ||
108 | /* DSP stores one character per word. */ | ||
109 | for (i = 0; i < sizeof(buffer); i++) | ||
110 | { | ||
111 | buffer[i] = dsp_message.payload.debugf.buffer[i]; | ||
112 | } | ||
113 | |||
114 | /* Release shared area to DSP. */ | ||
115 | dsp_wake(); | ||
116 | |||
117 | DEBUGF("DSP: %s", buffer); | ||
118 | break; | ||
119 | |||
120 | case MSG_REFILL: | ||
121 | /* Buffer empty. Try to get more. */ | ||
122 | get_more = pcm_callback_for_more; | ||
123 | size = 0; | ||
124 | |||
125 | if (get_more == NULL || (get_more(&start, &size), size == 0)) | ||
126 | { | ||
127 | /* Callback missing or no more DMA to do */ | ||
128 | pcm_play_dma_stop(); | ||
129 | pcm_play_dma_stopped_callback(); | ||
130 | } | ||
131 | else | ||
132 | { | ||
133 | unsigned long sdem_addr=(unsigned long)start - CONFIG_SDRAM_START; | ||
134 | /* Flush any pending cache writes */ | ||
135 | clean_dcache_range(start, size); | ||
136 | |||
137 | /* set the new DMA values */ | ||
138 | DSP_(_sdem_addrl) = sdem_addr & 0xffff; | ||
139 | DSP_(_sdem_addrh) = sdem_addr >> 16; | ||
140 | DSP_(_sdem_dsp_size) = size; | ||
141 | |||
142 | DEBUGF("pcm_sdram at 0x%08lx, sdem_addr 0x%08lx", | ||
143 | (unsigned long)start, (unsigned long)sdem_addr); | ||
144 | } | ||
145 | break; | ||
146 | default: | ||
147 | DEBUGF("DSP: unknown msg 0x%04x", dsp_message.msg); | ||
148 | break; | ||
149 | } | ||
150 | |||
151 | /* Re-Activate the channel */ | ||
152 | dsp_wake(); | ||
153 | |||
154 | DEBUGF("DSP: %s", buffer); | ||
77 | } | 155 | } |
156 | |||