diff options
author | Simon Glass <sjg@chromium.org> | 2012-03-02 17:12:08 -0800 |
---|---|---|
committer | Jon Loeliger <jdl@jdl.com> | 2012-03-07 13:26:06 -0600 |
commit | 30eb201adae2132c36874c89d4c6cf3195659d71 (patch) | |
tree | c1b8322133d3d41941e08ef9f3940d4ffbc7f4fa | |
parent | 097ec97c1a35685957210adb93692c3e210bc82c (diff) | |
download | dtc-30eb201adae2132c36874c89d4c6cf3195659d71.tar.gz |
fdtget: Add -p to list the properties of a node
This option lists the properties of each node given as a parameter, one
property per line.
Signed-off-by: Simon Glass <sjg@chromium.org>
Acked-by: David Gibson <david@gibson.dropbear.id.au>
-rw-r--r-- | fdtget.c | 66 |
1 files changed, 60 insertions, 6 deletions
@@ -1,6 +1,12 @@ /* * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. * + * Portions from U-Boot cmd_fdt.c (C) Copyright 2007 + * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com + * Based on code written by: + * Pantelis Antoniou <pantelis.antoniou@gmail.com> and + * Matthew McClintock <msm@freescale.com> + * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of @@ -17,6 +23,7 @@ * MA 02111-1307 USA */ +#include <assert.h> #include <ctype.h> #include <getopt.h> #include <stdio.h> @@ -27,10 +34,16 @@ #include "util.h" +enum display_mode { + MODE_SHOW_VALUE, /* show values for node properties */ + MODE_LIST_PROPS, /* list the properties for a node */ +}; + /* Holds information which controls our output and options */ struct display_info { int type; /* data type (s/i/u/x or 0 for default) */ int size; /* data size (1/2/4) */ + enum display_mode mode; /* display mode that we are using */ }; static void report_error(const char *where, int err) @@ -98,6 +111,32 @@ static int show_data(struct display_info *disp, const char *data, int len) } /** + * List all properties in a node, one per line. + * + * @param blob FDT blob + * @param node Node to display + * @return 0 if ok, or FDT_ERR... if not. + */ +static int list_properties(const void *blob, int node) +{ + const struct fdt_property *data; + const char *name; + int prop; + + prop = fdt_first_property_offset(blob, node); + do { + /* Stop silently when there are no more properties */ + if (prop < 0) + return prop == -FDT_ERR_NOTFOUND ? 0 : prop; + data = fdt_get_property_by_offset(blob, prop, NULL); + name = fdt_string(blob, fdt32_to_cpu(data->nameoff)); + if (name) + puts(name); + prop = fdt_next_property_offset(blob, prop); + } while (1); +} + +/** * Show the data for a given node (and perhaps property) according to the * display option provided. * @@ -113,6 +152,10 @@ static int show_data_for_item(const void *blob, struct display_info *disp, const void *value = NULL; int len, err = 0; + if (disp->mode == MODE_LIST_PROPS) + return list_properties(blob, node); + + assert(property); value = fdt_getprop(blob, node, property, &len); if (value) { if (show_data(disp, value, len)) @@ -136,23 +179,25 @@ static int show_data_for_item(const void *blob, struct display_info *disp, * @param return 0 if ok, -ve on error */ static int do_fdtget(struct display_info *disp, const char *filename, - char **arg, int arg_count) + char **arg, int arg_count, int args_per_step) { char *blob; + const char *prop; int i, node; blob = utilfdt_read(filename); if (!blob) return -1; - for (i = 0; i + 2 <= arg_count; i += 2) { + for (i = 0; i + args_per_step <= arg_count; i += args_per_step) { node = fdt_path_offset(blob, arg[i]); if (node < 0) { report_error(arg[i], node); return -1; } + prop = args_per_step == 1 ? NULL : arg[i + 1]; - if (show_data_for_item(blob, disp, node, arg[i + 1])) + if (show_data_for_item(blob, disp, node, prop)) return -1; } return 0; @@ -164,8 +209,10 @@ static const char *usage_msg = "Each value is printed on a new line.\n\n" "Usage:\n" " fdtget <options> <dt file> [<node> <property>]...\n" + " fdtget -p <options> <dt file> [<node> ]...\n" "Options:\n" "\t-t <type>\tType of data\n" + "\t-p\t\tList properties for each node\n" "\t-h\t\tPrint this help\n\n" USAGE_TYPE_MSG; @@ -182,12 +229,14 @@ int main(int argc, char *argv[]) { char *filename = NULL; struct display_info disp; + int args_per_step = 2; /* set defaults */ memset(&disp, '\0', sizeof(disp)); disp.size = -1; + disp.mode = MODE_SHOW_VALUE; for (;;) { - int c = getopt(argc, argv, "ht:"); + int c = getopt(argc, argv, "hpt:"); if (c == -1) break; @@ -201,6 +250,11 @@ int main(int argc, char *argv[]) &disp.size)) usage("Invalid type string"); break; + + case 'p': + disp.mode = MODE_LIST_PROPS; + args_per_step = 1; + break; } } @@ -217,10 +271,10 @@ int main(int argc, char *argv[]) return 0; /* Check for node, property arguments */ - if (argc % 2) + if (args_per_step == 2 && (argc % 2)) usage("Must have an even number of arguments"); - if (do_fdtget(&disp, filename, argv, argc)) + if (do_fdtget(&disp, filename, argv, argc, args_per_step)) return 1; return 0; } |