doc: ADT3 on Android S is compatible

also add reboot/shutdown flow
pull/66/head
cfig 4 years ago
parent 8a42f31167
commit 82c614a8f1
No known key found for this signature in database
GPG Key ID: B104C307F0FDABB7

@ -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, <Br>Android TV |
| Pixel 3 (blueline) | Google | Y | 12 (spp2.210219.008, <Br>2021)| |
| Pixel 3 (blueline) | Google | Y | 11 (RP1A.200720.009, <Br>2020)| [more ...](doc/additional_tricks.md#pixel-3-blueline) |
| Pixel 3 (blueline) | Google | Y | Q preview (qpp2.190228.023, <Br>2019)| [more ...](doc/additional_tricks.md#pixel-3-blueline) |

@ -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 = ""

@ -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

@ -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()
}
}

@ -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

@ -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
Loading…
Cancel
Save