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