FreeCalypso > hg > freecalypso-tools
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 |