首页 高通平台自定义按键进入 fastboot/recovery/edl 模式
文章
取消

高通平台自定义按键进入 fastboot/recovery/edl 模式

在大多数高通平台上,默认都提供以下的按键功能:

  1. 按住 vol+ 键开机,进入 recovery 模式。
  2. 按住 vol- 键开机,进入 fastboot 模式。
  3. 按住 vol+ 键及 vol- 键开机,进入 edl(Emergency Download)模式。

根据平台的不同,主要分为两种情况:使用 lk2nd 的高通平台以及使用 edk2 的高通平台。

使用 lk2nd 的平台

其源码位于 bootable/bootloader/lk/app/aboot/aboot.c 中。我们以 msm8916 平台的 lk2nd 为例,在 aboot.c 的 3967~3988 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 此处检测 vol+ 和 vol- 是否一起按下
if (keys_get_state(KEY_VOLUMEUP) && keys_get_state(KEY_VOLUMEDOWN))
{
    dprintf(ALWAYS,"dload mode key sequence detected\n");
    // 进入 edl 模式
    if (set_download_mode(EMERGENCY_DLOAD))
    {
        dprintf(CRITICAL,"dload mode not supported by target\n");
    }
    else
    {
        reboot_device(DLOAD);
        dprintf(CRITICAL,"Failed to reboot into dload mode\n");
    }
    boot_into_fastboot = true;
}
if (!boot_into_fastboot)
{
    // 检测 vol+,进入 recovery 模式
    if (keys_get_state(KEY_VOLUMEUP))
        boot_into_recovery = 1;
    // 检测 home/back/vol-,进入 fastboot 模式
    if (!boot_into_recovery &&
        (keys_get_state(KEY_HOME) || keys_get_state(KEY_BACK) || keys_get_state(KEY_VOLUMEDOWN)))
        boot_into_fastboot = true;
}

使用 edk2 的平台

其源代码位于 bootable/bootloader/edk2/QcomModulePkg/Application/LinuxLoader/LinuxLoader.c 中。在该文件的 222 行到 227 行

1
2
3
4
5
6
if ((KeyPressed == SCAN_DOWN) || (KeyPressed == SCAN_DELETE))
    BootIntoRecovery = TRUE;
if ((KeyPressed == SCAN_UP) || (KeyPressed == SCAN_HOME))
    BootIntoFastboot = TRUE;
if (KeyPressed == SCAN_ESC)
    RebootDevice (EMERGENCY_DLOAD);

其中,SCAN_UP, SCAN_DOWN, SCAN_DELETE, SCAN_HOME, SCAN_ESC 等是 EFI Scan Codes,跟实际按键的绑定位于高通 BP 代码中。由于高通的保密性原则,我无法在此处贴出具体的代码。对于同样有高通 BP 代码访问权限的读者,请在 boot_images 下寻找 ButtonsLib,在代码中搜索上述 EFI Scan Codes 就能找到对应的代码;对于不具有高通 BP 代码访问权限的读者,这里列举出所有绑定关系:

按键EFI Scan Code
vol+SCAN_UP
vol-SCAN_DOWN
vol+ + vol-SCAN_ESC
cam + vol+SCAN_HOME
cam + vol-SCAN_DELETE
power + vol+SCAN_HOME
power + vol-SCAN_DELETE
powerSCAN_SUSPEND
本文由作者按照 CC BY 4.0 进行授权

[译] 并不总是 iCache

USB redriver: NB7VPQ904M 浅析