我的NPI项目之设备系统启动(九) -- 高通平台启动阶段和功能详解

news2024/11/18 16:29:11

接触到一个新的平台最终要的一件事莫过于搞清楚如何boot起系统,那就要弄清楚系统开机各阶段的具体工作内容。这里最好的指导就是高通的启动guide。

对于系统的镜像和启动阶段我已经做了简单的介绍,详见:

镜像和启动阶段的说明

那今天我就以电源为例,简单的跟一下系统启动多个阶段的主要内容。从高通的文档可以看到,大部分平台,启动阶段分为PBL,XBL_SC(SBL),UEFI(XBL core, ABL), Kernel, Android ,这几个阶段(XBL 现在又被叫做 eXtended Boot Loader, ABL 叫做 application Bootloader或者aboot,加载boot.img,并启动linux kernel进而启动用户操作系统),这些阶段和镜像并不是一一对应的。一图胜千言,code boot flow明确定义了代码执行的物理器件:

代码的运行物理环境分别未:ROM,IMEM(TME internal memory/主要是进行校验的,确保进镜像的完整性和安全性),DDR。所涉及的阶段定义和工作大致作用如下:

PBL

Primary boot loader.是在soc的集成rom上运行,主要作用是进行自检。出厂自带,无code,无镜像。

XBL_SC

eXtensible boot loader system controller.

        有个比较核心的内容:XBL SC – The boot loader loads the XBL config settings image from the storage。xbl_config.elf 的主要内容:

应对xbl_sc的改动,UEFI、XBL RAM dump、XBL Device Tree Configurations有了单独分区或者文件。

有两处地方可以进行ODM的客制化,XBL Device Tree Configurations 或者UEFI中进行。针对,着两个地方,分别做说明:

 1. XBL Configure 和XBL Device Tree

The XBL DeviceTree feature supports the following DeviceTree blobs:
 pre_ddr-soc.dtb contains the configuration that is loaded before DDR is initialized
and is expected to be platform-independent (XBL SC).
 platform.dtb contains the DeviceTree configuration (XBL SC and UEFI). //进行产品配置

对应的device tree编译结果可以会被包含在xbl_config.elf中,xbl_config.elf可以被xbl_sc或者UEFI运行时使用。

那么,如何定制device tree,并且生成对应的配置节点,并打包到xbl_config.elf中? 

常言道,工欲善其事必先利其器。工具:编译脚本,高通 Android的整体编译都是依赖一套脚本。

而通常,QC会开发一套编译命令集,将我们需要的编译的规则统一,简单一个命令就可以解决问题。举个例子,amss的编译,只需要一个命令,就可以生成如下的目标文件:

aop.img          dsp.img          keymaster.img    shrm.img         xbl.img          
aop_config.img   featenabler.img  modem.img        tz.img           xbl_config.img   
cpucp.img        hyp.img          multiimgqti.img  uefi.img         xbl_ramdump.img  
devcfg.img       imagefv.img      qupfw.img        uefisecapp.img 

仔细观察代码,可以看到生成xbl_config.img的脚本位于modem目录下,一块WWAN的板子,核心是从 WWAN开始。

amss/MPSS.DE.3.1.1/modem_proc/core/boot/scripts/xblconfig/GenConfigImage.py..能看到最后是流转到了create_xbl_config.json. 文件中会明确告诉你,需要打包哪些配置文件(dtsi);

All XBL DeviceTree files and tools exist under one directory :

amss/BOOT.MXF.2.0/boot_images/boot/Settings/...

总结一下

4490平台在xbl中的改变和针对开机需要进行的必要修改:

  1. 高通提供了一套脚本,用于生成xbl_config.elf , 并且配置方法是投过dtsi进行
  2. 针对开机,能够进行的Device Tree修改内容主要涉及,SW/Hardware两个方面,细节内容如下:
    1. Boot-common software settings
      1. Settings\SW\Core\Boot\boot.dtsi
    2. PMIC hardware settigs
      1. 这个是硬件有关的设定,会在某个具体的soc目录下面,e.g:./Clarence/Core/PMIC/pmic.dtsi
      2. 有关reset定义:PM_WARM_RESET/PM_HARD_RESET/PM_SHUTDOWN/
    3. USB hardware settings
    4. GPIO hardware settings
    5. Storage hardware settings

