keywords:init、recovery服务、bootloader、bootloader_message、BCB(bootloader control block)
0:备注
重启进入recovery模式方式 1,misc分区BCB结构 2,PMIC寄存器 3, 组合键
在init里自定义命令,然后在rc文件里使用。(builtins.cpp builtin_functions变量里自定义命令),属性触发自定义命令的执行。
recovery服务执行的命令即可以在misc分区BCB结构存储也可以存储在/cache/recovery/command文件,这两个地方对recovery服务都起作用。
1:misc分区BCB结构进入recovery模式
write_bootloader_message-->update_bootloader_message_in_struct进入recovery mode
2:misc分区进入FFBM模式
rc文件修改:
misc_link=$(ls -l /dev/block/bootdevice/by-name/misc)
real_path=${misc_link##*>}
setprop persist.vendor.mmi.misc_dev_path $real_path
on property:vendor.sys.boot_mode=ffbm
write ${persist.vendor.mmi.misc_dev_path} "ffbm-01"
3:reboot bootloader使用misc分区进入bootloader(fastboot)
sys.powerctl 属性触发 HandlePowerctlMessage
-->write_reboot_bootloader
-->write_bootloader_message
-->write_misc_partition 写BCB结构到misc分区
4:应用设置重启到recovery/reboot recovery/reboot edl 流程
入口都是触发sys.powerctl属性。
init模块
HandlePowerctlMessage-->
DoReboot-->
RebootSystem-->
syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
LINUX_REBOOT_CMD_RESTART2, rebootTarget.c_str());
内核空间,系统调用reboot-->
kernel_restart(kernel/reboot.c)-->
machine_restart(arch/arm64/kernel/process.c)-->
arm_pm_restart函数指针 指向 do_msm_restart(msm-poweroff.c)-->
do_msm_restart-->
msm_restart_prepare
从msm_restart_prepare函数代码可知:把restart_reason写入到PMIC的寄存器中,bootloader读入寄存器值就获取boot mode。
if (cmd != NULL) {
if (!strncmp(cmd, "bootloader", 10)) {
qpnp_pon_set_restart_reason(
PON_RESTART_REASON_BOOTLOADER);
__raw_writel(0x77665500, restart_reason);
} else if (!strncmp(cmd, "recovery", 8)) {
qpnp_pon_set_restart_reason(
PON_RESTART_REASON_RECOVERY);
__raw_writel(0x77665502, restart_reason);
} else if (!strcmp(cmd, "rtc")) {
qpnp_pon_set_restart_reason(
PON_RESTART_REASON_RTC);
__raw_writel(0x77665503, restart_reason);
} else if (!strcmp(cmd, "dm-verity device corrupted")) {
qpnp_pon_set_restart_reason(
PON_RESTART_REASON_DMVERITY_CORRUPTED);
__raw_writel(0x77665508, restart_reason);