diff options
-rw-r--r-- | apps/codecs/Tremor/vorbisfile.c | 19 | ||||
-rw-r--r-- | apps/codecs/codec.h | 1 | ||||
-rw-r--r-- | apps/codecs/liba52/parse.c | 2 | ||||
-rw-r--r-- | apps/codecs/libmad/imdct_mcf5249.S | 1 | ||||
-rw-r--r-- | apps/codecs/libmad/layer3.c | 2 | ||||
-rw-r--r-- | apps/codecs/libmad/synth.c | 7 | ||||
-rw-r--r-- | apps/codecs/libmusepack/mpc_decoder.c | 4 | ||||
-rw-r--r-- | apps/codecs/libmusepack/synth_filter.c | 3 | ||||
-rw-r--r-- | apps/codecs/mpa.c | 3 | ||||
-rw-r--r-- | apps/dsp.c | 15 | ||||
-rw-r--r-- | firmware/export/system.h | 17 |
11 files changed, 44 insertions, 30 deletions
diff --git a/apps/codecs/Tremor/vorbisfile.c b/apps/codecs/Tremor/vorbisfile.c index 92f42a313b..70c0cdb24e 100644 --- a/apps/codecs/Tremor/vorbisfile.c +++ b/apps/codecs/Tremor/vorbisfile.c | |||
@@ -762,6 +762,12 @@ int ov_clear(OggVorbis_File *vf){ | |||
762 | 762 | ||
763 | int ov_open_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes, | 763 | int ov_open_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes, |
764 | ov_callbacks callbacks){ | 764 | ov_callbacks callbacks){ |
765 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) | ||
766 | /* this seems to be the closest we get to an init function, let's init emac | ||
767 | here. rounding is disabled because of MULT31_SHIFT15, which will be | ||
768 | inaccurate with rounding in its current incarnation */ | ||
769 | coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE); | ||
770 | #endif | ||
765 | int ret=_ov_open1(f,vf,initial,ibytes,callbacks); | 771 | int ret=_ov_open1(f,vf,initial,ibytes,callbacks); |
766 | if(ret)return ret; | 772 | if(ret)return ret; |
767 | return _ov_open2(vf); | 773 | return _ov_open2(vf); |
@@ -1287,15 +1293,12 @@ int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){ | |||
1287 | int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){ | 1293 | int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){ |
1288 | ogg_packet op={0,0,0,0,0,0}; | 1294 | ogg_packet op={0,0,0,0,0,0}; |
1289 | ogg_page og={0,0,0,0}; | 1295 | ogg_page og={0,0,0,0}; |
1296 | |||
1290 | int thisblock,lastblock=0; | 1297 | int thisblock,lastblock=0; |
1291 | int ret=ov_pcm_seek_page(vf,pos); | 1298 | int ret=ov_pcm_seek_page(vf,pos); |
1292 | if(ret<0)return(ret); | 1299 | if(ret<0)return(ret); |
1293 | _make_decode_ready(vf); | 1300 | _make_decode_ready(vf); |
1294 | 1301 | ||
1295 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) | ||
1296 | mcf5249_init_mac(); | ||
1297 | #endif | ||
1298 | |||
1299 | /* discard leading packets we don't need for the lapping of the | 1302 | /* discard leading packets we don't need for the lapping of the |
1300 | position we want; don't decode them */ | 1303 | position we want; don't decode them */ |
1301 | 1304 | ||
@@ -1553,10 +1556,6 @@ long ov_read(OggVorbis_File *vf,char *buffer,int bytes_req,int *bitstream){ | |||
1553 | 1556 | ||
1554 | if(vf->ready_state<OPENED)return(OV_EINVAL); | 1557 | if(vf->ready_state<OPENED)return(OV_EINVAL); |
1555 | 1558 | ||
1556 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) | ||
1557 | mcf5249_init_mac(); | ||
1558 | #endif | ||
1559 | |||
1560 | while(1){ | 1559 | while(1){ |
1561 | if(vf->ready_state==INITSET){ | 1560 | if(vf->ready_state==INITSET){ |
1562 | samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); | 1561 | samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); |
@@ -1622,10 +1621,6 @@ long ov_read_fixed(OggVorbis_File *vf,ogg_int32_t ***pcm_channels,int length, | |||
1622 | int *bitstream){ | 1621 | int *bitstream){ |
1623 | if(vf->ready_state<OPENED)return(OV_EINVAL); | 1622 | if(vf->ready_state<OPENED)return(OV_EINVAL); |
1624 | 1623 | ||
1625 | #if CONFIG_CPU == MCF5249 | ||
1626 | mcf5249_init_mac(); | ||
1627 | #endif | ||
1628 | |||
1629 | while(1){ | 1624 | while(1){ |
1630 | if(vf->ready_state==INITSET){ | 1625 | if(vf->ready_state==INITSET){ |
1631 | ogg_int32_t **pcm; | 1626 | ogg_int32_t **pcm; |
diff --git a/apps/codecs/codec.h b/apps/codecs/codec.h index c00d2bda95..0da653cf04 100644 --- a/apps/codecs/codec.h +++ b/apps/codecs/codec.h | |||
@@ -20,6 +20,7 @@ | |||
20 | /* Global declarations to be used in rockbox software codecs */ | 20 | /* Global declarations to be used in rockbox software codecs */ |
21 | 21 | ||
22 | #include "config.h" | 22 | #include "config.h" |
23 | #include "system.h" | ||
23 | 24 | ||
24 | #include <sys/types.h> | 25 | #include <sys/types.h> |
25 | 26 | ||
diff --git a/apps/codecs/liba52/parse.c b/apps/codecs/liba52/parse.c index d5b323c701..9e7ed47d56 100644 --- a/apps/codecs/liba52/parse.c +++ b/apps/codecs/liba52/parse.c | |||
@@ -59,7 +59,7 @@ a52_state_t * a52_init (uint32_t mm_accel) | |||
59 | int i; | 59 | int i; |
60 | 60 | ||
61 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) | 61 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) |
62 | asm volatile ("move.l #0x30, %macsr"); /* frac. mode with rounding */ | 62 | coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_ROUND | EMAC_SATURATE); |
63 | #endif | 63 | #endif |
64 | /* | 64 | /* |
65 | this needs to come back if we ever want two decoder instances | 65 | this needs to come back if we ever want two decoder instances |
diff --git a/apps/codecs/libmad/imdct_mcf5249.S b/apps/codecs/libmad/imdct_mcf5249.S index 62b33c3f07..1afd910fa8 100644 --- a/apps/codecs/libmad/imdct_mcf5249.S +++ b/apps/codecs/libmad/imdct_mcf5249.S | |||
@@ -32,7 +32,6 @@ III_imdct_s: | |||
32 | * get more low bits out of the accext01 register _before_ doing the | 32 | * get more low bits out of the accext01 register _before_ doing the |
33 | * movclrs. | 33 | * movclrs. |
34 | */ | 34 | */ |
35 | move.l #0xb0, %macsr /* frac mode, saturation, rounding */ | ||
36 | sub.l %a0, %a0 /* clear loop variable */ | 35 | sub.l %a0, %a0 /* clear loop variable */ |
37 | .imdctloop: /* outer loop label */ | 36 | .imdctloop: /* outer loop label */ |
38 | lea.l imdct_s, %a1 /* load pointer to imdct coefs in a1 */ | 37 | lea.l imdct_s, %a1 /* load pointer to imdct coefs in a1 */ |
diff --git a/apps/codecs/libmad/layer3.c b/apps/codecs/libmad/layer3.c index b5fa2be6f5..6d528ea52c 100644 --- a/apps/codecs/libmad/layer3.c +++ b/apps/codecs/libmad/layer3.c | |||
@@ -1775,8 +1775,6 @@ void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36]) | |||
1775 | mad_fixed_t t[16]; | 1775 | mad_fixed_t t[16]; |
1776 | /* assumes FRACBITS = 28 */ | 1776 | /* assumes FRACBITS = 28 */ |
1777 | asm volatile ( | 1777 | asm volatile ( |
1778 | "move.l #0xb0, %%d0\n\t" /* frac. mode, saturate, round */ | ||
1779 | "move.l %%d0, %%macsr\n\t" | ||
1780 | "move.l (4*4, %[X]), %%d0\n\t" | 1778 | "move.l (4*4, %[X]), %%d0\n\t" |
1781 | "move.l #0x0ec835e8, %%d1\n\t" | 1779 | "move.l #0x0ec835e8, %%d1\n\t" |
1782 | "mac.l %%d0, %%d1, (13*4, %[X]), %%d0, %%acc0\n\t" | 1780 | "mac.l %%d0, %%d1, (13*4, %[X]), %%d0, %%acc0\n\t" |
diff --git a/apps/codecs/libmad/synth.c b/apps/codecs/libmad/synth.c index bdec4258fb..4315e239e8 100644 --- a/apps/codecs/libmad/synth.c +++ b/apps/codecs/libmad/synth.c | |||
@@ -42,6 +42,11 @@ void mad_synth_init(struct mad_synth *synth) | |||
42 | synth->pcm.samplerate = 0; | 42 | synth->pcm.samplerate = 0; |
43 | synth->pcm.channels = 0; | 43 | synth->pcm.channels = 0; |
44 | synth->pcm.length = 0; | 44 | synth->pcm.length = 0; |
45 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) | ||
46 | /* init the emac unit here, since this function should always be called | ||
47 | before using libmad */ | ||
48 | coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE | EMAC_ROUND); | ||
49 | #endif | ||
45 | } | 50 | } |
46 | 51 | ||
47 | /* | 52 | /* |
@@ -582,8 +587,6 @@ void synth_full(struct mad_synth *synth, struct mad_frame const *frame, | |||
582 | mad_fixed_t const (*Dptr)[32]; | 587 | mad_fixed_t const (*Dptr)[32]; |
583 | mad_fixed64hi_t hi; | 588 | mad_fixed64hi_t hi; |
584 | 589 | ||
585 | asm volatile("move.l #0x20, %macsr"); /* fractional mode */ | ||
586 | |||
587 | for (ch = 0; ch < nch; ++ch) { | 590 | for (ch = 0; ch < nch; ++ch) { |
588 | sbsample = &frame->sbsample[ch]; | 591 | sbsample = &frame->sbsample[ch]; |
589 | filter = &synth->filter[ch]; | 592 | filter = &synth->filter[ch]; |
diff --git a/apps/codecs/libmusepack/mpc_decoder.c b/apps/codecs/libmusepack/mpc_decoder.c index 0c8b8b76a7..a37dc4583c 100644 --- a/apps/codecs/libmusepack/mpc_decoder.c +++ b/apps/codecs/libmusepack/mpc_decoder.c | |||
@@ -1173,6 +1173,10 @@ void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r) | |||
1173 | mpc_decoder_initialisiere_quantisierungstabellen(d, 1.0f); | 1173 | mpc_decoder_initialisiere_quantisierungstabellen(d, 1.0f); |
1174 | mpc_decoder_init_huffman_sv6(d); | 1174 | mpc_decoder_init_huffman_sv6(d); |
1175 | mpc_decoder_init_huffman_sv7(d); | 1175 | mpc_decoder_init_huffman_sv7(d); |
1176 | |||
1177 | #if defined(CPU_COLDFIRE)&& !defined(SIMULATOR) | ||
1178 | coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_ROUND | EMAC_SATURATE); | ||
1179 | #endif | ||
1176 | } | 1180 | } |
1177 | 1181 | ||
1178 | static void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si) | 1182 | static void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si) |
diff --git a/apps/codecs/libmusepack/synth_filter.c b/apps/codecs/libmusepack/synth_filter.c index 7644551d16..51ffcce921 100644 --- a/apps/codecs/libmusepack/synth_filter.c +++ b/apps/codecs/libmusepack/synth_filter.c | |||
@@ -335,9 +335,6 @@ static void Synthese_Filter_float_internal(MPC_SAMPLE_FORMAT * OutData,MPC_SAMPL | |||
335 | { | 335 | { |
336 | mpc_uint32_t n; | 336 | mpc_uint32_t n; |
337 | 337 | ||
338 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) | ||
339 | asm volatile ("move.l #0x20, %macsr"); /* fractional emac mode */ | ||
340 | #endif | ||
341 | for ( n = 0; n < 36; n++, Y += 32 ) { | 338 | for ( n = 0; n < 36; n++, Y += 32 ) { |
342 | V -= 64; | 339 | V -= 64; |
343 | Calculate_New_V ( Y, V ); | 340 | Calculate_New_V ( Y, V ); |
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c index 7beecd9edb..9970d57240 100644 --- a/apps/codecs/mpa.c +++ b/apps/codecs/mpa.c | |||
@@ -114,9 +114,6 @@ enum codec_status codec_start(struct codec_api* api) | |||
114 | ci->memset(&Synth, 0, sizeof(struct mad_synth)); | 114 | ci->memset(&Synth, 0, sizeof(struct mad_synth)); |
115 | ci->memset(&Timer, 0, sizeof(mad_timer_t)); | 115 | ci->memset(&Timer, 0, sizeof(mad_timer_t)); |
116 | 116 | ||
117 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) | ||
118 | mcf5249_init_mac(); | ||
119 | #endif | ||
120 | mad_stream_init(&Stream); | 117 | mad_stream_init(&Stream); |
121 | mad_frame_init(&Frame); | 118 | mad_frame_init(&Frame); |
122 | mad_synth_init(&Synth); | 119 | mad_synth_init(&Synth); |
diff --git a/apps/dsp.c b/apps/dsp.c index 8064a881a3..23b7ea548d 100644 --- a/apps/dsp.c +++ b/apps/dsp.c | |||
@@ -43,7 +43,6 @@ | |||
43 | 43 | ||
44 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) | 44 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) |
45 | 45 | ||
46 | #define INIT() asm volatile ("move.l #0xb0, %macsr") /* frac, round, clip */ | ||
47 | /* Multiply two S.31 fractional integers and return the sign bit and the | 46 | /* Multiply two S.31 fractional integers and return the sign bit and the |
48 | * 31 most significant bits of the result. | 47 | * 31 most significant bits of the result. |
49 | */ | 48 | */ |
@@ -89,7 +88,6 @@ | |||
89 | 88 | ||
90 | #else | 89 | #else |
91 | 90 | ||
92 | #define INIT() | ||
93 | #define FRACMUL(x, y) (long) (((((long long) (x)) * ((long long) (y))) >> 31)) | 91 | #define FRACMUL(x, y) (long) (((((long long) (x)) * ((long long) (y))) >> 31)) |
94 | #define FRACMUL_8(x, y) (long) (((((long long) (x)) * ((long long) (y))) >> 23)) | 92 | #define FRACMUL_8(x, y) (long) (((((long long) (x)) * ((long long) (y))) >> 23)) |
95 | #define FRACMUL_8_LOOP(x, y, s) \ | 93 | #define FRACMUL_8_LOOP(x, y, s) \ |
@@ -492,11 +490,17 @@ long dsp_process(char* dst, char* src[], long size) | |||
492 | long factor; | 490 | long factor; |
493 | int samples; | 491 | int samples; |
494 | 492 | ||
493 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) | ||
494 | /* set emac unit for dsp processing, and save old macsr, we're running in | ||
495 | codec thread context at this point, so can't clobber it */ | ||
496 | unsigned long old_macsr = coldfire_get_macsr(); | ||
497 | coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_ROUND | EMAC_SATURATE); | ||
498 | #endif | ||
499 | |||
495 | dsp = &dsp_conf[current_codec]; | 500 | dsp = &dsp_conf[current_codec]; |
496 | 501 | ||
497 | factor = (dsp->stereo_mode != STEREO_MONO) ? 2 : 1; | 502 | factor = (dsp->stereo_mode != STEREO_MONO) ? 2 : 1; |
498 | size /= dsp->sample_bytes * factor; | 503 | size /= dsp->sample_bytes * factor; |
499 | INIT(); | ||
500 | dsp_set_replaygain(false); | 504 | dsp_set_replaygain(false); |
501 | 505 | ||
502 | while (size > 0) | 506 | while (size > 0) |
@@ -510,7 +514,10 @@ long dsp_process(char* dst, char* src[], long size) | |||
510 | dst += samples * sizeof(short) * 2; | 514 | dst += samples * sizeof(short) * 2; |
511 | yield(); | 515 | yield(); |
512 | } | 516 | } |
513 | 517 | #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) | |
518 | /* set old macsr again */ | ||
519 | coldfire_set_macsr(old_macsr); | ||
520 | #endif | ||
514 | return written * sizeof(short) * 2; | 521 | return written * sizeof(short) * 2; |
515 | } | 522 | } |
516 | 523 | ||
diff --git a/firmware/export/system.h b/firmware/export/system.h index 895b3f7529..07b7094615 100644 --- a/firmware/export/system.h +++ b/firmware/export/system.h | |||
@@ -125,8 +125,21 @@ enum { | |||
125 | : /* %0 */ "d"(mask), \ | 125 | : /* %0 */ "d"(mask), \ |
126 | /* %1 */ "a"(address)) | 126 | /* %1 */ "a"(address)) |
127 | 127 | ||
128 | static inline void mcf5249_init_mac(void) { | 128 | #define EMAC_ROUND 0x10 |
129 | asm volatile ("move.l #0x20, %macsr;"); /* frac, truncate, no saturation */ | 129 | #define EMAC_FRACTIONAL 0x20 |
130 | #define EMAC_SATURATE 0x80 | ||
131 | |||
132 | static inline void coldfire_set_macsr(const unsigned long flags) | ||
133 | { | ||
134 | asm volatile ("move.l %0, %%macsr" : : "r" (flags)); | ||
135 | } | ||
136 | |||
137 | static inline unsigned long coldfire_get_macsr(void) | ||
138 | { | ||
139 | unsigned long m; | ||
140 | |||
141 | asm volatile ("move.l %%macsr, %0" : "=r" (m)); | ||
142 | return m; | ||
130 | } | 143 | } |
131 | 144 | ||
132 | #endif | 145 | #endif |