You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

271 lines
13 KiB

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) Hisilicon Technologies Co., Ltd.. 2020-2022. All rights reserved.
# Description: add the full ota or Incremental ota upgrade partitions
# Author: Huanglong
# Create: 2020-11-25
import common
import os.path
import sparse_img
from blockimgdiff import EmptyImage
# add for find the image exist or not
def HasTheImage(target_files_zip, partition):
try:
target_files_zip.getinfo("IMAGES/" + partition)
return True
except KeyError:
return False
def HuanglongAddImageToZipOutputHasTheImage(info, image_name):
if HasTheImage(info.input_zip, image_name):
common.ZipWriteStr(info.output_zip, image_name, info.input_zip.read("IMAGES/" + image_name))
def HuanglongUpdateHasTheImage(info, mount_point, image_name):
if HasTheImage(info.input_zip, image_name):
info.script.Print("update " + mount_point + " ...")
info.script.WriteRawImage("/" + mount_point, image_name)
def HuanglongUpdateContainsBakHasTheImage(info, mount_point, bak_mount_point, image_name):
if HasTheImage(info.input_zip, image_name):
info.script.Print("update " + mount_point + " and " + bak_mount_point + " ...")
info.script.WriteRawImage("/" + mount_point, image_name)
info.script.WriteRawImage("/" + bak_mount_point, image_name)
def GetCustomPartitionImages(input_tmp, zipfile):
dp_dict = {"odm": "IMAGES/odm.img",
"product": "IMAGES/product.img"}
return {partition: sparse_img.SparseImage(os.path.join(input_tmp, path)) for (partition, path) in dp_dict.items()}
def FullOTA_GetCustomBlockDifferences(info):
images = GetCustomPartitionImages(info.input_tmp, info.input_zip)
for partition, image in images.items():
info.script.Print("update %s ..." % (partition,))
image.ResetFileMap()
image_diff = common.BlockDifference(partition, image)
image_diff.WriteScript(info.script, info.output_zip)
def IncrementalOTA_GetCustomBlockDifferences(info):
source_images = GetCustomPartitionImages(info.source_tmp, info.source_zip)
target_images = GetCustomPartitionImages(info.target_tmp, info.target_zip)
for partition in source_images:
target_images.setdefault(partition, EmptyImage())
for partition, target_image in target_images.items():
info.script.Print("update %s ..." % (partition,))
target_image.ResetFileMap()
image_diff = common.BlockDifference(partition, target_image, source_images.get(partition))
image_diff.WriteScript(info.script, info.output_zip)
def ZipWriteOutput(info):
HuanglongAddImageToZipOutputHasTheImage(info, "fastboot.bin")
HuanglongAddImageToZipOutputHasTheImage(info, "sbl.bin")
HuanglongAddImageToZipOutputHasTheImage(info, "slaveboot.bin")
HuanglongAddImageToZipOutputHasTheImage(info, "trustedcore.img")
HuanglongAddImageToZipOutputHasTheImage(info, "deviceinfo.img")
HuanglongAddImageToZipOutputHasTheImage(info, "panel.img")
HuanglongAddImageToZipOutputHasTheImage(info, "vbmeta_system.img")
HuanglongAddImageToZipOutputHasTheImage(info, "vbmeta_vendor.img")
HuanglongAddImageToZipOutputHasTheImage(info, "bootargs.bin")
HuanglongAddImageToZipOutputHasTheImage(info, "recovery.img")
HuanglongAddImageToZipOutputHasTheImage(info, "dtbo.img")
HuanglongAddImageToZipOutputHasTheImage(info, "baseparam.img")
HuanglongAddImageToZipOutputHasTheImage(info, "logo.img")
HuanglongAddImageToZipOutputHasTheImage(info, "preload.img")
def HuanglongUpdateHasTheExt4Image(info, mount_point, image_name):
if HasTheImage(info.input_zip, image_name):
info.script.Print("update " + mount_point + " ...")
info.script.AppendExtra('format("%s", "%s","%s", "%s", "%s");' % ("ext4", "EMMC", "/dev/block/by-name/" + mount_point, "0", "/"+mount_point))
info.script.AppendExtra('package_extract_file("%s", "%s");' % (image_name, "/tmp/"+mount_point+".ext4"))
info.script.AppendExtra('write_ext4sp_img("%s", "%s");' % ("/tmp/"+mount_point+".ext4","/dev/block/by-name/"+mount_point))
info.script.AppendExtra('delete("%s");' % ("/tmp/"+mount_point+".ext4"))
def FullOTA_InstallBegin(info):
ZipWriteOutput(info)
type, misc_block_device= common.GetTypeAndDevice("/misc", info.info_dict)
info.script.AppendExtra(('if (get_stage("%s") == "" ) then' ) % (misc_block_device))
info.script.Print("update recovery... stage: 1/2......")
info.script.Print("update recoverybak bootargsbak dtbobak......")
info.script.AppendExtra(('if (get_recovery_state("%s") != "b" ) then' ) % (misc_block_device))
HuanglongUpdateHasTheImage(info, "recoverybak", "recovery.img")
HuanglongUpdateHasTheImage(info, "bootargsbak", "bootargs.bin")
HuanglongUpdateHasTheImage(info, "dtbobak", "dtbo.img")
info.script.AppendExtra('set_recovery_state("%s", "%s");' % (misc_block_device, "b"))
info.script.AppendExtra('endif;')
info.script.Print("update recovery bootargs dtbo(not bak)......")
HuanglongUpdateHasTheImage(info, "recovery", "recovery.img")
HuanglongUpdateHasTheImage(info, "bootargs", "bootargs.bin")
HuanglongUpdateHasTheImage(info, "dtbo", "dtbo.img")
info.script.AppendExtra('set_recovery_state("%s", "%s");' % (misc_block_device, "a"))
info.script.AppendExtra('set_stage("%s", "%s");' % (misc_block_device, "2/2"))
info.script.AppendExtra('endif;')
info.script.AppendExtra(('if (get_stage("%s") == "2/2" ) then' ) % (misc_block_device))
info.script.Print("update recovery...stage 2/2......");
HuanglongUpdateHasTheImage(info, "vbmeta_system", "vbmeta_system.img")
HuanglongUpdateHasTheImage(info, "vbmeta_vendor", "vbmeta_vendor.img")
HuanglongUpdateHasTheImage(info, "fastboot", "fastboot.bin")
if(CheckPartition(info,"fastboot_sda")):
HuanglongUpdateHasTheImage(info, "fastboot_sda", "fastboot.bin")
HuanglongUpdateContainsBakHasTheImage(info, "sbl", "sblbak", "sbl.bin")
HuanglongUpdateContainsBakHasTheImage(info, "slaveboot", "slavebootbak", "slaveboot.bin")
HuanglongUpdateHasTheImage(info, "deviceinfo", "deviceinfo.img")
HuanglongUpdateContainsBakHasTheImage(info, "trustedcore", "trustedcorebak", "trustedcore.img")
HuanglongUpdateHasTheImage(info, "panel", "panel.img")
HuanglongUpdateHasTheImage(info, "baseparam", "baseparam.img")
HuanglongUpdateHasTheImage(info, "logo", "logo.img")
if(CheckPartition(info, "preload")):
HuanglongUpdateHasTheExt4Image(info, "preload", "preload.img")
FullOTA_GetCustomBlockDifferences(info)
info.script.AppendExtra('endif;')
def CheckPartition(info,partition):
try:
type, partition_block_device= common.GetTypeAndDevice("/"+partition, info.info_dict)
if(len(partition_block_device)==0):
return False
else:
return True
except KeyError:
return False
def FullOTA_InstallEnd(info):
info.script.Print("FullOTA_InstallEnd01...")
info.script.Print("FullOTA_InstallEnd02...")
def GetSrcAndTagBootableImage(info, image_full_name):
source = common.GetBootableImage(
"/tmp/" + image_full_name, image_full_name, common.OPTIONS.source_tmp, "IMAGES", info.info_dict)
target = common.GetBootableImage(
"/tmp/" + image_full_name, image_full_name, common.OPTIONS.target_tmp, "IMAGES", info.info_dict)
return (source, target)
def CheckUpdatingImage(info, image, suffix):
image_full_name = image + suffix
source, target = GetSrcAndTagBootableImage(info, image_full_name)
if source.data != target.data:
type, device = common.GetTypeAndDevice(
"/" + image, info.info_dict)
d = common.Difference(target, source)
_, _, d = d.ComputePatch()
if d is None:
info.script.Print("%s do not change, including to update" % (image,))
common.ZipWriteStr(info.output_zip, image_full_name, target.data)
else:
info.script.Print("%s target: %d source: %d diff: %d" % (image,
target.size, source.size, len(d)))
common.ZipWriteStr(info.output_zip, "patch/" + image_full_name + ".p", d)
info.script.PatchPartitionCheck(
"{}:{}:{}:{}".format(
type, device, target.size, target.sha1),
"{}:{}:{}:{}".format(
type, device, source.size, source.sha1))
info.script.CacheFreeSpaceCheck(target.size)
def IncrementalOTA_VerifyBegin(info):
info.script.Print("IncrementalOTA_VerifyBegin...")
def IncrementalOTA_VerifyEnd(info):
info.script.Print("IncrementalOTA_VerifyEnd...")
def IncrementalUpdatingImage(info, image, suffix):
image_full_name = image + suffix
source, target = GetSrcAndTagBootableImage(info, image_full_name)
if source.data != target.data:
type, device = common.GetTypeAndDevice(
"/" + image, info.info_dict)
d = common.Difference(target, source)
_, _, d = d.ComputePatch()
if d is None:
info.script.Print("%s do not change, including full update" % (image,))
info.script.WriteRawImage(device, image_full_name)
else:
info.script.Print("%s image changed; including patch." % (image,))
info.script.PatchPartition(
'{}:{}:{}:{}'.format(
type, device, target.size, target.sha1),
'{}:{}:{}:{}'.format(
type, device, source.size, source.sha1),
"patch/" + image_full_name + ".p")
def HuanglongAddFullImage(info, device, image, suffix):
image_full_name = image + suffix
source, target = GetSrcAndTagBootableImage(info, image_full_name)
common.ZipWriteStr(info.output_zip, image_full_name, target.data)
info.script.WriteRawImage(device, image_full_name)
def HuanglongAddFullImageToZip(info, image_full_name):
if HasTheImage(info.target_zip, image_full_name):
source, target = GetSrcAndTagBootableImage(info, image_full_name)
common.ZipWriteStr(info.output_zip, image_full_name, target.data)
def HuanglongUpdateFullImage(info, mount_point, image_name):
if HasTheImage(info.target_zip, image_name):
info.script.Print("update " + mount_point + " ...")
info.script.WriteRawImage("/" + mount_point, image_name)
def HuanglongUpdateFullImageAndBak(info, mount_point, bak_mount_point, image_name):
if HasTheImage(info.target_zip, image_name):
info.script.Print("update " + mount_point + " and " + bak_mount_point + " ...")
info.script.WriteRawImage("/" + mount_point, image_name)
info.script.WriteRawImage("/" + bak_mount_point, image_name)
def IncrementalOTA_InstallBegin(info):
HuanglongAddFullImageToZip(info, "recovery.img")
HuanglongAddFullImageToZip(info, "bootargs.bin")
HuanglongAddFullImageToZip(info, "dtbo.img")
HuanglongAddFullImageToZip(info, "vbmeta_system.img")
HuanglongAddFullImageToZip(info, "vbmeta_vendor.img")
HuanglongAddFullImageToZip(info, "fastboot.bin")
HuanglongAddFullImageToZip(info, "sbl.bin")
HuanglongAddFullImageToZip(info, "slaveboot.bin")
HuanglongAddFullImageToZip(info, "deviceinfo.img")
HuanglongAddFullImageToZip(info, "trustedcore.img")
HuanglongAddFullImageToZip(info, "panel.img")
HuanglongAddFullImageToZip(info, "baseparam.img")
HuanglongAddFullImageToZip(info, "logo.img")
type, misc_block_device= common.GetTypeAndDevice("/misc", info.info_dict)
info.script.AppendExtra(('if (get_stage("%s") == "" ) then' ) % (misc_block_device))
info.script.Print("update recovery... stage: 1/2......")
info.script.Print("update recoverybak and bootargsbak and dtbobak......")
info.script.AppendExtra(('if (get_recovery_state("%s") != "b" ) then' ) % (misc_block_device))
HuanglongUpdateFullImage(info, "recoverybak", "recovery.img")
HuanglongUpdateFullImage(info, "bootargsbak", "bootargs.bin")
HuanglongUpdateFullImage(info, "dtbobak", "dtbo.img")
info.script.AppendExtra('set_recovery_state("%s", "%s");' % (misc_block_device, "b"))
info.script.AppendExtra('endif;')
info.script.Print("update recovery and bootargs and dtbo(not bak)......")
HuanglongUpdateFullImage(info, "recovery", "recovery.img")
HuanglongUpdateFullImage(info, "bootargs", "bootargs.bin")
HuanglongUpdateFullImage(info, "dtbo", "dtbo.img")
info.script.AppendExtra('set_recovery_state("%s", "%s");' % (misc_block_device, "a"))
info.script.AppendExtra('set_stage("%s", "%s");' % (misc_block_device, "2/2"))
info.script.AppendExtra('endif;')
info.script.AppendExtra(('if (get_stage("%s") == "2/2" ) then' ) % (misc_block_device))
info.script.Print("update recovery...stage 2/2......")
HuanglongUpdateFullImage(info, "vbmeta_system", "vbmeta_system.img")
HuanglongUpdateFullImage(info, "vbmeta_vendor", "vbmeta_vendor.img")
HuanglongUpdateFullImage(info, "fastboot", "fastboot.bin")
if(CheckPartition(info,"fastboot_sda")):
HuanglongUpdateHasTheImage(info, "fastboot_sda", "fastboot.bin")
HuanglongUpdateFullImageAndBak(info, "sbl", "sblbak", "sbl.bin")
HuanglongUpdateFullImageAndBak(info, "slaveboot", "slavebootbak", "slaveboot.bin")
HuanglongUpdateFullImage(info, "deviceinfo", "deviceinfo.img")
HuanglongUpdateFullImageAndBak(info, "trustedcore", "trustedcorebak", "trustedcore.img")
HuanglongUpdateFullImage(info, "panel", "panel.img")
HuanglongUpdateFullImage(info, "baseparam", "baseparam.img")
HuanglongUpdateFullImage(info, "logo", "logo.img")
IncrementalOTA_GetCustomBlockDifferences(info)
info.script.AppendExtra('endif;')
def IncrementalOTA_InstallEnd(info):
info.script.Print("IncrementalOTA_InstallEnd...")