[ECOS] custom code to bypass redboot abort script
Gary Thomas
gary@mlbassoc.com
Mon Aug 25 21:08:00 GMT 2008
n.b. this should really have been posted to ecos-patches
Jose Vasconcellos wrote:
> I have a device that does not have an easily accessible serial port.
> Access to redboot is normally done via telnet from the ethernet port.
> Of course, if there's a boot script installed then there's no opportunity
> to abort the script. It does have a button, so I wanted the user to
> power-on with the button pressed to bypass or abort the start-up script.
> I had to rework packages/redboot/current/main.c
>
> The following patch creates a function redboot_abort_script that handles
> the existing console check. The idea is to be able to replace this routine
> for unusual cases.
I don't see what your patch does other than factor out this portion of
the code. Are you expecting to add other features, such as the ability
to add a platform defined test which simulates ^C?
Also if your platform doesn't have a serial port, how does one see the
message/prompt?
> diff -r 690e1f51d092 packages/redboot/current/src/main.c
> --- a/packages/redboot/current/src/main.c Sun May 04 17:02:34 2008 -0400
> +++ b/packages/redboot/current/src/main.c Mon Aug 25 15:05:11 2008 -0400
> @@ -234,6 +234,25 @@
> }
> #endif
>
> +// Check for ^C on console
> +bool redboot_abort_script(int script_timeout_ms)
> +{
> + int res = _GETS_CTRLC; // Treat 0 timeout as ^C
> + diag_printf("== Executing boot script in %d.%03d seconds - enter ^C
> to abort\n",
> + script_timeout_ms/1000, script_timeout_ms%1000);
> +
> + while (script_timeout_ms >= CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT) {
> + res = _rb_gets(line, sizeof(line),
> CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT);
> + if (res >= _GETS_OK) {
> + diag_printf("== Executing boot script in %d.%03d seconds -
> enter ^C to abort\n",
> + script_timeout_ms/1000, script_timeout_ms%1000);
> + continue; // Ignore anything but ^C
> + }
> + if (res != _GETS_TIMEOUT) break;
> + script_timeout_ms -= CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT;
> + }
> + return res == _GETS_CTRLC;
> +}
>
> //
> // This is the main entry point for RedBoot
> @@ -337,26 +356,10 @@
> # endif
> if (script) {
> // Give the guy a chance to abort any boot script
> - unsigned char *hold_script = script;
> int script_timeout_ms = script_timeout *
> CYGNUM_REDBOOT_BOOT_SCRIPT_TIMEOUT_RESOLUTION;
> - diag_printf("== Executing boot script in %d.%03d seconds -
> enter ^C to abort\n",
> - script_timeout_ms/1000, script_timeout_ms%1000);
> - script = (unsigned char *)0;
> - res = _GETS_CTRLC; // Treat 0 timeout as ^C
> - while (script_timeout_ms >= CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT) {
> - res = _rb_gets(line, sizeof(line),
> CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT);
> - if (res >= _GETS_OK) {
> - diag_printf("== Executing boot script in %d.%03d
> seconds - enter ^C to abort\n",
> - script_timeout_ms/1000,
> script_timeout_ms%1000);
> - continue; // Ignore anything but ^C
> - }
> - if (res != _GETS_TIMEOUT) break;
> - script_timeout_ms -= CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT;
> - }
> - if (res == _GETS_CTRLC) {
> + res = redboot_abort_script(script_timeout_ms);
> + if (res) {
I don't like this change. I would prefer it still use the full test
(res == _GETS_CTRLC).
> script = (unsigned char *)0; // Disable script
> - } else {
> - script = hold_script; // Re-enable script
> }
> }
> #endif
Perhaps you can expand on what you're really after here.
Please post further discussion to the patches list.
--
------------------------------------------------------------
Gary Thomas | Consulting for the
MLB Associates | Embedded world
------------------------------------------------------------
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
More information about the Ecos-discuss
mailing list