zoukankan      html  css  js  c++  java
  • 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);
    
  • 相关阅读:
    mysql安装
    Apache 403 错误解决方法-让别人可以访问你的服务器
    windows安装xampp时出现,unable to realloc xxxxxxxx bytes
    spring-mvc整合jquery cropper图片裁剪插件
    Android 贝塞尔曲线
    Android 桌面生成快捷方式
    Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to “*****”
    Android TextView 字符串展示不同大小文字
    Android 6.0权限问题
    Android 部分机型GridView四周默认间距
  • 原文地址:https://www.cnblogs.com/bobfly1984/p/14091247.html
Copyright © 2011-2022 走看看