diff options
author | Karl Kurbjun <kkurbjun@gmail.com> | 2009-03-11 01:18:23 +0000 |
---|---|---|
committer | Karl Kurbjun <kkurbjun@gmail.com> | 2009-03-11 01:18:23 +0000 |
commit | 3c7ada594142b44bfb543f7ec693ac7250176287 (patch) | |
tree | a0a6cc746d5810c2e44643b627d5a181ad9acbdc /firmware/target/arm/tms320dm320/dsp-dm320.c | |
parent | 2d9caa9aa3aeebed58772eb6ed4b2f4aed85abf6 (diff) | |
download | rockbox-3c7ada594142b44bfb543f7ec693ac7250176287.tar.gz rockbox-3c7ada594142b44bfb543f7ec693ac7250176287.zip |
Sound working with rockbox PCM interface on the M:Robe 500. Doom and Rockboy run with sound. There are stability problems that need to be looked into causing the player to reset when music playback is attempted.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20284 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/tms320dm320/dsp-dm320.c')
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp-dm320.c | 123 |
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. */ | ||
31 | struct 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 |
43 | static void dsp_status(void) | 31 | static void dsp_status(void) |
44 | { | 32 | { |
@@ -74,7 +62,7 @@ static void dsp_status(void) | |||
74 | } | 62 | } |
75 | #endif | 63 | #endif |
76 | 64 | ||
77 | static void dsp_reset(void) | 65 | void 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 | ||
105 | static void dsp_load(const struct dsp_section *im) | 93 | void 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 | ||
134 | static signed short *the_rover = (signed short *)0x1900000; | ||
135 | static unsigned int index_rover = 0; | ||
136 | #define ARM_BUFFER_SIZE (PCM_SIZE) | ||
137 | |||
138 | void 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 | |||
192 | void 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 | } | ||