mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-23 20:24:26 +08:00
image: android: Add routine to get dtbo params
Android Boot Image v1 adds "Recovery DTB" field in image header and associate payload in boot image itself [1]. Payload should be in Android DTB/DTBO format [2]. That "Recovery DTB" area should be only populated for non-A/B devices, and only in recovery image. Add function to get an address and size of that payload. That function can be further used e.g. in 'abootimg' command to provide the user a way to get the address of recovery dtbo from U-Boot shell, which can be further parsed using 'adtimg' command. [1] https://source.android.com/devices/bootloader/boot-image-header [2] https://source.android.com/devices/architecture/dto/partitions Signed-off-by: Sam Protsenko <joe.skb7@gmail.com> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
This commit is contained in:
parent
c3bfad825a
commit
7f2531502c
@ -197,6 +197,67 @@ int android_image_get_second(const struct andr_img_hdr *hdr,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* android_image_get_dtbo() - Get address and size of recovery DTBO image.
|
||||||
|
* @hdr_addr: Boot image header address
|
||||||
|
* @addr: If not NULL, will contain address of recovery DTBO image
|
||||||
|
* @size: If not NULL, will contain size of recovery DTBO image
|
||||||
|
*
|
||||||
|
* Get the address and size of DTBO image in "Recovery DTBO" area of Android
|
||||||
|
* Boot Image in RAM. The format of this image is Android DTBO (see
|
||||||
|
* corresponding "DTB/DTBO Partitions" AOSP documentation for details). Once
|
||||||
|
* the address is obtained from this function, one can use 'adtimg' U-Boot
|
||||||
|
* command or android_dt_*() functions to extract desired DTBO blob.
|
||||||
|
*
|
||||||
|
* This DTBO (included in boot image) is only needed for non-A/B devices, and it
|
||||||
|
* only can be found in recovery image. On A/B devices we can always rely on
|
||||||
|
* "dtbo" partition. See "Including DTBO in Recovery for Non-A/B Devices" in
|
||||||
|
* AOSP documentation for details.
|
||||||
|
*
|
||||||
|
* Return: true on success or false on error.
|
||||||
|
*/
|
||||||
|
bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size)
|
||||||
|
{
|
||||||
|
const struct andr_img_hdr *hdr;
|
||||||
|
ulong dtbo_img_addr;
|
||||||
|
bool ret = true;
|
||||||
|
|
||||||
|
hdr = map_sysmem(hdr_addr, sizeof(*hdr));
|
||||||
|
if (android_image_check_header(hdr)) {
|
||||||
|
printf("Error: Boot Image header is incorrect\n");
|
||||||
|
ret = false;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hdr->header_version < 1) {
|
||||||
|
printf("Error: header_version must be >= 1 to get dtbo\n");
|
||||||
|
ret = false;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hdr->recovery_dtbo_size == 0) {
|
||||||
|
printf("Error: recovery_dtbo_size is 0\n");
|
||||||
|
ret = false;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculate the address of DTB area in boot image */
|
||||||
|
dtbo_img_addr = hdr_addr;
|
||||||
|
dtbo_img_addr += hdr->page_size;
|
||||||
|
dtbo_img_addr += ALIGN(hdr->kernel_size, hdr->page_size);
|
||||||
|
dtbo_img_addr += ALIGN(hdr->ramdisk_size, hdr->page_size);
|
||||||
|
dtbo_img_addr += ALIGN(hdr->second_size, hdr->page_size);
|
||||||
|
|
||||||
|
if (addr)
|
||||||
|
*addr = dtbo_img_addr;
|
||||||
|
if (size)
|
||||||
|
*size = hdr->recovery_dtbo_size;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
unmap_sysmem(hdr);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* android_image_get_dtb_img_addr() - Get the address of DTB area in boot image.
|
* android_image_get_dtb_img_addr() - Get the address of DTB area in boot image.
|
||||||
* @hdr_addr: Boot image header address
|
* @hdr_addr: Boot image header address
|
||||||
|
@ -1425,6 +1425,7 @@ int android_image_get_ramdisk(const struct andr_img_hdr *hdr,
|
|||||||
ulong *rd_data, ulong *rd_len);
|
ulong *rd_data, ulong *rd_len);
|
||||||
int android_image_get_second(const struct andr_img_hdr *hdr,
|
int android_image_get_second(const struct andr_img_hdr *hdr,
|
||||||
ulong *second_data, ulong *second_len);
|
ulong *second_data, ulong *second_len);
|
||||||
|
bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size);
|
||||||
bool android_image_get_dtb_by_index(ulong hdr_addr, u32 index, ulong *addr,
|
bool android_image_get_dtb_by_index(ulong hdr_addr, u32 index, ulong *addr,
|
||||||
u32 *size);
|
u32 *size);
|
||||||
ulong android_image_get_end(const struct andr_img_hdr *hdr);
|
ulong android_image_get_end(const struct andr_img_hdr *hdr);
|
||||||
|
Loading…
Reference in New Issue
Block a user