[PATCH] tiny-printf: Add support for upper case hex values

Christoph Niedermaier cniedermaier at dh-electronics.com
Thu Mar 20 11:23:46 CET 2025


If tiny printf is used with 0x%08X (upper case X) the output is
always 0x00000000. It could be confusing if upper case instead
of lower case is used intentionally or accidentally because the
actual value is not output. To avoid this confusion, tiny printf
is extended to support also the formatting with %X.

Signed-off-by: Christoph Niedermaier <cniedermaier at dh-electronics.com>
---
Cc: Marek Vasut <marex at denx.de>
Cc: Tom Rini <trini at konsulko.com>
Cc: Benedikt Spranger <b.spranger at linutronix.de>
Cc: Simon Glass <sjg at chromium.org>
Cc: John Ogness <john.ogness at linutronix.de>
Cc: Jerome Forissier <jerome.forissier at linaro.org>
Cc: Ilias Apalodimas <ilias.apalodimas at linaro.org>
---
 lib/tiny-printf.c | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)

diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c
index 0503c17341f..81c51d12f6c 100644
--- a/lib/tiny-printf.c
+++ b/lib/tiny-printf.c
@@ -13,6 +13,11 @@
 #include <stdarg.h>
 #include <linux/ctype.h>
 
+enum case_style {
+	LOWERCASE = 0,
+	UPPERCASE = 1,
+};
+
 struct printf_info {
 	char *bf;	/* Digit buffer */
 	char zs;	/* non-zero if a digit has been written */
@@ -27,14 +32,19 @@ static void out(struct printf_info *info, char c)
 	*info->bf++ = c;
 }
 
-static void out_dgt(struct printf_info *info, char dgt)
+static void out_dgt_case(struct printf_info *info, char dgt, enum case_style style)
 {
-	out(info, dgt + (dgt < 10 ? '0' : 'a' - 10));
+	out(info, dgt + (dgt < 10 ? '0' : (style ? 'A' : 'a') - 10));
 	info->zs = 1;
 }
 
-static void div_out(struct printf_info *info, unsigned long *num,
-		    unsigned long div)
+static void out_dgt(struct printf_info *info, char dgt)
+{
+	out_dgt_case(info, dgt, LOWERCASE);
+}
+
+static void div_out_case(struct printf_info *info, unsigned long *num,
+			 unsigned long div, enum case_style style)
 {
 	unsigned char dgt = 0;
 
@@ -44,7 +54,13 @@ static void div_out(struct printf_info *info, unsigned long *num,
 	}
 
 	if (info->zs || dgt > 0)
-		out_dgt(info, dgt);
+		out_dgt_case(info, dgt, style);
+}
+
+static void div_out(struct printf_info *info, unsigned long *num,
+		    unsigned long div)
+{
+	div_out_case(info, num, div, LOWERCASE);
 }
 
 #ifdef CONFIG_SPL_NET
@@ -203,6 +219,7 @@ static int _vprintf(struct printf_info *info, const char *fmt, va_list va)
 	unsigned long num;
 	char buf[12];
 	unsigned long div;
+	enum case_style style = LOWERCASE;
 
 	while ((ch = *(fmt++))) {
 		if (ch != '%') {
@@ -283,6 +300,8 @@ static int _vprintf(struct printf_info *info, const char *fmt, va_list va)
 				}
 				islong = true;
 				/* no break */
+			case 'X':
+				style = UPPERCASE;
 			case 'x':
 				if (islong) {
 					num = va_arg(va, unsigned long);
@@ -295,7 +314,7 @@ static int _vprintf(struct printf_info *info, const char *fmt, va_list va)
 					out_dgt(info, 0);
 				} else {
 					for (; div; div /= 0x10)
-						div_out(info, &num, div);
+						div_out_case(info, &num, div, style);
 				}
 				break;
 			case 'c':
-- 
2.30.2



More information about the U-Boot mailing list