cmd: part: Add 'number-format' sub-command
The part number sub-command is very useful for retrieving the partition
index in the u-boot environment.
It can be used for various purposes, such as:
1. Retrieving the UUID of the partition using it's name as explained in
patch [1]:
part number mmc $mmcdev system_a system_a_index
part uuid mmc $mmcdev:${system_a_index} system_a_uuid
2. setting the 'root=<somedev>' bootarg, as done in ti's
boot environment [2]:
"if part number mmc ${mmcdev} system${slot_suffix} " \
"system_part_number; then " \
"setenv bootargs_ab " \
"ro root=/dev/mmcblk${mmcdev}p${system_part_number} "
Unfortunetely, the second snippet is broken, since it currently does:
root=/dev/mmcblk0p<0xhex_value>
And it should do:
root=/dev/mmcblk0p<decimal_value>
By introducing a new command, part number-format <hex|dec>, we can
control the output format of part number:
=> part number mmc 0 system_a
0x7
=> part number-format dec
=> part number mmc 0 system_a
7
[1] https://www.mail-archive.com/u-boot@lists.denx.de/msg342867.html
[2] https://www.mail-archive.com/u-boot@lists.denx.de/msg316806.html
Bug: https://baylibre.atlassian.net/browse/RITA-65
Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
diff --git a/cmd/part.c b/cmd/part.c
index 5e4e45c..cc785dc 100644
--- a/cmd/part.c
+++ b/cmd/part.c
@@ -28,6 +28,13 @@
CMD_PART_INFO_NUMBER
};
+enum cmd_part_number_format {
+ CMD_PART_NUMBER_FORMAT_HEX = 0,
+ CMD_PART_NUMBER_FORMAT_DECIMAL
+};
+
+static enum cmd_part_number_format number_format = CMD_PART_NUMBER_FORMAT_HEX;
+
static int do_part_uuid(int argc, char * const argv[])
{
int part;
@@ -152,7 +159,10 @@
snprintf(buf, sizeof(buf), LBAF, info.size);
break;
case CMD_PART_INFO_NUMBER:
- snprintf(buf, sizeof(buf), "0x%x", part);
+ if (number_format == CMD_PART_NUMBER_FORMAT_DECIMAL)
+ snprintf(buf, sizeof(buf), "%d", part);
+ else // default is hexadecimal
+ snprintf(buf, sizeof(buf), "0x%x", part);
break;
default:
printf("** Unknown cmd_part_info value: %d\n", param);
@@ -182,6 +192,21 @@
return do_part_info(argc, argv, CMD_PART_INFO_NUMBER);
}
+static int do_part_number_format(int argc, char * const argv[])
+{
+ if (argc != 1)
+ return CMD_RET_USAGE;
+
+ if (!strcmp(argv[0], "hex"))
+ number_format = CMD_PART_NUMBER_FORMAT_HEX;
+ else if (!strcmp(argv[0], "dec"))
+ number_format = CMD_PART_NUMBER_FORMAT_DECIMAL;
+ else
+ return CMD_RET_USAGE;
+
+ return CMD_RET_SUCCESS;
+}
+
static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
if (argc < 2)
@@ -197,6 +222,8 @@
return do_part_size(argc - 2, argv + 2);
else if (!strcmp(argv[1], "number"))
return do_part_number(argc - 2, argv + 2);
+ else if (!strcmp(argv[1], "number-format"))
+ return do_part_number_format(argc - 2, argv + 2);
return CMD_RET_USAGE;
}
@@ -221,5 +248,8 @@
" part can be either partition number or partition name\n"
"part number <interface> <dev> <part> <varname>\n"
" - set environment variable to the partition number using the partition name\n"
- " part must be specified as partition name"
+ " part must be specified as partition name\n"
+ "part number-format <format>\n"
+ " - set the output format of the part number command. Default is hex\n"
+ " format must be either hex or dec"
);