| /* | |
| * Copyright (C) 2016 The Android Open Source Project | |
| * | |
| * SPDX-License-Identifier: BSD-2-Clause | |
| */ | |
| #include <android_bootloader.h> | |
| #include <android_cmds.h> | |
| #include <common.h> | |
| #include <command.h> | |
| static int do_boot_android(cmd_tbl_t *cmdtp, int flag, int argc, | |
| char * const argv[]) | |
| { | |
| unsigned long load_address; | |
| int ret = CMD_RET_SUCCESS; | |
| char *addr_arg_endp, *addr_str; | |
| struct blk_desc *dev_desc; | |
| disk_partition_t part_info; | |
| if (argc < 4) | |
| return CMD_RET_USAGE; | |
| if (argc > 5) | |
| return CMD_RET_USAGE; | |
| if (argc >= 5) { | |
| load_address = simple_strtoul(argv[4], &addr_arg_endp, 16); | |
| if (addr_arg_endp == argv[4] || *addr_arg_endp != '\0') | |
| return CMD_RET_USAGE; | |
| } else { | |
| addr_str = env_get("loadaddr"); | |
| if (addr_str) | |
| load_address = simple_strtoul(addr_str, NULL, 16); | |
| else | |
| load_address = CONFIG_SYS_LOAD_ADDR; | |
| } | |
| if (part_get_info_by_dev_and_name_or_num(argv[1], argv[2], | |
| &dev_desc, &part_info) < 0) { | |
| return CMD_RET_FAILURE; | |
| } | |
| ret = android_bootloader_boot_flow(dev_desc, &part_info, argv[3], | |
| load_address); | |
| if (ret < 0) { | |
| printf("Android boot failed, error %d.\n", ret); | |
| return CMD_RET_FAILURE; | |
| } | |
| return CMD_RET_SUCCESS; | |
| } | |
| U_BOOT_CMD( | |
| boot_android, 5, 0, do_boot_android, | |
| "Execute the Android Bootloader flow.", | |
| "<interface> <dev[:part|;part_name]> <slot> [<kernel_addr>]\n" | |
| " - Load the Boot Control Block (BCB) from the partition 'part' on\n" | |
| " device type 'interface' instance 'dev' to determine the boot\n" | |
| " mode, and load and execute the appropriate kernel.\n" | |
| " In normal and recovery mode, the kernel will be loaded from\n" | |
| " the corresponding \"boot\" partition. In bootloader mode, the\n" | |
| " command defined in the \"fastbootcmd\" variable will be\n" | |
| " executed.\n" | |
| " On Android devices with multiple slots, the pass 'slot' is\n" | |
| " used to load the appropriate kernel. The standard slot names\n" | |
| " are 'a' and 'b'.\n" | |
| " - If 'part_name' is passed, preceded with a ; instead of :, the\n" | |
| " partition name whose label is 'part_name' will be looked up in\n" | |
| " the partition table. This is commonly the \"misc\" partition.\n" | |
| ); |