blob: 7dcbac7dcc1d05a69a3b069daaf18a03ac3f27e3 [file] [log] [blame]
Maurus Cuelenaere944c3342008-08-27 20:32:12 +00001/***************************************************************************
2* __________ __ ___.
3* Open \______ \ ____ ____ | | _\_ |__ _______ ___
4* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7* \/ \/ \/ \/ \/
8* $Id$
9*
10* Copyright (C) 2008 by Maurus Cuelenaere
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#include "system.h"
21#include "lcd.h"
22#include "kernel.h"
23#include "thread.h"
Frank Gevaerts2f8a0082008-11-01 16:14:28 +000024#include "storage.h"
Maurus Cuelenaere944c3342008-08-27 20:32:12 +000025#include "ata-target.h"
26#include "disk.h"
27#include "font.h"
28#include "backlight.h"
29#include "button.h"
30#include "common.h"
Maurus Cuelenaereee1e8be2009-02-05 21:47:54 +000031#include "usb.h"
Rafaël Carré5d236b22010-05-27 09:41:46 +000032#include "version.h"
Maurus Cuelenaere944c3342008-08-27 20:32:12 +000033
34
35static void load_fw(unsigned char* ptr, unsigned int len)
36{
37 (void)ptr;
38 (void)len;
39 asm volatile("ldr pc, =0x1EE0000");
40}
41
42void main(void)
43{
44 unsigned char* loadbuffer;
45 int buffer_size;
46 int(*kernel_entry)(void);
47 int ret;
48
Maurus Cuelenaere78d44382008-08-27 20:35:41 +000049 /* Make sure interrupts are disabled */
50 set_irq_level(IRQ_DISABLED);
Maurus Cuelenaere944c3342008-08-27 20:32:12 +000051 set_fiq_status(FIQ_DISABLED);
52 system_init();
53 kernel_init();
Maurus Cuelenaere78d44382008-08-27 20:35:41 +000054
55 /* Now enable interrupts */
56 set_irq_level(IRQ_ENABLED);
Maurus Cuelenaere944c3342008-08-27 20:32:12 +000057 set_fiq_status(FIQ_ENABLED);
58 backlight_init();
59 lcd_init();
60 font_init();
61 button_init();
Maurus Cuelenaereee1e8be2009-02-05 21:47:54 +000062 usb_init();
Maurus Cuelenaere944c3342008-08-27 20:32:12 +000063
Thomas Martitzb5e6eec2009-03-17 21:23:02 +000064#ifdef HAVE_LCD_ENABLE
Maurus Cuelenaere944c3342008-08-27 20:32:12 +000065 lcd_enable(true);
Thomas Martitzb5e6eec2009-03-17 21:23:02 +000066#endif
Maurus Cuelenaere944c3342008-08-27 20:32:12 +000067 lcd_setfont(FONT_SYSFIXED);
68 reset_screen();
69 printf("Rockbox boot loader");
Rafaël Carré5d236b22010-05-27 09:41:46 +000070 printf("Version " RBVERSION);
Maurus Cuelenaere944c3342008-08-27 20:32:12 +000071
Frank Gevaerts2f8a0082008-11-01 16:14:28 +000072 ret = storage_init();
Maurus Cuelenaere78d44382008-08-27 20:35:41 +000073 if(ret)
74 printf("ATA error: %d", ret);
Maurus Cuelenaereee1e8be2009-02-05 21:47:54 +000075
Maurus Cuelenaere23fc9232008-09-07 17:24:14 +000076 /* If no button is held, start the OF */
77 if(button_read_device() == 0)
Maurus Cuelenaere944c3342008-08-27 20:32:12 +000078 {
79 printf("Loading Creative firmware...");
80
81 loadbuffer = (unsigned char*)0x00A00000;
82 ret = load_minifs_file("creativeos.jrm", loadbuffer);
83 if(ret != -1)
84 {
Maurus Cuelenaere78d44382008-08-27 20:35:41 +000085 set_irq_level(IRQ_DISABLED);
Maurus Cuelenaere944c3342008-08-27 20:32:12 +000086 set_fiq_status(FIQ_DISABLED);
87 /* Doesn't return! */
88 load_fw(loadbuffer, ret);
89 }
90 else
91 printf("FAILED!");
92 }
93 else
94 {
95 disk_init();
96
97 ret = disk_mount_all();
98 if (ret <= 0)
Rafaël Carré1ec82122010-06-23 05:08:36 +000099 error(EDISK, ret, true);
Maurus Cuelenaere944c3342008-08-27 20:32:12 +0000100
101 printf("Loading Rockbox firmware...");
102
103 loadbuffer = (unsigned char*)0x00900000;
104 buffer_size = (unsigned char*)0x01900000 - loadbuffer;
105
106 ret = load_firmware(loadbuffer, BOOTFILE, buffer_size);
107 if(ret < 0)
Rafaël Carré1ec82122010-06-23 05:08:36 +0000108 error(EBOOTFILE, ret, true);
Maurus Cuelenaere944c3342008-08-27 20:32:12 +0000109
110 else if(ret == EOK)
111 {
112 kernel_entry = (void*) loadbuffer;
113 ret = kernel_entry();
114 printf("FAILED!");
115 }
116 }
117
Maurus Cuelenaereee1e8be2009-02-05 21:47:54 +0000118 storage_sleepnow();
119
Maurus Cuelenaere944c3342008-08-27 20:32:12 +0000120 while(1);
121}