Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 19a53164 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Add fastboot mode to recovery"

parents ce2f0d85 20c81b30
Loading
Loading
Loading
Loading
+24 −0
Original line number Original line Diff line number Diff line
@@ -96,6 +96,29 @@ cc_library_static {
    ],
    ],
}
}


cc_library_static {
    name: "librecovery_fastboot",
    recovery_available: true,
    defaults: [
        "recovery_defaults",
    ],

    srcs: [
        "fastboot/fastboot.cpp",
    ],

    shared_libs: [
        "libbase",
        "libbootloader_message",
        "libcutils",
        "liblog",
    ],

    static_libs: [
        "librecovery_ui_default",
    ],
}

cc_defaults {
cc_defaults {
    name: "librecovery_defaults",
    name: "librecovery_defaults",


@@ -125,6 +148,7 @@ cc_defaults {
    ],
    ],


    static_libs: [
    static_libs: [
        "librecovery_fastboot",
        "libminui",
        "libminui",
        "libverifier",
        "libverifier",
        "libotautil",
        "libotautil",
+1 −0
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@
static std::vector<std::pair<std::string, Device::BuiltinAction>> g_menu_actions{
static std::vector<std::pair<std::string, Device::BuiltinAction>> g_menu_actions{
  { "Reboot system now", Device::REBOOT },
  { "Reboot system now", Device::REBOOT },
  { "Reboot to bootloader", Device::REBOOT_BOOTLOADER },
  { "Reboot to bootloader", Device::REBOOT_BOOTLOADER },
  { "Enter fastboot", Device::ENTER_FASTBOOT },
  { "Apply update from ADB", Device::APPLY_ADB_SIDELOAD },
  { "Apply update from ADB", Device::APPLY_ADB_SIDELOAD },
  { "Apply update from SD card", Device::APPLY_SDCARD },
  { "Apply update from SD card", Device::APPLY_SDCARD },
  { "Wipe data/factory reset", Device::WIPE_DATA },
  { "Wipe data/factory reset", Device::WIPE_DATA },
+2 −0
Original line number Original line Diff line number Diff line
@@ -48,6 +48,8 @@ class Device {
    RUN_GRAPHICS_TEST = 11,
    RUN_GRAPHICS_TEST = 11,
    RUN_LOCALE_TEST = 12,
    RUN_LOCALE_TEST = 12,
    KEY_INTERRUPTED = 13,
    KEY_INTERRUPTED = 13,
    ENTER_FASTBOOT = 14,
    ENTER_RECOVERY = 15,
  };
  };


  explicit Device(RecoveryUI* ui);
  explicit Device(RecoveryUI* ui);
+84 −19
Original line number Original line Diff line number Diff line
@@ -6,6 +6,8 @@ on early-init


    start ueventd
    start ueventd


    setprop sys.usb.configfs 0

on init
on init
    export ANDROID_ROOT /system
    export ANDROID_ROOT /system
    export ANDROID_DATA /data
    export ANDROID_DATA /data
@@ -31,20 +33,6 @@ on init
    write /proc/sys/kernel/panic_on_oops 1
    write /proc/sys/kernel/panic_on_oops 1
    write /proc/sys/vm/max_map_count 1000000
    write /proc/sys/vm/max_map_count 1000000


on fs
    write /sys/class/android_usb/android0/f_ffs/aliases adb
    mkdir /dev/usb-ffs 0770 shell shell
    mkdir /dev/usb-ffs/adb 0770 shell shell
    mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000

    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/idVendor 18D1
    write /sys/class/android_usb/android0/idProduct D001
    write /sys/class/android_usb/android0/functions adb
    write /sys/class/android_usb/android0/iManufacturer ${ro.product.manufacturer}
    write /sys/class/android_usb/android0/iProduct ${ro.product.model}
    write /sys/class/android_usb/android0/iSerial ${ro.serialno}

on boot
on boot
    ifup lo
    ifup lo
    hostname localhost
    hostname localhost
@@ -86,6 +74,7 @@ service charger /charger -r
    seclabel u:r:charger:s0
    seclabel u:r:charger:s0


service recovery /system/bin/recovery
service recovery /system/bin/recovery
    socket recovery stream 422 system system
    seclabel u:r:recovery:s0
    seclabel u:r:recovery:s0


service adbd /system/bin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery
service adbd /system/bin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery
@@ -93,13 +82,89 @@ service adbd /system/bin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery
    socket adbd stream 660 system system
    socket adbd stream 660 system system
    seclabel u:r:adbd:s0
    seclabel u:r:adbd:s0


# Always start adbd on userdebug and eng builds
service fastbootd /system/bin/fastbootd
on property:ro.debuggable=1
    disabled
    write /sys/class/android_usb/android0/enable 1
    group system
    start adbd
    seclabel u:r:fastbootd:s0


# Restart adbd so it can run as root
# Restart adbd so it can run as root
on property:service.adb.root=1
on property:service.adb.root=1
    write /sys/class/android_usb/android0/enable 0
    restart adbd
    restart adbd

# Always start adbd on userdebug and eng builds
on fs && property:ro.debuggable=1
    setprop sys.usb.config adb

on fs && property:sys.usb.configfs=1
    mount configfs none /config
    mkdir /config/usb_gadget/g1 0770 shell shell
    write /config/usb_gadget/g1/idVendor 0x18D1
    mkdir /config/usb_gadget/g1/strings/0x409 0770
    write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}
    write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer}
    write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model}
    mkdir /config/usb_gadget/g1/functions/ffs.adb
    mkdir /config/usb_gadget/g1/functions/ffs.fastboot
    mkdir /config/usb_gadget/g1/configs/b.1 0777 shell shell
    mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell

on fs && property:sys.usb.configfs=0
    write /sys/class/android_usb/android0/f_ffs/aliases adb,fastboot
    write /sys/class/android_usb/android0/idVendor 18D1
    write /sys/class/android_usb/android0/iManufacturer ${ro.product.manufacturer}
    write /sys/class/android_usb/android0/iProduct ${ro.product.model}
    write /sys/class/android_usb/android0/iSerial ${ro.serialno}

on fs
    mkdir /dev/usb-ffs 0775 shell shell
    mkdir /dev/usb-ffs/adb 0770 shell shell
    mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000
    mkdir /dev/usb-ffs/fastboot 0770 system system
    mount functionfs fastboot /dev/usb-ffs/fastboot rmode=0770,fmode=0660,uid=1000,gid=1000

on property:sys.usb.config=adb
    start adbd

on property:sys.usb.config=fastboot
    start fastbootd

on property:sys.usb.config=none
    stop adbd
    stop fastbootd

on property:sys.usb.config=none && property:sys.usb.configfs=0
    write /sys/class/android_usb/android0/enable 0
    setprop sys.usb.state ${sys.usb.config}

on property:sys.usb.config=adb && property:sys.usb.configfs=0
    write /sys/class/android_usb/android0/idProduct D001
    write /sys/class/android_usb/android0/functions adb
    write /sys/class/android_usb/android0/enable 1
    setprop sys.usb.state ${sys.usb.config}

on property:sys.usb.config=fastboot && property:sys.usb.configfs=0
    write /sys/class/android_usb/android0/idProduct 4EE0
    write /sys/class/android_usb/android0/functions fastboot
    write /sys/class/android_usb/android0/enable 1
    write /sys/class/android_usb/android0/enable 1
    setprop sys.usb.state ${sys.usb.config}

# Configfs triggers
on property:sys.usb.config=none && property:sys.usb.configfs=1
    write /config/usb_gadget/g1/UDC "none"
    setprop sys.usb.ffs.ready 0
    rm /config/usb_gadget/g1/configs/b.1/f1
    setprop sys.usb.state ${sys.usb.config}

on property:sys.usb.config=adb && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1
    write /config/usb_gadget/g1/idProduct 0xD001
    write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb"
    symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1
    write /config/usb_gadget/g1/UDC ${sys.usb.controller}
    setprop sys.usb.state ${sys.usb.config}

on property:sys.usb.config=fastboot && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1
    write /config/usb_gadget/g1/idProduct 0x4EE0
    write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "fastboot"
    symlink /config/usb_gadget/g1/functions/ffs.fastboot /config/usb_gadget/g1/configs/b.1/f1
    write /config/usb_gadget/g1/UDC ${sys.usb.controller}
    setprop sys.usb.state ${sys.usb.config}

fastboot/fastboot.cpp

0 → 100644
+82 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * 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.
 */

#include "fastboot.h"

#include <stdio.h>
#include <stdlib.h>

#include <algorithm>
#include <string>
#include <vector>

#include <android-base/logging.h>
#include <android-base/properties.h>
#include <bootloader_message/bootloader_message.h>

#include "device.h"
#include "ui.h"

static const std::vector<std::pair<std::string, Device::BuiltinAction>> kFastbootMenuActions{
  { "Reboot system now", Device::REBOOT },
  { "Enter recovery", Device::ENTER_RECOVERY },
  { "Reboot to bootloader", Device::REBOOT_BOOTLOADER },
  { "Power off", Device::SHUTDOWN },
};

Device::BuiltinAction StartFastboot(Device* device, const std::vector<std::string>& /* args */) {
  RecoveryUI* ui = device->GetUI();

  std::vector<std::string> title_lines = { "Android Fastboot" };
  title_lines.push_back("Product name - " + android::base::GetProperty("ro.product.device", ""));
  title_lines.push_back("Bootloader version - " + android::base::GetProperty("ro.bootloader", ""));
  title_lines.push_back("Baseband version - " +
                        android::base::GetProperty("ro.build.expect.baseband", ""));
  title_lines.push_back("Serial number - " + android::base::GetProperty("ro.serialno", ""));
  title_lines.push_back(std::string("Secure boot - ") +
                        ((android::base::GetProperty("ro.secure", "") == "1") ? "yes" : "no"));
  title_lines.push_back("HW version - " + android::base::GetProperty("ro.revision", ""));

  ui->ResetKeyInterruptStatus();
  ui->SetTitle(title_lines);
  ui->ShowText(true);

  // Reset to normal system boot so recovery won't cycle indefinitely.
  // TODO(b/112277594) Clear only if 'recovery' field of BCB is empty. If not,
  // set the 'command' field of BCB to 'boot-recovery' so the next boot is into recovery
  // to finish any interrupted tasks.
  std::string err;
  if (!clear_bootloader_message(&err)) {
    LOG(ERROR) << "Failed to clear BCB message: " << err;
  }

  std::vector<std::string> fastboot_menu_items;
  std::transform(kFastbootMenuActions.cbegin(), kFastbootMenuActions.cend(),
                 std::back_inserter(fastboot_menu_items),
                 [](const auto& entry) { return entry.first; });

  auto chosen_item = ui->ShowMenu(
      {}, fastboot_menu_items, 0, false,
      std::bind(&Device::HandleMenuKey, device, std::placeholders::_1, std::placeholders::_2));

  if (chosen_item == static_cast<size_t>(RecoveryUI::KeyError::INTERRUPTED)) {
    return Device::KEY_INTERRUPTED;
  }
  if (chosen_item == static_cast<size_t>(RecoveryUI::KeyError::TIMED_OUT)) {
    return Device::BuiltinAction::NO_ACTION;
  }
  return kFastbootMenuActions[chosen_item].second;
}
Loading