diff --git a/README.md b/README.md index 63c1b70..fd8d435 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ Please note that the boot.img MUST follows AOSP verified boot flow, either [Boot | Device Model | Manufacturer | Compatible | Android Version | Note | |--------------------------------|--------------|----------------------|--------------------------|------| +| ADT-3 (adt3) | Askey/Google | Y | 12 (spp2.210219.010) | amlogic inside,
Android TV | | Pixel 3 (blueline) | Google | Y | 12 (spp2.210219.008,
2021)| | | Pixel 3 (blueline) | Google | Y | 11 (RP1A.200720.009,
2020)| [more ...](doc/additional_tricks.md#pixel-3-blueline) | | Pixel 3 (blueline) | Google | Y | Q preview (qpp2.190228.023,
2019)| [more ...](doc/additional_tricks.md#pixel-3-blueline) | diff --git a/bbootimg/src/main/kotlin/bootloader_message/BootloaderMsg.kt b/bbootimg/src/main/kotlin/bootloader_message/BootloaderMsg.kt index 4d4a279..70c728b 100644 --- a/bbootimg/src/main/kotlin/bootloader_message/BootloaderMsg.kt +++ b/bbootimg/src/main/kotlin/bootloader_message/BootloaderMsg.kt @@ -112,6 +112,9 @@ data class BootloaderMsg(//offset 0, size 2k } } + /* + https://android-review.googlesource.com/c/platform/bootable/recovery/+/735984 + */ fun updateBootFastboot() { this.command = "boot-fastboot" this.recovery = "" diff --git a/bbootimg/src/main/kotlin/init/Reboot.kt b/bbootimg/src/main/kotlin/init/Reboot.kt index f21b7c4..7001931 100644 --- a/bbootimg/src/main/kotlin/init/Reboot.kt +++ b/bbootimg/src/main/kotlin/init/Reboot.kt @@ -42,7 +42,7 @@ class Reboot { val args = inValue.split(",").toTypedArray() var cmd: String var rebootTarget = "" - if (args.size > 3) { + if (args.size > 4) { throw java.lang.IllegalArgumentException("powerctl: unrecognized command $args") } when (args[0]) { @@ -89,15 +89,17 @@ class Reboot { } "sideload", "sideload-auto-reboot" -> { BootloaderMsg().writeBootloaderMessage( - arrayOf("--" + rebootTarget.replace("-", "_"))) + arrayOf("--" + rebootTarget.replace("-", "_")) + ) rebootTarget = "recovery" } else -> { } }//end-of-when-rebootTarget - if (args.size == 3 && args[2].isNotBlank()) { - log.info("rebootTarget: append " + args[2]) - rebootTarget += ("," + args[2]) + + for (i in 2 until args.size) { + log.info("rebootTarget: append " + args[i]) + rebootTarget += ("," + args[i]) } }//end-of-cmd }//end-of-cmd=reboot diff --git a/bbootimg/src/test/kotlin/init/RebootTest.kt b/bbootimg/src/test/kotlin/init/RebootTest.kt index 3034d34..5d79513 100644 --- a/bbootimg/src/test/kotlin/init/RebootTest.kt +++ b/bbootimg/src/test/kotlin/init/RebootTest.kt @@ -7,9 +7,12 @@ import java.util.* import cfig.bootloader_message.BootloaderMsg import cfig.init.Reboot import cfig.bootimg.Common.Companion.deleleIfExists +import org.slf4j.LoggerFactory @OptIn(ExperimentalUnsignedTypes::class) class RebootTest { + private val log = LoggerFactory.getLogger(RebootTest::class.java) + @After fun tearDown() { File(BootloaderMsg.miscFile).deleleIfExists() @@ -17,18 +20,44 @@ class RebootTest { @Test fun testDifferentModes() { - Reboot.handlePowerctlMessage("reboot,recovery") Reboot.handlePowerctlMessage("reboot") Reboot.handlePowerctlMessage("reboot,safemode") Reboot.handlePowerctlMessage("reboot,dynsystem") - Reboot.handlePowerctlMessage("reboot,quiescent") + Reboot.handlePowerctlMessage("reboot,cold") + Reboot.handlePowerctlMessage("reboot,ota") + Reboot.handlePowerctlMessage("reboot,factory_reset") + Reboot.handlePowerctlMessage("reboot,shell") + Reboot.handlePowerctlMessage("reboot,adb") + Reboot.handlePowerctlMessage("reboot,userrequested") + Reboot.handlePowerctlMessage("reboot,rescueparty") + Reboot.handlePowerctlMessage("reboot,powerloss") + Reboot.handlePowerctlMessage("reboot,undervoltage") + Reboot.handlePowerctlMessage("reboot,tool") //151 + Reboot.handlePowerctlMessage("reboot,wdt") //152 + Reboot.handlePowerctlMessage("reboot,unknown") //153 + + Reboot.handlePowerctlMessage("reboot,quiescent") //170 + Reboot.handlePowerctlMessage("reboot,rtc") //171 + Reboot.handlePowerctlMessage("reboot,dm-verity_device_corrupted") //172 + Reboot.handlePowerctlMessage("reboot,dm-verity_enforcing") //173 + + Reboot.handlePowerctlMessage("reboot,userrequested,fastboot") //178 + Reboot.handlePowerctlMessage("reboot,userrequested,recovery") //179 + Reboot.handlePowerctlMessage("reboot,userrequested,recovery,ui") //180 } @Test fun shutdown() { + Reboot.handlePowerctlMessage("shutdown") Reboot.handlePowerctlMessage("shutdown,userrequested") Reboot.handlePowerctlMessage("shutdown,thermal") + Reboot.handlePowerctlMessage("shutdown,battery") + Reboot.handlePowerctlMessage("shutdown,container") Reboot.handlePowerctlMessage("shutdown,thermal,battery") + Reboot.handlePowerctlMessage("shutdown,suspend") // Suspend to RAM + Reboot.handlePowerctlMessage("shutdown,hibernate") // Suspend to DISK + Reboot.handlePowerctlMessage("shutdown,userrequested,fastboot") + Reboot.handlePowerctlMessage("shutdown,userrequested,recovery") } @Test @@ -37,35 +66,42 @@ class RebootTest { } @Test - fun fastboot2bootloader() { - val props = Properties() - Reboot.handlePowerctlMessage("reboot,fastboot", props) + fun fastbootd() { + log.info("fastbootd test 1") + Reboot.handlePowerctlMessage("reboot,fastboot", + Properties().apply { + put(Reboot.dynamicPartitionKey, "true") + }) + log.info("fastbootd test 2") + BootloaderMsg().let { + it.updateBootloaderMessage("boot-fastboot", "recovery", null) + it.writeBootloaderMessage() + } + log.info("fastbootd test 3: not supported, change to bootloader") + Reboot.handlePowerctlMessage("reboot,fastboot", Properties()) } @Test - fun fastbootd() { - val props = Properties() - props.put(Reboot.dynamicPartitionKey, "true") - Reboot.handlePowerctlMessage("reboot,fastboot", props) + fun recovery() { + log.info("recovery test 1") + Reboot.handlePowerctlMessage("reboot,recovery") } @Test - fun fastbootd2() { - val msg = BootloaderMsg() - msg.updateBootloaderMessage("boot-fastboot", "recovery", null) - msg.writeBootloaderMessage() + fun recovery_rescue() { + log.info("recovery test 1: rescue") + BootloaderMsg().let { + it.updateBootloaderMessage("boot-rescue", "recovery", null) + it.writeBootloaderMessage() + } + log.info("recovery test 2: rescue") + Reboot.handlePowerctlMessage("reboot,rescue") } @Test - fun sideload() { + fun recovery_sideload() { + log.info("recovery test 3: sideload") Reboot.handlePowerctlMessage("reboot,sideload-auto-reboot") Reboot.handlePowerctlMessage("reboot,sideload") } - - @Test - fun rescue() { - val msg = BootloaderMsg() - msg.updateBootloaderMessage("boot-rescue", "recovery", null) - msg.writeBootloaderMessage() - } } diff --git a/src/resources/reboot.puml b/src/resources/reboot.puml new file mode 100644 index 0000000..2c52938 --- /dev/null +++ b/src/resources/reboot.puml @@ -0,0 +1,17 @@ +@startuml +'comment + +autonumber + +participant "system/core/reboot/reboot.c" as reboot_c +participant "init/reboot.cpp" as init_reboot +participant "init/reboot_utils.cpp" as init_reboot_utils +entity "kernel/reboot.c" as kernel + +reboot_c -> init_reboot : property_set()\nargs="sys.powerctl",\n "reboot,recovery" +note left: reboot recovery +init_reboot -> init_reboot_utils: HandlePowerctlMessage()\nargs="reboot,recovery" +init_reboot_utils -> kernel: RebootSystem(cmd, rebootTarget) +init_reboot_utils -> kernel: syscall(__NR_reboot,\n LINUX_REBOOT_MAGIC1,\n LINUX_REBOOT_MAGIC2,\n LINUX_REBOOT_CMD_RESTART2,\n rebootTarget.c_str()) +note right: void kernel_restart(rebootTarget) +@enduml diff --git a/src/resources/shutdown.puml b/src/resources/shutdown.puml new file mode 100644 index 0000000..1a41e95 --- /dev/null +++ b/src/resources/shutdown.puml @@ -0,0 +1,20 @@ +@startuml +'comment + +autonumber + +participant "system/core/reboot/reboot.c" as reboot_c +participant "init/reboot.cpp" as init_reboot +participant "init/reboot_utils.cpp" as init_reboot_utils +participant "bionic/libc/bionic/reboot.cpp" as bionic_reboot +entity "kernel/reboot.c" as kernel + +reboot_c -> init_reboot : property_set()\nargs="sys.powerctl","shutdown,tired" +note left: reboot -p tired +init_reboot -> init_reboot_utils: HandlePowerctlMessage()\nargs="shutdown,tired" +init_reboot_utils -> bionic_reboot: RebootSystem() +init_reboot_utils -> bionic_reboot: reboot(RB_POWER_OFF) +bionic_reboot -> kernel: reboot()\nmode=LINUX_REBOOT_CMD_POWER_OFF +bionic_reboot -> kernel: __reboot()\n args=(LINUX_REBOOT_MAGIC1,\n LINUX_REBOOT_MAGIC2,\n mode, nullptr) +note right: kernel_power_off() +@enduml