android: add api for loading fdt
If user get the kernel fdt into the independent partition which is the ext4 filesystem, we can use this api to load fdt. Change-Id: I4fa494beffecb41e8c0e4c02f1e782d0291e2d05 Signed-off-by: Weiwen Chen <cww@rock-chips.com>
This commit is contained in:
parent
bf17c6275d
commit
8ce4d2843d
|
|
@ -6,10 +6,12 @@
|
||||||
|
|
||||||
#include <android_bootloader.h>
|
#include <android_bootloader.h>
|
||||||
#include <android_bootloader_message.h>
|
#include <android_bootloader_message.h>
|
||||||
|
#include <android_avb/avb_ops_user.h>
|
||||||
|
|
||||||
#include <cli.h>
|
#include <cli.h>
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#include <fs.h>
|
||||||
|
|
||||||
#define ANDROID_PARTITION_BOOT "boot"
|
#define ANDROID_PARTITION_BOOT "boot"
|
||||||
#define ANDROID_PARTITION_SYSTEM "system"
|
#define ANDROID_PARTITION_SYSTEM "system"
|
||||||
|
|
@ -158,6 +160,66 @@ static int android_bootloader_boot_bootloader(void)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int android_bootloader_get_fdt(const char *part_name,
|
||||||
|
const char *load_file_name)
|
||||||
|
{
|
||||||
|
const char *dev_iface = "mmc";
|
||||||
|
struct blk_desc *dev_desc;
|
||||||
|
disk_partition_t boot_part_info;
|
||||||
|
char *fdt_addr = NULL;
|
||||||
|
char slot_suffix[5] = {0};
|
||||||
|
char dev_part[3] = {0};
|
||||||
|
loff_t bytes = 0;
|
||||||
|
loff_t pos = 0;
|
||||||
|
loff_t len_read;
|
||||||
|
unsigned long addr = 0;
|
||||||
|
int part_num = -1;
|
||||||
|
int dev_num = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
dev_desc = blk_get_dev(dev_iface, dev_num);
|
||||||
|
if (!dev_desc) {
|
||||||
|
printf("Could not find %s %d\n", dev_iface, dev_num);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&boot_part_info, 0, sizeof(boot_part_info));
|
||||||
|
|
||||||
|
#ifdef CONFIG_AVB_LIBAVB_USER
|
||||||
|
if (avb_get_current_slot(slot_suffix)) {
|
||||||
|
printf("ANDROID: Get Current Slot error.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
part_num = android_part_get_info_by_name_suffix(dev_desc,
|
||||||
|
part_name,
|
||||||
|
slot_suffix, &boot_part_info);
|
||||||
|
#else
|
||||||
|
part_num = part_get_info_by_name(dev_desc, part_name, &boot_part_info);
|
||||||
|
if (part_num < 0) {
|
||||||
|
printf("ANDROID: Could not find partition \"%s\"\n", part_name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
snprintf(dev_part, ARRAY_SIZE(dev_part), ":%x", part_num);
|
||||||
|
if (fs_set_blk_dev(dev_iface, dev_part, FS_TYPE_EXT))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
fdt_addr = env_get("fdt_addr_r");
|
||||||
|
if (!fdt_addr) {
|
||||||
|
printf("ANDROID: No Found FDT Load Address.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
addr = simple_strtoul(fdt_addr, NULL, 16);
|
||||||
|
|
||||||
|
ret = fs_read(load_file_name, addr, pos, bytes, &len_read);
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int android_bootloader_boot_kernel(unsigned long kernel_address)
|
int android_bootloader_boot_kernel(unsigned long kernel_address)
|
||||||
{
|
{
|
||||||
char kernel_addr_str[12];
|
char kernel_addr_str[12];
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue