marie cecile afantenos | 89c83d1 | 2014-08-15 17:50:09 +0200 | [diff] [blame] | 1 | # Copyright (C) 2012 The Android Open Source Project |
| 2 | # |
| 3 | # Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | # you may not use this file except in compliance with the License. |
| 5 | # You may obtain a copy of the License at |
| 6 | # |
| 7 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | # |
| 9 | # Unless required by applicable law or agreed to in writing, software |
| 10 | # distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | # See the License for the specific language governing permissions and |
| 13 | # limitations under the License. |
| 14 | |
| 15 | """Emit extra commands needed for Group during OTA installation |
| 16 | (installing the bootloader).""" |
| 17 | |
| 18 | import struct |
| 19 | import common |
| 20 | |
| 21 | |
| 22 | def WriteIfwi(info): |
| 23 | info.script.AppendExtra('package_extract_file("ifwi.bin", "/tmp/ifwi.bin");') |
| 24 | info.script.AppendExtra("""fugu.flash_ifwi("/tmp/ifwi.bin");""") |
| 25 | |
Sylvain Chouleur | 9eac47a | 2014-08-19 01:45:28 +0200 | [diff] [blame] | 26 | def WriteDroidboot(info): |
marie cecile afantenos | 89c83d1 | 2014-08-15 17:50:09 +0200 | [diff] [blame] | 27 | info.script.WriteRawImage("/fastboot", "droidboot.img") |
| 28 | |
Sylvain Chouleur | 9eac47a | 2014-08-19 01:45:28 +0200 | [diff] [blame] | 29 | def WriteSplashscreen(info): |
| 30 | info.script.WriteRawImage("/splashscreen", "splashscreen.img") |
| 31 | |
marie cecile afantenos | 89c83d1 | 2014-08-15 17:50:09 +0200 | [diff] [blame] | 32 | def WriteBootloader(info, bootloader): |
Sylvain Chouleur | 6d6815a | 2014-08-30 23:32:37 +0200 | [diff] [blame] | 33 | header_fmt = "<8sHHI" |
marie cecile afantenos | 89c83d1 | 2014-08-15 17:50:09 +0200 | [diff] [blame] | 34 | header_size = struct.calcsize(header_fmt) |
Sylvain Chouleur | 6d6815a | 2014-08-30 23:32:37 +0200 | [diff] [blame] | 35 | magic, revision, reserved, reserved = struct.unpack( |
marie cecile afantenos | 89c83d1 | 2014-08-15 17:50:09 +0200 | [diff] [blame] | 36 | header_fmt, bootloader[:header_size]) |
| 37 | |
| 38 | assert magic == "BOOTLDR!", "bootloader.img bad magic value" |
| 39 | |
Sylvain Chouleur | 9eac47a | 2014-08-19 01:45:28 +0200 | [diff] [blame] | 40 | if revision == 1: |
| 41 | offset = header_size; |
| 42 | header_v1_fmt = "II" |
| 43 | header_v1_size = struct.calcsize(header_v1_fmt) |
| 44 | ifwi_size, droidboot_size = struct.unpack(header_v1_fmt, bootloader[offset:offset + header_v1_size]) |
| 45 | offset += header_v1_size |
| 46 | ifwi = bootloader[offset:offset + ifwi_size] |
| 47 | offset += ifwi_size |
| 48 | droidboot = bootloader[offset:] |
| 49 | common.ZipWriteStr(info.output_zip, "droidboot.img", droidboot) |
| 50 | common.ZipWriteStr(info.output_zip, "ifwi.bin", ifwi) |
| 51 | WriteIfwi(info) |
| 52 | WriteDroidboot(info) |
| 53 | return |
marie cecile afantenos | 89c83d1 | 2014-08-15 17:50:09 +0200 | [diff] [blame] | 54 | |
Sylvain Chouleur | 9eac47a | 2014-08-19 01:45:28 +0200 | [diff] [blame] | 55 | offset = header_size; |
| 56 | while offset < len(bootloader): |
| 57 | c_header_fmt = "<8sIBBBB" |
| 58 | c_header_size = struct.calcsize(c_header_fmt) |
| 59 | c_magic, size, flags, _, _ , _ = struct.unpack(c_header_fmt, bootloader[offset:offset + c_header_size]) |
| 60 | buf = bootloader[offset + c_header_size: offset + c_header_size + size] |
| 61 | offset += c_header_size + size |
marie cecile afantenos | 89c83d1 | 2014-08-15 17:50:09 +0200 | [diff] [blame] | 62 | |
Sylvain Chouleur | 9eac47a | 2014-08-19 01:45:28 +0200 | [diff] [blame] | 63 | if not flags & 1: |
| 64 | continue |
| 65 | |
| 66 | if c_magic == "IFWI!!!!": |
| 67 | common.ZipWriteStr(info.output_zip, "ifwi.bin", buf) |
| 68 | WriteIfwi(info); |
| 69 | continue |
| 70 | if c_magic == "DROIDBT!": |
| 71 | common.ZipWriteStr(info.output_zip, "droidboot.img", buf) |
| 72 | WriteDroidboot(info); |
| 73 | continue |
| 74 | if c_magic == "SPLASHS!": |
| 75 | common.ZipWriteStr(info.output_zip, "splashscreen.img", buf) |
| 76 | WriteSplashscreen(info); |
| 77 | continue |
marie cecile afantenos | 89c83d1 | 2014-08-15 17:50:09 +0200 | [diff] [blame] | 78 | |
| 79 | def FullOTA_InstallEnd(info): |
| 80 | try: |
| 81 | bootloader_img = info.input_zip.read("RADIO/bootloader.img") |
| 82 | except KeyError: |
| 83 | print "no bootloader.img in target_files; skipping install" |
| 84 | else: |
| 85 | WriteBootloader(info, bootloader_img) |
| 86 | |
| 87 | |
| 88 | def IncrementalOTA_InstallEnd(info): |
| 89 | try: |
| 90 | target_bootloader_img = info.target_zip.read("RADIO/bootloader.img") |
| 91 | try: |
| 92 | source_bootloader_img = info.source_zip.read("RADIO/bootloader.img") |
| 93 | except KeyError: |
| 94 | source_bootloader_img = None |
| 95 | |
| 96 | if source_bootloader_img == target_bootloader_img: |
| 97 | print "bootloader unchanged; skipping" |
| 98 | else: |
| 99 | print "bootloader changed; adding it" |
| 100 | WriteBootloader(info, target_bootloader_img) |
| 101 | except KeyError: |
| 102 | print "no bootloader.img in target target_files; skipping install" |