summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/Makefile2
-rw-r--r--firmware/bitswap.S101
-rw-r--r--firmware/mpeg.c62
3 files changed, 104 insertions, 61 deletions
diff --git a/firmware/Makefile b/firmware/Makefile
index 7d09809713..aab5249b25 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -35,7 +35,7 @@ endif
35 35
36SRC := $(wildcard drivers/*.c common/*.c *.c) 36SRC := $(wildcard drivers/*.c common/*.c *.c)
37 37
38OBJS := $(SRC:%.c=$(OBJDIR)/%.o) $(OBJDIR)/crt0.o 38OBJS := $(SRC:%.c=$(OBJDIR)/%.o) $(OBJDIR)/crt0.o $(OBJDIR)/bitswap.o
39DEPS:=.deps 39DEPS:=.deps
40DEPDIRS:=$(DEPS) $(DEPS)/drivers $(DEPS)/common $(DEPS)/malloc 40DEPDIRS:=$(DEPS) $(DEPS)/drivers $(DEPS)/common $(DEPS)/malloc
41 41
diff --git a/firmware/bitswap.S b/firmware/bitswap.S
new file mode 100644
index 0000000000..5f94fedb36
--- /dev/null
+++ b/firmware/bitswap.S
@@ -0,0 +1,101 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 by Magnus Holmgren
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20 .section .icode,"ax",@progbits
21 .global _bitswap
22 .align 4
23 .type _bitswap,@function
24
25/* Registers used:
26 *
27 * r0 Temporary (required by some instructions)
28 * r1 Low byte
29 * r2 High byte
30 * r3 Result after flip
31 * r4 Data
32 * r5 Length
33 * r6 Current (position in Data)
34 * r7 Flip table
35 */
36
37_bitswap:
38 mov.l .fliptable,r7
39 mov r4,r6
40 add r5,r6 /* goto end of buffer */
41 add r5,r6 /* (direction IS important) */
42 bra .init
43.loop:
44 mov.w @r4,r1 /* data to flip */
45 swap.b r1,r2
46 extu.b r2,r0 /* high byte */
47 mov.b @(r0,r7),r2
48 extu.b r2,r0 /* remove any sign extend */
49 swap.b r0,r3 /* put high byte in result */
50 extu.b r1,r0 /* low byte */
51 mov.b @(r0,r7),r1
52 extu.b r1,r0 /* remove any sign extend */
53 or r0,r3 /* put low byte in result */
54 mov.w r3,@r4 /* store result */
55 add #2,r4
56.init:
57 cmp/gt r4,r6 /* while (data < start+length*2) */
58 bt .loop
59 rts
60
61 .align 4
62
63.fliptable:
64 .long _fliptable
65
66_fliptable:
67 .byte 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0
68 .byte 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0
69 .byte 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8
70 .byte 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8
71 .byte 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4
72 .byte 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4
73 .byte 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec
74 .byte 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc
75 .byte 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2
76 .byte 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2
77 .byte 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea
78 .byte 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa
79 .byte 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6
80 .byte 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6
81 .byte 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee
82 .byte 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe
83 .byte 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1
84 .byte 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1
85 .byte 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9
86 .byte 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9
87 .byte 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5
88 .byte 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5
89 .byte 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed
90 .byte 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd
91 .byte 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3
92 .byte 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3
93 .byte 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb
94 .byte 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb
95 .byte 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7
96 .byte 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7
97 .byte 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef
98 .byte 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
99
100.end:
101 .size _bitswap,.end-_bitswap
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index a3fdf2188f..a49f444dc2 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -35,6 +35,8 @@
35#include "file.h" 35#include "file.h"
36#endif 36#endif
37 37
38extern void bitswap(unsigned short *data, int length);
39
38#define MPEG_CHUNKSIZE 0x180000 40#define MPEG_CHUNKSIZE 0x180000
39#define MPEG_SWAP_CHUNKSIZE 0x8000 41#define MPEG_SWAP_CHUNKSIZE 0x8000
40#define MPEG_HIGH_WATER 2 42#define MPEG_HIGH_WATER 2
@@ -347,44 +349,6 @@ static unsigned int prescale_table[] =
347}; 349};
348#endif 350#endif
349 351
350static unsigned char fliptable[] =
351{
352 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
353 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
354 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
355 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
356 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
357 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
358 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
359 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
360 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
361 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
362 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
363 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
364 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
365 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
366 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
367 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
368 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
369 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
370 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
371 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
372 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
373 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
374 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
375 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
376 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
377 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
378 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
379 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
380 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
381 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
382 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
383 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
384};
385
386static unsigned short big_fliptable[65536];
387
388static struct event_queue mpeg_queue; 352static struct event_queue mpeg_queue;
389static char mpeg_stack[DEFAULT_STACK_SIZE + 0x1000]; 353static char mpeg_stack[DEFAULT_STACK_SIZE + 0x1000];
390static char mpeg_thread_name[] = "mpeg"; 354static char mpeg_thread_name[] = "mpeg";
@@ -407,16 +371,6 @@ static bool filling; /* We are filling the buffer with data from disk */
407 371
408static int mpeg_file; 372static int mpeg_file;
409 373
410static void create_fliptable(void)
411{
412 int i;
413
414 for(i = 0;i < 65536;i++)
415 {
416 big_fliptable[i] = fliptable[i & 0xff] | (fliptable[i >> 8] << 8);
417 }
418}
419
420static void mas_poll_start(int interval_in_ms) 374static void mas_poll_start(int interval_in_ms)
421{ 375{
422 unsigned int count; 376 unsigned int count;
@@ -518,16 +472,6 @@ static void dma_tick(void)
518 } 472 }
519} 473}
520 474
521static void bitswap(unsigned short *data, int length) __attribute__ ((section (".icode")));
522static void bitswap(unsigned short *data, int length)
523{
524 int i = length;
525 while(i--)
526 {
527 data[i] = big_fliptable[data[i]];
528 }
529}
530
531static void reset_mp3_buffer(void) 475static void reset_mp3_buffer(void)
532{ 476{
533 mp3buf_read = 0; 477 mp3buf_read = 0;
@@ -1621,8 +1565,6 @@ void mpeg_init(int volume, int bass, int treble, int balance, int loudness, int
1621 1565
1622 mp3buflen = mp3end - mp3buf; 1566 mp3buflen = mp3end - mp3buf;
1623 1567
1624 create_fliptable();
1625
1626 queue_init(&mpeg_queue); 1568 queue_init(&mpeg_queue);
1627 create_thread(mpeg_thread, mpeg_stack, 1569 create_thread(mpeg_thread, mpeg_stack,
1628 sizeof(mpeg_stack), mpeg_thread_name); 1570 sizeof(mpeg_stack), mpeg_thread_name);