FreeCalypso > hg > freecalypso-tools
annotate loadtools/chainload.c @ 967:6bf473f77fc4
fcup-smsend: support backslash escapes in UCS-2 mode too
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 01 Sep 2023 16:43:35 +0000 |
parents | 185c9bf208d3 |
children |
rev | line source |
---|---|
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This module implements the chain-loading of XRAM images via loadagent. |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 */ |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 #include <sys/types.h> |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <stdint.h> |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <stdio.h> |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdlib.h> |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <string.h> |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <strings.h> |
614
02bdb2f366bc
fc-xram: added transfer time reporting
Mychaela Falconia <falcon@freecalypso.org>
parents:
536
diff
changeset
|
11 #include <time.h> |
666
51bcfb251b23
fc-loadtool flash program-m0 changed to use binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
656
diff
changeset
|
12 #include <unistd.h> |
651
6bb41b4d39ed
fc-xram number of records per batch made baudrate-dependent
Mychaela Falconia <falcon@freecalypso.org>
parents:
650
diff
changeset
|
13 #include "../libserial/baudrate.h" |
656
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
14 #include "discontig.h" |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include "srecreader.h" |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 |
650
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
17 extern int target_fd; |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
18 |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 struct srecreader xramimage; |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 extern struct baudrate *current_baud_rate; |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 extern struct baudrate *xram_run_baudrate; |
536
dc05170ab113
fc-xram JTAG mode (-j) implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
535
diff
changeset
|
23 extern int xram_jtag_mode; |
656
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
24 extern uint32_t crc32_table[]; |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 perform_chain_load() |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 { |
656
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
28 int rc, reclen, too_many_regions; |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 unsigned long rec_count; |
656
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
30 struct discontig_prog regions[MAX_SREC_REGIONS], *regp; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
31 unsigned regcount, reg; |
650
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
32 char *argv[3], jumparg[10]; |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
33 u_char scratch[3], expect_conf[3]; |
614
02bdb2f366bc
fc-xram: added transfer time reporting
Mychaela Falconia <falcon@freecalypso.org>
parents:
536
diff
changeset
|
34 time_t start_time, finish_time; |
02bdb2f366bc
fc-xram: added transfer time reporting
Mychaela Falconia <falcon@freecalypso.org>
parents:
536
diff
changeset
|
35 unsigned duration, mm, ss; |
656
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
36 u_long crc_from_target; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
37 int i, c; |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 if (open_srec_file(&xramimage) < 0) |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 exit(1); |
650
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
41 /* enter binary RAM download mode */ |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
42 argv[0] = "BINML"; |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
43 argv[1] = 0; |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
44 tpinterf_make_cmd(argv); |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
45 if (tpinterf_send_cmd()) |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
46 exit(1); |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
47 /* read and send S-record image */ |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
48 expect_conf[0] = 0x06; |
656
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
49 regp = regions; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
50 regcount = 0; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
51 too_many_regions = 0; |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 for (rec_count = 0; ; ) { |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 if (read_s_record(&xramimage) < 0) |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 exit(1); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 switch (xramimage.record_type) { |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 case '0': |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 if (xramimage.lineno == 1) |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 continue; |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 fprintf(stderr, |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 "%s: S0 record found in line %d (expected in line 1 only)\n", |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 xramimage.filename, xramimage.lineno); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 exit(1); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 case '3': |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 case '7': |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 if (s3s7_get_addr_data(&xramimage) < 0) |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 exit(1); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 break; |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 default: |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 fprintf(stderr, |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 "%s line %d: S%c record type not supported\n", |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 xramimage.filename, xramimage.lineno, |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 xramimage.record_type); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 exit(1); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 } |
650
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
75 if (xramimage.record_type == '7') |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 break; |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 /* must be S3 */ |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 if (xramimage.datalen < 1) { |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 fprintf(stderr, |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 "%s line %d: S3 record has zero data length\n", |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 xramimage.filename, xramimage.lineno); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 exit(1); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 } |
614
02bdb2f366bc
fc-xram: added transfer time reporting
Mychaela Falconia <falcon@freecalypso.org>
parents:
536
diff
changeset
|
84 if (!rec_count) { |
651
6bb41b4d39ed
fc-xram number of records per batch made baudrate-dependent
Mychaela Falconia <falcon@freecalypso.org>
parents:
650
diff
changeset
|
85 printf("Each \'.\' is %d S-records\n", |
6bb41b4d39ed
fc-xram number of records per batch made baudrate-dependent
Mychaela Falconia <falcon@freecalypso.org>
parents:
650
diff
changeset
|
86 current_baud_rate->xram_records); |
614
02bdb2f366bc
fc-xram: added transfer time reporting
Mychaela Falconia <falcon@freecalypso.org>
parents:
536
diff
changeset
|
87 time(&start_time); |
02bdb2f366bc
fc-xram: added transfer time reporting
Mychaela Falconia <falcon@freecalypso.org>
parents:
536
diff
changeset
|
88 } |
650
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
89 reclen = xramimage.datalen + 6; |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
90 if (write(target_fd, xramimage.record, reclen) != reclen) { |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
91 perror("binary write to target"); |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 exit(1); |
650
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
93 } |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 rec_count++; |
656
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
95 /* discontiguous regions and CRC-32 accumulation */ |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
96 if (!regcount) { |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
97 regp->start = xramimage.addr; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
98 regp->end = xramimage.addr; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
99 regp->crc = 0xFFFFFFFF; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
100 regcount = 1; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
101 } |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
102 if (xramimage.addr != regp->end) { |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
103 if (regcount >= MAX_SREC_REGIONS) |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
104 too_many_regions = 1; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
105 else { |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
106 regp++; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
107 regcount++; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
108 regp->start = xramimage.addr; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
109 regp->end = xramimage.addr; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
110 regp->crc = 0xFFFFFFFF; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
111 } |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
112 } |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
113 if (!too_many_regions) { |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
114 for (i = 0; i < xramimage.datalen; i++) { |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
115 c = xramimage.record[i+5]; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
116 regp->crc = crc32_table[regp->crc & 0xFF ^ c] |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
117 ^ (regp->crc >> 8); |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
118 } |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
119 regp->end += xramimage.datalen; |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
120 } |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
121 /* target sync and progress indication */ |
651
6bb41b4d39ed
fc-xram number of records per batch made baudrate-dependent
Mychaela Falconia <falcon@freecalypso.org>
parents:
650
diff
changeset
|
122 if (rec_count % current_baud_rate->xram_records == 0) { |
650
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
123 scratch[0] = 0x05; /* ENQ */ |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
124 write(target_fd, scratch, 1); |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
125 if (collect_binblock_from_target(scratch, 3, 1)) |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
126 exit(1); |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
127 expect_conf[1] = rec_count >> 8; |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
128 expect_conf[2] = rec_count; |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
129 if (bcmp(scratch, expect_conf, 3)) { |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
130 fprintf(stderr, |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
131 "error: expected sync mismatch\n"); |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
132 exit(1); |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
133 } |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 putchar('.'); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 fflush(stdout); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 } |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 } |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 /* got S7 */ |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 fclose(xramimage.openfile); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 if (!rec_count) { |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 fprintf(stderr, |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 "%s line %d: S7 without any preceding S3 data records\n", |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 xramimage.filename, xramimage.lineno); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 exit(1); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 } |
535
88962b111edc
fc-xram: print a newline after the dots
Mychaela Falconia <falcon@freecalypso.org>
parents:
0
diff
changeset
|
146 putchar('\n'); /* newline after the dots */ |
650
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
147 scratch[0] = 0x04; /* EOT */ |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
148 write(target_fd, scratch, 1); |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
149 if (collect_binblock_from_target(scratch, 1, 1)) |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
150 exit(1); |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
151 time(&finish_time); |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
152 if (scratch[0] != '=') { |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
153 fprintf(stderr, "error: \'=\' not received as expected\n"); |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
154 exit(1); |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
155 } |
614
02bdb2f366bc
fc-xram: added transfer time reporting
Mychaela Falconia <falcon@freecalypso.org>
parents:
536
diff
changeset
|
156 duration = finish_time - start_time; |
02bdb2f366bc
fc-xram: added transfer time reporting
Mychaela Falconia <falcon@freecalypso.org>
parents:
536
diff
changeset
|
157 mm = duration / 60; |
02bdb2f366bc
fc-xram: added transfer time reporting
Mychaela Falconia <falcon@freecalypso.org>
parents:
536
diff
changeset
|
158 ss = duration - mm * 60; |
692
185c9bf208d3
loadtools operation time reporting: two digits for seconds
Mychaela Falconia <falcon@freecalypso.org>
parents:
666
diff
changeset
|
159 printf("XRAM image transferred in %um%02us\n", mm, ss); |
656
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
160 printf("Verifying CRC-32 of %u downloaded region(s)\n", regcount); |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
161 for (reg = 0, regp = regions; reg < regcount; reg++, regp++) { |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
162 rc = crc32_on_target((u_long) regp->start, |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
163 (u_long) (regp->end - regp->start), |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
164 &crc_from_target); |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
165 if (rc < 0) |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
166 exit(1); |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
167 if (crc_from_target != regp->crc) { |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
168 fprintf(stderr, "error: CRC mismatch!\n"); |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
169 exit(1); |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
170 } |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
171 putchar('.'); |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
172 fflush(stdout); |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
173 } |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
174 putchar('\n'); |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 if (xram_run_baudrate != current_baud_rate) { |
656
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
176 rc = loadagent_switch_baud(xram_run_baudrate); |
9f5a3e9e6294
fc-xram: implemented CRC-32 verification
Mychaela Falconia <falcon@freecalypso.org>
parents:
651
diff
changeset
|
177 if (rc) |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 exit(1); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 } |
536
dc05170ab113
fc-xram JTAG mode (-j) implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
535
diff
changeset
|
180 if (xram_jtag_mode) { |
dc05170ab113
fc-xram JTAG mode (-j) implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
535
diff
changeset
|
181 printf( |
dc05170ab113
fc-xram JTAG mode (-j) implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
535
diff
changeset
|
182 "Leaving target in loadagent for JTAG; image start address is 0x%08lX\n", |
dc05170ab113
fc-xram JTAG mode (-j) implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
535
diff
changeset
|
183 (u_long) xramimage.addr); |
dc05170ab113
fc-xram JTAG mode (-j) implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
535
diff
changeset
|
184 exit(0); |
dc05170ab113
fc-xram JTAG mode (-j) implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
535
diff
changeset
|
185 } |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 printf("Sending jump command\n"); |
650
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
187 sprintf(jumparg, "%lX", (u_long) xramimage.addr); |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 argv[0] = "jump"; |
650
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
189 argv[1] = jumparg; |
bf840c984113
fc-xram reworked to use the new binary protocol
Mychaela Falconia <falcon@freecalypso.org>
parents:
614
diff
changeset
|
190 argv[2] = 0; |
0
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 tpinterf_make_cmd(argv); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 if (tpinterf_send_cmd()) |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 exit(1); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 printf("Sent \"%s %s\": XRAM image should now be running!\n", |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 argv[0], argv[1]); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 return(0); |
e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 } |