提交 bb63363f 编写于 作者: S Sam Protsenko 提交者: Tom Rini

image: android: Support boot image v1 and v2

In new versions of Android Boot Image next fields are added to the
header (and corresponding payloads are added to the image itself):
  - v1: Recovery DTBO
  - v2: DTB

Account for these new fields in next functions:
  1. android_image_get_end(): as v1 and v2 have new payloads in the
     image, the calculation of image end address should be extended
     correspondingly; this is used e.g. by "bootm" command when booting
     the kernel from Android Boot Image
  2. android_print_contents(): new fields values in v1 and v2 should be
     printed; the result of this function can be seen e.g. in "iminfo"
     command

This commit doesn't add the means for working with new payloads in v1
and v2 images (it will be done in further commits), it only updates
existing functions w.r.t. changes in boot image v1/v2.
Signed-off-by: NSam Protsenko <semen.protsenko@linaro.org>
上级 35e99836
...@@ -120,6 +120,7 @@ int android_image_check_header(const struct andr_img_hdr *hdr) ...@@ -120,6 +120,7 @@ int android_image_check_header(const struct andr_img_hdr *hdr)
ulong android_image_get_end(const struct andr_img_hdr *hdr) ulong android_image_get_end(const struct andr_img_hdr *hdr)
{ {
ulong end; ulong end;
/* /*
* The header takes a full page, the remaining components are aligned * The header takes a full page, the remaining components are aligned
* on page boundary * on page boundary
...@@ -130,6 +131,12 @@ ulong android_image_get_end(const struct andr_img_hdr *hdr) ...@@ -130,6 +131,12 @@ ulong android_image_get_end(const struct andr_img_hdr *hdr)
end += ALIGN(hdr->ramdisk_size, hdr->page_size); end += ALIGN(hdr->ramdisk_size, hdr->page_size);
end += ALIGN(hdr->second_size, hdr->page_size); end += ALIGN(hdr->second_size, hdr->page_size);
if (hdr->header_version >= 1)
end += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
if (hdr->header_version >= 2)
end += ALIGN(hdr->dtb_size, hdr->page_size);
return end; return end;
} }
...@@ -207,21 +214,36 @@ void android_print_contents(const struct andr_img_hdr *hdr) ...@@ -207,21 +214,36 @@ void android_print_contents(const struct andr_img_hdr *hdr)
u32 os_ver = hdr->os_version >> 11; u32 os_ver = hdr->os_version >> 11;
u32 os_lvl = hdr->os_version & ((1U << 11) - 1); u32 os_lvl = hdr->os_version & ((1U << 11) - 1);
printf("%skernel size: %x\n", p, hdr->kernel_size); printf("%skernel size: %x\n", p, hdr->kernel_size);
printf("%skernel address: %x\n", p, hdr->kernel_addr); printf("%skernel address: %x\n", p, hdr->kernel_addr);
printf("%sramdisk size: %x\n", p, hdr->ramdisk_size); printf("%sramdisk size: %x\n", p, hdr->ramdisk_size);
printf("%sramdisk address: %x\n", p, hdr->ramdisk_addr); printf("%sramdisk address: %x\n", p, hdr->ramdisk_addr);
printf("%ssecond size: %x\n", p, hdr->second_size); printf("%ssecond size: %x\n", p, hdr->second_size);
printf("%ssecond address: %x\n", p, hdr->second_addr); printf("%ssecond address: %x\n", p, hdr->second_addr);
printf("%stags address: %x\n", p, hdr->tags_addr); printf("%stags address: %x\n", p, hdr->tags_addr);
printf("%spage size: %x\n", p, hdr->page_size); printf("%spage size: %x\n", p, hdr->page_size);
/* ver = A << 14 | B << 7 | C (7 bits for each of A, B, C) /* ver = A << 14 | B << 7 | C (7 bits for each of A, B, C)
* lvl = ((Y - 2000) & 127) << 4 | M (7 bits for Y, 4 bits for M) */ * lvl = ((Y - 2000) & 127) << 4 | M (7 bits for Y, 4 bits for M) */
printf("%sos_version: %x (ver: %u.%u.%u, level: %u.%u)\n", printf("%sos_version: %x (ver: %u.%u.%u, level: %u.%u)\n",
p, hdr->os_version, p, hdr->os_version,
(os_ver >> 7) & 0x7F, (os_ver >> 14) & 0x7F, os_ver & 0x7F, (os_ver >> 7) & 0x7F, (os_ver >> 14) & 0x7F, os_ver & 0x7F,
(os_lvl >> 4) + 2000, os_lvl & 0x0F); (os_lvl >> 4) + 2000, os_lvl & 0x0F);
printf("%sname: %s\n", p, hdr->name); printf("%sname: %s\n", p, hdr->name);
printf("%scmdline: %s\n", p, hdr->cmdline); printf("%scmdline: %s\n", p, hdr->cmdline);
printf("%sheader_version: %d\n", p, hdr->header_version);
if (hdr->header_version >= 1) {
printf("%srecovery dtbo size: %x\n", p,
hdr->recovery_dtbo_size);
printf("%srecovery dtbo offset: %llx\n", p,
hdr->recovery_dtbo_offset);
printf("%sheader size: %x\n", p,
hdr->header_size);
}
if (hdr->header_version >= 2) {
printf("%sdtb size: %x\n", p, hdr->dtb_size);
printf("%sdtb addr: %llx\n", p, hdr->dtb_addr);
}
} }
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册