UEFI(Unified extensible firmware interface)统一的可扩展固件接口,是一种详细描述类型接口的标准。

可扩展固件接口(Extensible Firmware Interface,EFI)是 Intel 为 PC 固件的体系结构、接口和服务提出的建议标准。其主要目的是为了提供一组在 OS 加载之前(启动前)在所有平台上一致的、正确指定的启动服务,被看做是有近20多年历史的 BIOS 的继任者。

既然UEFI是为了取代BIOS的,自然有他自己的优势。

BIOS是汇编实现的,采用的是16bit 实模式寻址方式,最大支持的内存只有1M,代码易读性以及实现的功能都受到限制,而且移植起来不方便。BIOS支持的最大磁盘空间不超过2TB。

UEFI克服了上述的所有缺点,采用C语言实现,分层,模块化设计,实现了CPU以及驱动的无关性。UEFI可以理解为一个完整的系统,包含了上电时序,驱动实现,os环境建立(这个os可以理解为UEFI运行独有的os,非linux,windows),应用程序。其中应用程序支持网络配置,类shell环境,fastboot,linux loader等。

其中UEFI中涉及的名词缩写:

Unified extensible firmware interface (UEFI)

SEC:security

PEI:pre EFI initialization

DXE:driver execution Environment

BDS:Boot Dev Select

TSL:Transient System Load

RT: runtime

AL:after life

GUID:Globally Unique Identifier

CSM : Compatibility Support Module

TCG:Trusted Computing Group

PE:portable executable

COFF:Common object file format

FV:Firmware Volume

对于高通的平台UEFI的实现分成了两部分:

1.    XBL包含了芯片相关的协议和关键的应用(例如充电)

2.    ABL包含了芯片无关的应用,比如fastboot和linuxloader

UEFI代码中大量使用了protocol概念,这个protocol其实指的是驱动,包含了驱动函数指针和数据。以rampatition为例:

boot_images/QcomPkg/Include/Protocol/EFIRamPartition.h中声明了了rampatition protocol:

typedef

EFI_STATUS

(EFIAPI *EFI_RAMPARTITION_GETRAMPARTITIONS)(

INEFI_RAMPARTITION_PROTOCOL* This,

OUTRamPartitionEntry         *RamPartitions,

IN OUT UINT32                 *NumPartition

);struct_EFI_RAMPARTITION_PROTOCOL {

UINT64                                  Revision;

EFI_RAMPARTITION_GETRAMPARTITIONVERSION GetRamPartitionVersion;

EFI_RAMPARTITION_GETHIGHESTBANKBIT     GetHighestBankBit;

EFI_RAMPARTITION_GETRAMPARTITIONS       GetRamPartitions;

};

在boot_images/QcomPkg/Drivers/EnvDxe/EnvDxe.c中实现了该协议

STATIC EFI_RAMPARTITION_PROTOCOL RamPartitionProtocol =

{

EFI_RAMPARTITION_PROTOCOL_REVISION,

EFI_GetRamPartitionVersion,

EFI_GetHighestBankBit,

EFI_GetRamPartitions

};

在XBL中实现了protocol,也就是驱动,在ABL中可以直接使用。

UEFI启动流程:

对于高通平台启动过程依次为PBL->XBL->ABL.

一般用户定制化主要集中在ABL中,这部分代码树如下:

Andrioid代码路径bootable/bootloader/edk2/QcomModulePkg

├── Application

│   └── LinuxLoader

│      ├── LinuxLoader.c

│      └── LinuxLoader.inf

├── Include

│   ├── Library

│   │   ├──BoardCustom.h

│   │   ├── Board.h

│   │   ├──BootImage.h

│   │   ├──BootLinux.h

│   │   ├──BootStats.h

│   │   ├──Decompress.h

│   │   ├──DeviceInfo.h

│   │   ├── DrawUI.h

│   │   ├──FastbootMenu.h

│   │   ├── Fonts.h

│   │   ├── KeyPad.h

│   │   ├──LinuxLoaderLib.h

│   │   ├── list.h

│   │   ├──LocateDeviceTree.h

│   │   ├──MenuKeysDetection.h

│   │   ├──PartitionTableUpdate.h

│   │   ├── Recovery.h

│   │   ├── Reg.h

