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 ****************************************************************************/
44 #include "powermgmt.h"
46 static void usb_screen(void)
49 lcd_puts(0, 0, "USB mode");
52 usb_acknowledge(SYS_USB_CONNECTED_ACK
);
53 while(usb_wait_for_disconnect_w_tmo(&button_queue
, HZ
)) {
57 static void show_logo(void)
60 lcd_puts(0, 0, "Rockbox");
61 lcd_puts(0, 1, "Rescue boot");
66 static void charging_screen(void)
71 ide_power_enable(false); /* power down the disk, else would be spinning */
77 #ifdef ARCHOS_RECORDER
78 if (charge_state
== CHARGING
)
80 else if (charge_state
== TOPOFF
)
81 msg
= "topoff charge";
82 else if (charge_state
== TRICKLE
)
83 msg
= "trickle charge";
92 int battv
= battery_voltage();
93 snprintf(buf
, sizeof(buf
), "%d.%02dV %d%%",
94 battv
/ 1000, (battv
% 1000) / 10, battery_level());
99 button
= button_get_w_tmo(HZ
/2);
101 if (button
== (BUTTON_ON
| BUTTON_REL
))
103 if (button
== (BUTTON_RIGHT
| BUTTON_REL
))
108 if (usb_detect() == USB_INSERTED
)
110 else if (!charger_inserted())
111 power_off(); /* charger removed: power down */
115 #endif /* CONFIG_CHARGING */
117 /* prompt user to plug USB and fix a problem */
118 static void prompt_usb(const char* msg1
, const char* msg2
)
122 lcd_puts(0, 0, msg1
);
123 lcd_puts(0, 1, msg2
);
124 #ifdef HAVE_LCD_BITMAP
125 lcd_puts(0, 2, "Insert USB cable");
126 lcd_puts(0, 3, "and fix it.");
131 button
= button_get(true);
132 if (button
== SYS_POWEROFF
)
136 } while (button
!= SYS_USB_CONNECTED
);
156 #if CONFIG_CHARGING && (CONFIG_CPU == SH7034)
157 if (charger_inserted()
158 #ifdef ATA_POWER_PLAYERSTYLE
159 && !ide_powered() /* relies on probing result from bootloader */
163 charging_screen(); /* display a "charging" screen */
164 show_logo(); /* again, to provide better visual feedback */
171 #ifdef HAVE_LCD_BITMAP
174 snprintf(str
, 31, "ATA error: %d", rc
);
177 while(!(button_get(true) & BUTTON_REL
));
179 panicf("storage: %d", rc
);
182 usb_start_monitoring();
183 while (usb_detect() == USB_INSERTED
)
184 { /* enter USB mode early, before trying to mount */
185 if (button_get_w_tmo(HZ
/10) == SYS_USB_CONNECTED
)
191 rc
= disk_mount_all();
194 prompt_usb("No partition", "found.");
197 { // rolo the firmware
198 static const char filename
[] = "/" BOOTFILE
;
199 rolo_load((char*)filename
); /* won't return if started */
201 prompt_usb("No firmware", filename
);
207 /* These functions are present in the firmware library, but we reimplement
208 them here because the originals do a lot more than we want */
210 void audio_stop(void)
214 int audio_status(void)
219 void audio_stop_recording(void)
223 void mp3_shutdown(void)