summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rbutil/mkamsboot/Makefile6
-rw-r--r--rbutil/mkamsboot/main.c24
-rw-r--r--rbutil/mkamsboot/mkamsboot.c63
-rw-r--r--rbutil/mkamsboot/mkamsboot.h13
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstallams.cpp33
-rw-r--r--utils/AMS/hacking/amsinfo.c37
6 files changed, 60 insertions, 116 deletions
diff --git a/rbutil/mkamsboot/Makefile b/rbutil/mkamsboot/Makefile
index 60e1ea8af8..8a9a4d3852 100644
--- a/rbutil/mkamsboot/Makefile
+++ b/rbutil/mkamsboot/Makefile
@@ -47,9 +47,9 @@ OBJS := $(patsubst %.c,%.o,$(addprefix $(OBJDIR),$(SOURCES)))
LIBOBJS := $(patsubst %.c,%.o,$(addprefix $(OBJDIR),$(LIBSOURCES)))
EXTRADEPS := $(LIBUCL)
-# explicit dependencies on dualboot.{c,h}
-$(OBJDIR)mkamsboot.o: dualboot.h dualboot.c mkamsboot.c
-$(OBJDIR)main.o: dualboot.h dualboot.c main.c
+# explicit dependencies on dualboot.{c,h} and mkamsboot.h
+$(OBJDIR)mkamsboot.o: dualboot.h dualboot.c mkamsboot.c mkamsboot.h
+$(OBJDIR)main.o: dualboot.h dualboot.c main.c mkamsboot.h
$(OBJDIR)%.o: %.c
@echo CC $< $
diff --git a/rbutil/mkamsboot/main.c b/rbutil/mkamsboot/main.c
index 1132334261..a864c2a5c1 100644
--- a/rbutil/mkamsboot/main.c
+++ b/rbutil/mkamsboot/main.c
@@ -59,6 +59,7 @@ int main(int argc, char* argv[])
int rb_packedsize;
int patchable;
int totalsize;
+ int model;
char errstr[200];
struct md5sums sum;
char md5sum[33]; /* 32 digits + \0 */
@@ -81,11 +82,21 @@ int main(int argc, char* argv[])
bootfile = argv[2];
outfile = argv[3];
+ /* Load bootloader file */
+ rb_packed = load_rockbox_file(bootfile, &model, &bootloader_size,
+ &rb_packedsize, errstr, sizeof(errstr));
+ if (rb_packed == NULL) {
+ fprintf(stderr, "%s", errstr);
+ fprintf(stderr, "[ERR] Could not load %s\n", bootfile);
+ return 1;
+ }
+
/* Load original firmware file */
- buf = load_of_file(infile, &len, &sum,
+ buf = load_of_file(infile, model, &len, &sum,
&firmware_size, &of_packed, &of_packedsize, errstr, sizeof(errstr));
if (buf == NULL) {
+ free(rb_packed);
fprintf(stderr, "%s", errstr);
fprintf(stderr, "[ERR] Could not load %s\n", infile);
return 1;
@@ -96,17 +107,6 @@ int main(int argc, char* argv[])
model_names[sum.model], hw_revisions[sum.model], sum.version);
- /* Load bootloader file */
- rb_packed = load_rockbox_file(bootfile, sum.model, &bootloader_size,
- &rb_packedsize, errstr, sizeof(errstr));
- if (rb_packed == NULL) {
- fprintf(stderr, "%s", errstr);
- fprintf(stderr, "[ERR] Could not load %s\n", bootfile);
- free(buf);
- free(of_packed);
- return 1;
- }
-
printf("[INFO] Firmware patching has begun !\n\n");
fprintf(stderr, "[INFO] Original firmware size: %d bytes\n",
diff --git a/rbutil/mkamsboot/mkamsboot.c b/rbutil/mkamsboot/mkamsboot.c
index 1ec9ec26e6..f47afe312a 100644
--- a/rbutil/mkamsboot/mkamsboot.c
+++ b/rbutil/mkamsboot/mkamsboot.c
@@ -323,30 +323,6 @@ static uint32_t calc_checksum(unsigned char* buf, uint32_t n)
return sum;
}
-static int get_model(int model_id)
-{
- switch(model_id) {
- case 0x1e:
- return MODEL_FUZE;
- case 0x22:
- return MODEL_CLIP;
- case 0x23:
- return MODEL_C200V2;
- case 0x24:
- return MODEL_E200V2;
- case 0x25:
- return MODEL_M200V4;
- case 0x27:
- return MODEL_CLIPV2;
- case 0x28:
- return MODEL_CLIPPLUS;
- case 0x70:
- return MODEL_FUZEV2;
- }
-
- return MODEL_UNKNOWN;
-}
-
/* Compress using nrv2e algorithm : Thumb decompressor fits in 168 bytes ! */
static unsigned char* uclpack(unsigned char* inbuf, int insize, int* outsize)
{
@@ -388,7 +364,7 @@ static unsigned char* uclpack(unsigned char* inbuf, int insize, int* outsize)
/* Loads a Sansa AMS Original Firmware file into memory */
unsigned char* load_of_file(
- char* filename, off_t* bufsize, struct md5sums *sum,
+ char* filename, int model, off_t* bufsize, struct md5sums *sum,
int* firmware_size, unsigned char** of_packed,
int* of_packedsize, char* errstr, int errstrsize)
{
@@ -397,7 +373,6 @@ unsigned char* load_of_file(
off_t n;
unsigned int i=0;
uint32_t checksum;
- int model_id;
unsigned int last_word;
fd = open(filename, O_RDONLY|O_BINARY);
@@ -425,21 +400,20 @@ unsigned char* load_of_file(
if (i < NUM_MD5S) {
*sum = sansasums[i];
+ if(sum->model != model) {
+ ERROR("[ERR] OF File provided is %sv%d version %s, not for %sv%d\n",
+ model_names[sum->model], hw_revisions[sum->model],
+ sum->version, model_names[model], hw_revisions[model]
+ );
+ }
} else {
- int fw_version = (get_uint32le(&buf[0x204]) == 0x0000f000) ? 2 : 1;
- model_id = buf[(fw_version == 2) ? 0x219 : 0x215];
- sum->model = get_model(model_id);
-
- if (sum->model == MODEL_UNKNOWN)
- ERROR("[ERR] Unknown firmware model (v%d) - model id 0x%02x\n",
- fw_version, model_id);
+ /* OF unknown, give a list of tested versions for the requested model */
-#if 1 /* comment to test new OFs */
char tested_versions[100];
tested_versions[0] = '\0';
for (i = 0; i < NUM_MD5S ; i++)
- if (sansasums[i].model == sum->model) {
+ if (sansasums[i].model == model) {
if (tested_versions[0] != '\0') {
strncat(tested_versions, ", ",
sizeof(tested_versions) - strlen(tested_versions) - 1);
@@ -449,9 +423,8 @@ unsigned char* load_of_file(
}
ERROR("[ERR] Original firmware unknown, please try an other version." \
- " Tested %s versions are : %s\n",
- model_names[sum->model], tested_versions);
-#endif
+ " Tested %sv%d versions are : %s\n",
+ model_names[model], hw_revisions[model], tested_versions);
}
/* TODO: Do some more sanity checks on the OF image. Some images (like
@@ -484,7 +457,7 @@ error:
/* Loads a rockbox bootloader file into memory */
unsigned char* load_rockbox_file(
- char* filename, int model, int* bufsize, int* rb_packedsize,
+ char* filename, int *model, int* bufsize, int* rb_packedsize,
char* errstr, int errstrsize)
{
int fd;
@@ -504,10 +477,12 @@ unsigned char* load_rockbox_file(
if (n != sizeof(header))
ERROR("[ERR] Could not read file %s\n", filename);
- /* Check for correct model string */
- if (memcmp(rb_model_names[model], header + 4, 4)!=0)
- ERROR("[ERR] Expected model name \"%s\" in %s, not \"%4.4s\"\n",
- rb_model_names[model], filename, (char*)header+4);
+ for(*model = 0; *model < NUM_MODELS; (*model)++)
+ if (memcmp(rb_model_names[*model], header + 4, 4) == 0)
+ break;
+
+ if(*model == NUM_MODELS)
+ ERROR("[ERR] Model name \"%4.4s\" unknown. Is this really a rockbox bootloader?\n", header + 4);
*bufsize = filesize(fd) - sizeof(header);
@@ -521,7 +496,7 @@ unsigned char* load_rockbox_file(
ERROR("[ERR] Could not read file %s\n", filename);
/* Check checksum */
- sum = rb_model_num[model];
+ sum = rb_model_num[*model];
for (i = 0; i < *bufsize; i++) {
/* add 8 unsigned bits but keep a 32 bit sum */
sum += buf[i];
diff --git a/rbutil/mkamsboot/mkamsboot.h b/rbutil/mkamsboot/mkamsboot.h
index 835d024d98..d87a5df4f7 100644
--- a/rbutil/mkamsboot/mkamsboot.h
+++ b/rbutil/mkamsboot/mkamsboot.h
@@ -43,6 +43,9 @@ enum {
MODEL_C200V2,
MODEL_CLIPPLUS,
MODEL_FUZEV2,
+ /* new models go here */
+
+ NUM_MODELS
};
@@ -65,8 +68,7 @@ extern const int bootloader_sizes[];
* ARGUMENTS
*
* filename : bootloader file to load
- * model : a 4 characters string representing the Sansa model
- * ("fuze", "clip", "e2v2", "m2v4", or "c2v2")
+ * model : will be set to this bootloader's model
* bootloader_size : set to the uncompressed bootloader size
* rb_packed_size : set to the size of compressed bootloader
* errstr : provided buffer to store an eventual error
@@ -78,7 +80,7 @@ extern const int bootloader_sizes[];
*/
unsigned char* load_rockbox_file(
- char* filename, int model, int* bootloader_size, int* rb_packedsize,
+ char* filename, int *model, int* bootloader_size, int* rb_packedsize,
char* errstr, int errstrsize);
@@ -89,10 +91,9 @@ unsigned char* load_rockbox_file(
* ARGUMENTS
*
* filename : firmware file to load
+ * model : desired player's model
* bufsize : set to firmware file size
* md5sum : set to file md5sum, must be at least 33 bytes long
- * model : set to firmware model (MODEL_XXX)
- * fw_version : set to firmware format version (1 or 2)
* firmware_size : set to firmware block's size
* of_packed : pointer to allocated memory containing the compressed
* original firmware block
@@ -106,7 +107,7 @@ unsigned char* load_rockbox_file(
*/
unsigned char* load_of_file(
- char* filename, off_t* bufsize, struct md5sums *sum,
+ char* filename, int model, off_t* bufsize, struct md5sums *sum,
int* firmware_size, unsigned char** of_packed,
int* of_packedsize, char* errstr, int errstrsize);
diff --git a/rbutil/rbutilqt/base/bootloaderinstallams.cpp b/rbutil/rbutilqt/base/bootloaderinstallams.cpp
index b1f47eda93..3bdd084c60 100644
--- a/rbutil/rbutilqt/base/bootloaderinstallams.cpp
+++ b/rbutil/rbutilqt/base/bootloaderinstallams.cpp
@@ -72,6 +72,7 @@ void BootloaderInstallAms::installStage2(void)
struct md5sums sum;
char md5sum[33]; /* 32 hex digits, plus terminating zero */
int n;
+ int model;
int firmware_size;
int bootloader_size;
int patchable;
@@ -84,33 +85,33 @@ void BootloaderInstallAms::installStage2(void)
QString bootfile = m_tempfile.fileName();
m_tempfile.close();
- /* Load original firmware file */
- buf = load_of_file(m_offile.toLocal8Bit().data(), &len,&sum,&firmware_size,
- &of_packed,&of_packedsize,errstr,sizeof(errstr));
- if (buf == NULL)
- {
- qDebug() << "[BootloaderInstallAms] could not load OF: " << m_offile;
- emit logItem(errstr, LOGERROR);
- emit logItem(tr("Could not load %1").arg(m_offile), LOGERROR);
- emit done(true);
- return;
- }
-
/* Load bootloader file */
- rb_packed = load_rockbox_file(bootfile.toLocal8Bit().data(), sum.model,
+ rb_packed = load_rockbox_file(bootfile.toLocal8Bit().data(), &model,
&bootloader_size,&rb_packedsize,
errstr,sizeof(errstr));
- if (rb_packed == NULL)
+ if (rb_packed == NULL)
{
qDebug() << "[BootloaderInstallAms] could not load bootloader: " << bootfile;
emit logItem(errstr, LOGERROR);
emit logItem(tr("Could not load %1").arg(bootfile), LOGERROR);
- free(buf);
- free(of_packed);
emit done(true);
return;
}
+ /* Load original firmware file */
+ buf = load_of_file(m_offile.toLocal8Bit().data(), model, &len, &sum,
+ &firmware_size, &of_packed ,&of_packedsize,
+ errstr, sizeof(errstr));
+ if (buf == NULL)
+ {
+ qDebug() << "[BootloaderInstallAms] could not load OF: " << m_offile;
+ emit logItem(errstr, LOGERROR);
+ emit logItem(tr("Could not load %1").arg(m_offile), LOGERROR);
+ free(rb_packed);
+ emit done(true);
+ return;
+ }
+
/* check total size */
patchable = check_sizes(sum.model, rb_packedsize, bootloader_size,
of_packedsize, firmware_size, &totalsize, errstr, sizeof(errstr));
diff --git a/utils/AMS/hacking/amsinfo.c b/utils/AMS/hacking/amsinfo.c
index ff92175e64..433333ecca 100644
--- a/utils/AMS/hacking/amsinfo.c
+++ b/utils/AMS/hacking/amsinfo.c
@@ -66,7 +66,7 @@ uint8_t *buf; /* file content */
/* 1st block description */
uint32_t idx,checksum,bs_multiplier,firmware_sz;
-uint32_t unknown_4_1; uint8_t unknown_1,id; uint16_t unknown_2;
+uint32_t unknown_4_1; uint16_t unknown_1, unknown_2;
uint32_t unknown_4_2,unknown_4_3;
static void *xmalloc(size_t s) /* malloc helper */
@@ -76,28 +76,6 @@ static void *xmalloc(size_t s) /* malloc helper */
return r;
}
-/* known models */
-static const char * model(uint8_t id)
-{
- switch(id)
- {
- case 0x1E: return "FUZE"; break;
- case 0x22: return "CLIP"; break;
- case 0x23: return "C200"; break;
- case 0x24: return "E200"; break;
- case 0x25: return "M200"; break;
- case 0x27: return "CLV2"; break;
- case 0x28: return "CLI+"; break;
- case 0x70:
- case 0x6d: return "FUZ2"; break;
- default:
- printf("Unknown ID 0x%x\n", id);
-
- assert(id == 0x1E || (id >= 0x22 && id <= 0x28));
- return "UNKNOWN!";
- }
-}
-
/* checksums the firmware (the firmware header contains the verification) */
static uint32_t do_checksum(void)
{
@@ -142,8 +120,7 @@ static void check(void)
assert(bs_multiplier << 9 == PAD_TO_BOUNDARY(firmware_sz)); /* 0x200 * bs_multiplier */
unknown_4_1 = get32le(0x10 + shift);
- unknown_1 = buf[0x14 + shift];
- id = buf[0x15 + shift];
+ unknown_1 = get16le(0x14 + shift);
unknown_2 = get16le(0x16 + shift);
unknown_4_2 = get32le(0x18 + shift);
unknown_4_3 = get32le(0x1c + shift);
@@ -171,9 +148,6 @@ static void check(void)
printf("1 Unknown %x\n",unknown_1);
color(GREEN);
- printf("1 Model ID %x (%s)\n",id,model(id));
-
- color(GREEN);
printf("2 Unknown (should be 0) %x\n",unknown_2);
assert(unknown_2 == 0);
@@ -185,13 +159,6 @@ static void check(void)
printf("4 Unknown (should be 1) %x\n",unknown_4_3);
assert(unknown_4_3 == 1);
- /* rest of the block is padded with 0xff */
- for(i=0x20 + shift;i<0x200 - shift;i++)
- assert(buf[i]==0xff /* normal case */ ||
- ((id==0x1e||id==0x24) && ( /* Fuze or E200 */
- (i>=0x3c && i<=0x3f && get32le(0x3c)==0x00005000)
- )));
-
/* the 2nd block is identical, except that the 1st byte has been incremented */
assert(buf[0x0]==0&&buf[0x200]==1);
assert(!memcmp(&buf[1],&buf[0x201],0x1FF - shift));