FreeCalypso > hg > freecalypso-tools
diff loadtools/chainload.c @ 0:e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 11 Jun 2016 00:13:35 +0000 |
parents | |
children | 88962b111edc |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loadtools/chainload.c Sat Jun 11 00:13:35 2016 +0000 @@ -0,0 +1,114 @@ +/* + * This module implements the chain-loading of XRAM images via loadagent. + */ + +#include <sys/types.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "srecreader.h" + +struct srecreader xramimage; + +extern struct baudrate *current_baud_rate; +extern struct baudrate *xram_run_baudrate; + +static void +make_ml_arg(rec, buf) + u_char *rec; + char *buf; +{ + register int i, len; + register char *s; + + len = rec[0] + 1; + s = buf; + for (i = 0; i < len; i++) { + sprintf(s, "%02X", rec[i]); + s += 2; + } + *s = '\0'; +} + +perform_chain_load() +{ + int resp; + unsigned long rec_count; + char *argv[3], srecarg[516]; + + if (open_srec_file(&xramimage) < 0) + exit(1); + argv[0] = "ML"; + argv[1] = srecarg; + argv[2] = 0; + for (rec_count = 0; ; ) { + if (read_s_record(&xramimage) < 0) + exit(1); + switch (xramimage.record_type) { + case '0': + if (xramimage.lineno == 1) + continue; + fprintf(stderr, + "%s: S0 record found in line %d (expected in line 1 only)\n", + xramimage.filename, xramimage.lineno); + exit(1); + case '3': + case '7': + if (s3s7_get_addr_data(&xramimage) < 0) + exit(1); + break; + default: + fprintf(stderr, + "%s line %d: S%c record type not supported\n", + xramimage.filename, xramimage.lineno, + xramimage.record_type); + exit(1); + } + if (xramimage.record_type == '7') + break; + /* must be S3 */ + if (xramimage.datalen < 1) { + fprintf(stderr, + "%s line %d: S3 record has zero data length\n", + xramimage.filename, xramimage.lineno); + exit(1); + } + if (!rec_count) + printf("Each \'.\' is 100 S-records\n"); + make_ml_arg(xramimage.record, srecarg); + tpinterf_make_cmd(argv); + if (tpinterf_send_cmd()) + exit(1); + if (tpinterf_pass_output(1)) + exit(1); + rec_count++; + if (rec_count % 100 == 0) { + putchar('.'); + fflush(stdout); + } + } + /* got S7 */ + fclose(xramimage.openfile); + if (!rec_count) { + fprintf(stderr, + "%s line %d: S7 without any preceding S3 data records\n", + xramimage.filename, xramimage.lineno); + exit(1); + } + if (xram_run_baudrate != current_baud_rate) { + resp = loadagent_switch_baud(xram_run_baudrate); + if (resp) + exit(1); + } + printf("Sending jump command\n"); + sprintf(srecarg, "%lX", (u_long) xramimage.addr); + argv[0] = "jump"; + tpinterf_make_cmd(argv); + if (tpinterf_send_cmd()) + exit(1); + printf("Sent \"%s %s\": XRAM image should now be running!\n", + argv[0], argv[1]); + return(0); +}