diff loadtools/ltexit.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 96332d875fc9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loadtools/ltexit.c	Sat Jun 11 00:13:35 2016 +0000
@@ -0,0 +1,109 @@
+/*
+ * This module implements the loadtool exit command, along with its
+ * options for jump-reboot and Iota power-off.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+
+static void
+exit_bare()
+{
+	exit(0);
+}
+
+static void
+exit_gta02_cutpwr()
+{
+#ifdef GTA0x_AP_BUILD
+	set_gta_modem_power_ctrl(0);
+#endif
+	exit(0);
+}
+
+static void
+exit_iotaoff()
+{
+	static char *poweroff_argv[2] = {"poweroff", 0};
+
+	tpinterf_make_cmd(poweroff_argv);
+	tpinterf_send_cmd();
+	exit(0);
+}
+
+static void
+exit_jump0()
+{
+	static char *jump0_argv[3] = {"jump", "0", 0};
+
+	tpinterf_make_cmd(jump0_argv);
+	tpinterf_send_cmd();
+	exit(0);
+}
+
+void (*default_exit)() = exit_bare;
+
+static struct kwtab {
+	char *kw;
+	void (*func)();
+} exit_modes[] = {
+	{"bare", exit_bare},
+	{"gta02-cutpwr", exit_gta02_cutpwr},
+	{"iota-off", exit_iotaoff},
+	{"jump0", exit_jump0},
+	{0, 0}
+};
+
+cmd_exit(argc, argv)
+	char **argv;
+{
+	struct kwtab *tp;
+
+	if (argc < 2)
+		default_exit();
+	for (tp = exit_modes; tp->kw; tp++)
+		if (!strcmp(tp->kw, argv[1]))
+			break;
+	if (!tp->func) {
+		fprintf(stderr,
+			"error: \"%s\" is not an understood exit mode\n",
+			argv[1]);
+		return(-1);
+	}
+	tp->func();
+}
+
+/* called from hwparam.c config file parser */
+void
+set_default_exit_mode(arg, filename_for_errs, lineno_for_errs)
+	char *arg;
+	char *filename_for_errs;
+	int lineno_for_errs;
+{
+	char *cp;
+	struct kwtab *tp;
+
+	while (isspace(*arg))
+		arg++;
+	if (!*arg) {
+		fprintf(stderr,
+		"%s line %d: exit-mode setting requires an argument\n",
+			filename_for_errs, lineno_for_errs);
+		exit(1);
+	}
+	for (cp = arg; *cp && !isspace(*cp); cp++)
+		;
+	*cp = '\0';
+	for (tp = exit_modes; tp->kw; tp++)
+		if (!strcmp(tp->kw, arg))
+			break;
+	if (!tp->func) {
+		fprintf(stderr,
+			"%s line %d: \"%s\" is not an understood exit mode\n",
+			filename_for_errs, lineno_for_errs, arg);
+		exit(1);
+	}
+	default_exit = tp->func;
+}