FreeCalypso > hg > freecalypso-tools
view 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 source
/* * 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); }