All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot-Users] [PATCH] Fix fdt printing for updated libfdt
@ 2007-11-22 22:26 Jerry Van Baren
  0 siblings, 0 replies; only message in thread
From: Jerry Van Baren @ 2007-11-22 22:26 UTC (permalink / raw)
  To: u-boot

Also improve printing (adopt dtc v1 "c style" hex format), whitespace cleanup.

Signed-off-by: Gerald Van Baren <vanbaren@cideas.com>
---
This applies after Kumar's libfdt_testing patches.

 common/cmd_fdt.c |   50 +++++++++++++++++++++++++++-----------------------
 1 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c
index 362d39d..629c9b4 100644
--- a/common/cmd_fdt.c
+++ b/common/cmd_fdt.c
@@ -75,7 +75,7 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 			/*
 			 * Optional new length
 			 */
-			len =  simple_strtoul(argv[3], NULL, 16);
+			len = simple_strtoul(argv[3], NULL, 16);
 			if (len < fdt_totalsize(fdt)) {
 				printf ("New length %d < existing length %d, "
 					"ignoring.\n",
@@ -522,21 +522,21 @@ static void print_data(const void *data, int len)
 
 	switch (len) {
 	case 1:	 /* byte */
-		printf("<%02x>", (*(u8 *) data) & 0xff);
+		printf("<0x%02x>", (*(u8 *) data) & 0xff);
 		break;
 	case 2:	 /* half-word */
-		printf("<%04x>", be16_to_cpu(*(u16 *) data) & 0xffff);
+		printf("<0x%04x>", be16_to_cpu(*(u16 *) data) & 0xffff);
 		break;
 	case 4:	 /* word */
-		printf("<%08x>", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
+		printf("<0x%08x>", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
 		break;
 	case 8:	 /* double-word */
 #if __WORDSIZE == 64
-		printf("<%016llx>", be64_to_cpu(*(uint64_t *) data));
+		printf("<0x%016llx>", be64_to_cpu(*(uint64_t *) data));
 #else
-		printf("<%08x ", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
+		printf("<0x%08x ", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
 		data += 4;
-		printf("%08x>", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
+		printf("0x%08x>", be32_to_cpu(*(u32 *) data) & 0xffffffffU);
 #endif
 		break;
 	default:		/* anything else... hexdump */
@@ -557,7 +557,6 @@ static void print_data(const void *data, int len)
  */
 static int fdt_print(const char *pathp, char *prop, int depth)
 {
-	static int offstack[MAX_LEVEL];
 	static char tabs[MAX_LEVEL+1] =
 		"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
 		"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
@@ -567,7 +566,7 @@ static int fdt_print(const char *pathp, char *prop, int depth)
 	uint32_t tag;		/* tag */
 	int  len;		/* length of the property */
 	int  level = 0;		/* keep track of nesting level */
-	const struct fdt_property *prop1;
+	const struct fdt_property *fdt_prop;
 
 	nodeoffset = fdt_path_offset (fdt, pathp);
 	if (nodeoffset < 0) {
@@ -604,48 +603,52 @@ static int fdt_print(const char *pathp, char *prop, int depth)
 	 * The user passed in a node path and no property,
 	 * print the node and all subnodes.
 	 */
-	offstack[0] = nodeoffset;
-
 	while(level >= 0) {
 		tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
 		switch(tag) {
 		case FDT_BEGIN_NODE:
-			pathp = fdt_offset_ptr(fdt, nodeoffset, 1);
-			if(level <= depth)
+			pathp = fdt_get_name(fdt, nodeoffset, NULL);
+			if (level <= depth) {
+				if (pathp == NULL)
+					pathp = "/* NULL pointer error */";
+				if (*pathp == '\0')
+					pathp = "/";	/* root is nameless */
 				printf("%s%s {\n",
 					&tabs[MAX_LEVEL - level], pathp);
+			}
 			level++;
-			offstack[level] = nodeoffset;
 			if (level >= MAX_LEVEL) {
-				printf("Aaaiii <splat> nested too deep. "
-					"Aborting.\n");
+				printf("Nested too deep, aborting.\n");
 				return 1;
 			}
 			break;
 		case FDT_END_NODE:
 			level--;
-			if(level <= depth)
+			if (level <= depth)
 				printf("%s};\n", &tabs[MAX_LEVEL - level]);
 			if (level == 0) {
 				level = -1;		/* exit the loop */
 			}
 			break;
 		case FDT_PROP:
-			prop1 = fdt_offset_ptr(fdt, nodeoffset, sizeof(*prop1));
-			pathp = fdt_string(fdt, fdt32_to_cpu(prop1->nameoff));
-			nodep = fdt_getprop (fdt, offstack[level], pathp, &len);
+			fdt_prop = fdt_offset_ptr(fdt, nodeoffset,
+					sizeof(*fdt_prop));
+			pathp    = fdt_string(fdt,
+					fdt32_to_cpu(fdt_prop->nameoff));
+			len      = fdt32_to_cpu(fdt_prop->len);
+			nodep    = fdt_prop->data;
 			if (len < 0) {
 				printf ("libfdt fdt_getprop(): %s\n",
 					fdt_strerror(len));
 				return 1;
 			} else if (len == 0) {
 				/* the property has no value */
-				if(level <= depth)
+				if (level <= depth)
 					printf("%s%s;\n",
 						&tabs[MAX_LEVEL - level],
 						pathp);
 			} else {
-				if(level <= depth) {
+				if (level <= depth) {
 					printf("%s%s=",
 						&tabs[MAX_LEVEL - level],
 						pathp);
@@ -655,11 +658,12 @@ static int fdt_print(const char *pathp, char *prop, int depth)
 			}
 			break;
 		case FDT_NOP:
+			printf("/* NOP */\n", &tabs[MAX_LEVEL - level]);
 			break;
 		case FDT_END:
 			return 1;
 		default:
-			if(level <= depth)
+			if (level <= depth)
 				printf("Unknown tag 0x%08X\n", tag);
 			return 1;
 		}
-- 
1.5.3.4

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2007-11-22 22:26 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-22 22:26 [U-Boot-Users] [PATCH] Fix fdt printing for updated libfdt Jerry Van Baren

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.