view target-utils/libload/cmd_memload.c @ 11:21eec7569eb8

loadtools support for C139/140 target: -c 1004 compalstage variant supercedes the previous -c 1003 version and supports the new C139 boot code version found in the wild that expects "1004" or greater in the signature bytes
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 25 Jul 2016 21:09:33 +0000
parents e7502631a0f9
children 9214118ae941
line wrap: on
line source

/*
 * 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], cksum;
	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;
	}
	cksum = 0;
	for (i = 0; i <= len; i++)
		cksum += srecbin[i];
	if (cksum != 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);
}