view loadtools/clmain.c @ 190:405f5b46cdc4

fc-tmsh: some buglets fixed
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Mon, 25 Nov 2013 03:23:19 +0000
parents e4257294102b
children 837ba1b47478
line wrap: on
line source

/*
 * This module contains the main() function for the XRAM chain-loading
 * utility fc-xram.
 */

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

extern char *target_ttydev;
extern struct srecreader iramimage;
extern char default_loadagent_image[];
extern struct srecreader xramimage;
extern char hw_init_script[];
extern struct baudrate baud_rate_table[];
extern struct baudrate *current_baud_rate;
extern int gta_modem_poweron;

extern struct baudrate *find_baudrate_by_name();

struct baudrate *xram_load_baudrate;
struct baudrate *xram_run_baudrate = baud_rate_table;	/* 1st entry default */

char **passon_argv;
int passon_argc;

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

	while ((c = getopt(argc, argv, "+a:b:B:h:H:i:nr:")) != EOF)
		switch (c) {
		case 'a':
			iramimage.filename = optarg;
			continue;
		case 'b':
			set_romload_baudrate(optarg);
			continue;
		case 'B':
			br = find_baudrate_by_name(optarg);
			if (!br)
				exit(1);	/* error msg already printed */
			xram_load_baudrate = br;
			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 'r':
			br = find_baudrate_by_name(optarg);
			if (!br)
				exit(1);	/* error msg already printed */
			xram_run_baudrate = br;
			continue;
		case '?':
		default:
usage:			fprintf(stderr,
		"usage: fc-xram [options] ttyport xramimage.srec [2ndprog]\n");
			exit(1);
		}
	if (argc - optind < 2)
		goto usage;
	target_ttydev = argv[optind];
	xramimage.filename = argv[optind+1];
	if (!iramimage.filename)
		iramimage.filename = default_loadagent_image;
	if (argc - optind >= 3) {
		passon_argv = argv + optind + 2;
		passon_argc = argc - optind - 2;
	}

	open_target_serial();
	perform_romload();
	/* loadagent should be running now */
	if (tpinterf_pass_output(1) < 0)
		exit(1);
	if (hw_init_script[0]) {
		printf("Executing init script %s\n", hw_init_script);
		c = exec_init_script(hw_init_script);
		if (c)
			exit(1);
	}
	if (xram_load_baudrate && xram_load_baudrate != current_baud_rate) {
		c = loadagent_switch_baud(xram_load_baudrate);
		if (c)
			exit(1);
	}
	printf("Sending XRAM image to loadagent\n");
	perform_chain_load();
	if (passon_argv)
		exec_2nd_prog();
	tty_passthru();
	exit(0);
}

exec_2nd_prog()
{
	char **execp_argv;
	char **sp, **dp;
	extern int target_fd;
	char desc_arg[16];

	sprintf(desc_arg, "-d%d", target_fd);
	execp_argv = (char **) malloc(sizeof(char *) * (passon_argc + 2));
	if (!execp_argv) {
		perror("malloc argv for execvp");
		exit(1);
	}
	sp = passon_argv;
	dp = execp_argv;
	*dp++ = *sp++;
	*dp++ = desc_arg;
	while (*sp)
		*dp++ = *sp++;
	*dp = NULL;
	execvp(execp_argv[0], execp_argv);
	fprintf(stderr, "Unable to execvp %s\n", passon_argv[0]);
	exit(1);
}