diff loadtools/clmain.c @ 0:e7502631a0f9

initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 11 Jun 2016 00:13:35 +0000
parents
children 064d4eedb3a6
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loadtools/clmain.c	Sat Jun 11 00:13:35 2016 +0000
@@ -0,0 +1,143 @@
+/*
+ * 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:c:C: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 '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 '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_compal_stage(1);
+	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);
+}