@@ -14,6 +14,7 @@ static void print_help()
"where:\n"
" SUBCOMMAND:\n"
" device: operate for device for unit on IEEE 1394 bus\n"
+ " file: operate for firmware file"
" help: print help\n"
" OPTIONS: optional arguments dependent on the subcommand\n");
}
@@ -26,6 +27,7 @@ int main(int argc, char **argv)
int (*op)(int argc, char **argv);
} *entry, entries[] = {
{ "device", sizeof("device"), subcmd_device },
+ { "file", sizeof("file"), subcmd_file },
};
const char *subcmd;
int i;
@@ -23,6 +23,7 @@ sources = [
'subcmd-device.c',
'op-device-read.c',
'subcmd-file.c',
+ 'op-file-parse.c',
]
headers = [
new file mode 100644
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+// Copyright (c) 2020 Takashi Sakamoto
+#include <stdio.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <errno.h>
+#include <string.h>
+#include <assert.h>
+
+#include "file-cntr.h"
+
+static void print_help()
+{
+ printf("Usage\n"
+ " efw-downloader file PATH parse [--help | -h]\n"
+ "\n"
+ "where:\n"
+ " --help, -h: print this help message\n");
+}
+
+static const char *get_blob_type_name(enum blob_type type)
+{
+ const char *name;
+
+ switch (type) {
+ case BLOB_TYPE_DSP:
+ name = "DSP";
+ break;
+ case BLOB_TYPE_ICELYNX:
+ name = "IceLynx";
+ break;
+ case BLOB_TYPE_DATA:
+ name = "data";
+ break;
+ case BLOB_TYPE_FPGA:
+ name = "FPGA";
+ break;
+ default:
+ name = "invalid";
+ break;
+ }
+
+ return name;
+}
+
+static void file_cntr_dump_header(const struct file_cntr *cntr)
+{
+ printf("Container header:\n");
+ printf(" type: %d (%s)\n", cntr->header.type, get_blob_type_name(cntr->header.type));
+ printf(" offset_addr: 0x%08x\n", cntr->header.offset_addr);
+ printf(" blob_quads: %u\n", cntr->header.blob_quads);
+ printf(" blob_crc32: 0x%08x\n", cntr->header.blob_crc32);
+ printf(" blob_checksum: 0x%08x\n", cntr->header.blob_checksum);
+ printf(" version: 0x%08x\n", cntr->header.version);
+ printf(" crc_in_region_end: %d\n", cntr->header.crc_in_region_end);
+ printf(" total_quads: %d\n", cntr->header.cntr_quads);
+}
+
+static void file_cntr_dump_payload(const struct file_cntr *cntr)
+{
+ int i;
+
+ printf("Container payload:\n");
+ for (i = 0; i < cntr->payload.count; ++i)
+ printf(" %08x: %08x\n", cntr->header.offset_addr + i * 4, cntr->payload.blob[i]);
+}
+
+static int parse_args(int argc, char **argv, bool *help)
+{
+ int i;
+
+ if (argc < 4)
+ return -EINVAL;
+ assert(!strncmp(argv[3], "parse", sizeof("parse")));
+
+ *help = false;
+ for (i = 0; i < argc; ++i) {
+ if (strncmp(argv[i], "--help", sizeof("--help")) == 0 ||
+ strncmp(argv[i], "-h", sizeof("-h")) == 0) {
+ *help = true;
+ break;
+ }
+ }
+
+ return 0;
+}
+
+int op_file_parse(int argc, char **argv, struct file_cntr *cntr)
+{
+ bool help = false;
+ int err;
+
+ err = parse_args(argc, argv, &help);
+ if (err < 0)
+ return err;
+
+ if (help) {
+ print_help();
+ return 0;
+ }
+
+ file_cntr_dump_header(cntr);
+ file_cntr_dump_payload(cntr);
+
+ return 0;
+}
@@ -16,6 +16,7 @@ static void print_help()
"where:\n"
" FILEPATH: The path to file.\n"
" OPERATION:\n"
+ " parse: parse and dump binary blob released by Echo Audio\n"
" help: print this help message\n"
" ARGUMENTS:\n"
" depending on the OPERATION\n");
@@ -45,6 +46,7 @@ int subcmd_file(int argc, char **argv)
size_t size;
int (*op)(int argc, char **argv, struct file_cntr *cntr);
} *entry, entries[] = {
+ { "parse", sizeof("parse"), op_file_parse },
};
const char *op_name;
const char *filepath;
@@ -11,4 +11,6 @@ int subcmd_file(int argc, char **argv);
void op_device_read(int argc, char **argv, EfwProto *proto, GError **error);
+int op_file_parse(int argc, char **argv, struct file_cntr *cntr);
+
#endif
This commit adds parse operation in file sub command to dump contents of firmware files. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> --- efw-downloader/src/main.c | 2 + efw-downloader/src/meson.build | 1 + efw-downloader/src/op-file-parse.c | 106 +++++++++++++++++++++++++++++ efw-downloader/src/subcmd-file.c | 2 + efw-downloader/src/subcmds.h | 2 + 5 files changed, 113 insertions(+) create mode 100644 efw-downloader/src/op-file-parse.c