
Hi,
did anyone ever used md command? Patch below does following:
# md 400000 00400000: ea000012 .... # md 400000 4 00400000: ea000012 e59ff014 e59ff014 e59ff014 ................ # md .w 40000 00040000: 7b55 U{ # md .w 40000 4 00040000: 7b55 7e24 47b4 67e1 U{$~.G.g
Wrong parameters are handled too :)
Once there, a question comes to mind. Why was this format choosen? md [.b, .w, .l] address [# of objects] First optional parameter makes parsing a bit more difcult. And why is width specifier prefixed with dot? And what is .s specifier good for? Well, more that one question, I know... ;-)
I implemented cmd_get_data_size2, because cmd_get_data_size simply doesn't work and all it's users are broken too (do_pci looks good), just grep for function name and you'll see what needs fixing.
My proposal is to replace cmd_get_data_size with cmd_get_data_size2 and fix all bugs in its users. How should it be done depends on answers to questions above.
Best regars, ladis
--- u-boot/common/cmd_mem.c.orig 2004-09-08 18:43:16.000000000 +0200 +++ u-boot/common/cmd_mem.c 2004-09-08 19:00:18.000000000 +0200 @@ -62,6 +62,33 @@ } return default_size; } + +/* Check for a size specification .b, .w or .l. + * Returns: -1 if arg is not size specifier + * 0 if specifier was recognized (size is set approriately) + * 1 if arg is unknown specifier + */ +int cmd_get_data_size2(char* arg, int *size) +{ + if (!(strlen(arg) > 1 && arg[0] == '.')) + return -1; + switch(arg[1]) { + case 'b': + *size = 1; + break; + case 'w': + *size = 2; + break; + case 'l': + *size = 4; + break; + default: + return 1; + } + return 0; +} + + #endif
#if (CONFIG_COMMANDS & CFG_CMD_MEMORY) @@ -105,27 +132,32 @@ length = dp_last_length;
if (argc < 2) { +error: printf ("Usage:\n%s\n", cmdtp->usage); return 1; }
if ((flag & CMD_FLAG_REPEAT) == 0) { + int idx = 1; /* New command specified. Check for a size specification. * Defaults to long if no or incorrect specification. */ - if ((size = cmd_get_data_size(argv[0], 4)) < 0) - return 1; + size = 4; + if (cmd_get_data_size2(argv[idx], &size) >= 0) + idx++; + if (idx >= argc) + goto error;
- /* Address is specified since argc > 1 - */ - addr = simple_strtoul(argv[1], NULL, 16); + addr = simple_strtoul(argv[idx++], NULL, 16); addr += base_address;
/* If another parameter, it is the length to display. * Length is the number of objects, not number of bytes. */ - if (argc > 2) - length = simple_strtoul(argv[2], NULL, 16); + if (idx < argc) + length = simple_strtoul(argv[idx], NULL, 16); + else + length = 1; }
/* Print the lines. @@ -1128,7 +1160,7 @@ /**************************************************/ #if (CONFIG_COMMANDS & CFG_CMD_MEMORY) U_BOOT_CMD( - md, 3, 1, do_mem_md, + md, 4, 1, do_mem_md, "md - memory display\n", "[.b, .w, .l] address [# of objects]\n - memory display\n" );