summaryrefslogtreecommitdiff
path: root/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c')
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c91
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
28void pcm_postinit(void) 32void pcm_postinit(void)
29{ 33{
30 34 audiohw_postinit();
31} 35}
32 36
33const void * pcm_play_dma_get_peak_buffer(int *count) 37const 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
39void pcm_play_dma_init(void) 43void 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
44void pcm_dma_apply_settings(void) 54void pcm_dma_apply_settings(void)
45{ 55{
56 audiohw_set_frequency(pcm_fsel);
46} 57}
47 58
48void pcm_play_dma_start(const void *addr, size_t size) 59void 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
54void pcm_play_dma_stop(void) 69void pcm_play_dma_stop(void)
@@ -73,5 +88,69 @@ void pcm_play_dma_pause(bool pause)
73 88
74size_t pcm_get_bytes_waiting(void) 89size_t pcm_get_bytes_waiting(void)
75{ 90{
76 return 0; 91 return DSP_(_sdem_dsp_size)-DSP_(_sdem_level);
92}
93
94void 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