summaryrefslogtreecommitdiff
path: root/rbutil
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2011-12-04 19:40:43 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2011-12-04 19:40:43 +0000
commit38f03d4eaed0952bc1c866d46a10f783f2b895b2 (patch)
tree568ac45d9777e840c0889789701e2e9b79702e88 /rbutil
parent38890ac6dc1e3cebb90e60d70cea8da8009ee8da (diff)
downloadrockbox-38f03d4eaed0952bc1c866d46a10f783f2b895b2.tar.gz
rockbox-38f03d4eaed0952bc1c866d46a10f783f2b895b2.zip
sansapatcher: factor out handling of bundled bootloaders.
Instead of handling bundled bootloaders in the sansapatcher functions leave that to the caller. This removes the need to have Rockbox Utility specific parts in sansapatcher. sansa_add_bootloader() now operates on an already loaded bootloader. For loading a convenience function sansa_read_bootloader() is added. This also introduces a new check on loading to prevent installing an e200 bootloader on a c200 (and vice versa). These changes will allow building a libsansapatcher for linking with Rockbox Utility later. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31144 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'rbutil')
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstallsansa.cpp6
-rw-r--r--rbutil/sansapatcher/main.c37
-rw-r--r--rbutil/sansapatcher/sansapatcher.c97
-rw-r--r--rbutil/sansapatcher/sansapatcher.h6
4 files changed, 80 insertions, 66 deletions
diff --git a/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp b/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp
index b07ddfad93..ae46df273d 100644
--- a/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp
+++ b/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp
@@ -96,6 +96,8 @@ bool BootloaderInstallSansa::install(void)
96void BootloaderInstallSansa::installStage2(void) 96void BootloaderInstallSansa::installStage2(void)
97{ 97{
98 struct sansa_t sansa; 98 struct sansa_t sansa;
99 unsigned char* buf = NULL;
100 unsigned int len;
99 101
100 emit logItem(tr("Installing Rockbox bootloader"), LOGINFO); 102 emit logItem(tr("Installing Rockbox bootloader"), LOGINFO);
101 QCoreApplication::processEvents(); 103 QCoreApplication::processEvents();
@@ -130,8 +132,8 @@ void BootloaderInstallSansa::installStage2(void)
130 return; 132 return;
131 } 133 }
132 134
133 if(sansa_add_bootloader(&sansa, blfile.toLatin1().data(), 135 len = sansa_read_bootloader(&sansa, blfile.toLatin1().data(), &buf);
134 FILETYPE_MI4) == 0) { 136 if(sansa_add_bootloader(&sansa, buf, len) == 0) {
135 emit logItem(tr("Successfully installed bootloader"), LOGOK); 137 emit logItem(tr("Successfully installed bootloader"), LOGOK);
136 sansa_close(&sansa); 138 sansa_close(&sansa);
137#if defined(Q_OS_MACX) 139#if defined(Q_OS_MACX)
diff --git a/rbutil/sansapatcher/main.c b/rbutil/sansapatcher/main.c
index 6b65876eac..31b690509f 100644
--- a/rbutil/sansapatcher/main.c
+++ b/rbutil/sansapatcher/main.c
@@ -31,6 +31,8 @@
31#include "sansapatcher.h" 31#include "sansapatcher.h"
32#include "sansaio.h" 32#include "sansaio.h"
33#include "parttypes.h" 33#include "parttypes.h"
34#include "bootimg_c200.h"
35#include "bootimg_e200.h"
34 36
35#define VERSION "0.8 with v6.0 bootloaders" 37#define VERSION "0.8 with v6.0 bootloaders"
36 38
@@ -135,9 +137,10 @@ int main(int argc, char* argv[])
135 int n; 137 int n;
136 char* filename; 138 char* filename;
137 int action = SHOW_INFO; 139 int action = SHOW_INFO;
138 int type;
139 struct sansa_t sansa; 140 struct sansa_t sansa;
140 int res = 0; 141 int res = 0;
142 unsigned char* buf = NULL;
143 unsigned int len;
141 144
142 fprintf(stderr,"sansapatcher v" VERSION " - (C) Dave Chapman 2006-2007\n"); 145 fprintf(stderr,"sansapatcher v" VERSION " - (C) Dave Chapman 2006-2007\n");
143 fprintf(stderr,"This is free software; see the source for copying conditions. There is NO\n"); 146 fprintf(stderr,"This is free software; see the source for copying conditions. There is NO\n");
@@ -213,7 +216,6 @@ int main(int argc, char* argv[])
213 } else if ((strcmp(argv[i],"-a")==0) || 216 } else if ((strcmp(argv[i],"-a")==0) ||
214 (strcmp(argv[i],"--add-bootloader")==0)) { 217 (strcmp(argv[i],"--add-bootloader")==0)) {
215 action = ADD_BOOTLOADER; 218 action = ADD_BOOTLOADER;
216 type = FILETYPE_MI4;
217 i++; 219 i++;
218 if (i == argc) { print_usage(); return 1; } 220 if (i == argc) { print_usage(); return 1; }
219 filename=argv[i]; 221 filename=argv[i];
@@ -286,8 +288,14 @@ int main(int argc, char* argv[])
286 if (sansa_reopen_rw(&sansa) < 0) { 288 if (sansa_reopen_rw(&sansa) < 0) {
287 res = 5; 289 res = 5;
288 } 290 }
289 291 if (strcmp(sansa.targetname,"c200") == 0) {
290 if (sansa_add_bootloader(&sansa, NULL, FILETYPE_INTERNAL)==0) { 292 len = LEN_bootimg_c200;
293 buf = bootimg_c200;
294 } else {
295 len = LEN_bootimg_e200;
296 buf = bootimg_e200;
297 }
298 if (sansa_add_bootloader(&sansa, buf, len)==0) {
291 fprintf(stderr,"[INFO] Bootloader installed successfully.\n"); 299 fprintf(stderr,"[INFO] Bootloader installed successfully.\n");
292 } else { 300 } else {
293 fprintf(stderr,"[ERR] --install failed.\n"); 301 fprintf(stderr,"[ERR] --install failed.\n");
@@ -317,7 +325,15 @@ int main(int argc, char* argv[])
317 return 5; 325 return 5;
318 } 326 }
319 327
320 if (sansa_add_bootloader(&sansa, NULL, FILETYPE_INTERNAL)==0) { 328 if (strcmp(sansa.targetname,"c200") == 0) {
329 len = LEN_bootimg_c200;
330 buf = bootimg_c200;
331 } else {
332 len = LEN_bootimg_e200;
333 buf = bootimg_e200;
334 }
335
336 if (sansa_add_bootloader(&sansa, buf, len)==0) {
321 fprintf(stderr,"[INFO] Bootloader installed successfully.\n"); 337 fprintf(stderr,"[INFO] Bootloader installed successfully.\n");
322 } else { 338 } else {
323 fprintf(stderr,"[ERR] --install failed.\n"); 339 fprintf(stderr,"[ERR] --install failed.\n");
@@ -327,10 +343,13 @@ int main(int argc, char* argv[])
327 return 5; 343 return 5;
328 } 344 }
329 345
330 if (sansa_add_bootloader(&sansa, filename, type)==0) { 346 len = sansa_read_bootloader(&sansa, filename, &buf);
331 fprintf(stderr,"[INFO] Bootloader %s written to device.\n",filename); 347 if (len > 0) {
332 } else { 348 if (sansa_add_bootloader(&sansa, buf, len)==0) {
333 fprintf(stderr,"[ERR] --add-bootloader failed.\n"); 349 fprintf(stderr,"[INFO] Bootloader %s written to device.\n",filename);
350 } else {
351 fprintf(stderr,"[ERR] --add-bootloader failed.\n");
352 }
334 } 353 }
335 } else if (action==DELETE_BOOTLOADER) { 354 } else if (action==DELETE_BOOTLOADER) {
336 if (sansa_reopen_rw(&sansa) < 0) { 355 if (sansa_reopen_rw(&sansa) < 0) {
diff --git a/rbutil/sansapatcher/sansapatcher.c b/rbutil/sansapatcher/sansapatcher.c
index 69e89e993e..9297f36e02 100644
--- a/rbutil/sansapatcher/sansapatcher.c
+++ b/rbutil/sansapatcher/sansapatcher.c
@@ -31,10 +31,6 @@
31#include "sansaio.h" 31#include "sansaio.h"
32#include "sansapatcher.h" 32#include "sansapatcher.h"
33 33
34#ifndef RBUTIL
35 #include "bootimg_c200.h"
36 #include "bootimg_e200.h"
37#endif
38/* The offset of the MI4 image header in the firmware partition */ 34/* The offset of the MI4 image header in the firmware partition */
39#define PPMI_OFFSET 0x80000 35#define PPMI_OFFSET 0x80000
40#define NVPARAMS_OFFSET 0x780000 36#define NVPARAMS_OFFSET 0x780000
@@ -683,34 +679,55 @@ int sansa_read_firmware(struct sansa_t* sansa, const char* filename)
683 return 0; 679 return 0;
684} 680}
685 681
682unsigned int sansa_read_bootloader(struct sansa_t* sansa, const char* filename, unsigned char** bl_buffer)
683{
684 /* Step 1 - read bootloader into RAM. */
685 int infile;
686 unsigned int n;
687 unsigned int len;
688 infile=open(filename,O_RDONLY|O_BINARY);
689 if (infile < 0) {
690 fprintf(stderr,"[ERR] Couldn't open input file %s\n",filename);
691 return 0;
692 }
693
694 len = filesize(infile);
695
696 unsigned char* b = malloc(len);
697 if (b == NULL) {
698 fprintf(stderr,"[ERR] Could not allocate memory for bootloader\n");
699 close(infile);
700 return 0;
701 }
702
703 n = read(infile,b,len);
704 close(infile);
705 if (n < len) {
706 fprintf(stderr,"[ERR] Short read - requested %d bytes, received %d\n"
707 ,len,n);
708 return 0;
709 }
710
711 if (memcmp(b+0x1f8,"RBBL",4)!=0) {
712 fprintf(stderr,"[ERR] %s is not a Rockbox bootloader, aborting.\n",
713 filename);
714 return 0;
715 }
716 if (memcmp(b+0x1fc,sansa->targetname,4)!=0) {
717 fprintf(stderr,"[ERR] %s is not a Rockbox bootloader for %s, aborting.\n",
718 filename, sansa->targetname);
719 return 0;
720 }
721 *bl_buffer = b;
722 return len;
723}
686 724
687int sansa_add_bootloader(struct sansa_t* sansa, const char* filename, int type) 725int sansa_add_bootloader(struct sansa_t* sansa, const unsigned char* bootloader, const unsigned int bl_length)
688{ 726{
689 int res; 727 int res;
690 int infile = -1; /* Prevent an erroneous "may be used uninitialised" gcc warning */
691 int bl_length = 0; /* Keep gcc happy when building for rbutil */
692 struct mi4header_t mi4header; 728 struct mi4header_t mi4header;
693 int n;
694 int length; 729 int length;
695 730 int n;
696 if (type==FILETYPE_MI4) {
697 /* Step 1 - read bootloader into RAM. */
698 infile=open(filename,O_RDONLY|O_BINARY);
699 if (infile < 0) {
700 fprintf(stderr,"[ERR] Couldn't open input file %s\n",filename);
701 return -1;
702 }
703
704 bl_length = filesize(infile);
705 } else {
706 #ifndef RBUTIL
707 if (strcmp(sansa->targetname,"c200") == 0) {
708 bl_length = LEN_bootimg_c200;
709 } else {
710 bl_length = LEN_bootimg_e200;
711 }
712 #endif
713 }
714 731
715 /* Create PPMI header */ 732 /* Create PPMI header */
716 memset(sansa_sectorbuf,0,0x200); 733 memset(sansa_sectorbuf,0,0x200);
@@ -718,30 +735,8 @@ int sansa_add_bootloader(struct sansa_t* sansa, const char* filename, int type)
718 int2le(bl_length, sansa_sectorbuf+4); 735 int2le(bl_length, sansa_sectorbuf+4);
719 int2le(0x00020000, sansa_sectorbuf+8); 736 int2le(0x00020000, sansa_sectorbuf+8);
720 737
721 if (type==FILETYPE_MI4) { 738 /* copy bootloader to sansa_sectorbuf+0x200 */
722 /* Read bootloader into sansa_sectorbuf+0x200 */ 739 memcpy(sansa_sectorbuf+0x200,bootloader,bl_length);
723 n = read(infile,sansa_sectorbuf+0x200,bl_length);
724 close(infile);
725 if (n < bl_length) {
726 fprintf(stderr,"[ERR] Short read - requested %d bytes, received %d\n"
727 ,bl_length,n);
728 return -1;
729 }
730
731 if (memcmp(sansa_sectorbuf+0x200+0x1f8,"RBBL",4)!=0) {
732 fprintf(stderr,"[ERR] %s is not a Rockbox bootloader, aborting.\n",
733 filename);
734 return -1;
735 }
736 } else {
737 #ifndef RBUTIL
738 if (strcmp(sansa->targetname,"c200") == 0) {
739 memcpy(sansa_sectorbuf+0x200,bootimg_c200,LEN_bootimg_c200);
740 } else {
741 memcpy(sansa_sectorbuf+0x200,bootimg_e200,LEN_bootimg_e200);
742 }
743 #endif
744 }
745 740
746 /* Load original firmware from Sansa to the space after the bootloader */ 741 /* Load original firmware from Sansa to the space after the bootloader */
747 res = load_original_firmware(sansa,sansa_sectorbuf+0x200+bl_length,&mi4header); 742 res = load_original_firmware(sansa,sansa_sectorbuf+0x200+bl_length,&mi4header);
diff --git a/rbutil/sansapatcher/sansapatcher.h b/rbutil/sansapatcher/sansapatcher.h
index 7416e1928b..4f08eea432 100644
--- a/rbutil/sansapatcher/sansapatcher.h
+++ b/rbutil/sansapatcher/sansapatcher.h
@@ -34,14 +34,12 @@ extern int sansa_verbose;
34#define BUFFER_SIZE 8*1024*1024 34#define BUFFER_SIZE 8*1024*1024
35extern unsigned char* sansa_sectorbuf; 35extern unsigned char* sansa_sectorbuf;
36 36
37#define FILETYPE_MI4 0
38#define FILETYPE_INTERNAL 1
39
40int sansa_read_partinfo(struct sansa_t* sansa, int silent); 37int sansa_read_partinfo(struct sansa_t* sansa, int silent);
41int is_sansa(struct sansa_t* sansa); 38int is_sansa(struct sansa_t* sansa);
42int sansa_scan(struct sansa_t* sansa); 39int sansa_scan(struct sansa_t* sansa);
43int sansa_read_firmware(struct sansa_t* sansa, const char* filename); 40int sansa_read_firmware(struct sansa_t* sansa, const char* filename);
44int sansa_add_bootloader(struct sansa_t* sansa, const char* filename, int type); 41unsigned int sansa_read_bootloader(struct sansa_t* sansa, const char* filename, unsigned char** bl_buffer);
42int sansa_add_bootloader(struct sansa_t* sansa, const unsigned char* buf, unsigned int len);
45int sansa_delete_bootloader(struct sansa_t* sansa); 43int sansa_delete_bootloader(struct sansa_t* sansa);
46int sansa_update_of(struct sansa_t* sansa,const char* filename); 44int sansa_update_of(struct sansa_t* sansa,const char* filename);
47int sansa_update_ppbl(struct sansa_t* sansa,const char* filename); 45int sansa_update_ppbl(struct sansa_t* sansa,const char* filename);