百敖飞腾 BIOS开发者手册

华为奋斗者精神 2023-11-28 10:00:58

目录

  • 百敖飞腾 BIOS开发者手册
  • 1产品简介
  • 1.1产品描述
  • 1.2主要功能
  • 2基础代码架构与文件目录介绍
  • 2.1代码基础结构及文件目录
  • 2.2主要的Package介绍
  • 3代码编译过程介绍
  • 3.1编译所需开发工具
  • 3.2编译环境搭建
  • 3.2.1安装VMware (版本没有要求)
  • 3.2.2搭建编译环境
  • 1. 解压gcc文件
  • 2.设置tool路径:
  • 3. 安装acpica编译ACPI table工具,工具下载地址如下:
  • 4.编译code:
  • 5.搭建编译环境常见问题:
  • 1) aarch64-linux-gnu-gcc找不到
  • 2) libz.so.1找不到
  • 3) 找不到uuid.h
  • 4代码开机流程介绍
  • 4.1UEFI bios开机流程简介
  • 4.2 SEC
  • 4.3 DXE
  • 4.4 BDS
  • 5 OEM Porting
  • 5.1更换pbf头文件
  • 5.2更换logo
  • 5.3 更换驱动文件
  • 5.4 如何添加新的驱动模块
  • 5.5 如何添加新的setup选项
  • 6 定制BIOS setup 界面,callback实现
  • 6.1定制Bios Setup界面
  • 6.2callback 原理
  • 维护人:
(百敖飞腾 BIOS开发者手册①)

百敖飞腾 BIOS开发者手册

在这里插入图片描述

1产品简介

1.1产品描述

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

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基础代码架构与文件目录介绍

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.com/technology/framework/spec.htm)%E4%B8%AD%E5%AE%9A%E4%B9%89%E7%9A%84PROTOCOLs, 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代码编译过程介绍

3.1编译所需开发工具

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

3.2编译环境搭建

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

在VMware下安装Ubuntu(64 位ubuntu需要把BIOS SETUP中的CPU的VT打开)安装时选择默认路径
参考文档:
http://wenku.baidu.com/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.org/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.net/ageme/article/details/26969575

2) libz.so.1找不到

这个需要安装程式,终端输入如下命令:

sudo apt-get install lib32z1

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

3) 找不到uuid.h

终端输入如下命令:

sudo apt-get install uuid-dev

4代码开机流程介绍

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

在这里插入图片描述


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

在这里插入图片描述

5 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文件中[Components.common]模块下,如下图一所示。但若需要包进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值的,如图。

在这里插入图片描述

6 定制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.2callback 原理

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


维护人:

...全文
527 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