summaryrefslogtreecommitdiff
path: root/rbutil/chinachippatcher/chinachip.c
diff options
context:
space:
mode:
Diffstat (limited to 'rbutil/chinachippatcher/chinachip.c')
-rw-r--r--rbutil/chinachippatcher/chinachip.c52
1 files changed, 27 insertions, 25 deletions
diff --git a/rbutil/chinachippatcher/chinachip.c b/rbutil/chinachippatcher/chinachip.c
index e7d4095b38..cafb1d189b 100644
--- a/rbutil/chinachippatcher/chinachip.c
+++ b/rbutil/chinachippatcher/chinachip.c
@@ -27,6 +27,8 @@
27#include <time.h> 27#include <time.h>
28#include "chinachip.h" 28#include "chinachip.h"
29 29
30#define tr(x) x /* Qt translation support */
31
30/* From http://www.rockbox.org/wiki/ChinaChip */ 32/* From http://www.rockbox.org/wiki/ChinaChip */
31struct header 33struct header
32{ 34{
@@ -89,42 +91,42 @@ int chinachip_patch(const char* firmware, const char* bootloader,
89 fd = fopen(firmware, "rb"); 91 fd = fopen(firmware, "rb");
90 if(!fd) 92 if(!fd)
91 { 93 {
92 ERR("Can't open file %s!", firmware); 94 ERR(tr("Can't open file %s!"), firmware);
93 goto err; 95 goto err;
94 } 96 }
95 bd = fopen(bootloader, "rb"); 97 bd = fopen(bootloader, "rb");
96 if(!bd) 98 if(!bd)
97 { 99 {
98 ERR("Can't open file %s!", bootloader); 100 ERR(tr("Can't open file %s!"), bootloader);
99 goto err; 101 goto err;
100 } 102 }
101 103
102 bsize = filesize(bd); 104 bsize = filesize(bd);
103 INFO("Bootloader size is %d bytes", bsize); 105 INFO(tr("Bootloader size is %d bytes"), bsize);
104 FCLOSE(bd); 106 FCLOSE(bd);
105 107
106 fsize = filesize(fd); 108 fsize = filesize(fd);
107 INFO("Firmware size is %d bytes", fsize); 109 INFO(tr("Firmware size is %d bytes"), fsize);
108 110
109 buf = malloc(TOTAL_SIZE); 111 buf = malloc(TOTAL_SIZE);
110 if(buf == NULL) 112 if(buf == NULL)
111 { 113 {
112 ERR("Can't allocate %d bytes!", fsize); 114 ERR(tr("Can't allocate %d bytes!"), fsize);
113 goto err; 115 goto err;
114 } 116 }
115 memset(buf, 0, TOTAL_SIZE); 117 memset(buf, 0, TOTAL_SIZE);
116 118
117 INFO("Reading %s into memory...", firmware); 119 INFO(tr("Reading %s into memory..."), firmware);
118 if(fread(buf, fsize, 1, fd) != 1) 120 if(fread(buf, fsize, 1, fd) != 1)
119 { 121 {
120 ERR("Can't read file %s to memory!", firmware); 122 ERR(tr("Can't read file %s to memory!"), firmware);
121 goto err; 123 goto err;
122 } 124 }
123 FCLOSE(fd); 125 FCLOSE(fd);
124 126
125 if(memcmp(buf, "WADF", 4)) 127 if(memcmp(buf, "WADF", 4))
126 { 128 {
127 ERR("File %s isn't a valid ChinaChip firmware!", firmware); 129 ERR(tr("File %s isn't a valid ChinaChip firmware!"), firmware);
128 goto err; 130 goto err;
129 } 131 }
130 132
@@ -146,30 +148,30 @@ int chinachip_patch(const char* firmware, const char* bootloader,
146 148
147 if(i >= fsize) 149 if(i >= fsize)
148 { 150 {
149 ERR("Couldn't find ccpmp.bin in %s!", firmware); 151 ERR(tr("Couldn't find ccpmp.bin in %s!"), firmware);
150 goto err; 152 goto err;
151 } 153 }
152 INFO("Found ccpmp.bin at %d bytes", ccpmp_pos); 154 INFO(tr("Found ccpmp.bin at %d bytes"), ccpmp_pos);
153 155
154 if(ccpmp_backup) 156 if(ccpmp_backup)
155 { 157 {
156 bd = fopen(ccpmp_backup, "wb"); 158 bd = fopen(ccpmp_backup, "wb");
157 if(!bd) 159 if(!bd)
158 { 160 {
159 ERR("Can't open file %s!", ccpmp_backup); 161 ERR(tr("Can't open file %s!"), ccpmp_backup);
160 goto err; 162 goto err;
161 } 163 }
162 164
163 INFO("Writing %d bytes to %s...", ccpmp_size, ccpmp_backup); 165 INFO(tr("Writing %d bytes to %s..."), ccpmp_size, ccpmp_backup);
164 if(fwrite(&buf[ccpmp_pos], ccpmp_size, 1, bd) != 1) 166 if(fwrite(&buf[ccpmp_pos], ccpmp_size, 1, bd) != 1)
165 { 167 {
166 ERR("Can't write to file %s!", ccpmp_backup); 168 ERR(tr("Can't write to file %s!"), ccpmp_backup);
167 goto err; 169 goto err;
168 } 170 }
169 FCLOSE(bd); 171 FCLOSE(bd);
170 } 172 }
171 173
172 INFO("Renaming it to ccpmp.old..."); 174 INFO(tr("Renaming it to ccpmp.old..."));
173 buf[ccpmp_pos + 6] = 'o'; 175 buf[ccpmp_pos + 6] = 'o';
174 buf[ccpmp_pos + 7] = 'l'; 176 buf[ccpmp_pos + 7] = 'l';
175 buf[ccpmp_pos + 8] = 'd'; 177 buf[ccpmp_pos + 8] = 'd';
@@ -177,27 +179,27 @@ int chinachip_patch(const char* firmware, const char* bootloader,
177 bd = fopen(bootloader, "rb"); 179 bd = fopen(bootloader, "rb");
178 if(!bd) 180 if(!bd)
179 { 181 {
180 ERR("Can't open file %s!", bootloader); 182 ERR(tr("Can't open file %s!"), bootloader);
181 goto err; 183 goto err;
182 } 184 }
183 185
184 /* Also include path size */ 186 /* Also include path size */
185 ccpmp_pos -= sizeof(uint32_t); 187 ccpmp_pos -= sizeof(uint32_t);
186 188
187 INFO("Making place for ccpmp.bin..."); 189 INFO(tr("Making place for ccpmp.bin..."));
188 memmove(&buf[ccpmp_pos + bsize + CCPMPBIN_HEADER_SIZE], 190 memmove(&buf[ccpmp_pos + bsize + CCPMPBIN_HEADER_SIZE],
189 &buf[ccpmp_pos], fsize - ccpmp_pos); 191 &buf[ccpmp_pos], fsize - ccpmp_pos);
190 192
191 INFO("Reading %s into memory...", bootloader); 193 INFO(tr("Reading %s into memory..."), bootloader);
192 if(fread(&buf[ccpmp_pos + CCPMPBIN_HEADER_SIZE], 194 if(fread(&buf[ccpmp_pos + CCPMPBIN_HEADER_SIZE],
193 bsize, 1, bd) != 1) 195 bsize, 1, bd) != 1)
194 { 196 {
195 ERR("Can't read file %s to memory!", bootloader); 197 ERR(tr("Can't read file %s to memory!"), bootloader);
196 goto err; 198 goto err;
197 } 199 }
198 FCLOSE(bd); 200 FCLOSE(bd);
199 201
200 INFO("Adding header to %s...", bootloader); 202 INFO(tr("Adding header to %s..."), bootloader);
201 int2le(&buf[ccpmp_pos ], 9); /* Pathname Size */ 203 int2le(&buf[ccpmp_pos ], 9); /* Pathname Size */
202 memcpy(&buf[ccpmp_pos + 4 ], "ccpmp.bin", 9); /* Pathname */ 204 memcpy(&buf[ccpmp_pos + 4 ], "ccpmp.bin", 9); /* Pathname */
203 memset(&buf[ccpmp_pos + 4 + 9 ], 0x20, sizeof(uint8_t)); /* File Type */ 205 memset(&buf[ccpmp_pos + 4 + 9 ], 0x20, sizeof(uint8_t)); /* File Type */
@@ -207,7 +209,7 @@ int chinachip_patch(const char* firmware, const char* bootloader,
207 time_info = localtime(&cur_time); 209 time_info = localtime(&cur_time);
208 if(time_info == NULL) 210 if(time_info == NULL)
209 { 211 {
210 ERR("Can't obtain current time!"); 212 ERR(tr("Can't obtain current time!"));
211 goto err; 213 goto err;
212 } 214 }
213 215
@@ -217,11 +219,11 @@ int chinachip_patch(const char* firmware, const char* bootloader,
217 time_info->tm_hour, 219 time_info->tm_hour,
218 time_info->tm_min); 220 time_info->tm_min);
219 221
220 INFO("Computing checksum..."); 222 INFO(tr("Computing checksum..."));
221 for(i = sizeof(struct header); i < TOTAL_SIZE; i+=4) 223 for(i = sizeof(struct header); i < TOTAL_SIZE; i+=4)
222 checksum += le2int(&buf[i]); 224 checksum += le2int(&buf[i]);
223 225
224 INFO("Updating main header..."); 226 INFO(tr("Updating main header..."));
225 memcpy(&buf[offsetof(struct header, timestamp)], header_time, 12); 227 memcpy(&buf[offsetof(struct header, timestamp)], header_time, 12);
226 int2le(&buf[offsetof(struct header, size) ], TOTAL_SIZE); 228 int2le(&buf[offsetof(struct header, size) ], TOTAL_SIZE);
227 int2le(&buf[offsetof(struct header, checksum) ], checksum); 229 int2le(&buf[offsetof(struct header, checksum) ], checksum);
@@ -229,14 +231,14 @@ int chinachip_patch(const char* firmware, const char* bootloader,
229 od = fopen(output, "wb"); 231 od = fopen(output, "wb");
230 if(!od) 232 if(!od)
231 { 233 {
232 ERR("Can't open file %s!", output); 234 ERR(tr("Can't open file %s!"), output);
233 goto err; 235 goto err;
234 } 236 }
235 237
236 INFO("Writing output to %s...", output); 238 INFO(tr("Writing output to %s..."), output);
237 if(fwrite(buf, TOTAL_SIZE, 1, od) != 1) 239 if(fwrite(buf, TOTAL_SIZE, 1, od) != 1)
238 { 240 {
239 ERR("Can't write to file %s!", output); 241 ERR(tr("Can't write to file %s!"), output);
240 goto err; 242 goto err;
241 } 243 }
242 fclose(od); 244 fclose(od);