[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