Android kernel images include a header that specifies addresses and kernel size. This patch adds a command to load these images from storage without specifying the size or address of them, and parsing them from the header instead. --- cmd/Kconfig | 9 +++++++++ cmd/Makefile | 1 + cmd/load_android.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 cmd/load_android.c
diff --git a/cmd/Kconfig b/cmd/Kconfig index 25e3b783a8..87a445d269 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -422,6 +422,15 @@ config CMD_LOADS help Load an S-Record file over serial line +config CMD_LOAD_ANDROID + bool "load_android" + default n + depends on ANDROID_BOOT_IMAGE + help + Load an Android Boot image from storage. The Android Boot images + define the size and kernel address on the header, which are used by + this command. + config CMD_FLASH bool "flinfo, erase, protect" default y diff --git a/cmd/Makefile b/cmd/Makefile index f13bb8c11e..2f75dab040 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -82,6 +82,7 @@ obj-$(CONFIG_CMD_LDRINFO) += ldrinfo.o obj-$(CONFIG_LED_STATUS_CMD) += led.o obj-$(CONFIG_CMD_LICENSE) += license.o obj-y += load.o +obj-$(CONFIG_CMD_LOAD_ANDROID) += load_android.o obj-$(CONFIG_LOGBUFFER) += log.o obj-$(CONFIG_ID_EEPROM) += mac.o obj-$(CONFIG_CMD_MD5SUM) += md5sum.o diff --git a/cmd/load_android.c b/cmd/load_android.c new file mode 100644 index 0000000000..b9f3b1b372 --- /dev/null +++ b/cmd/load_android.c @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <common.h> +#include <command.h> + +static int do_load_android(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + int boot_partition; + unsigned long load_address; + char *addr_arg_endp, *addr_str; + struct blk_desc *dev_desc; + disk_partition_t part_info; + + if (argc < 2) + return CMD_RET_USAGE; + if (argc > 4) + return CMD_RET_USAGE; + + if (argc >= 4) { + load_address = simple_strtoul(argv[3], &addr_arg_endp, 16); + if (addr_arg_endp == argv[3] || *addr_arg_endp != '\0') + return CMD_RET_USAGE; + } else { + addr_str = getenv("loadaddr"); + if (addr_str != NULL) + load_address = simple_strtoul(addr_str, NULL, 16); + else + load_address = CONFIG_SYS_LOAD_ADDR; + } + + boot_partition = blk_get_device_part_str(argv[1], + (argc >= 3) ? argv[2] : NULL, + &dev_desc, &part_info, 1); + if (boot_partition < 0) + return CMD_RET_FAILURE; + + if (android_image_load(dev_desc, &part_info, load_address, -1UL) < 0) { + printf("Error loading Android Image from %s %d:%d to 0x%lx.\n", + argv[1], dev_desc->devnum, boot_partition, load_address); + return CMD_RET_FAILURE; + } + return CMD_RET_SUCCESS; +} + +U_BOOT_CMD( + load_android, 4, 0, do_load_android, + "load Android Boot image from storage.", + "<interface> [<dev[:part]> [<addr>]]\n" + " - Load a binary Android Boot image from the partition 'part' on\n" + " device type 'interface' instance 'dev' to address 'addr'." +); -- 2.12.2.564.g063fe858b8-goog _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot