summaryrefslogtreecommitdiff
path: root/firmware/target/arm/tms320dm320/dsp-dm320.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/tms320dm320/dsp-dm320.c')
-rw-r--r--firmware/target/arm/tms320dm320/dsp-dm320.c123
1 files changed, 2 insertions, 121 deletions
diff --git a/firmware/target/arm/tms320dm320/dsp-dm320.c b/firmware/target/arm/tms320dm320/dsp-dm320.c
index aad2941254..f729cc4e90 100644
--- a/firmware/target/arm/tms320dm320/dsp-dm320.c
+++ b/firmware/target/arm/tms320dm320/dsp-dm320.c
@@ -27,18 +27,6 @@
27#include "dsp-target.h" 27#include "dsp-target.h"
28#include "dsp/ipc.h" 28#include "dsp/ipc.h"
29 29
30/* A "DSP image" is an array of these, terminated by raw_data_size_half = 0. */
31struct dsp_section {
32 const unsigned short *raw_data;
33 unsigned short physical_addr;
34 unsigned short raw_data_size_half;
35};
36
37/* Must define struct dsp_section before including the image. */
38#include "dsp/dsp-image.h"
39
40#define dsp_message (*(volatile struct ipc_message *)&DSP_(_status))
41
42#ifdef DEBUG 30#ifdef DEBUG
43static void dsp_status(void) 31static void dsp_status(void)
44{ 32{
@@ -74,7 +62,7 @@ static void dsp_status(void)
74} 62}
75#endif 63#endif
76 64
77static void dsp_reset(void) 65void dsp_reset(void)
78{ 66{
79 DSP_(0x7fff) = 0xdead; 67 DSP_(0x7fff) = 0xdead;
80 68
@@ -102,7 +90,7 @@ void dsp_wake(void)
102 restore_irq(old_level); 90 restore_irq(old_level);
103} 91}
104 92
105static void dsp_load(const struct dsp_section *im) 93void dsp_load(const struct dsp_section *im)
106{ 94{
107 while (im->raw_data_size_half) { 95 while (im->raw_data_size_half) {
108 volatile unsigned short *data_ptr = &DSP_(im->physical_addr); 96 volatile unsigned short *data_ptr = &DSP_(im->physical_addr);
@@ -131,110 +119,3 @@ static void dsp_load(const struct dsp_section *im)
131 } 119 }
132} 120}
133 121
134static signed short *the_rover = (signed short *)0x1900000;
135static unsigned int index_rover = 0;
136#define ARM_BUFFER_SIZE (PCM_SIZE)
137
138void dsp_init(void)
139{
140 unsigned long sdem_addr;
141 int fd;
142 int bytes;
143
144 IO_INTC_IRQ0 = 1 << 11;
145 IO_INTC_EINT0 |= 1 << 11;
146
147 IO_DSPC_HPIB_CONTROL = 1 << 10 | 1 << 9 | 1 << 8 | 1 << 7 | 1 << 3 | 1 << 0;
148
149 dsp_reset();
150 dsp_load(dsp_image);
151
152 /* Initialize codec. */
153 sdem_addr = (unsigned long)the_rover - CONFIG_SDRAM_START;
154 DEBUGF("pcm_sdram at 0x%08lx, sdem_addr 0x%08lx",
155 (unsigned long)the_rover, (unsigned long)sdem_addr);
156 DSP_(_sdem_addrl) = sdem_addr & 0xffff;
157 DSP_(_sdem_addrh) = sdem_addr >> 16;
158 DSP_(_sdem_dsp_size) = ARM_BUFFER_SIZE;
159
160 fd = open("/test.raw", O_RDONLY);
161 bytes = read(fd, the_rover, 4*1024*1024);
162 close(fd);
163
164 DEBUGF("read %d rover bytes", bytes);
165
166#ifdef IPC_SIZES
167 DEBUGF("dsp_message at 0x%08x", &dsp_message);
168 DEBUGF("sizeof(ipc_message)=%uB offset(ipc_message.payload)=%uB",
169 sizeof(struct ipc_message), (int)&((struct ipc_message*)0)->payload);
170#endif
171
172#if 0//def INIT_MSG
173 /* Prepare init message. */
174
175 /* DSP accesses MUST be done a word at a time. */
176 dsp_message.msg = MSG_INIT;
177
178 sdem_addr = (unsigned long)pcm_sdram - CONFIG_SDRAM_START;
179 DEBUGF("pcm_sdram at 0x%08x, sdem_addr 0x%08x", pcm_sdram, sdem_addr);
180 dsp_message.payload.init.sdem_addrl = sdem_addr & 0xffff;
181 dsp_message.payload.init.sdem_addrh = sdem_addr >> 16;
182
183 DEBUGF("dsp_message: %04x %04x %04x %04x",
184 ((unsigned short *)&dsp_message)[0],
185 ((unsigned short *)&dsp_message)[1],
186 ((unsigned short *)&dsp_message)[2],
187 ((unsigned short *)&dsp_message)[3]);
188#endif
189
190}
191
192void DSPHINT(void)
193{
194 unsigned long sdem_addr;
195 unsigned int i;
196 char buffer[80];
197
198 IO_INTC_IRQ0 = 1 << 11;
199
200 switch (dsp_message.msg)
201 {
202 case MSG_DEBUGF:
203 /* DSP stores one character per word. */
204 for (i = 0; i < sizeof(buffer); i++)
205 {
206 buffer[i] = dsp_message.payload.debugf.buffer[i];
207 }
208
209 /* Release shared area to DSP. */
210 dsp_wake();
211
212 DEBUGF("DSP: %s", buffer);
213 break;
214 case MSG_REFILL:
215 sdem_addr = (unsigned long)the_rover + index_rover - CONFIG_SDRAM_START;
216
217 DSP_(_sdem_addrl) = sdem_addr & 0xffff;
218 DSP_(_sdem_addrh) = sdem_addr >> 16;
219 DSP_(_sdem_dsp_size) = ARM_BUFFER_SIZE;
220
221 index_rover += ARM_BUFFER_SIZE;
222 if (index_rover >= 4*1024*1024)
223 {
224 index_rover = 0;
225 }
226
227 DEBUGF("pcm_sdram at 0x%08lx, sdem_addr 0x%08lx",
228 (unsigned long)the_rover, (unsigned long)sdem_addr);
229
230 break;
231 default:
232 DEBUGF("DSP: unknown msg 0x%04x", dsp_message.msg);
233 break;
234 }
235
236 /* Release shared area to DSP. */
237 dsp_wake();
238
239 DEBUGF("DSP: %s", buffer);
240}