Loading Android.bp +24 −0 Original line number Original line Diff line number Diff line Loading @@ -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", Loading Loading @@ -125,6 +148,7 @@ cc_defaults { ], ], static_libs: [ static_libs: [ "librecovery_fastboot", "libminui", "libminui", "libverifier", "libverifier", "libotautil", "libotautil", Loading device.cpp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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 }, Loading device.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -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); Loading etc/init.rc +84 −19 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading @@ -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
Android.bp +24 −0 Original line number Original line Diff line number Diff line Loading @@ -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", Loading Loading @@ -125,6 +148,7 @@ cc_defaults { ], ], static_libs: [ static_libs: [ "librecovery_fastboot", "libminui", "libminui", "libverifier", "libverifier", "libotautil", "libotautil", Loading
device.cpp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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 }, Loading
device.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -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); Loading
etc/init.rc +84 −19 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading @@ -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; }