view loadtools/sertool.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 8c011177adb9
children aba969153d20
line wrap: on
line source

/*
 * This module contains the main() function for fc-iram, previously
 * called fc-sertool: the simplest of the FreeCalypso loading tools,
 * which sends the user-specified IRAM SREC image to the boot ROM
 * and then switches into serial tty pass-through.
 */

#include <sys/types.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "srecreader.h"

char *target_ttydev;

extern struct srecreader iramimage;
extern int gta_modem_poweron;

char **passon_argv;
int passon_argc;

main(argc, argv)
	char **argv;
{
	extern char *optarg;
	extern int optind;
	int c;

	while ((c = getopt(argc, argv, "b:c:C:h:H:i:n")) != EOF)
		switch (c) {
		case 'b':
			set_romload_baudrate(optarg);
			continue;
		case 'c':
			set_compalstage_short(optarg);
			continue;
		case 'C':
			set_compalstage_fullpath(optarg);
			continue;
		case 'h':
			read_hwparam_file_shortname(optarg);
			continue;
		case 'H':
			read_hwparam_file_fullpath(optarg);
			continue;
		case 'i':
			set_beacon_interval(optarg);
			continue;
		case 'n':
			gta_modem_poweron = 0;
			continue;
		case '?':
		default:
usage:			fprintf(stderr,
			"usage: fc-iram [options] ttyport iramimage.srec\n");
			exit(1);
		}
	if (argc - optind < 2)
		goto usage;
	target_ttydev = argv[optind];
	iramimage.filename = argv[optind+1];
	if (argc - optind >= 3) {
		passon_argv = argv + optind + 2;
		passon_argc = argc - optind - 2;
	}

	open_serial_port(target_ttydev);
	perform_compal_stage();
	perform_romload();
	if (passon_argv)
		exec_2nd_prog();
	tty_passthru();
	exit(0);
}