[U-Boot] [PATCH v2 06/20] Add print_freq() to display frequencies nicely
Simon Glass
sjg at chromium.org
Wed Apr 29 15:55:20 CEST 2015
Hi Bin,
On 28 April 2015 at 22:56, Bin Meng <bmeng.cn at gmail.com> wrote:
> Hi Simon,
>
> On Wed, Apr 29, 2015 at 10:25 AM, Simon Glass <sjg at chromium.org> wrote:
>> Add a function similar to print_size() that works for frequencies. It can
>> handle from Hz to GHz.
>>
>> Signed-off-by: Simon Glass <sjg at chromium.org>
>> ---
>>
>> Changes in v2:
>> - Correct bugs in number output
>>
>> include/display_options.h | 11 +++++++++++
>> lib/display_options.c | 38 ++++++++++++++++++++++++++++++++++++++
>> 2 files changed, 49 insertions(+)
>>
>> diff --git a/include/display_options.h b/include/display_options.h
>> index 54bd41d..ac44c45 100644
>> --- a/include/display_options.h
>> +++ b/include/display_options.h
>> @@ -23,6 +23,17 @@
>> void print_size(uint64_t size, const char *suffix);
>>
>> /**
>> + * print_freq() - Print a frequency with a suffix
>> + *
>> + * Print frequencies as "x.xx GHz", "xxx KHz", etc as needed; allow for
>> + * optional trailing string (like "\n")
>> + *
>> + * @freq: Frequency to print in Hz
>> + * @suffix String to print after the frequency
>> + */
>> +void print_freq(uint64_t freq, const char *suffix);
>> +
>> +/**
>> * print_buffer() - Print data buffer in hex and ascii form
>> *
>> * Data reads are buffered so that each memory address is only read once.
>> diff --git a/lib/display_options.c b/lib/display_options.c
>> index 3f32bcd..3a70e14 100644
>> --- a/lib/display_options.c
>> +++ b/lib/display_options.c
>> @@ -7,6 +7,7 @@
>>
>> #include <config.h>
>> #include <common.h>
>> +#include <div64.h>
>> #include <inttypes.h>
>> #include <version.h>
>> #include <linux/ctype.h>
>> @@ -22,6 +23,43 @@ int display_options (void)
>> return 0;
>> }
>>
>> +void print_freq(uint64_t freq, const char *s)
>> +{
>> + unsigned long m = 0, n;
>> + uint64_t f;
>> + static const char names[] = {'G', 'M', 'K'};
>> + unsigned long d = 1e9;
>> + char c = 0;
>> + unsigned int i;
>> +
>> + for (i = 0; i < ARRAY_SIZE(names); i++, d /= 1000) {
>> + if (freq >= d) {
>> + c = names[i];
>> + break;
>> + }
>> + }
>> +
>> + if (!c) {
>> + printf("%" PRIu64 " Hz%s", freq, s);
>> + return;
>> + }
>> +
>> + f = do_div(freq, d);
>> + n = freq;
>> +
>> + /* If there's a remainder, show the first few digits */
>> + if (f) {
>> + m = f % d;
>> + while (!(m % 10))
>> + m /= 10;
>> + }
>
> This 'first few digits' issue is not fixed. Do you intend to print all
> numbers after the radix point? If yes, then we need fix the comment to
> say all numbers will be printed.
I think it is better not to. I'll change my tests a bit and send a new
version of just this patch.
Regards,
Simon
More information about the U-Boot
mailing list