You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.4 KiB
Python
99 lines
3.4 KiB
Python
# Copyright (C) 2009 The Android Open Source Project
|
|
# Copyright (c) 2011, The Linux Foundation. All rights reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""Emit commands needed for QCOM devices during OTA installation
|
|
(installing the radio image)."""
|
|
|
|
import hashlib
|
|
import common
|
|
import re
|
|
|
|
def LoadFilesMap(zip):
|
|
try:
|
|
data = zip.read("RADIO/filesmap")
|
|
except KeyError:
|
|
print "Warning: could not find RADIO/filesmap in %s." % zip
|
|
data = ""
|
|
d = {}
|
|
for line in data.split("\n"):
|
|
line = line.strip()
|
|
if not line or line.startswith("#"): continue
|
|
pieces = line.split()
|
|
if not (len(pieces) == 2 or len(pieces) == 3):
|
|
raise ValueError("malformed filesmap line: \"%s\"" % (line,))
|
|
file_size = zip.getinfo("RADIO/"+pieces[0]).file_size
|
|
sha1 = hashlib.sha1()
|
|
sha1.update(zip.read("RADIO/"+pieces[0]))
|
|
d[pieces[0]] = (pieces[1], sha1.hexdigest(), file_size)
|
|
return d
|
|
|
|
def GetRadioFiles(z):
|
|
out = {}
|
|
for info in z.infolist():
|
|
if info.filename.startswith("RADIO/") and (info.filename.__len__() > len("RADIO/")):
|
|
fn = "RADIO/" + info.filename[6:]
|
|
out[fn] = fn
|
|
return out
|
|
|
|
def FullOTA_Assertions(info):
|
|
#TODO: Implement device specific asserstions.
|
|
return
|
|
|
|
def IncrementalOTA_Assertions(info):
|
|
#TODO: Implement device specific asserstions.
|
|
return
|
|
|
|
def InstallRawImage(image_data, api_version, input_zip, fn, info, filesmap):
|
|
#fn is in RADIO/* format. Extracting just file name.
|
|
filename = fn[6:]
|
|
if api_version >= 3:
|
|
if filename not in filesmap:
|
|
return
|
|
partition = filesmap[filename][0]
|
|
checksum = filesmap[filename][1]
|
|
file_size = filesmap[filename][2]
|
|
# read_file returns a blob or NULL. Use sha1_check to convert to a string
|
|
# that can be evaluated (a NULL results in an empty string)
|
|
info.script.AppendExtra('ifelse((sha1_check(read_file("EMMC:%s:%d:%s")) != ""),'
|
|
'(ui_print("%s already up to date")),'
|
|
'(package_extract_file("%s", "%s")));'
|
|
% (partition, file_size, checksum, partition, filename, partition))
|
|
common.ZipWriteStr(info.output_zip, filename, image_data)
|
|
return
|
|
else:
|
|
print "warning radio-update: no support for api_version less than 3."
|
|
|
|
def InstallRadioFiles(info):
|
|
files = GetRadioFiles(info.input_zip)
|
|
if files == {}:
|
|
print "warning radio-update: no radio image in input target_files; not flashing radio"
|
|
return
|
|
info.script.Print("Writing radio image...")
|
|
#Load filesmap file
|
|
filesmap = LoadFilesMap(info.input_zip)
|
|
if filesmap == {}:
|
|
print "warning radio-update: no or invalid filesmap file found. not flashing radio"
|
|
return
|
|
for f in files:
|
|
image_data = info.input_zip.read(f)
|
|
InstallRawImage(image_data, info.input_version, info.input_zip, f, info, filesmap)
|
|
return
|
|
|
|
def FullOTA_InstallEnd(info):
|
|
InstallRadioFiles(info)
|
|
|
|
def IncrementalOTA_InstallEnd(info):
|
|
InstallRadioFiles(info)
|