summaryrefslogtreecommitdiffstats
path: root/bootloader
diff options
context:
space:
mode:
authorTomasz Moń <desowin@gmail.com>2011-11-16 14:08:01 +0000
committerTomasz Moń <desowin@gmail.com>2011-11-16 14:08:01 +0000
commite8a8a1be43afe63079ae48ce1a9eb3052df3b1a4 (patch)
tree084e1cdf27a339ce58e24cff8fec8c31432b52db /bootloader
parent992d4eb775cac48e107e18d72783ebfb39c4234f (diff)
downloadrockbox-e8a8a1be43afe63079ae48ce1a9eb3052df3b1a4.tar.gz
rockbox-e8a8a1be43afe63079ae48ce1a9eb3052df3b1a4.tar.bz2
rockbox-e8a8a1be43afe63079ae48ce1a9eb3052df3b1a4.zip
Sandisk Sansa Connect port (FS #12363)
Included are drivers for buttons, backlight, lcd, audio and storage. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31000 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader')
-rw-r--r--bootloader/SOURCES3
-rw-r--r--bootloader/sansaconnect.c135
2 files changed, 138 insertions, 0 deletions
diff --git a/bootloader/SOURCES b/bootloader/SOURCES
index 1725939fa3..4678175bb6 100644
--- a/bootloader/SOURCES
+++ b/bootloader/SOURCES
@@ -70,4 +70,7 @@ mpio_hd200_hd300.c
#elif defined(RK27_GENERIC) || defined(HM60X) || defined(HM801)
rk27xx.c
show_logo.c
+#elif defined(SANSA_CONNECT)
+sansaconnect.c
+show_logo.c
#endif
diff --git a/bootloader/sansaconnect.c b/bootloader/sansaconnect.c
new file mode 100644
index 0000000000..9ef831f0b3
--- /dev/null
+++ b/bootloader/sansaconnect.c
@@ -0,0 +1,135 @@
+/***************************************************************************
+* __________ __ ___.
+* Open \______ \ ____ ____ | | _\_ |__ _______ ___
+* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+* \/ \/ \/ \/ \/
+* $Id: $
+*
+* Copyright (C) 2011 by Tomasz Moń
+*
+* All files in this archive are subject to the GNU General Public License.
+* See the file COPYING in the source tree root for full license agreement.
+*
+* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+* KIND, either express or implied.
+*
+****************************************************************************/
+
+#include "system.h"
+#include "lcd.h"
+#include "kernel.h"
+#include "thread.h"
+#include "storage.h"
+#include "ata-target.h"
+#include "disk.h"
+#include "font.h"
+#include "backlight.h"
+#include "button.h"
+#include "common.h"
+#include "version.h"
+#include "uart-target.h"
+#include "power.h"
+
+extern void show_logo(void);
+
+void main(void)
+{
+ unsigned char* loadbuffer;
+ int buffer_size;
+ int(*kernel_entry)(void);
+ int ret;
+ int btn;
+
+ /* Make sure interrupts are disabled */
+ set_irq_level(IRQ_DISABLED);
+ set_fiq_status(FIQ_DISABLED);
+ system_init();
+ kernel_init();
+
+ /* Now enable interrupts */
+ set_irq_level(IRQ_ENABLED);
+ set_fiq_status(FIQ_ENABLED);
+ backlight_init();
+ lcd_init();
+ font_init();
+ button_init();
+
+#ifdef HAVE_LCD_ENABLE
+ lcd_enable(true);
+#endif
+ lcd_setfont(FONT_SYSFIXED);
+ reset_screen();
+ show_logo();
+
+ btn = button_read_device();
+
+ printf("Rockbox boot loader");
+ printf("Version " RBVERSION);
+
+ ret = storage_init();
+ if(ret)
+ printf("SD error: %d", ret);
+
+ disk_init(IF_MD(0));
+
+ ret = disk_mount_all();
+ if (ret <= 0)
+ error(EDISK, ret, true);
+
+ if (btn & BUTTON_PREV)
+ {
+ printf("Loading OF firmware...");
+ printf("Loading vmlinux.bin...");
+ loadbuffer = (unsigned char*)0x01008000;
+ buffer_size = 0x200000;
+
+ ret = load_raw_firmware(loadbuffer, "/vmlinux.bin", buffer_size);
+
+ if (ret < 0)
+ {
+ printf("Unable to load vmlinux.bin");
+ }
+ else
+ {
+ printf("Loading initrd.bin...");
+ loadbuffer = (unsigned char*)0x04400020;
+ buffer_size = 0x200000;
+ ret = load_raw_firmware(loadbuffer, "/initrd.bin", buffer_size);
+ }
+
+ if (ret > 0)
+ {
+ system_prepare_fw_start();
+
+ kernel_entry = (void*)0x01008000;
+ ret = kernel_entry();
+ printf("FAILED to boot OF");
+ }
+ }
+
+ printf("Loading Rockbox firmware...");
+
+ loadbuffer = (unsigned char*)CONFIG_SDRAM_START;
+ buffer_size = 0x1000000;
+
+ ret = load_firmware(loadbuffer, BOOTFILE, buffer_size);
+
+ if(ret < 0)
+ {
+ error(EBOOTFILE, ret, true);
+ }
+ else if(ret == EOK)
+ {
+ system_prepare_fw_start();
+
+ kernel_entry = (void*) loadbuffer;
+ ret = kernel_entry();
+ printf("FAILED!");
+ }
+
+ storage_sleepnow();
+
+ while(1);
+}