blob: 7354890c36985db2086523123cb65e59c1fddd89 [file] [log] [blame]
#! /usr/bin/env python
# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Common command line options for mtbringup tools."""
from common import (MTBringupTool,
MTBringupArgumentParser,
ExecuteCommonCommands,
MTBringupToolArgs)
from mtlib.util import AskUser, Path
from mtlib.firmware import FirmwarePackage, FirmwareBinary
src_dir = Path("/mnt/host/source/src/")
firmware_commit_tpl = """\
Touchpad firmware revision {version}
This commit contains the following firmware binaries:
{binaries}
BUG={bug}
TEST=To automatically verify if the firmware is correctly installed, run:
$ mtbringup-firmware -r device_ip --verify
"""
class FirmwareTool(MTBringupTool):
def __init__(self, args):
MTBringupTool.__init__(self, args)
self.package = FirmwarePackage(self.board, self.variant)
def ForceUpdate(self, device, binary):
binary.ForceUpdate(device, self.remote)
device.Refresh(self.remote)
print "Updated device information:"
print device
def DownloadBinaries(self):
binaries = self.package.GetExistingBinaries()
for binary in binaries:
open(binary.filename, "w").write(binary.data)
def PrepareBinary(self, device, binary):
self.ForceUpdate(device, binary)
binary.UpdateName(device.hw_version, device.fw_version)
print "Renamed binary to: {}".format(binary.filename)
def GenerateEbuildPackage(self, new_version, binaries, clean):
for binary in binaries:
if not binary.fw_version or not binary.hw_version:
msg = "Prepare {} with --prepare-binary"
raise Exception(msg.format(binary.filename))
self.package.AddBinary(binary)
self.GitRepoPrepared(self.package.ebuild_dir)
existing = self.package.GetExistingBinaries()
firmwares = self.package.binaries
legacy_binaries = [b for b in existing if b.hw_version not in firmwares]
for binary in legacy_binaries:
msg = "Do you want to keep the firmware '{}' in the package?"
if not AskUser.YesNo(msg.format(binary), default=True):
continue
if not binary.symlink_name:
touch_devices = self.device_info.touch_devices
if binary.hw_version in touch_devices:
binary.symlink_name = touch_devices[binary.hw_version].symlink
else:
msg = "What is the symlink name for this device?"
binary.symlink_name = AskUser.Text(msg)
self.package.AddBinary(binary)
self.package.UpdateVersionSymlink(new_version)
self.package.UpdateEbuildFile(self.remote, regenerate=clean)
tar_file = self.package.GenerateBCSPackage(new_version)
print "Upload the package {} to the following url".format(tar_file.basename)
print " https://www.google.com/chromeos/partner/fe/#bcUpload:type=PRIVATE"
print "Using the following values:"
print " Overlay:", self.package.overlay.basename
print " Relative path: chromeos-base/" + self.package.ebuild_name
def Status(self):
print "Firmware Ebuild Status:"
print " Ebuild: {}".format(self.package.ebuild_file)
if not self.package.ebuild_file.exists:
print " Ebuild does not exist."
return
print " Ebuild version: {}".format(self.package.ebuild_version)
print " GIT branch: {}".format(self.package.ebuild_repo.active_branch)
print " GIT status: {}".format(self.package.ebuild_repo.status)
print " Firmware binaries:"
existing = self.package.GetExistingBinaries()
for binary in existing:
print " {}".format(binary)
print " BCS URL: {}".format(self.package.bcs_url)
def Verify(self):
self.emerge.Deploy(self.package.ebuild_name, self.remote)
print "Verifying firmware symlinks and binaries"
self.package.VerifySymlinks(self.remote)
print "Forcing firmware updates"
for device in self.device_info.touch_devices.values():
device.ForceFirmwareUpdate(self.remote)
print "Checking firmware version numbers"
self.package.VerifyFirmwareVersions(self.remote)
def Prepare(self):
self.PrepareGit(self.package.overlay)
def Clean(self):
self.CleanGit(self.package.overlay)
def Commit(self, bug_id):
existing = self.package.GetExistingBinaries()
lines = []
for firmware in existing:
lines.append(" - Firmware {} for device {}".format(
firmware.fw_version, firmware.hw_version))
message = firmware_commit_tpl.format(
version=self.package.ebuild_version,
binaries="\n".join(lines),
bug=bug_id)
self.package.ebuild_repo.Add(self.package.ebuild_file)
self.package.ebuild_repo.Add(self.package.ebuild_symlink)
self.package.ebuild_repo.Commit(message, all_changes=True,
ammend_if_diverged=True)
self.Upload(self.package.ebuild_repo)
usage = "Touch firmware bringup tool"
def main():
parser = MTBringupArgumentParser(usage)
parser.add_argument("--prepare",
dest="prepare", default=False, action="store_true",
help="prepare overlay git repo.")
parser.add_argument("--verify",
dest="verify", default=False, action="store_true",
help="Install firmware and verify update process.")
parser.add_argument("--commit",
dest="commit", default=False, action="store_true",
help="upload ebuild file for review.")
parser.add_argument("--clean",
dest="clean", default=False, action="store_true",
help="cleanup overlay git repo.")
parser.add_argument("--force-update",
dest="force_update", default=None,
help="force update to firmware binary on a device")
parser.add_argument("--prepare-binary",
dest="prepare_binary", default=None,
help="rename binary to hwver_fwver.bin.")
parser.add_argument("--ebuild",
dest="ebuild", default=None, nargs="*",
help="Generate firmware package and ebuild file.")
parser.add_argument("--version",
dest="version", default=None,
help="Specify new version of generated ebuild package")
parser.add_argument("--clean-ebuild",
dest="clean_ebuild", default=None, nargs="*",
help="Generate firmware package and ebuild file " +
"from scratch")
parser.add_argument("--download",
dest="download", default=False, action="store_true",
help="download all firmware binaries to cwd")
args = parser.parse_args()
tool = FirmwareTool(MTBringupToolArgs(args))
if args.prepare_binary or args.force_update:
device = tool.AskForDevice("Which device does this firmware apply to?")
binary = FirmwareBinary(args.prepare_binary or args.force_update)
if args.prepare_binary:
tool.PrepareBinary(device, binary)
elif args.force_update:
tool.ForceUpdate(device, binary)
elif args.download:
tool.DownloadBinaries()
elif args.ebuild is not None or args.clean_ebuild is not None:
files = args.ebuild or args.clean_ebuild
new_version = args.version
if not new_version:
print "Enter the new version number of this ebuild:"
current_version = tool.package.ebuild_version
if current_version:
print "(The current version is: {})".format(current_version)
# todo(denniskempin): automatically increment x.x or x.x-rx version
new_version = AskUser.Text()
if not new_version:
exit(-1)
binaries = [FirmwareBinary(b) for b in files]
tool.GenerateEbuildPackage(new_version, binaries,
args.clean_ebuild is not None)
else:
ExecuteCommonCommands(args, tool)
if __name__ == '__main__':
main()