@@ -45,6 +45,22 @@ def pad_file(f, padding):
4545 f .write (pack (str (pad ) + 'x' ))
4646
4747
48+ def get_number_of_pages (image_size , page_size ):
49+ """calculates the number of pages required for the image"""
50+ return (image_size + page_size - 1 ) / page_size
51+
52+
53+ def get_recovery_dtbo_offset (args ):
54+ """calculates the offset of recovery_dtbo image in the boot image"""
55+ num_header_pages = 1 # header occupies a page
56+ num_kernel_pages = get_number_of_pages (filesize (args .kernel ), args .pagesize )
57+ num_ramdisk_pages = get_number_of_pages (filesize (args .ramdisk ), args .pagesize )
58+ num_second_pages = get_number_of_pages (filesize (args .second ), args .pagesize )
59+ dtbo_offset = args .pagesize * (num_header_pages + num_kernel_pages +
60+ num_ramdisk_pages + num_second_pages )
61+ return dtbo_offset
62+
63+
4864def write_header (args ):
4965 BOOT_MAGIC = 'ANDROID!' .encode ()
5066 args .output .write (pack ('8s' , BOOT_MAGIC ))
@@ -57,7 +73,7 @@ def write_header(args):
5773 args .base + args .second_offset , # physical load addr
5874 args .base + args .tags_offset , # physical addr for kernel tags
5975 args .pagesize , # flash page size we assume
60- 0 , # future expansion: MUST be 0
76+ args . header_version , # version of bootimage header
6177 (args .os_version << 11 ) | args .os_patch_level )) # os version and patch level
6278 args .output .write (pack ('16s' , args .board .encode ())) # asciiz product name
6379 args .output .write (pack ('512s' , args .cmdline [:512 ].encode ()))
@@ -66,10 +82,23 @@ def write_header(args):
6682 update_sha (sha , args .kernel )
6783 update_sha (sha , args .ramdisk )
6884 update_sha (sha , args .second )
85+
86+ if args .header_version > 0 :
87+ update_sha (sha , args .recovery_dtbo )
88+
6989 img_id = pack ('32s' , sha .digest ())
7090
7191 args .output .write (img_id )
7292 args .output .write (pack ('1024s' , args .cmdline [512 :].encode ()))
93+
94+ if args .header_version > 0 :
95+ args .output .write (pack ('I' , filesize (args .recovery_dtbo ))) # size in bytes
96+ if args .recovery_dtbo :
97+ args .output .write (pack ('Q' , get_recovery_dtbo_offset (args ))) # recovery dtbo offset
98+ else :
99+ args .output .write (pack ('Q' , 0 )) # Will be set to 0 for devices without a recovery dtbo
100+ args .output .write (pack ('I' , args .output .tell () + 4 )) # size of boot header
101+
73102 pad_file (args .output , args .pagesize )
74103 return img_id
75104
@@ -132,6 +161,7 @@ def parse_cmdline():
132161 required = True )
133162 parser .add_argument ('--ramdisk' , help = 'path to the ramdisk' , type = FileType ('rb' ))
134163 parser .add_argument ('--second' , help = 'path to the 2nd bootloader' , type = FileType ('rb' ))
164+ parser .add_argument ('--recovery_dtbo' , help = 'path to the recovery DTBO' , type = FileType ('rb' ))
135165 parser .add_argument ('--cmdline' , help = 'extra arguments to be passed on the '
136166 'kernel command line' , default = '' , action = ValidateStrLenAction , maxlen = 1536 )
137167 parser .add_argument ('--base' , help = 'base address' , type = parse_int , default = 0x10000000 )
@@ -150,6 +180,7 @@ def parse_cmdline():
150180 choices = [2 ** i for i in range (11 ,15 )], default = 2048 )
151181 parser .add_argument ('--id' , help = 'print the image ID on standard output' ,
152182 action = 'store_true' )
183+ parser .add_argument ('--header_version' , help = 'boot image header version' , type = parse_int , default = 0 )
153184 parser .add_argument ('-o' , '--output' , help = 'output file name' , type = FileType ('wb' ),
154185 required = True )
155186 return parser .parse_args ()
@@ -160,6 +191,8 @@ def write_data(args):
160191 write_padded_file (args .output , args .ramdisk , args .pagesize )
161192 write_padded_file (args .output , args .second , args .pagesize )
162193
194+ if args .header_version > 0 :
195+ write_padded_file (args .output , args .recovery_dtbo , args .pagesize )
163196
164197def main ():
165198 args = parse_cmdline ()
0 commit comments