summaryrefslogtreecommitdiff
path: root/tools/scramble.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/scramble.c')
-rw-r--r--tools/scramble.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/tools/scramble.c b/tools/scramble.c
index 3be92d0605..3d7970c9f9 100644
--- a/tools/scramble.c
+++ b/tools/scramble.c
@@ -22,6 +22,26 @@
22 22
23#include "iriver.h" 23#include "iriver.h"
24 24
25enum
26{
27 ARCHOS_PLAYER,
28 ARCHOS_V1RECORDER,
29 ARCHOS_V2RECORDER,
30 ARCHOS_FMRECORDER,
31 ARCHOS_ONDIO_SP,
32 ARCHOS_ONDIO_FM
33};
34
35int size_limit[] =
36{
37 0x32000, /* ARCHOS_PLAYER */
38 0x32000, /* ARCHOS_V1RECORDER */
39 0x64000, /* ARCHOS_V2RECORDER */
40 0x64000, /* ARCHOS_FMRECORDER */
41 0x64000, /* ARCHOS_ONDIO_SP */
42 0x64000 /* ARCHOS_ONDIO_FM */
43};
44
25void int2le(unsigned int val, unsigned char* addr) 45void int2le(unsigned int val, unsigned char* addr)
26{ 46{
27 addr[0] = val & 0xFF; 47 addr[0] = val & 0xFF;
@@ -71,8 +91,11 @@ int main (int argc, char** argv)
71 int version; 91 int version;
72 unsigned long irivernum; 92 unsigned long irivernum;
73 char irivermodel[5]; 93 char irivermodel[5];
94 int model_id;
74 enum { none, scramble, xor, add } method = scramble; 95 enum { none, scramble, xor, add } method = scramble;
75 96
97 model_id = ARCHOS_PLAYER;
98
76 if (argc < 3) { 99 if (argc < 3) {
77 usage(); 100 usage();
78 } 101 }
@@ -82,6 +105,7 @@ int main (int argc, char** argv)
82 iname = argv[2]; 105 iname = argv[2];
83 oname = argv[3]; 106 oname = argv[3];
84 version = 4; 107 version = 4;
108 model_id = ARCHOS_FMRECORDER;
85 } 109 }
86 110
87 else if(!strcmp(argv[1], "-v2")) { 111 else if(!strcmp(argv[1], "-v2")) {
@@ -89,6 +113,7 @@ int main (int argc, char** argv)
89 iname = argv[2]; 113 iname = argv[2];
90 oname = argv[3]; 114 oname = argv[3];
91 version = 2; 115 version = 2;
116 model_id = ARCHOS_V2RECORDER;
92 } 117 }
93 118
94 else if(!strcmp(argv[1], "-ofm")) { 119 else if(!strcmp(argv[1], "-ofm")) {
@@ -96,6 +121,7 @@ int main (int argc, char** argv)
96 iname = argv[2]; 121 iname = argv[2];
97 oname = argv[3]; 122 oname = argv[3];
98 version = 8; 123 version = 8;
124 model_id = ARCHOS_ONDIO_FM;
99 } 125 }
100 126
101 else if(!strcmp(argv[1], "-osp")) { 127 else if(!strcmp(argv[1], "-osp")) {
@@ -103,6 +129,7 @@ int main (int argc, char** argv)
103 iname = argv[2]; 129 iname = argv[2];
104 oname = argv[3]; 130 oname = argv[3];
105 version = 16; 131 version = 16;
132 model_id = ARCHOS_ONDIO_SP;
106 } 133 }
107 134
108 else if(!strcmp(argv[1], "-neo")) { 135 else if(!strcmp(argv[1], "-neo")) {
@@ -164,12 +191,14 @@ int main (int argc, char** argv)
164 length = ftell(file); 191 length = ftell(file);
165 length = (length + 3) & ~3; /* Round up to nearest 4 byte boundary */ 192 length = (length + 3) & ~3; /* Round up to nearest 4 byte boundary */
166 193
167 if ((method == scramble) && ((length + headerlen) >= 0x32000)) { 194 if ((method == scramble) &&
168 printf("error: max firmware size is 200KB!\n"); 195 ((length + headerlen) >= size_limit[model_id])) {
196 printf("error: max firmware size is %dKB!\n",
197 size_limit[model_id]/1024);
169 fclose(file); 198 fclose(file);
170 return -1; 199 return -1;
171 } 200 }
172 201
173 fseek(file,0,SEEK_SET); 202 fseek(file,0,SEEK_SET);
174 inbuf = malloc(length); 203 inbuf = malloc(length);
175 if (method == xor) 204 if (method == xor)