1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 Randy D. Wood
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.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
30 #define IRQ0_EDGE_TRIGGER 0x80
32 static void rolo_error(char *text
)
35 lcd_puts(0, 0, "ROLO error:");
36 lcd_puts_scroll(0, 1, text
);
41 /***************************************************************************
43 * Name: rolo_load_app(char *filename,int scrambled)
44 * Filename must be a fully defined filename including the path and extension
46 ***************************************************************************/
47 int rolo_load(char* filename
) __attribute__ ((section (".topcode")));
48 int rolo_load(char* filename
)
51 unsigned long length
,file_length
,i
;
52 extern unsigned char mp3buf
[],mp3end
;
53 unsigned short checksum
,file_checksum
;
54 unsigned char* ramstart
= (void*)0x09000000;
55 void (*start_func
)(void) = (void*)ramstart
+ 0x200;
58 lcd_puts(0, 0, "ROLO...");
59 lcd_puts(0, 1, "Loading");
64 fd
= open(filename
, O_RDONLY
);
66 rolo_error("File not found");
70 /* Read file length from header and compare to real file length */
71 length
=lseek(fd
,0,SEEK_END
)-6;
72 lseek(fd
, 0, SEEK_SET
);
73 if(read(fd
, &file_length
, 4) != 4) {
74 rolo_error("Error Reading File Length");
77 if (length
!= file_length
) {
78 rolo_error("File length mismatch");
82 /* Read and save checksum */
83 lseek(fd
, 4, SEEK_SET
);
84 if (read(fd
, &file_checksum
, 2) != 2) {
85 rolo_error("Error Reading checksum");
88 lseek(fd
, 6, SEEK_SET
);
90 /* verify that file can be read and descrambled */
91 if ((&mp3buf
[0] + (2*length
)+4) >= &mp3end
) {
92 rolo_error("Not enough room to load file");
96 if (read(fd
, &mp3buf
[length
], length
) != (int)length
) {
97 rolo_error("Error Reading File");
101 lcd_puts(0, 1, "Descramble");
106 for (i
= 0; i
< length
; i
++) {
107 unsigned long addr
= ((i
% slen
) << 2) + i
/slen
;
108 unsigned char data
= mp3buf
[i
+length
];
109 data
= ~((data
>> 1) | ((data
<< 7) & 0x80)); /* poor man's ROR */
113 /* Compute checksum and verify against checksum from file header */
115 for (i
=0; i
<length
; i
++)
116 checksum
+= mp3buf
[i
];
118 if (checksum
!= file_checksum
) {
119 rolo_error("Checksum Error");
123 lcd_puts(0, 1, "Executing ");
126 /* Disable interrupts */
127 asm("mov #15<<4,r6\n"
130 /* Calling these 2 initialization routines was necessary to get the
131 the origional Archos version of the firmware to load and execute. */
132 system_init(); /* Initialize system for restart */
133 i2c_init(); /* Init i2c bus - it seems like a good idea */
134 ICR
= IRQ0_EDGE_TRIGGER
; /* Make IRQ0 edge triggered */
136 /* move firmware to start of ram */
137 for ( i
=0; i
< length
/4+1; i
++ )
138 ((unsigned int*)ramstart
)[i
] = ((unsigned int*)mp3buf
)[i
];
140 start_func(); /* start new firmware */
142 return 0; /* this is never reached */