comparison loadtools/flprogbin.c @ 665:b43d8c2725b9

fc-loadtool flash program-bin changed to use binary protocol
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 07 Mar 2020 18:34:39 +0000
parents 52980e3a51c7
children 51bcfb251b23
comparison
equal deleted inserted replaced
664:77a0001d8849 665:b43d8c2725b9
8 #include <stdio.h> 8 #include <stdio.h>
9 #include <stdint.h> 9 #include <stdint.h>
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
14 extern int target_fd;
13 15
14 extern struct flash_bank_info flash_bank_info[2]; 16 extern struct flash_bank_info flash_bank_info[2];
15 extern uint32_t crc32_table[]; 17 extern uint32_t crc32_table[];
16 18
17 flashcmd_progbin(argc, argv, bank) 19 flashcmd_progbin(argc, argv, bank)
22 u_long crc_base_addr, crc_from_target; 24 u_long crc_base_addr, crc_from_target;
23 uint32_t crcaccum; 25 uint32_t crcaccum;
24 char *strtoul_endp; 26 char *strtoul_endp;
25 FILE *binf; 27 FILE *binf;
26 struct stat filestat; 28 struct stat filestat;
27 char *targv[4], shortarg[10], longarg[513]; 29 char *targv[3], shortarg[10];
28 u_char databuf[256]; 30 u_char databuf[2048 + 7], ackbyte;
29 int reclen, cc, i; 31 int reclen, cc, i;
30 time_t initial_time, curtime, last_time; 32 time_t initial_time, curtime, last_time;
31 unsigned duration, mm, ss; 33 unsigned duration, mm, ss;
32 34
33 if (argc < 4 || argc > 6) { 35 if (argc < 4 || argc > 6) {
129 if (bi->ops->prep_for_program(bi) < 0) { 131 if (bi->ops->prep_for_program(bi) < 0) {
130 fclose(binf); 132 fclose(binf);
131 return(-1); 133 return(-1);
132 } 134 }
133 fseek(binf, fileoff, SEEK_SET); 135 fseek(binf, fileoff, SEEK_SET);
134 targv[0] = bi->ops->loadagent_program_cmd; 136 targv[0] = bi->ops->loadagent_binmode_cmd;
135 targv[1] = shortarg; 137 targv[1] = 0;
136 targv[2] = longarg; 138 tpinterf_make_cmd(targv);
137 targv[3] = 0; 139 if (tpinterf_send_cmd() < 0) {
140 fclose(binf);
141 return(-1);
142 }
138 printf("Programming flash: %lu (0x%lx) bytes\n", len, len); 143 printf("Programming flash: %lu (0x%lx) bytes\n", len, len);
144 databuf[0] = 0x01;
139 origlen = len; 145 origlen = len;
140 bytesdone = 0; 146 bytesdone = 0;
141 last_time = 0; 147 last_time = 0;
142 crcaccum = 0xFFFFFFFF; 148 crcaccum = 0xFFFFFFFF;
143 time(&initial_time); 149 time(&initial_time);
144 while (len) { 150 while (len) {
145 if (len >= 256) 151 if (len >= 2048)
146 reclen = 256; 152 reclen = 2048;
147 else 153 else
148 reclen = len; 154 reclen = len;
149 cc = fread(databuf, 1, reclen, binf); 155 cc = fread(databuf + 7, 1, reclen, binf);
150 if (cc != reclen) { 156 if (cc != reclen) {
151 fclose(binf); 157 fclose(binf);
152 fprintf(stderr, "error reading from %s\n", argv[3]); 158 fprintf(stderr, "error reading from %s\n", argv[3]);
159 /* don't leave loadagent in binary flash mode */
160 databuf[0] = 0x04;
161 write(target_fd, databuf, 1);
162 tpinterf_pass_output(1);
153 return(-1); 163 return(-1);
154 } 164 }
155 for (i = 0; i < reclen; i++) /* update running CRC */ 165 for (i = 0; i < reclen; i++) /* update running CRC */
156 crcaccum = crc32_table[crcaccum & 0xFF ^ databuf[i]] 166 crcaccum = crc32_table[crcaccum & 0xFF ^ databuf[i+7]]
157 ^ (crcaccum >> 8); 167 ^ (crcaccum >> 8);
158 sprintf(shortarg, "%lx", flashoff); 168 /* binary flash write command to loadagent */
159 build_flashw_hex_string(databuf, longarg, reclen >> 1, 0); 169 databuf[1] = flashoff >> 24;
160 tpinterf_make_cmd(targv); 170 databuf[2] = flashoff >> 16;
161 if (tpinterf_send_cmd() < 0) { 171 databuf[3] = flashoff >> 8;
162 fclose(binf); 172 databuf[4] = flashoff;
163 return(-1); 173 databuf[5] = reclen >> 8;
164 } 174 databuf[6] = reclen;
165 i = tpinterf_pass_output(8); /* 8 s timeout */ 175 cc = write(target_fd, databuf, reclen + 7);
176 if (cc != reclen + 7) {
177 fclose(binf);
178 perror("binary write to target");
179 return(-1);
180 }
181 i = collect_binblock_from_target(&ackbyte, 1, 8);
166 if (i) { 182 if (i) {
167 fclose(binf); 183 fclose(binf);
168 return(i); 184 return(i);
185 }
186 if (ackbyte == 0x15) { /* NAK */
187 fclose(binf);
188 tpinterf_pass_output(1);
189 return(-1);
190 }
191 if (ackbyte != 0x06) { /* ACK */
192 fclose(binf);
193 fprintf(stderr,
194 "binary protocol error: bad ack 0x%02X\n",
195 ackbyte);
196 return(-1);
169 } 197 }
170 flashoff += reclen; 198 flashoff += reclen;
171 len -= reclen; 199 len -= reclen;
172 bytesdone += reclen; 200 bytesdone += reclen;
173 cc = bytesdone * 100 / origlen; 201 cc = bytesdone * 100 / origlen;
179 } 207 }
180 last_time = curtime; 208 last_time = curtime;
181 } 209 }
182 putchar('\n'); 210 putchar('\n');
183 fclose(binf); 211 fclose(binf);
212 databuf[0] = 0x04; /* EOT */
213 write(target_fd, databuf, 1);
214 i = collect_binblock_from_target(&ackbyte, 1, 1);
215 if (i)
216 return(i);
217 time(&last_time);
218 if (ackbyte != '=') {
219 fprintf(stderr, "error: \'=\' not received as expected\n");
220 return(-1);
221 }
184 duration = last_time - initial_time; 222 duration = last_time - initial_time;
185 mm = duration / 60; 223 mm = duration / 60;
186 ss = duration - mm * 60; 224 ss = duration - mm * 60;
187 printf("Operation completed in %um%us\n", mm, ss); 225 printf("Operation completed in %um%us\n", mm, ss);
188 226