FreeCalypso > hg > freecalypso-sw
diff loadtools/chainload.c @ 42:5da0cbee2b89
fc-xram tool written, compiles, now needs to be debugged
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Mon, 17 Jun 2013 07:18:04 +0000 |
parents | |
children | 5ca0ad4003a0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loadtools/chainload.c Mon Jun 17 07:18:04 2013 +0000 @@ -0,0 +1,101 @@ +/* + * 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; + +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); + } + make_ml_arg(xramimage.record, srecarg); + tpinterf_make_cmd(argv); + if (tpinterf_send_cmd()) + exit(1); + if (tpinterf_pass_output(1)) + exit(1); + putchar('.'); + fflush(stdout); + rec_count++; + } + /* 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); + } + 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); +}