│   │   ├──ShutdownServices.h

│   │   ├──StackCanary.h

│   │   ├──UnlockMenu.h

│   │   ├──UpdateCmdLine.h

│   │   ├──UpdateDeviceTree.h

│   │   └──VerifiedBootMenu.h

│   └── Protocol

│      ├── EFICardInfo.h

│      ├── EFIChargerEx.h

│      ├── EFIChipInfo.h

│      ├── EFIChipInfoTypes.h

│      ├── EFIEraseBlock.h

│      ├── EFILimits.h

│      ├── EFIMdtp.h

│      ├── EFIPlatformInfo.h

│      ├── EFIPlatformInfoTypes.h

│      ├── EFIPmicPon.h

│      ├── EFIPmicVersion.h

│      ├── EFIQseecom.h

│      ├── EFIRamPartition.h

│      ├── EFIResetReason.h

│      ├── EFIRng.h

│      ├── EFIScmModeSwitch.h

│      ├── EFIUsbDevice.h

│      ├── EFIUsbEx.h

│      ├── EFIVerifiedBoot.h

│      └── UsbEx.h

├── Library

│   ├── BootLib

│   │   ├── Board.c

│   │   ├──BootLib.inf

│   │   ├──BootLinux.c

│   │   ├──BootStats.c

│   │   ├──Decompress.c

│   │   ├──DeviceInfo.c

│   │   ├── DrawUI.c

│   │   ├──FastbootMenu.c

│   │   ├── KeyPad.c

│   │   ├──LinuxLoaderLib.c

│   │   ├──LocateDeviceTree.c

│   │   ├──MenuKeysDetection.c

│   │   ├──PartitionTableUpdate.c

│   │   ├── Recovery.c

│   │   ├──ShutdownServices.c

│   │   ├──UnlockMenu.c

│   │   ├──UpdateCmdLine.c

│   │   ├──UpdateDeviceTree.c

│   │   └──VerifiedBootMenu.c

│   ├── FastbootLib

│   │   ├──FastbootCmds.c

│   │   ├──FastbootCmds.h

│   │   ├──FastbootLib.inf

│   │   ├──FastbootMain.c

│   │   ├──FastbootMain.h

│   │   ├──MetaFormat.h

│   │   ├──SparseFormat.h

│   │   ├──UsbDescriptors.c

│   │   └──UsbDescriptors.h

│   ├── StackCanary

│   │   ├──StackCanary.c

│   │   └──StackCanary.inf

│   └── zlib

│      ├── adler32.c

│      ├── inffast.c

│      ├── inffast.h

│      ├── inffixed.h

│      ├── inflate.c

│      ├── inflate.h

│      ├── inftrees.c

│      ├── inftrees.h

│      ├── zconf.h

│      ├── zlib.h

│      ├── zlib.inf

│      ├── zutil.c

│      └── zutil.h

├──QcomModulePkg.dec

├──QcomModulePkg.dsc

├──QcomModulePkg.fdf

└── Tools

├── app_path_set.cmm

├── check_paths.cmm

├── debug_app.cmm

├── elf_tools.py

├── image_header.py

├── load_uefi_dump.cmm

├── log_save.cmm

├── symbol_Load.cmm

└── uefi_core_path_set.cmm

这部分里面主要是支持linuxloader 用来加载linux,以及fastboot。用户修改主要集中在这两个部分,入口函数LinuxLoaderEntry。

UEFI中用到几种后缀格式的文件说明:

fdf:flash definitionfile,描述flash分区地址范围

dec:package declarationfile,定义了不同模块的GUID信息

dsc:description file,主要包含需要用到的所有inf文件

inf:单个模块的编译信息,类似makefile

efi :最终编译生成的UEFI可执行文件

