diff options
author | Jörg Hohensohn <hohensoh@rockbox.org> | 2005-06-21 00:11:14 +0000 |
---|---|---|
committer | Jörg Hohensohn <hohensoh@rockbox.org> | 2005-06-21 00:11:14 +0000 |
commit | 9cfa47a22647a293ea1697456fcdbaddc975830c (patch) | |
tree | 81c5bb8ab3e27f28b4261cff76a2d86b9da809b4 /flash/bootbox/main.c | |
parent | b6bd58261a253577dad9a7a5496d7717f9f6e4b8 (diff) |
"Bootbox" is a minimalistic rescue firmware for Archos models. Not working yet (Rolo problems). Created by configure script as bootloader.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6786 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'flash/bootbox/main.c')
-rw-r--r-- | flash/bootbox/main.c | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/flash/bootbox/main.c b/flash/bootbox/main.c new file mode 100644 index 0000000000..da9efcf728 --- /dev/null +++ b/flash/bootbox/main.c @@ -0,0 +1,237 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2005 by Jörg Hohensohn aka [IDC]Dragon + * + * 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 "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include "cpu.h" +#include "system.h" +#include "lcd.h" +#include "kernel.h" +#include "thread.h" +#include "ata.h" +#include "disk.h" +#include "font.h" +#include "adc.h" +#include "button.h" +#include "panic.h" +#include "power.h" +#include "file.h" +#include "rolo.h" +#include "usb.h" +#include "powermgmt.h" + +int line = 0; + +void usb_screen(void) +{ + lcd_clear_display(); + lcd_puts(0, 0, "USB mode"); +#ifdef HAVE_LCD_BITMAP + lcd_update(); +#endif + usb_acknowledge(SYS_USB_CONNECTED_ACK); + while(usb_wait_for_disconnect_w_tmo(&button_queue, HZ)) { + } +} + +int show_logo(void) +{ + lcd_clear_display(); + lcd_puts(0, 0, "Rockbox"); + lcd_puts(0, 1, "Rescue boot"); +#ifdef HAVE_LCD_BITMAP + lcd_update(); +#endif + return 0; +} + +#ifdef HAVE_CHARGING +int charging_screen(void) +{ + unsigned int button; + int rc = 0; +#ifdef BUTTON_OFF + const unsigned int offbutton = BUTTON_OFF; +#else + const unsigned int offbutton = BUTTON_STOP; +#endif + + ide_power_enable(false); /* power down the disk, else would be spinning */ + + lcd_clear_display(); + lcd_puts(0, 0, "charging..."); +#ifdef HAVE_LCD_BITMAP + lcd_update(); +#endif + + do + { + button = button_get_w_tmo(HZ/2); +#ifdef BUTTON_ON + if (button == (BUTTON_ON | BUTTON_REL)) +#else + if (button == (BUTTON_RIGHT | BUTTON_REL)) +#endif + rc = 3; + else if (button == offbutton) + rc = 2; + else + { + if (usb_detect()) + rc = 4; + else if (!charger_inserted()) + rc = 1; + } + } while (!rc); + + return rc; +} +#endif /* HAVE_CHARGING */ + + +void main(void) +{ + int rc; + + power_init(); + system_init(); + kernel_init(); + lcd_init(); + show_logo(); + set_irq_level(0); + adc_init(); + usb_init(); + button_init(); + powermgmt_init(); + +#if defined(HAVE_CHARGING) && (CONFIG_CPU == SH7034) + if (charger_inserted() +#ifdef ATA_POWER_PLAYERSTYLE + && !ide_powered() /* relies on probing result from bootloader */ +#endif + ) + { + rc = charging_screen(); /* display a "charging" screen */ + if (rc == 1 || rc == 2) /* charger removed or "Off/Stop" pressed */ + power_off(); + /* "On" pressed or USB connected: proceed */ + show_logo(); /* again, to provide better visual feedback */ + } +#endif + + rc = ata_init(); + if(rc) + { +#ifdef HAVE_LCD_BITMAP + char str[32]; + lcd_clear_display(); + snprintf(str, 31, "ATA error: %d", rc); + lcd_puts(0, 1, str); + lcd_update(); + while(!(button_get(true) & BUTTON_REL)); +#endif + panicf("ata: %d", rc); + } + + //disk_init(); + usb_start_monitoring(); + while (usb_detect()) + { /* enter USB mode early, before trying to mount */ + if (button_get_w_tmo(HZ/10) == SYS_USB_CONNECTED) +#ifdef HAVE_MMC + if (!mmc_touched() || (mmc_remove_request() == SYS_MMC_EXTRACTED)) +#endif + { + usb_screen(); + } + } + + rc = disk_mount_all(); + if (rc<=0) + { + lcd_clear_display(); + lcd_puts(0, 0, "No partition"); + lcd_puts(0, 1, "found."); +#ifdef HAVE_LCD_BITMAP + lcd_puts(0, 2, "Insert USB cable"); + lcd_puts(0, 3, "and fix it."); + lcd_update(); +#endif + while(button_get(true) != SYS_USB_CONNECTED) {}; + usb_screen(); + system_reboot(); + } + + { // rolo the firmware + int fd; + static const char filename[] = BOOTFILE; + fd = open(filename, O_RDONLY); + if(fd >= 0) /* no complaint if it doesn't exit */ + { + close(fd); + rolo_load((char*)filename); /* start if it does */ + } + + lcd_clear_display(); + lcd_puts(0, 0, "No firmware"); + lcd_puts(0, 1, filename); +#ifdef HAVE_LCD_BITMAP + lcd_update(); +#endif + while(!(button_get(true) & BUTTON_REL)); + system_reboot(); + } + + +} + +/* These functions are present in the firmware library, but we reimplement + them here because the originals do a lot more than we want */ + +void screen_dump(void) +{ +} + +int dbg_ports(void) +{ + return 0; +} + +void audio_stop(void) +{ +} + +int audio_status(void) +{ + return 0; +} + +void mp3_shutdown(void) +{ +} +/* +void i2c_init(void) +{ +} + +void backlight_on(void) +{ +} +*/ |