UEFI在高通平台实现
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在高通平台实现相关推荐
- 开机动画适配方案_高通平台刷机包定制方案适配-ROM定制开发入门到精通
高通平台刷机包定制方案适配-ROM定制开发入门到精通 根据新老平台,高通平台线刷包至少要这样几个基本文件,但不一定全部都需要: 8x10_msimage.mbn----平台镜像,是个完整的磁盘,就是s ...
- [Linux Device Driver] 高通平台分区学习
1. 分区名字 && 作用 ssd ---ssd diag模块的分区,存储加密的RSA密钥. persist ---其中包含在设备出厂后不应该更改的数据,例如:芯片的校准数据(WIFI ...
- android 高通平台有前途吗,华为鸿蒙计划要适配高通平台了,可以告别安卓搭载鸿蒙OS了?...
鸿蒙走出这一步是可以想象到的,看来华为打造这个系统希望的结果是万物皆可盘呀,所以一开始就提出了开源,也就意味着这次是高通,下次就可以是联发科,甚至更多的手机品牌也完全就可以搭载!早期我们一直在说国产手 ...
- 高通平台 /sys/module/lpm_levels/parameters/sleep_disabled节点
高通平台 /sys/module/lpm_levels/parameters/sleep_disabled节点默认值为N,可通过修改init.rc文件来修改,最近遇到一个问题,就是两台设备韦根测试收发 ...
- Android高通平台调试Camera驱动全纪录
项目比较紧,3周内把一个带有外置ISP,MIPI数据通信,800万像素的camera从无驱动到实现客户全部需求. 1日 搭平台,建环境,编译内核,烧写代码. 我是一直在Window下搭个虚拟机登服务器 ...
- 高通平台开发实践经验
高通平台开发实践经验 本文以一个3GPP下MO call(mobile original call)为例,简述从上层到下层如何建立call.安卓架构很多人都有印象,从APP层到FrameWork层到H ...
- 手机MODEM 开发(14)----高通平台手机开发之Modem
高通平台手机开发之Modem 1.检查原理图,把每个频段的发送,接收通道都整理清楚形成表格. a) 一般每个频段有一个发送通路,两个接受通路(4G要求的),主天线通路和分集天线通路.rx0, rx1, ...
- 高通平台添加或者移植一个完整的camera
OV8865 1.kernel部分: A.kernel_driver: 把驱动文件ov8865_qtech_f8865ac.c 放到kernel/drivers/media/platform/msm/ ...
- 高通平台提高核电电压
高通平台提高核电电压 高通平台有一些异常的复位重启以及死机问题,抓不到dump信息,很可能和核电的电压有关系.我们可以提升核电电压来确认是否是该问题. 修改文件在rpm中: rpm_proc/core ...
最新文章
- 如何把字符串类型转换成整型?
- HDU 3339 In Action 最短路+01背包
- 《大话数据结构》第9章 排序 9.4 简单选择排序
- [UOJ #167]【UR #11】元旦老人与汉诺塔
- 冲突域、广播域的通俗讲解
- UITabBarController详解
- eclipse环境配置、快捷键及基本操作
- LeetCode题 - 26 删除排序数组中的重复项 python实现
- 大数据Hadoop原理学习(HDFS,MAPREDUCE,YARN)
- 【验证码识别】OpenCV挑战顶象滑动拼图验证码
- cad插入块_CAD块无法分解怎么办?
- win10 IDE改AHCI,无需重装系统
- sogou/workflow入门(windows版)
- 手机录像出现arn无响应
- 百度网盘PC端扫描二维码登录时无法加载二维码问题解决方法
- worldmap matlab,[转载]转:matlab画地图的工具:worldmap和m_map
- 【论文检索】推荐一个可以免费下载论文的网站
- Markdown Emoji表情语法速查表
- java服务器Nav寻路
- lucene Lucene Spatial
热门文章
- 十七讲14常数项级数的敛散性
- AI:人工智能领域有影响力的开源社区/科技巨头研究机构/全球顶尖学府实验室的简介、课程学习(正确姿势薅羊毛)之详细攻略
- [gdc16]《星球大战:前线》的美术制作技术
- 曾哥传(第五话)皇城大乱斗
- java springboot 写入word文档(word模版: 文字,表格,图片)
- TPM零知识学习八 —— tpm组件联调及API实例解析
- 养生保健的误区有哪些?
- 九联UNT402H-Hi3798MV300-当贝纯净桌面-卡刷固件包
- 云仓数字生态:探索绿色基因电商4.0新模式
- 题目24 身高、体重排序(ok)