summaryrefslogtreecommitdiff
path: root/bootloader/sansa_as3525.c
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2010-06-23 05:08:36 +0000
committerRafaël Carré <rafael.carre@gmail.com>2010-06-23 05:08:36 +0000
commit1ec821244afc4f671c0c94519cd3a70b2777bf74 (patch)
tree748eead72f705c1e3a91120dc890be49617239c9 /bootloader/sansa_as3525.c
parent28bcc17ddef4cfad2d1a669869f2f81f0724acb9 (diff)
downloadrockbox-1ec821244afc4f671c0c94519cd3a70b2777bf74.tar.gz
rockbox-1ec821244afc4f671c0c94519cd3a70b2777bf74.zip
Sansa AMS bootloader: enter USB mode only when needed
- If an error happens when reading partitions / rockbox.sansa - If the select button was pressed add an argument to error() to not power off, when we're going to enter USB mode to try to fix the problem, but display the error message anyway for debugging purpose git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27075 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader/sansa_as3525.c')
-rw-r--r--bootloader/sansa_as3525.c81
1 files changed, 47 insertions, 34 deletions
diff --git a/bootloader/sansa_as3525.c b/bootloader/sansa_as3525.c
index 3eb6159800..4219038d9a 100644
--- a/bootloader/sansa_as3525.c
+++ b/bootloader/sansa_as3525.c
@@ -27,10 +27,8 @@
27#include <inttypes.h> 27#include <inttypes.h>
28#include "config.h" 28#include "config.h"
29#include "lcd.h" 29#include "lcd.h"
30#ifdef USE_ROCKBOX_USB
31#include "usb.h" 30#include "usb.h"
32#include "sysfont.h" 31#include "sysfont.h"
33#endif /* USE_ROCKBOX_USB */
34#include "backlight.h" 32#include "backlight.h"
35#include "button-target.h" 33#include "button-target.h"
36#include "common.h" 34#include "common.h"
@@ -41,6 +39,33 @@
41 39
42int show_logo(void); 40int show_logo(void);
43 41
42static void usb_mode(void)
43{
44 if(usb_detect() != USB_INSERTED)
45 {
46 const char msg[] = "Plug USB cable";
47 reset_screen();
48 lcd_putsxy( (LCD_WIDTH - (SYSFONT_WIDTH * sizeof(msg))) / 2,
49 (LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg);
50 lcd_update();
51
52 /* wait until USB is plugged */
53 while(usb_detect() != USB_INSERTED) ;
54 }
55
56 const char msg[] = "Bootloader USB mode";
57 reset_screen();
58 lcd_putsxy( (LCD_WIDTH - (SYSFONT_WIDTH * sizeof(msg))) / 2,
59 (LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg);
60 lcd_update();
61
62 while(usb_detect() == USB_INSERTED)
63 sleep(HZ);
64
65 reset_screen();
66 lcd_update();
67}
68
44void main(void) __attribute__((noreturn)); 69void main(void) __attribute__((noreturn));
45void main(void) 70void main(void)
46{ 71{
@@ -84,53 +109,41 @@ void main(void)
84 109
85 ret = storage_init(); 110 ret = storage_init();
86 if(ret < 0) 111 if(ret < 0)
87 error(EATA,ret); 112 error(EATA, ret, true);
88 113
89#ifdef USE_ROCKBOX_USB
90 usb_init(); 114 usb_init();
91 usb_start_monitoring(); 115 usb_start_monitoring();
92 if(usb_detect() == USB_INSERTED)
93 {
94 const char msg[] = "Bootloader USB mode";
95 reset_screen();
96 lcd_putsxy( (LCD_WIDTH - (SYSFONT_WIDTH * sizeof(msg))) / 2,
97 (LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg);
98 lcd_update();
99
100 while(usb_detect() == USB_INSERTED)
101 sleep(HZ);
102
103 reset_screen();
104 lcd_update();
105 }
106#endif /* USE_ROCKBOX_USB */
107 116
108 if(!disk_init(IF_MV(0))) 117 /* Enter USB mode if USB is plugged and SELECT button is pressed */
109 panicf("disk_init failed!"); 118 if(btn & BUTTON_SELECT && usb_detect() == USB_INSERTED)
119 usb_mode();
110 120
111 ret = disk_mount_all(); 121 while(!disk_init(IF_MV(0)))
122 usb_mode();
112 123
113 if(ret <= 0) 124 while((ret = disk_mount_all()) <= 0)
114 error(EDISK, ret); 125 {
126 error(EDISK, ret, false);
127 usb_mode();
128 }
115 129
116 printf("Loading firmware"); 130 printf("Loading firmware");
117 131
118 loadbuffer = (unsigned char*)DRAM_ORIG; /* DRAM */ 132 loadbuffer = (unsigned char*)DRAM_ORIG; /* DRAM */
119 buffer_size = (int)(loadbuffer + (DRAM_SIZE) - TTB_SIZE); 133 buffer_size = (int)(loadbuffer + (DRAM_SIZE) - TTB_SIZE);
120 134
121 ret = load_firmware(loadbuffer, BOOTFILE, buffer_size); 135 while((ret = load_firmware(loadbuffer, BOOTFILE, buffer_size)) < 0)
122 if(ret < 0)
123 error(EBOOTFILE, ret);
124
125 if (ret == EOK)
126 { 136 {
127 kernel_entry = (void*) loadbuffer; 137 error(EBOOTFILE, ret, false);
128 cpucache_invalidate(); 138 usb_mode();
129 printf("Executing");
130 kernel_entry();
131 printf("ERR: Failed to boot");
132 } 139 }
133 140
141 kernel_entry = (void*) loadbuffer;
142 cpucache_invalidate();
143 printf("Executing");
144 kernel_entry();
145 printf("ERR: Failed to boot");
146
134 /* never returns */ 147 /* never returns */
135 while(1) ; 148 while(1) ;
136} 149}