Skip to content
Snippets Groups Projects
Commit c4974632 authored by mario.six@gdsys.cc's avatar mario.six@gdsys.cc Committed by Tom Rini
Browse files

cmd: misc: Add support for fractions in sleep


A feasible way to communicate certain errors for devices that have no
other way of signalling besides LEDs is to flash these LEDs. For errors
in U-Boot, a script that utilizes the led and sleep commands would be a
practicable way, but currently the sleep command can only delay for an
integral amount of seconds, which is too slow to create an easily
noticeable pattern for flashing LEDs.

Therefore, this patch adds support for fractions (down to .001 seconds)
to the sleep command.

The parsing is kept minimal, simplistic and as robust as possible: After
converting the passed string using simple_strtoul and multiplying it
with 1000, we search for the first dot, convert the three characters
after that into a number (if they are not numbers, we ignore the
fractional part and just use the delay we got from simple_strtoul), and
add this number to the delay.

Signed-off-by: default avatarMario Six <mario.six@gdsys.cc>
parent 29d63a59
No related branches found
No related tags found
No related merge requests found
...@@ -15,13 +15,31 @@ ...@@ -15,13 +15,31 @@
static int do_sleep(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) static int do_sleep(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{ {
ulong start = get_timer(0); ulong start = get_timer(0);
ulong mdelay = 0;
ulong delay; ulong delay;
char *frpart;
if (argc != 2) if (argc != 2)
return CMD_RET_USAGE; return CMD_RET_USAGE;
delay = simple_strtoul(argv[1], NULL, 10) * CONFIG_SYS_HZ; delay = simple_strtoul(argv[1], NULL, 10) * CONFIG_SYS_HZ;
frpart = strchr(argv[1], '.');
if (frpart) {
uint mult = CONFIG_SYS_HZ / 10;
for (frpart++; *frpart != '\0' && mult > 0; frpart++) {
if (*frpart < '0' || *frpart > '9') {
mdelay = 0;
break;
}
mdelay += (*frpart - '0') * mult;
mult /= 10;
}
}
delay += mdelay;
while (get_timer(start) < delay) { while (get_timer(start) < delay) {
if (ctrlc()) if (ctrlc())
return (-1); return (-1);
...@@ -36,7 +54,8 @@ U_BOOT_CMD( ...@@ -36,7 +54,8 @@ U_BOOT_CMD(
sleep , 2, 1, do_sleep, sleep , 2, 1, do_sleep,
"delay execution for some time", "delay execution for some time",
"N\n" "N\n"
" - delay execution for N seconds (N is _decimal_ !!!)" " - delay execution for N seconds (N is _decimal_ and can be\n"
" fractional)"
); );
#ifdef CONFIG_CMD_TIMER #ifdef CONFIG_CMD_TIMER
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment