android&uboot reset流程

1、模式解析流程:

frameworks/base/core/java/android/os/PowerManager.java

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

把reason存储到SystemProperties,最后调用ShutdownThread带着reason传参

frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java

这个类中主要是根据一些条件做了一些单独处理,例如recovery等可能还会展示弹窗

SystemProperties.set(“sys.powerctl”, “reboot,” + reason),这里很重要。静默重启会把这个值存储到内核特定的启动参数,这个启动参数在下次重启时会被系统拿到。这里内部就涉及SystemProperties原理和源代码了

同时,内核还会解析reason,存储另一个SystemProperties;大概的流程是lk 中读到 rtc 的 Quiescent 标志位,则不显示开机logo,并且在 cmdline 中添加 androidboot.quiescent=1;lk -> kernel -> init,init 会解析 cmdline,并把其中的 androidboot.quiescent=1 解析出来,并设置成 ro.boot.quiescent=1,这样后续 Android 所有地方都能知道此次是 quiescent 开机

Sys.Powerctl

平台reboot_mode寄存器配置:

bsp/bootloader/u-boot15/arch/arm/include/asm/xxxx/check_reboot.h

Reboot mode各模式定义:

bsp/bootloader/u-boot15/include/boot_mode.h

平台各模式注册:

bsp/bootloader/u-boot15/board/xxx/xxx.c

从寄存器或者pmic RTC中获取各模式位和进入,记录mode到cmdline,check_mode驱动:

bsp/bootloader/u-boot15/drivers/misc/check_reboot.c

reboot时进入的模式:

bsp/bootloader/u-boot15/common/cmd_cboot.c

各模式函数代码:

bsp/bootloader/u-boot15/common/loader/boot_mode.c

2、reboot流程:

system/core/bootstat/bootstat.cpp

system/core/libcutils/include/cutils/android_reboot.h

system/core/reboot/reboot.c: property_set HandlePowerctlMessage DoReboot RebootSystem

system/core/init/reboot_utils.cpp :

RebootSystem 通过 syscall 系统调用转到内核层

由syscall到内核层之后调用的第一个函数是 SYSCALL_DEFINE4:

第一个参数为函数名后缀,如上图,则这个定义的函数名字为SyS_reboot。

第二个,第三个一起看,为类型加变量名。

可以发现一共有4组类型加变量名的 变量。所以DEFINE4 中的数字4就代表SyS_reboot有4个参数

首先对应用层中syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,

LINUX_REBOOT_CMD_RESTART2, rebootTarget.c_str());传递进来的参数进行分析,判断校验,一些reboot命令没有重启,有可能这里解析错误

然后调用 kernel_restart 去做kernel的重启:

bsp/kernel/kernel4.14/kernel/reboot.c

这里去处理reboot原因:

bsp/kernel/kernel5.4/drivers/spi/spi-sprd-adi.c

sprd_adi_restart_handler

这里调用do_kernel_restart做系统复位,里面做的是发送一个通知,通知各个通过register_restart_handler注册的钩子函数,执行这个关机函数,最后我发现在我系统中是使用看门狗复位来实现重启的 bsp/kernel/kernel5.4/drivers/watchdog/watchdog_core.c

对watchdog函数做溢出写入触发restart

220 static const struct watchdog_ops wdt_ops = {
221 .owner = THIS_MODULE,
222 .start = wdt_enable,
223 .stop = wdt_disable,
224 .ping = wdt_ping,
225 .set_timeout = wdt_setload,
226 .get_timeleft = wdt_timeleft,
227 .restart = wdt_restart,
228 };

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 9.0系统的U-Boot Logo加载流程如下: 首先,当设备上电时,启动引导加载程序(Bootloader)会运行。U-Boot作为一个常用的开源Bootloader,被广泛用于Android设备。然后,U-Boot开始执行它的初始化代码,包括初始化硬件、加载环境变量和配置等。 接下来,U-Boot开始加载Logo图像。在Android 9.0中,U-Boot会在启动过程的早期加载Logo图像,并在屏幕上显示。为了加载Logo图像,U-Boot需要的一些文件和配置如下: 1. Logo图像文件:通常是一个BMP格式的图片文件,作为设备启动时显示的Logo图像。这个文件会包含Logo图像的像素数据和相关的图像信息。 2. U-Boot配置文件:U-Boot需要通过一个配置文件来指定Logo图像的位置和属性。这个配置文件通常存储在设备的存储器中,如NAND Flash或eMMC闪存中。 3. 屏幕显示驱动:U-Boot还需要适配设备的屏幕显示驱动,以确保Logo图像可以正确显示在设备屏幕上。这包括配置屏幕分辨率、颜色深度等参数。 一旦U-Boot完成初始化和加载Logo图像所需的文件和配置,它会通过屏幕显示驱动将Logo图像显示在设备的屏幕上。Logo图像会持续显示一段时间,直到系统完成启动过程,然后才会被系统界面替换。 总结起来,Android 9.0的U-Boot Logo加载流程主要包括启动引导加载程序的初始化、配置加载、图像文件加载和屏幕显示等步骤。这样做的目的是为了在设备启动过程中提供一个包含品牌标识或其他相关信息的界面,以增强用户体验和品牌识别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值