avatar Nihil

Nichts Hsu

  • 首页
  • 子域
  • 分类
  • 标签
  • 归档
  • 关于
首页 高通平台自定义按键进入 fastboot/recovery/edl 模式
文章

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

发表于 2022/05/16 更新于 2022/11/29
作者 Nichts Hsu
2 分钟阅读
高通平台自定义按键进入 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
power SCAN_SUSPEND
教程, Android
android qualcomm
本文由作者按照 CC BY 4.0 进行授权
分享

最近更新

  • 『I Wanna』 Best Bye To 2016
  • [译] Rust 中的内联
  • [Rust] 幽灵索引类型与匿名结构体
  • [C++] 深入了解左值与右值
  • Android.bp 中启用 openmp
外部链接
  • 996.icu
  •  此博客的 Github 仓库
  •  Olimi 的个人博客

文章内容

相关文章

2023/10/16

Android.bp 中启用 openmp

在找到正确答案之前,我尝试了许多方法,例如: 1 2 3 4 5 cc_binary { shared_libs: [ "libopenmp", ], } 又或者: 1 2 3 4 5 cc_binary { cppflags: [ "-fopenmp" ], } 但是毫无例外地都失败了,以至于在很长一段时间内我都以...

2022/11/28

Android C++ 生成 compile_commands.json

Android C++ 程序开发现状 在 Android 下开发 C++ 程序,我见过绝大多数人都是不使用任何语法插件,就靠硬写,写完之后再根据编译报错来修改语法错误。这也怪不得程序员,一方面,Android 使用 Arm 平台的 clang 编译器,跟 x86 平台的开发环境并不是很兼容;另一方面,Android 要求我们将 C++ 程序放在 vendor 目录下,但是我们包含的头文件却...

2022/06/10

USB redriver: NB7VPQ904M 浅析

器件介绍 NB7VPQ904M 是一颗由 onsemi 的子公司 Semiconductor Components Industries, LLC 生产的 USB redriver 器件,其官方介绍是: 1.8V USB Type-C™ DisplayPort™ ALT Mode 10Gbps Linear Redriver 我们来逐字解析: 1.8V 指器件所需的供电电压; ...

[译] 并不总是 iCache

USB redriver: NB7VPQ904M 浅析

© 2024 Nichts Hsu. 保留部分权利。

本站采用 Jekyll 主题 Chirpy

热门标签

编程语言 教程 rust c++ android c++20 usb 翻译 linux qt

发现新版本的内容。