diff mbox

[U-Boot,v2,06/20] Add print_freq() to display frequencies nicely

Message ID 1430274322-14383-7-git-send-email-sjg@chromium.org
State Superseded
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass April 29, 2015, 2:25 a.m. UTC
Add a function similar to print_size() that works for frequencies. It can
handle from Hz to GHz.

Signed-off-by: Simon Glass <sjg@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(+)

Comments

Bin Meng April 29, 2015, 4:56 a.m. UTC | #1
Hi Simon,

On Wed, Apr 29, 2015 at 10:25 AM, Simon Glass <sjg@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@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.

> +       printf("%lu", n);
> +       if (m)
> +               printf(".%ld", m);
> +       printf(" %cHz%s", c, s);
> +}
> +
>  void print_size(uint64_t size, const char *s)
>  {
>         unsigned long m = 0, n;
> --

Regards,
Bin
Simon Glass April 29, 2015, 1:55 p.m. UTC | #2
Hi Bin,

On 28 April 2015 at 22:56, Bin Meng <bmeng.cn@gmail.com> wrote:
> Hi Simon,
>
> On Wed, Apr 29, 2015 at 10:25 AM, Simon Glass <sjg@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@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
diff mbox

Patch

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;
+	}
+
+	printf("%lu", n);
+	if (m)
+		printf(".%ld", m);
+	printf(" %cHz%s", c, s);
+}
+
 void print_size(uint64_t size, const char *s)
 {
 	unsigned long m = 0, n;