UEFI在高通平台实现相关推荐

  1. 开机动画适配方案_高通平台刷机包定制方案适配-ROM定制开发入门到精通

    高通平台刷机包定制方案适配-ROM定制开发入门到精通 根据新老平台,高通平台线刷包至少要这样几个基本文件,但不一定全部都需要: 8x10_msimage.mbn----平台镜像,是个完整的磁盘,就是s ...

  2. [Linux Device Driver] 高通平台分区学习

    1. 分区名字 && 作用 ssd ---ssd diag模块的分区,存储加密的RSA密钥. persist ---其中包含在设备出厂后不应该更改的数据,例如:芯片的校准数据(WIFI ...

  3. android 高通平台有前途吗,华为鸿蒙计划要适配高通平台了,可以告别安卓搭载鸿蒙OS了?...

    鸿蒙走出这一步是可以想象到的,看来华为打造这个系统希望的结果是万物皆可盘呀,所以一开始就提出了开源,也就意味着这次是高通,下次就可以是联发科,甚至更多的手机品牌也完全就可以搭载!早期我们一直在说国产手 ...

  4. 高通平台 /sys/module/lpm_levels/parameters/sleep_disabled节点

    高通平台 /sys/module/lpm_levels/parameters/sleep_disabled节点默认值为N,可通过修改init.rc文件来修改,最近遇到一个问题,就是两台设备韦根测试收发 ...

  5. Android高通平台调试Camera驱动全纪录

    项目比较紧,3周内把一个带有外置ISP,MIPI数据通信,800万像素的camera从无驱动到实现客户全部需求. 1日 搭平台,建环境,编译内核,烧写代码. 我是一直在Window下搭个虚拟机登服务器 ...

  6. 高通平台开发实践经验

    高通平台开发实践经验 本文以一个3GPP下MO call(mobile original call)为例,简述从上层到下层如何建立call.安卓架构很多人都有印象,从APP层到FrameWork层到H ...

  7. 手机MODEM 开发(14)----高通平台手机开发之Modem

    高通平台手机开发之Modem 1.检查原理图,把每个频段的发送,接收通道都整理清楚形成表格. a) 一般每个频段有一个发送通路,两个接受通路(4G要求的),主天线通路和分集天线通路.rx0, rx1, ...

  8. 高通平台添加或者移植一个完整的camera

    OV8865 1.kernel部分: A.kernel_driver: 把驱动文件ov8865_qtech_f8865ac.c 放到kernel/drivers/media/platform/msm/ ...

  9. 高通平台提高核电电压

    高通平台提高核电电压 高通平台有一些异常的复位重启以及死机问题,抓不到dump信息,很可能和核电的电压有关系.我们可以提升核电电压来确认是否是该问题. 修改文件在rpm中: rpm_proc/core ...

最新文章

  1. 如何把字符串类型转换成整型?
  2. HDU 3339 In Action 最短路+01背包
  3. 《大话数据结构》第9章 排序 9.4 简单选择排序
  4. [UOJ #167]【UR #11】元旦老人与汉诺塔
  5. 冲突域、广播域的通俗讲解
  6. UITabBarController详解
  7. eclipse环境配置、快捷键及基本操作
  8. LeetCode题 - 26 删除排序数组中的重复项 python实现
  9. 大数据Hadoop原理学习(HDFS,MAPREDUCE,YARN)
  10. 【验证码识别】OpenCV挑战顶象滑动拼图验证码
  11. cad插入块_CAD块无法分解怎么办?
  12. win10 IDE改AHCI,无需重装系统
  13. sogou/workflow入门(windows版)
  14. 手机录像出现arn无响应
  15. 百度网盘PC端扫描二维码登录时无法加载二维码问题解决方法
  16. worldmap matlab,[转载]转:matlab画地图的工具:worldmap和m_map
  17. 【论文检索】推荐一个可以免费下载论文的网站
  18. Markdown Emoji表情语法速查表
  19. java服务器Nav寻路
  20. lucene Lucene Spatial

热门文章

  1. 十七讲14常数项级数的敛散性
  2. AI:人工智能领域有影响力的开源社区/科技巨头研究机构/全球顶尖学府实验室的简介、课程学习(正确姿势薅羊毛)之详细攻略
  3. [gdc16]《星球大战:前线》的美术制作技术
  4. 曾哥传(第五话)皇城大乱斗
  5. java springboot 写入word文档(word模版: 文字,表格,图片)
  6. TPM零知识学习八 —— tpm组件联调及API实例解析
  7. 养生保健的误区有哪些?
  8. 九联UNT402H-Hi3798MV300-当贝纯净桌面-卡刷固件包
  9. 云仓数字生态:探索绿色基因电商4.0新模式
  10. 题目24 身高、体重排序(ok)