FreeCalypso > hg > freecalypso-tools
annotate loadtools/chainload.c @ 689:730a9f919dcd
fc-loadtool flash erase-program-boot fix to not stop scripts
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Wed, 11 Mar 2020 00:48:15 +0000 | 
| parents | 51bcfb251b23 | 
| children | 185c9bf208d3 | 
| 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; | 
| 
 
02bdb2f366bc
fc-xram: added transfer time reporting
 
Mychaela Falconia <falcon@freecalypso.org> 
parents: 
536 
diff
changeset
 | 
159 printf("XRAM image transferred in %um%us\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 } | 
