FreeCalypso > hg > freecalypso-sw
comparison loadtools/ltflash.c @ 58:1f9302b6f342
fc-loadtool: started flash/flash2 command implementation
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Mon, 24 Jun 2013 06:30:57 +0000 |
parents | d98137625c0d |
children | 048329d0888e |
comparison
equal
deleted
inserted
replaced
57:10996c267de4 | 58:1f9302b6f342 |
---|---|
126 "%s line %d: flash setting: too many arguments\n", | 126 "%s line %d: flash setting: too many arguments\n", |
127 filename_for_errs, lineno_for_errs); | 127 filename_for_errs, lineno_for_errs); |
128 exit(1); | 128 exit(1); |
129 } | 129 } |
130 } | 130 } |
131 | |
132 flashcmd_blankchk(argc, argv, bank) | |
133 char **argv; | |
134 { | |
135 printf("To be implemented\n"); | |
136 return(1); | |
137 } | |
138 | |
139 flashcmd_dump2file(argc, argv, bank) | |
140 char **argv; | |
141 { | |
142 struct flash_bank_info *bi; | |
143 u_long offset, dumplen, maxlen; | |
144 char *strtoul_endp; | |
145 int format; | |
146 | |
147 if (argc < 3 || argc > 5) { | |
148 inv: fprintf(stderr, "usage: %s %s outfile [offset [length]]\n", | |
149 argv[0], argv[1]); | |
150 return(-1); | |
151 } | |
152 bi = flash_bank_info + bank; | |
153 if (argc >= 4) { | |
154 offset = strtoul(argv[3], &strtoul_endp, 16); | |
155 if (*strtoul_endp) | |
156 goto inv; | |
157 if (offset >= bi->total_size) { | |
158 fprintf(stderr, | |
159 "error: specified offset exceeds flash bank size (0x%lx)\n", | |
160 (u_long) bi->total_size); | |
161 return(-1); | |
162 } | |
163 } else | |
164 offset = 0; | |
165 maxlen = bi->total_size - offset; | |
166 if (argc >= 5) { | |
167 dumplen = strtoul(argv[4], &strtoul_endp, 16); | |
168 if (*strtoul_endp) | |
169 goto inv; | |
170 if (dumplen > maxlen) { | |
171 fprintf(stderr, | |
172 "error: specified offset+length exceed flash bank size (0x%lx)\n", | |
173 (u_long) bi->total_size); | |
174 return(-1); | |
175 } | |
176 } else | |
177 dumplen = maxlen; | |
178 switch (argv[1][5]) { | |
179 case 'b': | |
180 format = 0; | |
181 break; | |
182 case 's': | |
183 format = 1; | |
184 break; | |
185 default: | |
186 fprintf(stderr, | |
187 "internal bug: bad format in flashcmd_dump2file()\n"); | |
188 return(-1); | |
189 } | |
190 return loadtool_memdump(bi->base_addr + offset, dumplen, argv[2], | |
191 format); | |
192 } | |
193 | |
194 flashcmd_info(argc, argv, bank) | |
195 char **argv; | |
196 { | |
197 struct flash_bank_info *bi; | |
198 | |
199 if (argc > 2) { | |
200 fprintf(stderr, "error: too many arguments\n"); | |
201 return(-1); | |
202 } | |
203 bi = flash_bank_info + bank; | |
204 printf("Flash device type: %s\n", selected_flash_device->name); | |
205 printf("Bank %d base address: %08lX\n", bank, (u_long) bi->base_addr); | |
206 printf("Bank %d total size: %lx\n", bank, (u_long) bi->total_size); | |
207 printf("Sectors in bank %d: %u\n", bank, bi->nsectors); | |
208 if (selected_flash_device->nbanks == 2 && !bank) | |
209 printf("\nFlash device has 2 banks; flash2 command available\n"); | |
210 return(0); | |
211 } | |
212 | |
213 static struct cmdtab { | |
214 char *cmd; | |
215 int (*func)(); | |
216 } cmdtab[] = { | |
217 {"blankchk", flashcmd_blankchk}, | |
218 {"dump2bin", flashcmd_dump2file}, | |
219 {"dump2srec", flashcmd_dump2file}, | |
220 {"info", flashcmd_info}, | |
221 {0, 0} | |
222 }; | |
223 | |
224 cmd_flash(argc, argv) | |
225 char **argv; | |
226 { | |
227 int bank; | |
228 struct cmdtab *tp; | |
229 | |
230 if (!selected_flash_device) { | |
231 fprintf(stderr, "No flash configuration defined\n"); | |
232 return(-1); | |
233 } | |
234 if (argv[0][5] == '2') { | |
235 if (selected_flash_device->nbanks < 2) { | |
236 fprintf(stderr, "Flash device %s has only one bank\n", | |
237 selected_flash_device->name); | |
238 return(-1); | |
239 } | |
240 bank = 1; | |
241 } else | |
242 bank = 0; | |
243 for (tp = cmdtab; tp->cmd; tp++) | |
244 if (!strcmp(tp->cmd, argv[1])) | |
245 break; | |
246 if (!tp->func) { | |
247 fprintf(stderr, "%s %s: unknown/unimplemented subcommand\n", | |
248 argv[0], argv[1]); | |
249 return(-1); | |
250 } | |
251 return tp->func(argc, argv, bank); | |
252 } |