On 03/09/2017 06:58 PM, Oleksij Rempel wrote: > From: Marc Kleine-Budde > > This patch makes it possible to abort a console countdown by an external > command, for example when fastboot is used. This requires additional > modifications in the external commands, a call to "console_countdown_abort()" > has to be inserted. > > Signed-off-by: Marc Kleine-Budde > Signed-off-by: Oleksij Rempel > --- > commands/timeout.c | 8 ++++++-- > common/console_countdown.c | 15 +++++++++++++++ > include/console_countdown.h | 2 ++ > 3 files changed, 23 insertions(+), 2 deletions(-) > > diff --git a/commands/timeout.c b/commands/timeout.c > index ef1a037c1..d197cedd8 100644 > --- a/commands/timeout.c > +++ b/commands/timeout.c > @@ -32,7 +32,7 @@ static int do_timeout(int argc, char *argv[]) > char str[2] = { }; > const char *varname = NULL; > > - while((opt = getopt(argc, argv, "crsav:")) > 0) { > + while ((opt = getopt(argc, argv, "crsav:e")) > 0) { > switch(opt) { > case 'r': > flags |= CONSOLE_COUNTDOWN_RETURN; > @@ -46,6 +46,9 @@ static int do_timeout(int argc, char *argv[]) > case 's': > flags |= CONSOLE_COUNTDOWN_SILENT; > break; > + case 'e': > + flags |= CONSOLE_COUNTDOWN_EXTERN; > + break; > case 'v': > varname = optarg; > break; > @@ -73,6 +76,7 @@ BAREBOX_CMD_HELP_TEXT("Options:") > BAREBOX_CMD_HELP_OPT("-a", "interrupt on any key") > BAREBOX_CMD_HELP_OPT("-c", "interrupt on Ctrl-C") > BAREBOX_CMD_HELP_OPT("-r", "interrupt on RETURN") > +BAREBOX_CMD_HELP_OPT("-e", "interrupt on external commands (i.e. fastboot") > BAREBOX_CMD_HELP_OPT("-s", "silent mode") > BAREBOX_CMD_HELP_OPT("-v ", "export pressed key to environment") > BAREBOX_CMD_HELP_END > @@ -80,7 +84,7 @@ BAREBOX_CMD_HELP_END > BAREBOX_CMD_START(timeout) > .cmd = do_timeout, > BAREBOX_CMD_DESC("wait for a specified timeout") > - BAREBOX_CMD_OPTS("[-acrsv] SECONDS") > + BAREBOX_CMD_OPTS("[-acrsev] SECONDS") > BAREBOX_CMD_GROUP(CMD_GRP_CONSOLE) > BAREBOX_CMD_HELP(cmd_timeout_help) > BAREBOX_CMD_END > diff --git a/common/console_countdown.c b/common/console_countdown.c > index b2eec72b2..594d3d879 100644 > --- a/common/console_countdown.c > +++ b/common/console_countdown.c > @@ -23,6 +23,13 @@ > #include > #include > > +static int console_countdown_timeout_abort; static bool > + > +void console_countdown_abort(void) > +{ > + console_countdown_timeout_abort = true; > +} > + > int console_countdown(int timeout_s, unsigned flags, char *out_key) > { > uint64_t start, second; > @@ -48,6 +55,9 @@ int console_countdown(int timeout_s, unsigned flags, char *out_key) > goto out; > key = 0; > } > + if ((flags & CONSOLE_COUNTDOWN_EXTERN) && > + console_countdown_timeout_abort) > + goto out; > if (!(flags & CONSOLE_COUNTDOWN_SILENT) && > is_timeout(second, SECOND)) { > printf("\b\b\b\b%4d", countdown--); > @@ -55,6 +65,10 @@ int console_countdown(int timeout_s, unsigned flags, char *out_key) > } > } while (!is_timeout(start, timeout_s * SECOND)); > > + if ((flags & CONSOLE_COUNTDOWN_EXTERN) && > + console_countdown_timeout_abort) > + goto out; > + > ret = 0; > > out: > @@ -62,6 +76,7 @@ int console_countdown(int timeout_s, unsigned flags, char *out_key) > printf("\n"); > if (key && out_key) > *out_key = key; > + console_countdown_timeout_abort = false; > > return ret; > } > diff --git a/include/console_countdown.h b/include/console_countdown.h > index cb46964bc..c6c2d5c00 100644 > --- a/include/console_countdown.h > +++ b/include/console_countdown.h > @@ -5,7 +5,9 @@ > #define CONSOLE_COUNTDOWN_ANYKEY (1 << 1) > #define CONSOLE_COUNTDOWN_RETURN (1 << 3) > #define CONSOLE_COUNTDOWN_CTRLC (1 << 4) > +#define CONSOLE_COUNTDOWN_EXTERN (1 << 5) > > int console_countdown(int timeout_s, unsigned flags, char *out_key); > +void console_countdown_abort(void); > > #endif /* __CONSOLE_COUNTDOWN_H */ > Marc -- Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |