最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

[UEFI BIOS]百敖飞腾(ARM64)UEFI BIOS开发

业界 admin 4浏览 0评论

FT-2000/4芯片集成4个飞腾自主研发的新一代高性能处理器内核FTC663,采用乱序四发射超标量流水线,兼容64位ARMV8指令集并支持ARM64和ARM32两种执行模式,支持单精度、双精度浮点运算指令和ASIMD处理指令,支持硬件虚拟化。

FT-2000/4从硬件层面增强了芯片的安全性,支持飞腾自主定义的处理器安全架构标准PSPA 1.0,满足更复杂应用场景下对性能和安全可信的需求。

该产品适用于构建有更高性能、能耗比和安全需要的桌面终端、便携式终端、轻量级服务器和嵌入式低功耗产品,支持商业和工业分级。 [1]

主要技术参数:

处理器内核

FTC663

核数

4

主频

2.2GHz、2.6GHz

一级缓存

32KB数据缓存,32KB指令缓存

二级缓存

4MB

三级缓存

4MB

片上存储器

集成128KB片上存储

存储控制器

2个DDR4接口,支持DDR存储数据实时加密,兼容DDR3、DDR3L

PCIE接口

2个x16(每个可分拆为2个x8)和2个x1 PCIE 3.0接口

网络接口

2个10/100/1000Mbps自适应以太网接口

其他接口

1个SD 2.0,1个HD-Audio,4个UART,32个GPIO,1个LPC,4个I2C,1个QSPI接Flash,2个通用SPI,2个WDT,3个CAN 2.0

安全技术

支持PSPA安全标准1.0,支持基于域隔离的安全机制,集成ROM作为可信启动根,集成多种密码加速引擎

低功耗技术

支持电源关断、时钟关断、DVFS以及关核、降频操作,支持待机、休眠模式

典型功耗

40W

封装

FCBGA,引脚个数1144

尺寸

35mm x 35mm

一、产品简介


1.1 产品描述


作为百敖的旗舰产品,飞腾 UEFI BIOS基于UEFI EDK II规范,经过严格的开发及测试流程,应用了最新的UEFI标准,采用模块化设计,可以很容易的移植到不同的平台,包括服务器,台式机,笔记本,移动设备,嵌入式设备等。相比较传统的BIOS,UEFI BIOS基于UEFI标准,能够提供更大的灵活性,在预启动环境可以完成更多的工作。
百敖飞腾 UEFI BIOS针对飞腾FT2000处理器进行了升级,全面支持飞腾FT2000平台,飞腾UEFI BIOS基于飞腾CRB(客户参考板)进行开发,在支持FT2000公板平台的基础上增加了很多百敖的特定功能,满足各种应用场景的要求,并且根据OEM/ODM的需要提供定制化服务,帮助客户迅速开发产品。

百敖软件创立于 2006 年,是领先的固件供应商及软件服务提供商,公司产品涵盖 UEFI BIOS、BMC、EC 及配套工具,支持多种芯片架构(包括 X86、Arm、MIPS、Alpha 等),广泛应用于 PC、服务器、物联网、工控、消费等领域。

1.2主要功能
飞腾UEFI BIOS 飞腾FT2000版本支持以下主要功能:

UEFI及平台功能
支持UEFI 2.5及PI 1.2标准
支持飞腾FT2000+处理器
支持Linux/UEFI Shell
高级功能
快速启动
多语言支持(中文/英文)
Boot功能
硬盘模式启动
光驱模式启动
USB模式启动
网络模式启动
支持热键
BIOS管理
BIOS Setup下固件更新功能
启动信息支持串口输出
密码管理
管理员密码
开机密码
控制重定向功能
支持串口的控制重定向功能
显卡
HD5450 7450 7470 7750 8450 8470
E6460 E6465 E6760
R5340 R5235 R7240及SM750、SM768
BMC里显卡支持列表:Aspeed 2400/2500
ATA/ATAPI功能
支持SATA AHCI模式
USB功能
支持USB1.0/2.0/3.0
POST阶段/UEFI Shell环境下支持USB键盘鼠标热插拔
Video
板载Video
支持UEFI模式下的显卡
Debug支持
COM口调试支持
内存配置
Memory Topology Detection and Display
Memory Operating Speed Display
内存大小
PCI/PCI-e
支持PCI 2.3
支持PCI-X
PCI FW 3.0
PCI-e 1.1/2.0


二、 基础代码架构与文件目录介绍


2.1 代码基础结构及文件目录


飞腾FT2000+ BIOS使用UEFI构架,Code有99%的C代码和极少量的汇编代码组合而成。由INF文件和源文件(c、汇编等)组成一个个模块,定义在一个DEC文件描述包内,最后由平台文件DSC和FDF来选择参与编译和最终包含进BIOS的模块。

2.2 主要的Package介绍


