From 04b235cedfcce2088a8e04e4de3def014c3c0760 Mon Sep 17 00:00:00 2001 From: Werner Almesberger Date: Mon, 28 Jan 2013 21:14:53 -0300 Subject: [PATCH] ubb-patgen/ubb-patgen.c: new option -F freq_Hz to select "unsafe" frequencies --- ubb-patgen/README | 4 ++++ ubb-patgen/ubb-patgen.c | 31 +++++++++++++++++++------------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/ubb-patgen/README b/ubb-patgen/README index da02791..a250030 100644 --- a/ubb-patgen/README +++ b/ubb-patgen/README @@ -63,6 +63,10 @@ bus clk = 100.962 kHz (+0.96%) This warning can be suppressed with the option -q. +The option -F works like -f but also allows frequencies that may +exceed the hardware's capabilities. As a consequence, the MMC +controller may hang. + The frequency can also be specified as the cycle time with the option -i: diff --git a/ubb-patgen/ubb-patgen.c b/ubb-patgen/ubb-patgen.c index ea5c17f..84206f6 100644 --- a/ubb-patgen/ubb-patgen.c +++ b/ubb-patgen/ubb-patgen.c @@ -46,7 +46,7 @@ static int cmp(const void *a, const void *b) } -static struct mmcclk *frequencies(int *n) +static struct mmcclk *frequencies(int *n, int all) { struct mmcclk mmc; struct mmcclk *clks = malloc(sizeof(struct mmcclk)); @@ -57,7 +57,8 @@ static struct mmcclk *frequencies(int *n) exit(1); } - mmcclk_first(&mmc, 0, MMCCLK_FLAG_WR_ONLY); + mmcclk_first(&mmc, 0, + MMCCLK_FLAG_WR_ONLY | (all ? MMCCLK_FLAG_ALL : 0)); clks[0] = mmc; while (mmcclk_next(&mmc)) { clks = realloc(clks, sizeof(struct mmcclk)*(n_clks+1)); @@ -96,7 +97,7 @@ static void show_frequencies(int quiet) int n, i; double last = 0; - clks = frequencies(&n); + clks = frequencies(&n, 0); for (i = 0; i != n; i++) { if (quiet) { if (clks[i].bus_clk_hz != last) @@ -113,14 +114,14 @@ static void show_frequencies(int quiet) } -static int select_freq(struct mmcclk *res, int hz, int rel, int quiet) +static int select_freq(struct mmcclk *res, int hz, int rel, int quiet, int all) { const struct mmcclk *clks, *p, *best = NULL; double d, best_d = 0; int n; double err; - clks = frequencies(&n); + clks = frequencies(&n, all); for (p = clks; p != clks+n; p++) { if (rel > 0 && p->bus_clk_hz < hz) continue; @@ -690,14 +691,16 @@ static void usage(const char *name) { fprintf(stderr, "usage: %s\n" -" %s [-q] -f freq_hz|-i interval_s\n" -" %s [-q] [-f freq_hz|-i interval_s] -c [active_s]\n" -" %s [-q] [-f freq_hz|-i interval_s] [-C|-t 0|1... [-d debounce_s]]\n" -" [-w wait_s] [-m mask] [-p] file|pattern\n\n" +" %s [-q] (-f|-F) freq_hz|-i interval_s\n" +" %s [-q] [(-f|-F) freq_hz|-i interval_s] -c [active_s]\n" +" %s [-q] [(-f|-F) freq_hz|-i interval_s]\n" +" [-C|-t 0|1... [-d debounce_s]] [-w wait_s] [-m mask] [-p]\n" +" file|pattern\n\n" " -c output bus clock on CLK without sending a pattern\n" " -C temporarily output bus clock on CLK (for debugging)\n" " -d deb_s trigger debounce time (default: no debouncing)\n" " -f freq_hz set bus clock to the specified frequency (default: 1 MHz)\n" +" -F freq_hz like -f, but also allow \"overclocking\"\n" " -i inter_s set bus clock such that one cycle equals the specified " "interval\n" " -m mask use only the DATx lines specified in the mask (default: 0xf)\n" @@ -728,6 +731,7 @@ static void usage(const char *name) int main(int argc, char **argv) { struct mmcclk clk; + int all = 0; int bus_hz = 0, clk_only = 0, clkout = 0, bus_rel = 0; const char *pattern = NULL; int quiet = 0, force_pattern = 0; @@ -745,7 +749,7 @@ int main(int argc, char **argv) unsigned long tmp; const char *p; - while ((c = getopt(argc, argv, "cCd:f:i:m:pqt:w:")) != EOF) + while ((c = getopt(argc, argv, "cCd:f:F:i:m:pqt:w:")) != EOF) switch (c) { case 'c': clk_only = 1; @@ -761,6 +765,9 @@ int main(int argc, char **argv) usage(*argv); debounce = 1; break; + case 'F': + all = 1; + /* fall through */ case 'f': if (!frequency(optarg, &bus_hz, &bus_rel)) usage(*argv); @@ -818,7 +825,7 @@ int main(int argc, char **argv) ubb_open(UBB_ALL); if (bus_hz) { - if (!select_freq(&clk, bus_hz, bus_rel, quiet)) { + if (!select_freq(&clk, bus_hz, bus_rel, quiet, all)) { fprintf(stderr, "no suitable frequency found\n"); exit(1); @@ -856,7 +863,7 @@ int main(int argc, char **argv) if (!bus_hz) bus_hz = 1000000; - if (!select_freq(&clk, bus_hz, bus_rel, quiet)) { + if (!select_freq(&clk, bus_hz, bus_rel, quiet, all)) { fprintf(stderr, "no suitable frequency found\n"); exit(1); }