view loadtools/ltmain.c @ 633:4dca8542f569

loadtools/romload.c: collect additional response bytes after >p and >c
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 01 Mar 2020 00:57:12 +0000
parents cef70d53fc5e
children ecea01f65146
line wrap: on
line source

/*
 * This module contains the main() function for fc-loadtool
 */

#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 char default_loadagent_image[];
extern char hw_init_script[];
extern void (*default_exit)();

extern struct baudrate *find_baudrate_by_name();

static struct baudrate *reattach, *batch_baud;

main(argc, argv)
	char **argv;
{
	extern char *optarg;
	extern int optind;
	int c;
	char command[512];

	while ((c = getopt(argc, argv, "a:b:B:c:C:h:H:i:P:r:")) != EOF)
		switch (c) {
		case 'a':
			iramimage.filename = optarg;
			continue;
		case 'b':
			set_romload_baudrate(optarg);
			continue;
		case 'B':
			batch_baud = find_baudrate_by_name(optarg);
			if (!batch_baud)
				exit(1);	/* error msg already printed */
			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 'P':
			if (find_bootctrl_entry(optarg) < 0)
				exit(1);	/* error msg already printed */
			continue;
		case 'r':
			reattach = find_baudrate_by_name(optarg);
			if (!reattach)
				exit(1);	/* error msg already printed */
			continue;
		case '?':
		default:
usage:			fprintf(stderr,
		"usage: fc-loadtool [options] ttyport [command-script]\n");
			exit(1);
		}
	if (argc - optind < 1 || argc - optind > 2)
		goto usage;
	target_ttydev = argv[optind];
	if (!iramimage.filename)
		iramimage.filename = default_loadagent_image;

	open_serial_port(target_ttydev);
	if (reattach)
		set_serial_baudrate(reattach);
	else {
		pwon_if_needed();
		perform_compal_stage();
		perform_romload();
		putchar('\n');
		if (tpinterf_pass_output(1) < 0)
			exit(1);
		putchar('\n');
		if (hw_init_script[0]) {
			printf("Executing init script %s\n", hw_init_script);
			c = loadtool_exec_script(hw_init_script, 1);
		} else
			c = 0;
		if (argc - optind > 1) {
			if (c)
				exit(1);
			if (batch_baud) {
				c = loadagent_switch_baud(batch_baud);
				if (c)
					exit(1);
			}
			printf("Executing command script %s\n", argv[optind+1]);
			c = loadtool_exec_script(argv[optind+1], 0);
			if (c)
				exit(1);
			default_exit(0);
		}
	}
	for (;;) {
		if (isatty(0)) {
			fputs("loadtool> ", stdout);
			fflush(stdout);
		}
		if (!fgets(command, sizeof command, stdin))
			default_exit(0);
		loadtool_dispatch_cmd(command, 0);
	}
}