主要package简介如下。
ArmPkg:提供了ARM平台硬件相关模块,如GIC、CPU、Timer以及ARM指令集。
ArmPlatformPkg:提供ARM平台相关的驱动模块,如Flash、GPIO等。
BaseTools: 提供了BIOS编译的二进制可执行工具,以及BIOS编译的配置文件模板。
ByoModulePkg: 提供了百敖定制化模块和百敖特定功能模块(Setup界面,USB等等)。
CryptoPkg: 提供了供UEFI安全功能模块使用的密码算法相关库函数,以及用于测试库函数的测试应用程序。
ExtPkg: 提供了访问linux ext2~4分区格式的文件系统驱动。
FatBinPkg: 提供了针对不同CPU架构的FAT驱动二进制文件。
IntelFrameworkPkg:声明了Intel Platform Innovation Framework Specification(http://developer.intel/technology/framework/spec.htm)中定义的PROTOCOLs, PPIs, GUIDs和相关数据结构。另外,这个package还包括了基于Intel Platform Innovation Framework Specification的库函数实例(Library Instances)。
IntelFrameworkModulePkg:提供了基于Intel Platform Innovation Framework Specification的一组跨平台通用库函数实例和模块,以及服务于这些模块的库函数实例。
MdePkg:用来声明在UEFI、EFI、PI规范和行业标准中定义的协议栈、PPIs、GUIDs 和相关数据结构体。此外,这个包还为英特尔创新平台固件提供了 MdeModulePkg中定义的库实体服务程序。
MdeModulePkg:提供了一组基于UEFI、EFI和PI规范的跨平台的模块。并且它还包括这些模块的库实体。
PhytiumPkg:飞腾平台客户一些定制化功能一般在本文件夹中添加。
SecurityPkg:为UEFI安全模块提供安全相关的驱动。
ShellPkg: 提供了UEFI shell源代码,可用于编译生成UEFI shell二进制文件。
ShellBinPkg:提供了针对不同CPU架构的UEFI shell和shell应用程序二进制文件。
UefiCpuPkg:提供了UEFI兼容的CPU初始化模块和库函数。

三、代码编译过程介绍


3.1 编译所需开发工具


飞腾平台需要在ARM环境下编译或者在虚拟机里面用交叉编译环境编译。

3.2 编译环境搭建


3.2.1 安装VMware (版本没有要求)


在VMware下安装Ubuntu(64 位ubuntu需要把BIOS SETUP中的CPU的VT打开)安装时选择默认路径
参考文档:
http://wenku.baidu/link?url=eTUlDof-qCa2QKKyxjJqXGz80XAQOjLghgf0tnZG3BBW8Xiu_3xyglRgr0YQpZpNRNWauny6i6dw4bevB2MkUOyuK2zHCvJHJITssFpAHim

3.2.2 搭建编译环境


1. 解压gcc文件
将下图所示tool拷贝到Linux相应文件夹下解压附件。

2.设置tool路径:
Code文件下的build.sh文件里面有一条

export PATH=$PATH:/home/xuxiaoyue/share/tool/aarch64-toolchain/gcc-linaro-aarch64-linux-gnu-4.9-2014.08_linux/bin


请依自己的文件目录(即上述步骤解压存放路径)进行修改

3. 安装acpica编译ACPI table工具,工具下载地址如下:
https://acpica/downloads 
下载后编译进行安装。

4. 编译code
将code拷贝到虚拟机的相应路径下,在终端先输入语句chmod +x build.sh,修改文件权限;
执行./build.sh init,初始化编译环境;
执行命令./ build.sh d/r (d为debug版本,r为release版本)就可以build出一版bios了,生成的BIOS在文件根目录下,后缀名为*.fd。
PS:第一和第二步只需要执行一次,但是若是一个新的code或更改了文件名,则需再次执行./build.sh init。

 ./build.sh init:初始化编译环境
./ build.sh d:编译生成debug版本BIOS
./ build.sh r:编译生成release版本BIOS
./ build.sh clean:清除编译信息

5.搭建编译环境常见问题:
1) aarch64-linux-gnu-gcc找不到
这个是因为此文件为32位程序,而我装的是64位系统,所以需要安装一个在64位系统下运行32位系统的程式。终端输入如下命令:

sudodpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
sudo ./adb

参考文档:http://blog.csdn/ageme/article/details/26969575

2) libz.so.1找不到
这个需要安装程式,终端输入如下命令:

sudo apt-get install lib32z1

参考文档:http://www.linuxdiyf/linux/13257.html

3) 找不到uuid.h
终端输入如下命令:

sudo apt-get install uuid-dev


四、代码开机流程介绍


4.1UEFI bios开机流程简介

如上图所示,UEFI架构的平台开机由POWERON开始经历SEC、PEI、DXE、BDS、OS Loader以及RUNTIME阶段。具体的细节可以参开UEFI的PI Spec。
SEC(安全验证)-> PEI(EFI前期初始化)-> DXE(驱动执行环境)
-> BDS(启动设备选择)-> TSL(操作系统加载前期) -> RT(Run time) -> AL(系统灾难恢复期)
前三个阶段是UEFI初始化阶段,DXE阶段结束后UEFI环境已准备完毕。BDS和TSL是操作系统加载器作为UEFI应用程序运行阶段。
操作系统加载器调用ExitBootServices()服务后进入RT阶段,RT阶段包括操作系统加载器后期和操作系统运行期。
当系统硬件或操作系统出现严重错误不能继续正常运行时,固件尝试修复错误,这时系统进入AL期。
UEFI定义了操作系统和平台固件之间的接口。UEFI接口可分为启动服务(Runtime Services)和运行时服务(Boot Services)。启动服务和运行时服务只有在系统进入DXE阶段后才生成。
值得注意的是,飞腾平台有别于x86平台,并不包含PEI阶段,且平台资源分配的工作很多都是在pbf头文件中完成的,开机后会先执行pbf头文件,再去跑BIOS,下面对飞腾平台BIOS的三个阶段进行介绍。

4.2 SEC
SEC(Security Phase)阶段是平台初始化的第一个阶段,计算机系统加电后进入这个阶段。

SecCore的作用:
需用Assembly做一些C无法处理的工作
C语言无法处理CPU的特殊寄存器;
C语言需要Memory来作为函数调用的栈。

SEC阶段做什么
接收并处理系统启动和重启信号
交接给C环境
a)进入protected mode
b)提供C环境所需Stack
c)传递系统参数给DXE,比如系统当前状态,可启动固件,RAM地址和大小,Stack地址和大小等等
启用所有核心的指令缓存

SEC具体流程
\ArmPlatformPkg\PrePi\PrePi.c

ArmPlatformInitialize
ArmDisableDataCache
ArmInvalidateDataCache
ArmInvalidateInstructionCache
ArmEnableInstructionCache

4.3 DXE
DXE阶段做什么
Run 所有的DXE Driver, 使其这个阶段Ready.
Binding driver先挂到系统上,实际connect device在BDS阶段
启动BDS

DXE执行流程

DXE阶段执行大部分系统初始化工作,进入此阶段时,内存已经被完全使用,可进行大量复杂工作
从功能上讲DXE分为两部分
DXE core,负责DXE基础服务和流程
DXE dispatcher,负责调度执行DXE驱动,初始化系统设备
DXE提供的基础服务包括SystemTable, BootServices, Run Time Services

DXE具体流程
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c

\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//初始化系统服务

\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c

\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c

\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//调度系统中的Driver

Debug信息:” Loading driver XXXX”

\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//传递控制权到BDS,从本质上讲,BDS是一种特殊的DXE阶段的应用程序

REPORT_STATUS_CODE:0x90

4.4 BDS
BDS阶段做什么
初始化控制台设备
加载必要的设备驱动
选择并执行启动项或者进入SETUP

BDS具体流程
MdeModulePkg\Universal\BdsDxe\BdsEntry.c
//BDS入口

// 做一些平台初始化

// 初始化hotkey service

// Connect all default consoles

// After consoles, show logo & connect all

//等待一定时间,若无按键则从默认设备启动

五、OEM Porting

5.1更换pbf头文件

不同平台由于硬件的不同,所以需包入适配于该板子的pbf头文件。
将pbf相应的头文件放入\ PhytiumPkg\pbf\文件夹中然后修改build.sh里面对应的文件名为新的pbf文件名即可。

5.2更换logo

将\PhytiumPkg\PhytiumPkg.fdf文件中的红框中的名字修改为要替换的logo文件名,并将logo放在PhytiumPkg\Logo\文件夹中。

支持的图片类型仅为.bmp和.jpg格式,分辨率最大支持1024*768。

5.3 更换驱动文件

以下图中三个驱动为例

AMDGOP:AMD显卡驱动。飞腾平台仅支持UEFI驱动,所以此处包的是显卡的GOP驱动,但是AMD显卡需板载上包含VBIOS(可x86平台的),因为GOP驱动会从VBIOS驱动中获取部分关于显卡的table信息。

ASPEED_2400:ASPEED 2400显卡驱动。有别于AMD显卡驱动,此处显卡驱动不依赖于VBIOS。uefi_2400_396.depex为该驱动的dependency,只有该dependency满足的时候,这只驱动才会跑起来。下面对该dependency进行描述:

由上面几幅图可以看出,uefi_2400_396.depex的dependency对应的是gAspeedGopDepexGuid,再从code中可以看出,当没有找到AMD显卡时,才会installgAspeedGopDepexGuid,后面该显卡驱动才会跑起来,程序如下图。目的是为了有外插显卡时优先使用外插显卡,无外插显卡时再去使用BMC板载显卡。添加原因是:为了解决在进麒麟操作系统后的双显卡显示问题。

GigUndiDxe:Intel网卡驱动。GigUndiDxe.depex为该驱动的dependency,只有该dependency满足的时候,这只驱动才会跑起来。下面对该dependency进行描述:

由上面几幅图可以看出,GigUndiDxe.depex的dependency对应的是gIntelUndiDepexGuid,再从code中可以看出,当网络引导打开时,才会installgIntelUndiDepexGuid,即只有当打开网络引导选项时,intel网卡驱动才会跑起来code中的实现见下图。目的是为了从软件方面实现对intel网卡的打开和关闭。

5.4 如何添加新的驱动模块
每个驱动文件最起码包含一个.inf文件及一个.c文件,具体可参考“DxeDriver参考.rar”。.inf文件用于定义你的驱动类型,用到的libraryclasses等,关于.inf文件的详细描述详见文档第二章。.c文件用于编写你的程序实现。


若该驱动模块仅用于编译生成.efi文件,则只需将该驱动的.inf文件路径定义在Phytium1500aPkg.dsc文件中[Componentsmon]模块下,如下图一所示。但若需要包进BIOS中,则需要将.inf文件文件路径定义在Phytium1500aPkg.fdf文件的对应位置,如下图二。若本模块需包含未定义的LibraryClasses,则需在Phytium1500aPkg.dsc文件中定义LibraryClasses的路径,如图三。

【DXE_DRIVER与UEFI_DRIVER的区别】:

  • DXE_DRIVER只要load到内存里面后,只要Depex满足或为TRUE,如图,就会立即执行它的ENTRY_POINT;
  • UEFI_DRIVER在load到内存后,Depex满足或为TRUE后虽然也会执行它的ENTRY_POINT,但是它的ENTRY_POINT函数只会去Install EFI Driver Binding Protocol,如图。一个标准的Driver Binding包括supported,start,stop3个成员函数。BDS在调用ConnectCOntroller时,会把每个UEFI_DRIVER的supported都执行一遍,当supported满足时,才会去跑start函数,只有当start函数跑起来时,这支UEFI_DRIVER才是真的起作用。Stop为卸载该驱动。

5.5 如何添加新的setup选项
Setup选项的添加与删减基本在\PhytiumPkg\PlatformSetupDxe\文件夹中进行相应修改。以下以server平台上添加SATA Port选项为例,具体说明。

1.在对应界面的.vfr文件中添加需要添加的选项。SATA port选项添加在高级界面(即Advance),找到文件\PhytiumPkg\PlatformSetupDxe\Advanced\FormsetAdvanced.vfr,添加图中字段。此处添加的是文本格式的选项,不同类型选项的说明,详见下面的“VFR.pdf”spec。

2.在.uni文件中对string进行定义。如图一,在setup.uni文件中,对添加的4个port的字符串赋值。若是固定的名称,则只需将对应名称写入;若是像SATA port一样,需动态显示其名称,则需要在.c文件中进行赋值,如图二。

3.若定义的是下图一类型的,且需要default值的,如图。

六、定制BIOS setup 界面,callback实现

6.1定制Bios Setup界面
相关module PlatformPkg\PlatformSetupDxe
下面有文件目录分别对应SETUP界面里的选项卡:Advanced device Exit Main power Security。
以Exit选项卡为例:

formset guid = EXIT_FORM_SET_GUID,       //定义一个表的容器formset 
  title = STRING_TOKEN(STR_EXIT),
  help = STRING_TOKEN(STR_EXIT_HELP),
  classguid = EFI_IFR_FRONT_PAGE_GUID,
  class = EXIT_FORM_SET_CLASS, 
  subclass = 0,

form formid = 1,                               //定义一个表form
    title = STRING_TOKEN(STR_EXIT);
    text
      help  = STRING_TOKEN(STR_SAVE_EXIT_HELP),
      text  = STRING_TOKEN(STR_SAVE_EXIT),
      flags = INTERACTIVE | RESET_REQUIRED,
      key   = AUTO_ID(KEY_SAVE_AND_EXIT_VALUE);  

formset 和form 的定义规则参见HII spec。一个formset 可以容纳多个form。
这里定义了一个text 格式的表,表所显示的帮助信息(STR_SAVE_EXIT_HELP),名字(STR_SAVE_EXIT)可以从Setup.uni文件中查到为:Exit system Setup after saving the changes.

6.2 callback 原理
这个form 在setup界面下会根据用户选择对相应函数实现callback。
如当我们选择保存并退出时就会调用ExitFormCallback函数,根据回调时的参数来执行具体的任务。保存退出时的KeyValue是KEY_SAVE_AND_EXIT_VALUE。通过switch case 执行相应的代码。

FT-2000/4芯片集成4个飞腾自主研发的新一代高性能处理器内核FTC663,采用乱序四发射超标量流水线,兼容64位ARMV8指令集并支持ARM64和ARM32两种执行模式,支持单精度、双精度浮点运算指令和ASIMD处理指令,支持硬件虚拟化。

FT-2000/4从硬件层面增强了芯片的安全性,支持飞腾自主定义的处理器安全架构标准PSPA 1.0,满足更复杂应用场景下对性能和安全可信的需求。

该产品适用于构建有更高性能、能耗比和安全需要的桌面终端、便携式终端、轻量级服务器和嵌入式低功耗产品,支持商业和工业分级。 [1]

主要技术参数:

处理器内核

FTC663

核数

4

主频

2.2GHz、2.6GHz

一级缓存

32KB数据缓存,32KB指令缓存

二级缓存

4MB

三级缓存

4MB

片上存储器

集成128KB片上存储

存储控制器

2个DDR4接口,支持DDR存储数据实时加密,兼容DDR3、DDR3L

PCIE接口

2个x16(每个可分拆为2个x8)和2个x1 PCIE 3.0接口

网络接口

2个10/100/1000Mbps自适应以太网接口

其他接口

1个SD 2.0,1个HD-Audio,4个UART,32个GPIO,1个LPC,4个I2C,1个QSPI接Flash,2个通用SPI,2个WDT,3个CAN 2.0

安全技术

支持PSPA安全标准1.0,支持基于域隔离的安全机制,集成ROM作为可信启动根,集成多种密码加速引擎

低功耗技术

支持电源关断、时钟关断、DVFS以及关核、降频操作,支持待机、休眠模式

典型功耗

40W

封装

FCBGA,引脚个数1144

尺寸

35mm x 35mm

一、产品简介


1.1 产品描述


作为百敖的旗舰产品,飞腾 UEFI BIOS基于UEFI EDK II规范,经过严格的开发及测试流程,应用了最新的UEFI标准,采用模块化设计,可以很容易的移植到不同的平台,包括服务器,台式机,笔记本,移动设备,嵌入式设备等。相比较传统的BIOS,UEFI BIOS基于UEFI标准,能够提供更大的灵活性,在预启动环境可以完成更多的工作。
百敖飞腾 UEFI BIOS针对飞腾FT2000处理器进行了升级,全面支持飞腾FT2000平台,飞腾UEFI BIOS基于飞腾CRB(客户参考板)进行开发,在支持FT2000公板平台的基础上增加了很多百敖的特定功能,满足各种应用场景的要求,并且根据OEM/ODM的需要提供定制化服务,帮助客户迅速开发产品。

百敖软件创立于 2006 年,是领先的固件供应商及软件服务提供商,公司产品涵盖 UEFI BIOS、BMC、EC 及配套工具,支持多种芯片架构(包括 X86、Arm、MIPS、Alpha 等),广泛应用于 PC、服务器、物联网、工控、消费等领域。

1.2主要功能
飞腾UEFI BIOS 飞腾FT2000版本支持以下主要功能:

UEFI及平台功能
支持UEFI 2.5及PI 1.2标准
支持飞腾FT2000+处理器
支持Linux/UEFI Shell
高级功能
快速启动
多语言支持(中文/英文)
Boot功能
硬盘模式启动
光驱模式启动
USB模式启动
网络模式启动
支持热键
BIOS管理
BIOS Setup下固件更新功能
启动信息支持串口输出
密码管理
管理员密码
开机密码
控制重定向功能
支持串口的控制重定向功能
显卡
HD5450 7450 7470 7750 8450 8470
E6460 E6465 E6760
R5340 R5235 R7240及SM750、SM768
BMC里显卡支持列表:Aspeed 2400/2500
ATA/ATAPI功能
支持SATA AHCI模式
USB功能
支持USB1.0/2.0/3.0
POST阶段/UEFI Shell环境下支持USB键盘鼠标热插拔
Video
板载Video
支持UEFI模式下的显卡
Debug支持
COM口调试支持
内存配置
Memory Topology Detection and Display
Memory Operating Speed Display
内存大小
PCI/PCI-e
支持PCI 2.3
支持PCI-X
PCI FW 3.0
PCI-e 1.1/2.0


二、 基础代码架构与文件目录介绍


2.1 代码基础结构及文件目录


飞腾FT2000+ BIOS使用UEFI构架,Code有99%的C代码和极少量的汇编代码组合而成。由INF文件和源文件(c、汇编等)组成一个个模块,定义在一个DEC文件描述包内,最后由平台文件DSC和FDF来选择参与编译和最终包含进BIOS的模块。

2.2 主要的Package介绍


主要package简介如下。
ArmPkg:提供了ARM平台硬件相关模块,如GIC、CPU、Timer以及ARM指令集。
ArmPlatformPkg:提供ARM平台相关的驱动模块,如Flash、GPIO等。
BaseTools: 提供了BIOS编译的二进制可执行工具,以及BIOS编译的配置文件模板。
ByoModulePkg: 提供了百敖定制化模块和百敖特定功能模块(Setup界面,USB等等)。
CryptoPkg: 提供了供UEFI安全功能模块使用的密码算法相关库函数,以及用于测试库函数的测试应用程序。
ExtPkg: 提供了访问linux ext2~4分区格式的文件系统驱动。
FatBinPkg: 提供了针对不同CPU架构的FAT驱动二进制文件。
IntelFrameworkPkg:声明了Intel Platform Innovation Framework Specification(http://developer.intel/technology/framework/spec.htm)中定义的PROTOCOLs, PPIs, GUIDs和相关数据结构。另外,这个package还包括了基于Intel Platform Innovation Framework Specification的库函数实例(Library Instances)。
IntelFrameworkModulePkg:提供了基于Intel Platform Innovation Framework Specification的一组跨平台通用库函数实例和模块,以及服务于这些模块的库函数实例。
MdePkg:用来声明在UEFI、EFI、PI规范和行业标准中定义的协议栈、PPIs、GUIDs 和相关数据结构体。此外,这个包还为英特尔创新平台固件提供了 MdeModulePkg中定义的库实体服务程序。
MdeModulePkg:提供了一组基于UEFI、EFI和PI规范的跨平台的模块。并且它还包括这些模块的库实体。
PhytiumPkg:飞腾平台客户一些定制化功能一般在本文件夹中添加。
SecurityPkg:为UEFI安全模块提供安全相关的驱动。
ShellPkg: 提供了UEFI shell源代码,可用于编译生成UEFI shell二进制文件。
ShellBinPkg:提供了针对不同CPU架构的UEFI shell和shell应用程序二进制文件。
UefiCpuPkg:提供了UEFI兼容的CPU初始化模块和库函数。

三、代码编译过程介绍


3.1 编译所需开发工具


飞腾平台需要在ARM环境下编译或者在虚拟机里面用交叉编译环境编译。

3.2 编译环境搭建


3.2.1 安装VMware (版本没有要求)


在VMware下安装Ubuntu(64 位ubuntu需要把BIOS SETUP中的CPU的VT打开)安装时选择默认路径
参考文档:
http://wenku.baidu/link?url=eTUlDof-qCa2QKKyxjJqXGz80XAQOjLghgf0tnZG3BBW8Xiu_3xyglRgr0YQpZpNRNWauny6i6dw4bevB2MkUOyuK2zHCvJHJITssFpAHim

3.2.2 搭建编译环境


1. 解压gcc文件
将下图所示tool拷贝到Linux相应文件夹下解压附件。

2.设置tool路径:
Code文件下的build.sh文件里面有一条

export PATH=$PATH:/home/xuxiaoyue/share/tool/aarch64-toolchain/gcc-linaro-aarch64-linux-gnu-4.9-2014.08_linux/bin


请依自己的文件目录(即上述步骤解压存放路径)进行修改

3. 安装acpica编译ACPI table工具,工具下载地址如下:
https://acpica/downloads 
下载后编译进行安装。

4. 编译code
将code拷贝到虚拟机的相应路径下,在终端先输入语句chmod +x build.sh,修改文件权限;
执行./build.sh init,初始化编译环境;
执行命令./ build.sh d/r (d为debug版本,r为release版本)就可以build出一版bios了,生成的BIOS在文件根目录下,后缀名为*.fd。
PS:第一和第二步只需要执行一次,但是若是一个新的code或更改了文件名,则需再次执行./build.sh init。

 ./build.sh init:初始化编译环境
./ build.sh d:编译生成debug版本BIOS
./ build.sh r:编译生成release版本BIOS
./ build.sh clean:清除编译信息

5.搭建编译环境常见问题:
1) aarch64-linux-gnu-gcc找不到
这个是因为此文件为32位程序,而我装的是64位系统,所以需要安装一个在64位系统下运行32位系统的程式。终端输入如下命令:

sudodpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
sudo ./adb

参考文档:http://blog.csdn/ageme/article/details/26969575

2) libz.so.1找不到
这个需要安装程式,终端输入如下命令:

sudo apt-get install lib32z1

参考文档:http://www.linuxdiyf/linux/13257.html

3) 找不到uuid.h
终端输入如下命令:

sudo apt-get install uuid-dev


四、代码开机流程介绍


4.1UEFI bios开机流程简介

如上图所示,UEFI架构的平台开机由POWERON开始经历SEC、PEI、DXE、BDS、OS Loader以及RUNTIME阶段。具体的细节可以参开UEFI的PI Spec。
SEC(安全验证)-> PEI(EFI前期初始化)-> DXE(驱动执行环境)
-> BDS(启动设备选择)-> TSL(操作系统加载前期) -> RT(Run time) -> AL(系统灾难恢复期)
前三个阶段是UEFI初始化阶段,DXE阶段结束后UEFI环境已准备完毕。BDS和TSL是操作系统加载器作为UEFI应用程序运行阶段。
操作系统加载器调用ExitBootServices()服务后进入RT阶段,RT阶段包括操作系统加载器后期和操作系统运行期。
当系统硬件或操作系统出现严重错误不能继续正常运行时,固件尝试修复错误,这时系统进入AL期。
UEFI定义了操作系统和平台固件之间的接口。UEFI接口可分为启动服务(Runtime Services)和运行时服务(Boot Services)。启动服务和运行时服务只有在系统进入DXE阶段后才生成。
值得注意的是,飞腾平台有别于x86平台,并不包含PEI阶段,且平台资源分配的工作很多都是在pbf头文件中完成的,开机后会先执行pbf头文件,再去跑BIOS,下面对飞腾平台BIOS的三个阶段进行介绍。

4.2 SEC
SEC(Security Phase)阶段是平台初始化的第一个阶段,计算机系统加电后进入这个阶段。

SecCore的作用:
需用Assembly做一些C无法处理的工作
C语言无法处理CPU的特殊寄存器;
C语言需要Memory来作为函数调用的栈。

SEC阶段做什么
接收并处理系统启动和重启信号
交接给C环境
a)进入protected mode
b)提供C环境所需Stack
c)传递系统参数给DXE,比如系统当前状态,可启动固件,RAM地址和大小,Stack地址和大小等等
启用所有核心的指令缓存

SEC具体流程
\ArmPlatformPkg\PrePi\PrePi.c

ArmPlatformInitialize
ArmDisableDataCache
ArmInvalidateDataCache
ArmInvalidateInstructionCache
ArmEnableInstructionCache

4.3 DXE
DXE阶段做什么
Run 所有的DXE Driver, 使其这个阶段Ready.
Binding driver先挂到系统上,实际connect device在BDS阶段
启动BDS

DXE执行流程

DXE阶段执行大部分系统初始化工作,进入此阶段时,内存已经被完全使用,可进行大量复杂工作
从功能上讲DXE分为两部分
DXE core,负责DXE基础服务和流程
DXE dispatcher,负责调度执行DXE驱动,初始化系统设备
DXE提供的基础服务包括SystemTable, BootServices, Run Time Services

DXE具体流程
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c

\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//初始化系统服务

\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c

\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c

\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//调度系统中的Driver

Debug信息:” Loading driver XXXX”

\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//传递控制权到BDS,从本质上讲,BDS是一种特殊的DXE阶段的应用程序

REPORT_STATUS_CODE:0x90

4.4 BDS
BDS阶段做什么
初始化控制台设备
加载必要的设备驱动
选择并执行启动项或者进入SETUP

BDS具体流程
MdeModulePkg\Universal\BdsDxe\BdsEntry.c
//BDS入口

// 做一些平台初始化

// 初始化hotkey service

// Connect all default consoles

// After consoles, show logo & connect all

//等待一定时间,若无按键则从默认设备启动

五、OEM Porting

5.1更换pbf头文件

不同平台由于硬件的不同,所以需包入适配于该板子的pbf头文件。
将pbf相应的头文件放入\ PhytiumPkg\pbf\文件夹中然后修改build.sh里面对应的文件名为新的pbf文件名即可。

5.2更换logo

将\PhytiumPkg\PhytiumPkg.fdf文件中的红框中的名字修改为要替换的logo文件名,并将logo放在PhytiumPkg\Logo\文件夹中。

支持的图片类型仅为.bmp和.jpg格式,分辨率最大支持1024*768。

5.3 更换驱动文件

以下图中三个驱动为例

AMDGOP:AMD显卡驱动。飞腾平台仅支持UEFI驱动,所以此处包的是显卡的GOP驱动,但是AMD显卡需板载上包含VBIOS(可x86平台的),因为GOP驱动会从VBIOS驱动中获取部分关于显卡的table信息。

ASPEED_2400:ASPEED 2400显卡驱动。有别于AMD显卡驱动,此处显卡驱动不依赖于VBIOS。uefi_2400_396.depex为该驱动的dependency,只有该dependency满足的时候,这只驱动才会跑起来。下面对该dependency进行描述:

由上面几幅图可以看出,uefi_2400_396.depex的dependency对应的是gAspeedGopDepexGuid,再从code中可以看出,当没有找到AMD显卡时,才会installgAspeedGopDepexGuid,后面该显卡驱动才会跑起来,程序如下图。目的是为了有外插显卡时优先使用外插显卡,无外插显卡时再去使用BMC板载显卡。添加原因是:为了解决在进麒麟操作系统后的双显卡显示问题。

