mirror of
git://projects.qi-hardware.com/ben-blinkenlights.git
synced 2024-11-04 23:08:07 +02:00
ubb-patgen/ubb-patgen.c: accept SI suffixes and a unit for durations as well
This commit is contained in:
parent
9930ae6576
commit
c124e1a819
@ -77,6 +77,11 @@ while and clean up on exit, add the delay in seconds, e.g.:
|
|||||||
|
|
||||||
# ubb-patgen -f 500kHz -c 10
|
# ubb-patgen -f 500kHz -c 10
|
||||||
|
|
||||||
|
The delay can be followed by "m", "u", or "n" for the respective
|
||||||
|
multiplier. Furthermore, it can end with an optional "s". Note
|
||||||
|
that the minimum time ubb-patgen actually spends generating a
|
||||||
|
clock will typically be in the order of several milliseconds.
|
||||||
|
|
||||||
To stop the MMC bus clock, run
|
To stop the MMC bus clock, run
|
||||||
|
|
||||||
# ubb-patgen -c 0
|
# ubb-patgen -c 0
|
||||||
|
@ -465,6 +465,9 @@ static int frequency(const char *s, int *hz, int *rel)
|
|||||||
|
|
||||||
f = strtod(s, &end);
|
f = strtod(s, &end);
|
||||||
|
|
||||||
|
if (end == s || f < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
switch (*end) {
|
switch (*end) {
|
||||||
case 'M':
|
case 'M':
|
||||||
case 'm':
|
case 'm':
|
||||||
@ -503,6 +506,49 @@ static int frequency(const char *s, int *hz, int *rel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int duration(const char *s, struct timespec *res)
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
double d;
|
||||||
|
|
||||||
|
d = strtod(s, &end);
|
||||||
|
|
||||||
|
if (end == s || d < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
switch (*end) {
|
||||||
|
case 'M':
|
||||||
|
case 'm':
|
||||||
|
d /= 1e3;
|
||||||
|
end++;
|
||||||
|
break;
|
||||||
|
case 'U':
|
||||||
|
case 'u':
|
||||||
|
d /= 1e6;
|
||||||
|
end++;
|
||||||
|
break;
|
||||||
|
case 'N':
|
||||||
|
case 'n':
|
||||||
|
d /= 1e9;
|
||||||
|
end++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*end == 'S' || *end == 's')
|
||||||
|
end++;
|
||||||
|
|
||||||
|
if (*end)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
res->tv_sec = d;
|
||||||
|
res->tv_nsec = (d-res->tv_sec)*1e9;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void usage(const char *name)
|
static void usage(const char *name)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
@ -523,10 +569,12 @@ static void usage(const char *name)
|
|||||||
" (default: exit immediately but leave the clock on)\n"
|
" (default: exit immediately but leave the clock on)\n"
|
||||||
" file file containing the pattern\n"
|
" file file containing the pattern\n"
|
||||||
" pattern send the specified pattern on DAT0 through DAT3\n\n"
|
" pattern send the specified pattern on DAT0 through DAT3\n\n"
|
||||||
"Frequency: the frequency in Hz, optionally followed by \"M\" or \"k\",\n"
|
"Frequency: the frequency in hertz, optionally followed by \"M\" or \"k\",\n"
|
||||||
" optionally followed by \"Hz\", optionally followed by \"+\" or \"-\".\n"
|
" optionally followed by \"Hz\", optionally followed by \"+\" or \"-\".\n"
|
||||||
" \"+\" selects a frequency >= the specified one, \"-\" one <=.\n"
|
" \"+\" selects a frequency >= the specified one, \"-\" one <=.\n"
|
||||||
" Without +/-, the closest available frequency is selected.\n"
|
" Without +/-, the closest available frequency is selected.\n"
|
||||||
|
"Duration: the duration in seconds, optionally followed by \"m\", \"u\", or\n"
|
||||||
|
" \"n\", optionally followed by \"s\".\n"
|
||||||
"Pattern: hex digits corresponding to 1 for DAT0, 2 for DAT1, etc.\n"
|
"Pattern: hex digits corresponding to 1 for DAT0, 2 for DAT1, etc.\n"
|
||||||
" {n} repeats the preceding digit n times, e.g., 1{3} is equivalent to 111.\n"
|
" {n} repeats the preceding digit n times, e.g., 1{3} is equivalent to 111.\n"
|
||||||
, name, name, name, name);
|
, name, name, name, name);
|
||||||
@ -540,7 +588,6 @@ int main(int argc, char **argv)
|
|||||||
int bus_hz = 0, clk_only = 0, clkout = 0, bus_rel = 0;
|
int bus_hz = 0, clk_only = 0, clkout = 0, bus_rel = 0;
|
||||||
const char *pattern = NULL;
|
const char *pattern = NULL;
|
||||||
int quiet = 0, force_pattern = 0;
|
int quiet = 0, force_pattern = 0;
|
||||||
double active_s = 0;
|
|
||||||
struct timespec active_ns;
|
struct timespec active_ns;
|
||||||
int keep_clk = 1;
|
int keep_clk = 1;
|
||||||
uint8_t mask = 0xf;
|
uint8_t mask = 0xf;
|
||||||
@ -617,11 +664,8 @@ int main(int argc, char **argv)
|
|||||||
if (clk_only) {
|
if (clk_only) {
|
||||||
if (force_pattern)
|
if (force_pattern)
|
||||||
usage(*argv);
|
usage(*argv);
|
||||||
active_s = strtod(argv[argc-1], &end);
|
if (!duration(argv[optind], &active_ns))
|
||||||
if (*end)
|
|
||||||
usage(*argv);
|
usage(*argv);
|
||||||
active_ns.tv_sec = (int) active_s;
|
|
||||||
active_ns.tv_nsec = (active_s-(int) active_s)*1e9;
|
|
||||||
keep_clk = 0;
|
keep_clk = 0;
|
||||||
} else {
|
} else {
|
||||||
pattern = argv[optind];
|
pattern = argv[optind];
|
||||||
@ -653,7 +697,7 @@ int main(int argc, char **argv)
|
|||||||
if (pattern)
|
if (pattern)
|
||||||
dma_pattern(&clk, pattern, mask << 10, trigger);
|
dma_pattern(&clk, pattern, mask << 10, trigger);
|
||||||
|
|
||||||
if (active_s)
|
if (!keep_clk)
|
||||||
if (nanosleep(&active_ns, NULL))
|
if (nanosleep(&active_ns, NULL))
|
||||||
perror("nanosleep");
|
perror("nanosleep");
|
||||||
if (pattern) {
|
if (pattern) {
|
||||||
|
Loading…
Reference in New Issue
Block a user