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 }