FreeCalypso > hg > freecalypso-tools
view target-utils/libload/cmd_memload.c @ 497:74610c4f10f7
target-utils: added 10 ms delay at the end of abb_power_off()
The deosmification of the ABB access code (replacement of osmo_delay_ms()
bogus delays with correctly-timed ones, which are significantly shorter)
had one annoying side effect: when executing the poweroff command from
any of the programs, one last '=' prompt character was being sent (and
received by the x86 host) as the Calypso board powers off. With delays
being shorter now, the abb_power_off() function was returning and the
standalone program's main loop was printing its prompt before the Iota chip
fully executed the switch-off sequence!
I thought about inserting an endless tight loop at the end of the
abb_power_off() function, but the implemented solution of a 10 ms delay
is a little nicer IMO because if the DEVOFF operation doesn't happen for
some reason in a manual hacking scenario, there won't be an artificial
blocker in the form of a tight loop keeping us from further poking around.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 25 May 2019 20:44:05 +0000 |
parents | 9214118ae941 |
children |
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]; memcpy(addr, srecbin + 5, len); }