FreeCalypso > hg > freecalypso-tools
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; +}