GigUndiDxe:Intel网卡驱动。GigUndiDxe.depex为该驱动的dependency,只有该dependency满足的时候,这只驱动才会跑起来。下面对该dependency进行描述:

由上面几幅图可以看出,GigUndiDxe.depex的dependency对应的是gIntelUndiDepexGuid,再从code中可以看出,当网络引导打开时,才会installgIntelUndiDepexGuid,即只有当打开网络引导选项时,intel网卡驱动才会跑起来code中的实现见下图。目的是为了从软件方面实现对intel网卡的打开和关闭。

5.4 如何添加新的驱动模块
每个驱动文件最起码包含一个.inf文件及一个.c文件,具体可参考“DxeDriver参考.rar”。.inf文件用于定义你的驱动类型,用到的libraryclasses等,关于.inf文件的详细描述详见文档第二章。.c文件用于编写你的程序实现。


若该驱动模块仅用于编译生成.efi文件,则只需将该驱动的.inf文件路径定义在Phytium1500aPkg.dsc文件中[Componentsmon]模块下,如下图一所示。但若需要包进BIOS中,则需要将.inf文件文件路径定义在Phytium1500aPkg.fdf文件的对应位置,如下图二。若本模块需包含未定义的LibraryClasses,则需在Phytium1500aPkg.dsc文件中定义LibraryClasses的路径,如图三。

【DXE_DRIVER与UEFI_DRIVER的区别】:

  • DXE_DRIVER只要load到内存里面后,只要Depex满足或为TRUE,如图,就会立即执行它的ENTRY_POINT;
  • UEFI_DRIVER在load到内存后,Depex满足或为TRUE后虽然也会执行它的ENTRY_POINT,但是它的ENTRY_POINT函数只会去Install EFI Driver Binding Protocol,如图。一个标准的Driver Binding包括supported,start,stop3个成员函数。BDS在调用ConnectCOntroller时,会把每个UEFI_DRIVER的supported都执行一遍,当supported满足时,才会去跑start函数,只有当start函数跑起来时,这支UEFI_DRIVER才是真的起作用。Stop为卸载该驱动。

5.5 如何添加新的setup选项
Setup选项的添加与删减基本在\PhytiumPkg\PlatformSetupDxe\文件夹中进行相应修改。以下以server平台上添加SATA Port选项为例,具体说明。

1.在对应界面的.vfr文件中添加需要添加的选项。SATA port选项添加在高级界面(即Advance),找到文件\PhytiumPkg\PlatformSetupDxe\Advanced\FormsetAdvanced.vfr,添加图中字段。此处添加的是文本格式的选项,不同类型选项的说明,详见下面的“VFR.pdf”spec。

2.在.uni文件中对string进行定义。如图一,在setup.uni文件中,对添加的4个port的字符串赋值。若是固定的名称,则只需将对应名称写入;若是像SATA port一样,需动态显示其名称,则需要在.c文件中进行赋值,如图二。

3.若定义的是下图一类型的,且需要default值的,如图。

六、定制BIOS setup 界面,callback实现

6.1定制Bios Setup界面
相关module PlatformPkg\PlatformSetupDxe
下面有文件目录分别对应SETUP界面里的选项卡:Advanced device Exit Main power Security。
以Exit选项卡为例:

formset guid = EXIT_FORM_SET_GUID,       //定义一个表的容器formset 
  title = STRING_TOKEN(STR_EXIT),
  help = STRING_TOKEN(STR_EXIT_HELP),
  classguid = EFI_IFR_FRONT_PAGE_GUID,
  class = EXIT_FORM_SET_CLASS, 
  subclass = 0,

form formid = 1,                               //定义一个表form
    title = STRING_TOKEN(STR_EXIT);
    text
      help  = STRING_TOKEN(STR_SAVE_EXIT_HELP),
      text  = STRING_TOKEN(STR_SAVE_EXIT),
      flags = INTERACTIVE | RESET_REQUIRED,
      key   = AUTO_ID(KEY_SAVE_AND_EXIT_VALUE);  

formset 和form 的定义规则参见HII spec。一个formset 可以容纳多个form。
这里定义了一个text 格式的表,表所显示的帮助信息(STR_SAVE_EXIT_HELP),名字(STR_SAVE_EXIT)可以从Setup.uni文件中查到为:Exit system Setup after saving the changes.

6.2 callback 原理
这个form 在setup界面下会根据用户选择对相应函数实现callback。
如当我们选择保存并退出时就会调用ExitFormCallback函数,根据回调时的参数来执行具体的任务。保存退出时的KeyValue是KEY_SAVE_AND_EXIT_VALUE。通过switch case 执行相应的代码。

发布评论

评论列表 (0)

  1. 暂无评论