FreeCalypso > hg > freecalypso-sw
diff target-utils/libload/cmd_memload.c @ 40:9b4c5ce3db8b
loadagent: ML command (support for fc-chainload) implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Mon, 13 May 2013 22:59:08 +0000 |
parents | |
children | eee03b6ac615 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/target-utils/libload/cmd_memload.c Mon May 13 22:59:08 2013 +0000 @@ -0,0 +1,52 @@ +/* + * This module implements the ML (memory load) command, which will be + * used by fc-chainload. + * + * The sole argument to the ML command is the body of an S3 record + * with the initial "S3" characters stripped, i.e., starting with the + * "count" byte, followed by the address, data and checksum bytes + * exactly as in the original S3 record. + */ + +#include "types.h" + +void +cmd_memload(argbulk) + char *argbulk; +{ + char *argv[2], *s; + u8 srecbin[256]; + int len, i, c; + u32 addr; + + if (parse_args(argbulk, 1, 1, argv, 0) < 0) + return; + s = argv[0]; + if (decode_hex_digits(s, 2, &len) < 0) { +inv: printf("ERROR: ML argument is invalid\n"); + return; + } + s += 2; + if (len < 6) + goto inv; + srecbin[0] = len; + for (i = 1; i <= len; i++) { + if (decode_hex_digits(s, 2, &c) < 0) + goto inv; + s += 2; + srecbin[i] = c; + } + c = 0; + for (i = 0; i <= len; i++) + c += srecbin[i]; + if (c != 0xFF) { + printf("ERROR: bad ML S-record checksum\n"); + return; + } + len -= 5; + addr = ((u32)srecbin[1] << 24) | + ((u32)srecbin[2] << 16) | + ((u32)srecbin[3] << 8) | + (u32)srecbin[4]; + bcopy(srecbin + 5, addr, len); +}