1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2005 by Jörg Hohensohn aka [IDC]Dragon
12 * This is "Bootbox", a minimalistic loader, rescue firmware for just
13 * booting into a full features one. Aside from that it does charging
14 * and USB mode, to enable copying the desired firmware.
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License
18 * as published by the Free Software Foundation; either version 2
19 * of the License, or (at your option) any later version.
21 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
22 * KIND, either express or implied.
24 ****************************************************************************/
45 #include "powermgmt.h"
47 static void usb_screen(void)
50 lcd_puts(0, 0, "USB mode");
53 usb_acknowledge(SYS_USB_CONNECTED_ACK
);
54 while(usb_wait_for_disconnect_w_tmo(&button_queue
, HZ
)) {
58 static void show_logo(void)
61 lcd_puts(0, 0, "Rockbox");
62 lcd_puts(0, 1, "Rescue boot");
67 static void charging_screen(void)
72 ide_power_enable(false); /* power down the disk, else would be spinning */
78 #ifdef ARCHOS_RECORDER
79 if (charge_state
== CHARGING
)
81 else if (charge_state
== TOPOFF
)
82 msg
= "topoff charge";
83 else if (charge_state
== TRICKLE
)
84 msg
= "trickle charge";
93 int battv
= battery_voltage();
94 snprintf(buf
, sizeof(buf
), "%d.%02dV %d%%",
95 battv
/ 1000, (battv
% 1000) / 10, battery_level());
100 button
= button_get_w_tmo(HZ
/2);
102 if (button
== (BUTTON_ON
| BUTTON_REL
))
104 if (button
== (BUTTON_RIGHT
| BUTTON_REL
))
109 if (usb_detect() == USB_INSERTED
)
111 else if (!charger_inserted())
112 power_off(); /* charger removed: power down */
116 #endif /* CONFIG_CHARGING */
118 /* prompt user to plug USB and fix a problem */
119 static void prompt_usb(const char* msg1
, const char* msg2
)
123 lcd_puts(0, 0, msg1
);
124 lcd_puts(0, 1, msg2
);
125 #ifdef HAVE_LCD_BITMAP
126 lcd_puts(0, 2, "Insert USB cable");
127 lcd_puts(0, 3, "and fix it.");
132 button
= button_get(true);
133 if (button
== SYS_POWEROFF
)
137 } while (button
!= SYS_USB_CONNECTED
);
158 #if CONFIG_CHARGING && (CONFIG_CPU == SH7034)
159 if (charger_inserted()
160 #ifdef ATA_POWER_PLAYERSTYLE
161 && !ide_powered() /* relies on probing result from bootloader */
165 charging_screen(); /* display a "charging" screen */
166 show_logo(); /* again, to provide better visual feedback */
173 #ifdef HAVE_LCD_BITMAP
176 snprintf(str
, 31, "ATA error: %d", rc
);
179 while(!(button_get(true) & BUTTON_REL
));
181 panicf("storage: %d", rc
);
184 usb_start_monitoring();
185 while (usb_detect() == USB_INSERTED
)
186 { /* enter USB mode early, before trying to mount */
187 if (button_get_w_tmo(HZ
/10) == SYS_USB_CONNECTED
)
193 rc
= disk_mount_all();
196 prompt_usb("No partition", "found.");
199 { // rolo the firmware
200 static const char filename
[] = "/" BOOTFILE
;
201 rolo_load((char*)filename
); /* won't return if started */
203 prompt_usb("No firmware", filename
);
209 /* These functions are present in the firmware library, but we reimplement
210 them here because the originals do a lot more than we want */
212 void audio_stop(void)
216 int audio_status(void)
221 void audio_stop_recording(void)
225 void mp3_shutdown(void)