[PATCH 2/2] dtc: support printing binary data with fdtget

Rafał Miłecki zajec5 at gmail.com
Tue Dec 7 04:00:02 PST 2021


From: Rafał Miłecki <rafal at milecki.pl>

It's needed for extracting binary images.

Cc: Yousong Zhou <yszhou4tech at gmail.com>
Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
---
 ...t-for-printing-raw-bytes-with-fdtget.patch | 78 +++++++++++++++++++
 1 file changed, 78 insertions(+)
 create mode 100644 package/utils/dtc/patches/0001-Support-b-format-for-printing-raw-bytes-with-fdtget.patch

diff --git a/package/utils/dtc/patches/0001-Support-b-format-for-printing-raw-bytes-with-fdtget.patch b/package/utils/dtc/patches/0001-Support-b-format-for-printing-raw-bytes-with-fdtget.patch
new file mode 100644
index 0000000000..388b25e7a7
--- /dev/null
+++ b/package/utils/dtc/patches/0001-Support-b-format-for-printing-raw-bytes-with-fdtget.patch
@@ -0,0 +1,78 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal at milecki.pl>
+Date: Mon, 6 Dec 2021 16:41:11 +0100
+Subject: [PATCH] Support 'b' format for printing raw bytes with fdtget
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+FT is sometimes used for storing raw data. That is quite common for
+U-Boot FIT images.
+
+Extracting such data is not trivial currently. Using type 's' (string)
+will replace every 0x00 (NUL) with 0x20 (space). Using type 'x' will
+print bytes but in xxd incompatible format.
+
+This commit adds support for 'b' (binary) format. Example usage:
+fdtget -t b firmware.itb /images/foo data > image.raw
+
+Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
+---
+ fdtget.c |  5 +++++
+ util.c   | 24 ++++++++++++++----------
+ 2 files changed, 19 insertions(+), 10 deletions(-)
+
+--- a/fdtget.c
++++ b/fdtget.c
+@@ -91,6 +91,11 @@ static int show_data(struct display_info
+ 	if (len == 0)
+ 		return 0;
+ 
++	if (disp->type == 'b') {
++		fwrite(data, 1, len, stdout);
++		return 0;
++	}
++
+ 	is_string = (disp->type) == 's' ||
+ 		(!disp->type && util_is_printable_string(data, len));
+ 	if (is_string) {
+--- a/util.c
++++ b/util.c
+@@ -340,24 +340,28 @@ int utilfdt_decode_type(const char *fmt,
+ 
+ 	/* get the conversion qualifier */
+ 	*size = -1;
+-	if (strchr("hlLb", *fmt)) {
+-		qualifier = *fmt++;
+-		if (qualifier == *fmt) {
+-			switch (*fmt++) {
+-/* TODO:		case 'l': qualifier = 'L'; break;*/
+-			case 'h':
++	for (; *(fmt + 1); fmt++) {
++		if (!strchr("hlLb", *fmt))
++			return -1;
++		if (qualifier) {
++			if (*fmt == 'h' && qualifier == 'h')
+ 				qualifier = 'b';
+-				break;
+-			}
++			else
++				return -1;
++		} else {
++			qualifier = *fmt;
+ 		}
+ 	}
+ 
+ 	/* we should now have a type */
+-	if ((*fmt == '\0') || !strchr("iuxs", *fmt))
++	if (!strchr("iuxsb", *fmt)) {
++		if (*fmt)
++			fprintf(stderr, "invalid type: %c\n", *fmt);
+ 		return -1;
++	}
+ 
+ 	/* convert qualifier (bhL) to byte size */
+-	if (*fmt != 's')
++	if (*fmt != 's' && *fmt != 'b')
+ 		*size = qualifier == 'b' ? 1 :
+ 				qualifier == 'h' ? 2 :
+ 				qualifier == 'l' ? 4 : -1;
-- 
2.31.1




More information about the openwrt-devel mailing list