[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