简要说明实现逻辑:开机common(即常说的kernel目录,amlogic是common目录)中通过长按reset键(例如5s)来识别设置reboot mode 模式(通过meson_common_restart函数传参cmd,例如cmd设置为reboot_clear,当识别到cmd参数为reboot_clear时设置reboot_reason的属性值为MESONGXBB_FACTORY_RESET_REBOOT,然后去设置对应的寄存器,让系统重启的时候进入对应的模式即可,例如),
66 static u32 parse_reason(const char *cmd)
67 {
68 u32 reboot_reason;
69 reboot_reason = MESONGXBB_NORMAL_BOOT;
70 if (cmd) {
71 if (strcmp(cmd, "recovery") == 0 ||
72 strcmp(cmd, "factory_reset") == 0)
73 reboot_reason = MESONGXBB_FACTORY_RESET_REBOOT;
74 else if (strcmp(cmd, "update") == 0)
75 reboot_reason = MESONGXBB_UPDATE_REBOOT;
76 else if (strcmp(cmd, "fastboot") == 0)
77 reboot_reason = MESONGXBB_FASTBOOT_REBOOT;
78 else if (strcmp(cmd, "bootloader") == 0)
79 reboot_reason = MESONGXBB_BOOTLOADER_REBOOT;
80 else if (strcmp(cmd, "report_crash") == 0)
81 reboot_reason = MESONGXBB_CRASH_REBOOT;
82 else if (strcmp(cmd, "uboot_suspend") == 0)
83 reboot_reason = MESONGXBB_UBOOT_SUSPEND;
84 #ifdef CONFIG_FACTORY_RESET
85 else if (strcmp(cmd, "reboot_clear") == 0)
86 reboot_reason = MESONGXBB_FACTORY_RESET_REBOOT;
87 #endif
说白了就是通过往reboot_reason赋值一个对应的字符串例如reboot_clear,然后,uboot中通过 get_rebootmode 来识别reboot模式. 如果是factory reset reboot,就设置环境变量wipe_data_gt = wipe_data_gt, 然后环境变量wipe_data_gt通过system.prop桥接(在recovery模式的时候在根目录的default.prop文件中,在正常启动的时候在build.prop目录),recovery通过get_bootloader_env读取环境变量wipe_data_gt 的属性,然后设置clear_data标志位,clear_data为true的时候就直接执行清除数据和缓存操作,然后重启设备,clear_data如果是false的时候则进入recovery界面,执行循环等待函数prompt_and_wait,等待用户的操作进入下一步。