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);
