comparison loadtools/flprogbin.c @ 922:fb3f04a62f71

fc-loadtool: flash program-bin now performs a CRC-32 verification
author Mychaela Falconia <falcon@ivan.Harhan.ORG>
date Mon, 19 Oct 2015 04:10:34 +0000
parents 81d387690063
children
comparison
equal deleted inserted replaced
921:38c7078712ab 922:fb3f04a62f71
10 #include <stdlib.h> 10 #include <stdlib.h>
11 #include <time.h> 11 #include <time.h>
12 #include "flash.h" 12 #include "flash.h"
13 13
14 extern struct flash_bank_info flash_bank_info[2]; 14 extern struct flash_bank_info flash_bank_info[2];
15 extern uint32_t crc32_table[];
15 16
16 flashcmd_progbin(argc, argv, bank) 17 flashcmd_progbin(argc, argv, bank)
17 char **argv; 18 char **argv;
18 { 19 {
19 struct flash_bank_info *bi; 20 struct flash_bank_info *bi;
20 u_long flashoff, fileoff, len, origlen, bytesdone; 21 u_long flashoff, fileoff, len, origlen, bytesdone;
22 u_long crc_base_addr, crc_from_target;
23 uint32_t crcaccum;
21 char *strtoul_endp; 24 char *strtoul_endp;
22 FILE *binf; 25 FILE *binf;
23 struct stat filestat; 26 struct stat filestat;
24 char *targv[4], shortarg[10], longarg[513]; 27 char *targv[4], shortarg[10], longarg[513];
25 u_char databuf[256]; 28 u_char databuf[256];
26 int reclen, cc; 29 int reclen, cc, i;
27 time_t curtime, last_time; 30 time_t curtime, last_time;
28 31
29 if (argc < 4 || argc > 6) { 32 if (argc < 4 || argc > 6) {
30 inv: fprintf(stderr, 33 inv: fprintf(stderr,
31 "usage: %s %s flash-offset binfile [file-offset [length]]\n", 34 "usage: %s %s flash-offset binfile [file-offset [length]]\n",
108 /* finally done with the arg parsing etc, can get to work now */ 111 /* finally done with the arg parsing etc, can get to work now */
109 if (flash_id_check(bank, 0) < 0) { 112 if (flash_id_check(bank, 0) < 0) {
110 fclose(binf); 113 fclose(binf);
111 return(-1); 114 return(-1);
112 } 115 }
116 crc_base_addr = bi->base_addr + flashoff;
113 sprintf(shortarg, "%lx", (u_long) bi->base_addr); 117 sprintf(shortarg, "%lx", (u_long) bi->base_addr);
114 targv[0] = bi->ops->loadagent_setbase_cmd; 118 targv[0] = bi->ops->loadagent_setbase_cmd;
115 targv[1] = shortarg; 119 targv[1] = shortarg;
116 targv[2] = 0; 120 targv[2] = 0;
117 printf("Setting flash base address: %s %s\n", targv[0], targv[1]); 121 printf("Setting flash base address: %s %s\n", targv[0], targv[1]);
136 targv[3] = 0; 140 targv[3] = 0;
137 printf("Programming flash: %lu (0x%lx) bytes\n", len, len); 141 printf("Programming flash: %lu (0x%lx) bytes\n", len, len);
138 origlen = len; 142 origlen = len;
139 bytesdone = 0; 143 bytesdone = 0;
140 last_time = 0; 144 last_time = 0;
145 crcaccum = 0xFFFFFFFF;
141 while (len) { 146 while (len) {
142 if (len >= 256) 147 if (len >= 256)
143 reclen = 256; 148 reclen = 256;
144 else 149 else
145 reclen = len; 150 reclen = len;
147 if (cc != reclen) { 152 if (cc != reclen) {
148 fclose(binf); 153 fclose(binf);
149 fprintf(stderr, "error reading from %s\n", argv[3]); 154 fprintf(stderr, "error reading from %s\n", argv[3]);
150 return(-1); 155 return(-1);
151 } 156 }
157 for (i = 0; i < reclen; i++) /* update running CRC */
158 crcaccum = crc32_table[crcaccum & 0xFF ^ databuf[i]]
159 ^ (crcaccum >> 8);
152 sprintf(shortarg, "%lx", flashoff); 160 sprintf(shortarg, "%lx", flashoff);
153 build_flashw_hex_string(databuf, longarg, reclen >> 1, 0); 161 build_flashw_hex_string(databuf, longarg, reclen >> 1, 0);
154 tpinterf_make_cmd(targv); 162 tpinterf_make_cmd(targv);
155 if (tpinterf_send_cmd() < 0) { 163 if (tpinterf_send_cmd() < 0) {
156 fclose(binf); 164 fclose(binf);
157 return(-1); 165 return(-1);
158 } 166 }
159 cc = tpinterf_pass_output(8); /* 8 s timeout */ 167 i = tpinterf_pass_output(8); /* 8 s timeout */
160 if (cc) { 168 if (i) {
161 fclose(binf); 169 fclose(binf);
162 return(cc); 170 return(i);
163 } 171 }
164 flashoff += reclen; 172 flashoff += reclen;
165 len -= reclen; 173 len -= reclen;
166 bytesdone += reclen; 174 bytesdone += reclen;
167 cc = bytesdone * 100 / origlen; 175 cc = bytesdone * 100 / origlen;
173 } 181 }
174 last_time = curtime; 182 last_time = curtime;
175 } 183 }
176 putchar('\n'); 184 putchar('\n');
177 fclose(binf); 185 fclose(binf);
178 return(0); 186
187 /* reset flash to read mode */
188 if (bi->ops->reset_cmd(bi) < 0)
189 return(-1);
190 printf("Verifying CRC-32 of programmed flash area\n");
191 if (crc32_on_target(crc_base_addr, origlen, &crc_from_target) < 0)
192 return(-1);
193 if (crc_from_target == crcaccum) {
194 printf("match (%08lX)\n", crc_from_target);
195 return(0);
196 } else {
197 fprintf(stderr, "error: CRC mismatch!\n");
198 return(-1);
199 }
179 } 200 }