mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-19 16:38:53 +09:00
![mario.six@gdsys.cc](/assets/img/avatar_default.png)
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: Mario Six <mario.six@gdsys.cc>
87 lines
1.6 KiB
C
87 lines
1.6 KiB
C
/*
|
|
* (C) Copyright 2001
|
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
/*
|
|
* Misc functions
|
|
*/
|
|
#include <common.h>
|
|
#include <command.h>
|
|
#include <console.h>
|
|
|
|
static int do_sleep(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
ulong start = get_timer(0);
|
|
ulong mdelay = 0;
|
|
ulong delay;
|
|
char *frpart;
|
|
|
|
if (argc != 2)
|
|
return CMD_RET_USAGE;
|
|
|
|
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) {
|
|
if (ctrlc())
|
|
return (-1);
|
|
|
|
udelay(100);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
U_BOOT_CMD(
|
|
sleep , 2, 1, do_sleep,
|
|
"delay execution for some time",
|
|
"N\n"
|
|
" - delay execution for N seconds (N is _decimal_ and can be\n"
|
|
" fractional)"
|
|
);
|
|
|
|
#ifdef CONFIG_CMD_TIMER
|
|
static int do_timer(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
static ulong start;
|
|
|
|
if (argc != 2)
|
|
return CMD_RET_USAGE;
|
|
|
|
if (!strcmp(argv[1], "start"))
|
|
start = get_timer(0);
|
|
|
|
if (!strcmp(argv[1], "get")) {
|
|
ulong msecs = get_timer(start) * 1000 / CONFIG_SYS_HZ;
|
|
printf("%ld.%03d\n", msecs / 1000, (int)(msecs % 1000));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
U_BOOT_CMD(
|
|
timer, 2, 1, do_timer,
|
|
"access the system timer",
|
|
"start - Reset the timer reference.\n"
|
|
"timer get - Print the time since 'start'."
|
|
);
|
|
#endif
|