summaryrefslogtreecommitdiff
path: root/bootloader/main-pp.c
diff options
context:
space:
mode:
authorBarry Wardell <rockbox@barrywardell.net>2007-01-28 18:42:11 +0000
committerBarry Wardell <rockbox@barrywardell.net>2007-01-28 18:42:11 +0000
commit84b509dc43cf84ef16fcd4a57b167351f146cd11 (patch)
tree57eca4b44db56e11c1a3d9dde5d0e4ef8e830686 /bootloader/main-pp.c
parent6c3a44643590f8cbc925375c2dc8393cc7f9d55e (diff)
downloadrockbox-84b509dc43cf84ef16fcd4a57b167351f146cd11.tar.gz
rockbox-84b509dc43cf84ef16fcd4a57b167351f146cd11.zip
FS#6554. Move bootloader code into a common file. Only PortalPlayer devices (iPods, H10, Sansa) are affected for the moment. Someone with access to (and no fear of bricking) an X5, H100, H300 and Gigabeat should try to adapt those bootloaders to also use the code in common.c. The (non-working) patch in the tracker would be a good place to start with this.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12136 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader/main-pp.c')
-rw-r--r--bootloader/main-pp.c225
1 files changed, 46 insertions, 179 deletions
diff --git a/bootloader/main-pp.c b/bootloader/main-pp.c
index 1da24b7d9b..a02510e31c 100644
--- a/bootloader/main-pp.c
+++ b/bootloader/main-pp.c
@@ -19,156 +19,27 @@
19 * KIND, either express or implied. 19 * KIND, either express or implied.
20 * 20 *
21 ****************************************************************************/ 21 ****************************************************************************/
22#include "config.h" 22#include "common.h"
23
24#include <stdlib.h>
25#include <stdio.h>
26#include <string.h>
27#include <stdarg.h>
28#include "cpu.h" 23#include "cpu.h"
24#include "file.h"
29#include "system.h" 25#include "system.h"
30#include "lcd.h"
31#include "kernel.h" 26#include "kernel.h"
32#include "thread.h" 27#include "lcd.h"
33#include "ata.h"
34#include "fat.h"
35#include "disk.h"
36#include "font.h" 28#include "font.h"
37#include "adc.h" 29#include "ata.h"
38#include "backlight.h"
39#include "button.h" 30#include "button.h"
40#include "panic.h" 31#include "disk.h"
41#include "power.h" 32#include "power.h"
42#include "file.h"
43 33
44/* Size of the buffer to store the loaded firmware image */ 34/* Maximum allowed firmware image size. 10MB is more than enough */
45#define MAX_LOADSIZE (10*1024*1024) 35#define MAX_LOADSIZE (10*1024*1024)
46 36
47/* A buffer to load the iriver firmware or Rockbox into */ 37/* A buffer to load the original firmware or Rockbox into */
48unsigned char loadbuffer[MAX_LOADSIZE]; 38unsigned char *loadbuffer = (unsigned char *)DRAM_START;
49 39
40/* Bootloader version */
50char version[] = APPSVERSION; 41char version[] = APPSVERSION;
51 42
52#define DRAM_START 0x10000000
53
54int line=0;
55char printfbuf[256];
56
57void reset_screen(void)
58{
59 lcd_clear_display();
60 line = 0;
61}
62
63void printf(const char *format, ...)
64{
65 int len;
66 unsigned char *ptr;
67 va_list ap;
68 va_start(ap, format);
69
70
71 ptr = printfbuf;
72 len = vsnprintf(ptr, sizeof(printfbuf), format, ap);
73 va_end(ap);
74
75 lcd_puts(0, line++, ptr);
76 lcd_update();
77 if(line >= (LCD_HEIGHT/SYSFONT_HEIGHT))
78 line = 0;
79}
80
81/* Load original mi4 firmware. This function expects a file called
82 "/System/OF.bin" on the player. It should be a mi4 firmware decrypted
83 and header stripped using mi4code. It reads the file in to a memory
84 buffer called buf. The rest of the loading is done in main() and crt0.S
85*/
86int load_original_firmware(unsigned char* buf)
87{
88 int fd;
89 int rc;
90 int len;
91
92 fd = open("/System/OF.bin", O_RDONLY);
93
94 len = filesize(fd);
95
96 if (len > MAX_LOADSIZE)
97 return -6;
98
99 rc = read(fd, buf, len);
100 if(rc < len)
101 return -4;
102
103 close(fd);
104 return len;
105}
106
107/* Load Rockbox firmware (rockbox.*) */
108int load_rockbox(unsigned char* buf)
109{
110 int fd;
111 int rc;
112 int len;
113 unsigned long chksum;
114 char model[5];
115 unsigned long sum;
116 int i;
117
118 fd = open("/.rockbox/" BOOTFILE, O_RDONLY);
119 if(fd < 0)
120 {
121 fd = open("/" BOOTFILE, O_RDONLY);
122 if(fd < 0)
123 return -1;
124 }
125
126 len = filesize(fd) - 8;
127
128 printf("Length: %x", len);
129
130 if (len > MAX_LOADSIZE)
131 return -6;
132
133 lseek(fd, FIRMWARE_OFFSET_FILE_CRC, SEEK_SET);
134
135 rc = read(fd, &chksum, 4);
136 chksum=betoh32(chksum); /* Rockbox checksums are big-endian */
137 if(rc < 4)
138 return -2;
139
140 printf("Checksum: %x", chksum);
141
142 rc = read(fd, model, 4);
143 if(rc < 4)
144 return -3;
145
146 model[4] = 0;
147
148 printf("Model name: %s", model);
149
150 lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET);
151
152 rc = read(fd, buf, len);
153 if(rc < len)
154 return -4;
155
156 close(fd);
157
158 sum = MODEL_NUMBER;
159
160 for(i = 0;i < len;i++) {
161 sum += buf[i];
162 }
163
164 printf("Sum: %x", sum);
165
166 if(sum != chksum)
167 return -5;
168
169 return len;
170}
171
172void* main(void) 43void* main(void)
173{ 44{
174 char buf[256]; 45 char buf[256];
@@ -183,8 +54,6 @@ void* main(void)
183 font_init(); 54 font_init();
184 button_init(); 55 button_init();
185 56
186 line=0;
187
188 lcd_setfont(FONT_SYSFIXED); 57 lcd_setfont(FONT_SYSFIXED);
189 58
190 printf("Rockbox boot loader"); 59 printf("Rockbox boot loader");
@@ -193,18 +62,20 @@ void* main(void)
193 62
194 i=ata_init(); 63 i=ata_init();
195 if (i==0) { 64 if (i==0) {
196 identify_info=ata_get_identify(); 65 identify_info=ata_get_identify();
197 /* Show model */ 66 /* Show model */
198 for (i=0; i < 20; i++) { 67 for (i=0; i < 20; i++) {
199 ((unsigned short*)buf)[i]=htobe16(identify_info[i+27]); 68 ((unsigned short*)buf)[i]=htobe16(identify_info[i+27]);
200 } 69 }
201 buf[40]=0; 70 buf[40]=0;
202 for (i=39; i && buf[i]==' '; i--) { 71 for (i=39; i && buf[i]==' '; i--) {
203 buf[i]=0; 72 buf[i]=0;
204 } 73 }
205 printf(buf); 74 printf(buf);
206 } else { 75 } else {
207 printf("ATA: %d", i); 76 printf("ATA error: %d", i);
77 sleep(HZ*5);
78 power_off();
208 } 79 }
209 80
210 disk_init(); 81 disk_init();
@@ -212,6 +83,8 @@ void* main(void)
212 if (rc<=0) 83 if (rc<=0)
213 { 84 {
214 printf("No partition found"); 85 printf("No partition found");
86 sleep(HZ*5);
87 power_off();
215 } 88 }
216 89
217 pinfo = disk_partinfo(0); 90 pinfo = disk_partinfo(0);
@@ -220,39 +93,37 @@ void* main(void)
220 i=button_read_device(); 93 i=button_read_device();
221 if(i==BUTTON_LEFT) 94 if(i==BUTTON_LEFT)
222 { 95 {
96 /* Load original mi4 firmware. This expects a file called
97 "/System/OF.bin" on the player. It should be a mi4 firmware decrypted
98 and header stripped using mi4code. It reads the file in to a memory
99 buffer called loadbuffer. The rest of the loading is done in crt0.S
100 */
223 printf("Loading original firmware..."); 101 printf("Loading original firmware...");
224 rc=load_original_firmware(loadbuffer); 102 rc=load_raw_firmware(loadbuffer, "/System/OF.bin", MAX_LOADSIZE);
103 if (rc < EOK) {
104 printf("Error!");
105 printf("Can't load /System/OF.bin:");
106 printf(strerror(rc));
107 sleep(HZ*5);
108 power_off();
109 }
225 } else { 110 } else {
226 printf("Loading Rockbox..."); 111 printf("Loading Rockbox...");
227 rc=load_rockbox(loadbuffer); 112 rc=load_firmware(loadbuffer, BOOTFILE, MAX_LOADSIZE);
113 if (rc < EOK) {
114 printf("Error!");
115 printf("Can't load %s:", BOOTFILE);
116 printf(strerror(rc));
117 sleep(HZ*5);
118 power_off();
119 }
228 } 120 }
229
230 if (rc < 0) {
231 printf("Rockbox error: %d",rc);
232 while(1) {}
233 }
234
235 memcpy((void*)DRAM_START,loadbuffer,rc);
236 121
237 return (void*)DRAM_START; 122 return (void*)loadbuffer;
238} 123}
239 124
240/* These functions are present in the firmware library, but we reimplement 125/* These functions are present in the firmware library, but we reimplement
241 them here because the originals do a lot more than we want */ 126 them here because the originals do a lot more than we want */
242
243void reset_poweroff_timer(void)
244{
245}
246
247int dbg_ports(void)
248{
249 return 0;
250}
251
252void mpeg_stop(void)
253{
254}
255
256void usb_acknowledge(void) 127void usb_acknowledge(void)
257{ 128{
258} 129}
@@ -260,7 +131,3 @@ void usb_acknowledge(void)
260void usb_wait_for_disconnect(void) 131void usb_wait_for_disconnect(void)
261{ 132{
262} 133}
263
264void sys_poweroff(void)
265{
266}