recovery misc分区

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);
原文地址:https://www.cnblogs.com/bobfly1984/p/14091247.html