硬件部分需要结合自己硬件选型进行。特别是一些需要开机阶段特殊设定的模块。

UEFI

这个阶段,就已经很接近要去加载boot.img,并进入linux kernel的执行阶段了。这个阶段主要涉及两个分区镜像uefi.elf 和abl.elf. 看下架构:

XBL Core

XBL core contains chipset-specific core protocols (drivers) and core applications(such as charging). XBL core is part of the non-HLOS boot_images code.

ABL

Abl(application bootloader) contains chipset-independent applications such as fastboot. ABL is part of the open source Linux Android source tree on Code Aurora Forum. ABL source is BSDlicensed.

Android bootloader,代码位于asop端,QcomModulePkg/Application/LinuxLoader/LinuxLoader.c

这里面可以进行有关内容的配置,例如,在命令行生成器中添加内核启动的不同参数。

LK(little kernel) device drivers are moved into the XBL core. Leveraging drivers from XBL core reduces code duplication. The Linux loader and fastboot functionality are refactored as stand-alone UEFI applications. Customers transitioning from LK need to ensure that their LK modifications are ported to XBL Core and ABL.

总结一下

UEFI一共有如下的几个阶段,UEFI的结束也就标志着Linux内核的开始。

  1. SEC (Pre-Pi //这是个什么概念?)阶段
    1. First UEFI code to execute 
    2. Setup MMU
    3. Parse platform config file
    4. Set up Hands off Blocks
    5. Decompress FW volume
    6. Load DXE core
    7. ./boot/QcomPkg/XBLCore/ModuleEntryPoint.S :CEntryPoint
  2. DXE阶段 Driver execution environment
    1. Load up drivers
    2. Using Apriori.
    3. ./boot/QcomPkg/XBLCore/Sec.c :LoadDxeCoreFromFv
  3. BDS阶段 Boot Device selection
    1. Check for Hotkey / BDS menu
    2. Enable platform security
    3. Bootloader processing
    4. ./boot/QcomPkg/Tools/sym.cmm : \\&ModName\AutoGen\ProcessModuleEntryPointList
  4. OS Loader阶段 LinuxLoader
    1. LinuxLoader launched
    2. ExitBootService called by LinuxLoader
    3. End of UEFI 
    4. Start of Kernel : LinuxLoader做为一个UEFI_APPLICATION 应用被加载,入口函数为LinuxLoaderEntry

Kernel

一切物理资源的管理者。

Android

我们的各种应用的依赖和基础,提供各种功能接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1521588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

树的初步了解及堆,堆的topk问题,堆排序

目录 前言 一:树 1.树的概念 2.树的基础概念知识 3.在树中孩子节点和父节点知一求一 4.树的表示方法 二:二叉树 1.二叉树的概念 2.二叉树的特性 3.满二叉树 4.完全二叉树 三:堆 1.堆的定义 2.堆的实现:数组实现…

牛客网-SQL大厂面试题-2.平均播放进度大于60%的视频类别

题目:平均播放进度大于60%的视频类别 DROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_user_video_log (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 自增ID,uid INT NOT NULL COMMENT 用户ID,video_id INT NOT NULL COMMENT 视频ID,start…

【小白刷leetcode】第15题

【小白刷leetcode】第15题 动手刷leetcode,正在准备蓝桥,但是本人算法能力一直是硬伤。。。所以做得一直很痛苦。但是不熟练的事情像练吉他一样,就需要慢速,多练。 题目描述 看这个题目,说实在看的不是很懂。索性我们直…

YOLOv9算法原理——使用可编程梯度信息学习想要学习的内容

前言 2023年1月发布YOLOv8正式版后,经过一年多的等待,YOLOv9终于面世了!YOLO是一种利用图像全局信息进行目标检测的系统。自从2015年Joseph Redmon、Ali Farhadi等人提出了第一代模型以来,该领域的研究者们已经对YOLO进行了多次更…

OceanBase4.2版本 Docker 体验

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

文件包含例子

一、常见的文件包含函数 php中常见的文件包含函数有以下四种: include() require() include_once() require()_once() include与require基本是相同的,除了错误处理方面: include(),只生成警告(E_WARNING)&#x…

Unity Live Capture 中实现面部捕捉同步模型动画

Unity Face Capture 是一个强大的工具,可以帮助你快速轻松地将真实人脸表情捕捉到数字模型中。在本文中,我们将介绍如何在 Unity Face Capture 中实现面部捕捉同步模型动画。 安装 |实时捕获 |4.0.0 (unity3d.com) 安装软件插件 安装 Live Capture 软件…

数据资产管理解决方案:构建高效、安全的数据生态体系

在数字化时代,数据已成为企业最重要的资产之一。然而,如何有效管理和利用这些数据资产,却是许多企业面临的难题。本文将详细介绍数据资产管理解决方案,帮助企业构建高效、安全的数据生态体系。 一、引言 在信息化浪潮的推动下&a…

为什么单线程的 Redis 能那么快?

大家好我是苏麟 , 给大家找一些好的文章看看 . 原文文章 : 03 高性能IO模型:为什么单线程Redis能那么快? (lianglianglee.com) Redis 为什么用单线程? 要更好地理解 Redis 为什么用单线程,我们就要先了解多线程的开销。 多线程的…

力扣hot100:416.分割等和子集(组合/动态规划/STL问题)

组合数问题 我们思考一下,如果要把数组分割成两个子集,并且两个子集的元素和相等,是否等价于在数组中寻找若干个数使之和等于所有数的一半?是的! 因此我们可以想到,两种方式: ①回溯的方式找到t…

基于SpringBoot+Vue交流和分享平台的设计与实现(源码+部署说明+演示视频+源码介绍)

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

Android Studio实现内容丰富的安卓宠物用品商店管理系统

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动。 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.系统公告 3.宠物社区(可发布宠物帖子&#…

如何将Git拉取项目后,将SSH验证方式修改为HTTPS?

首先在打开项目所在位置的Git BashGUI 查找当前的远程仓库URL: 打开终端或命令提示符,导航到你的项目目录,并使用以下命令查看当前配置的远程仓库URL: git remote -v这会显示如下格式的输出: origin gitgithub.com:用…

从政府工作报告探讨计算机行业的发展

从政府工作报告探计算机行业发展 政府工作报告作为政府工作的全面总结和未来规划,不仅反映了国家整体的发展态势,也为各行各业提供了发展的指引和参考。随着信息技术的快速发展,计算机行业已经成为推动经济社会发展的重要引擎之一。因此&…

什么是 KNIME Hub(2024)

什么是 KNIME Hub KNIME Hub 是一个中央存储库和协作平台,它是用来促进与 KNIME Analytics Platform(分析平台,AP)相关的工作流、节点、组件和扩展的共享和管理。它既充当工作流存储库又充当协作空间,使用户能够发现和利用可合并到其数据分析项目中的各种…

前端Prettier 插件的使用配置(详细)

各个参数代表的意思:printWidth:每行代码的最大长度限制。 tabWidth:选项用于控制制表符的宽度。 useTabs:指定是否使用制表符代替空格。 semi:指定是否在语句的末尾添加分号。 singleQuote:指定是否使用单引号或双引号…

控制学习_正弦波无刷直流力矩电机建模、控制带宽讨论与选择

无刷电机通过电子换向器实现定子的磁场旋转,去电刷后使用寿命大幅提升,是现在更流行的选择。三相无刷电机则是无刷电机中比较流行的一款。三相无刷电机的驱动方式有多种,最简单的被称为梯形波驱动、方波驱动或正弦波驱动。而正弦波驱动技术可…

Redis中的HyperLogLog以及HyperLogLog原理

大家在学习redis的过程中,除了String,list,hash,set,zset这五种基本的数据结构,一定还会接触到几种高级的数据结构,比如bitmap,geo, 还有今天我们要说的hyperloglog&…

【OJ】string类题目

个人主页 : zxctscl 如有转载请先通知 题目 1. 415字符串相加1.1 分析1.2 代码 2. 344反转字符串2.1 分析2.2 代码 3. HJ1字符串最后一个单词的长度3.1 分析3.2 代码 4. 387.字符串中的第一个唯一字符4.1 分析4.2 代码 5. 125验证回文串5.1 分析5.2 代码 1. 415字符…

ctf-web23

web23 substr substr:字符串截取;substr()函数可以用于字符串处理、数据清洗、数据挖掘等领域。 substr(abcdef,2,2)返回值cd PHP intval() 函数 ​编辑PHP 可用的函数 intval() 函数用于获取变量的整数值。 intval() 函数通过使用指定的进制 base 转换&…