EDK2编译记录

  • EDK2
  • EDK2-PLATFORM
  • EDK2-NON-OSI

以上三个仓库,EDK2是主仓库,EDK2-PLATFORM是和EDK2版本对应的板子和CPU相关的仓库(比如树莓派的就在这个里面),EDK2-NON-OSI是有一些license和前两个仓库不同的文件的仓库。基本上3个仓库其实可以合并为一个仓库进行编译。直接克隆最新的仓库

编译过程流程:

首先要克隆仓库以及子仓库

然后编译BaseTools,编译好后才可以用build这个命令来进行编译。

. edksetup.sh 

用这个命令来加载变量,当然还依赖前面设置的WORKSPACE

在只有EDK2仓库的时候,可以直接在命令行指定编译的参数,但如果长期只针对一种平台进行编译,可以修改配置文件,简化编译命令

配置文件在

Conf/target.txt  tools_def.txt 这两个里面。写好了就直接build命令就行了,也可以命令行指定参数覆盖配置文件的参数。对交叉编译,也有对应的交叉编译链的指定。

但基本上都是配置好EDK2-PLATFORM,然后指定对应的板子描述文件来进行编译,主要增加 PACKAGES_PATH 这个路径让系统找到对应的板子dsc文件。

target.txt里面主要是这几个变量

ACTIVE_PLATFORM       = EmulatorPkg/EmulatorPkg.dsc

TARGET                = DEBUG

TARGET_ARCH           = IA32

TOOL_CHAIN_CONF       = Conf/tools_def.txt

TOOL_CHAIN_TAG        = VS2015x86



BUILD_RULE_CONF = Conf/build_rule.txt

ACTIVE_PLATFORM就是指定板子的描述文件,描述文件在非edk2目录的,可以通过添加PACKAGES_PATH变量来扩展目录,或者WORKSPACE的相对路径

TARGET可以是  DEBUG, RELEASE, NOOPT

TARGET_ARCH   可以是 IA32, IPF, X64, EBC, ARM  ,AArch64

TOOL_CHAIN_TAG  指定工具链的标记,具体的值在tools_def.txt文件有

TOOL_CHAIN_CONF 这个一般固定不变了

直接先弄个树莓派3B的编译一下试试,先修改配置文件

grep -v ^# target.txt 


ACTIVE_PLATFORM       = EmulatorPkg/EmulatorPkg.dsc

TARGET                = DEBUG

TARGET_ARCH           = AARCH64

TOOL_CHAIN_CONF       = Conf/tools_def.txt

TOOL_CHAIN_TAG        = GCC5

BUILD_RULE_CONF = Conf/build_rule.txt

然后配置交叉编译工具链的路径和PACKAGES_PATH等路径并编译BaseTools

export WORKSPACE=/home/actionchen/Documents/Firefly3399/UEFI
export PACKAGES_PATH=$WORKSPACE/edk2:$WORKSPACE/edk2-platforms:$WORKSPACE/edk2-non-osi
export PATH=/home/actionchen/Documents/Firefly3399/UEFI/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin:$PATH
export GCC5_AARCH64_PREFIX=aarch64-linux-gnu-

. edk2/edksetup.sh
make -C edk2/BaseTools

然后

 build -p Platform/RaspberryPi/RPi3/RPi3.dsc

前面PACKAGES_PATH指定了目录,他自己就去edk2-platform下面找到dsc,直接就编译好了。

再测试下RK3399的,   

git clone https://github.com/edk2-porting/edk2-rk3399.git

export PACKAGES_PATH=$PACKAGES_PATH:$WORKSPACE/edk2-rk3399

然后返回到edk2目录,checkout一下之前的版本,如果直接用最新的编译报错。

cd edk2

git checkout 3a3713e62cfad00d78bb938b0d9fb1eedaeff314

build -p sdm845Pkg/polaris.dsc

就直接编译好rk3399的EFI启动固件了,edk2-rk3399的里面也自带了个build.sh,估计是我交叉编译工具链的原因,之前在ubuntu上死活编译不过,这次在UOS上直接用build命令也能过。

交叉编译工具链的下载地址

Linaro Releaseshttps://releases.linaro.org/components/toolchain/binaries/latest-5/

一会吃完饭用uboot启动下看看

直接用firefly 的debian固件包发现加载后没法出图形,看了下

https://github.com/edk2-porting/edk2-rk3399/

的说明,需要Uboot初始化framebuffer,说是看UBOOT启动的时候看有没有LOGO出现。我看了下我刷这个debian带的uboot确实没有图形。明天再重新编译一下uboot试试看。

RK3399从系统ROM启动后有2种固件来启动uboot,一种是官网闭源的loader加载uboot,另外一种是uboot开源的SPL和TPL,分别负责初始化内存和加载uboot.uboot边以后格式也稍有不通,一般参考网上开源的例子需要用uboot官网的代码编译,编译完后就直接生成idbloader.img uboot.itb两个文件用于直接烧写。rk的github网站的代码编译出来是没有idbloader.img和uboot.itb文件的,因为根目录缺少以点开头的cmd文件用来生成。

linux下直接烧写emmc可以直接dd,

uboot下就只能用fatls mmc 1:1 然后fatload mmc 1:1 0x300000 xxx.fd这样的形式先把文件加载到内存,然后mmc write  0 0x30000 0x4000 0x10 (0x10相当于16个block,mmc info 可以看到mmc一个block是512字节,所以烧写的内容就是16*512个字节大小了)这样的形式来往emmc烧写了。

其实最简单还是直接把emmc最开始给擦掉,然后插sd卡来搞。不然搞挂又得来拆开发板盖子镊子短路进maskrom。

当然如果接了网线,走tftp下载img到内存然后直接烧到emmc最好,这样省的拔插TF卡了。但tf卡好处是可以直接在调试机器上直接dd 任意镜像到任意位置,方便。

反复测试了2个版本的EDK2 FOR  RK3399

GitHub - andreiw/rk3399-edk2: Uefi Rockchip Rk3399PkgUefi Rockchip Rk3399Pkg. Contribute to andreiw/rk3399-edk2 development by creating an account on GitHub.https://github.com/andreiw/rk3399-edk2.git

https://github.com/edk2-porting/edk2-rk3399https://github.com/edk2-porting/edk2-rk3399

分别是替代uboot以及通过uboot的syslinux菜单extlinux.conf来引导,但都没办法引导起来,但是uboot本身也是支持加载efi启动文件引导的,所以就暂时不去考虑直接edk2的问题了,直接用uboot来加载efi启动文件启动了。

只不过,uboot里面启动还是走设备树传递设备信息的方式,所以bootefi后面可以跟设备树的内存地址,而纯EFI提供的是ACPI表的方式来传递设备信息,所以如果走bootefi来加载efi启动文件其实还是换汤不换药,还不如用uboot启动。后面空了再来研究rk3399的EFI固件吧。反正目前手工测试弄死都无法正常启动。

uboot启用viconsole图形输出,除了要配置图形驱动外,还在在console里面配置console_mux选项。

最后要说,armbian做的镜像的确是不错,各种功能都开齐全了,可以玩。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译生成 OVMF 是指通过 ed2k 来获得 OVMF 源代码,并将其编译成可执行文件的过程。 首先,我们需要通过 ed2k 下载 OVMF 的源代码。ed2k 是一种文件传输协议,可以在网络上找到对应的资源。我们可以使用 ed2k 客户端软件来下载 OVMF。打开 ed2k 客户端,粘贴 OVMF 的 ed2k 链接,然后开始下载。 下载完成后,我们需要解压缩 OVMF 的源代码。可以使用压缩软件(如 WinRAR)将下载的文件解压缩到一个目录中。 接下来,我们需要打开命令行终端,并进入到解压缩后的 OVMF 源代码目录。 在命令行中输入编译命令来生成 OVMF。具体的编译命令可能因操作系统和编译器而不同。常见的编译命令包括 make、gcc、cmake 等。我们可以查阅 OVMF 的文档或官方网站来获取准确的编译命令。 根据编译命令的要求,执行相应的编译命令,等待编译过程完成。编译过程可能需要一定的时间,取决于计算机性能和源代码的复杂度。 一旦编译完成,我们可以在指定的目录中找到生成的 OVMF 可执行文件。该文件就是编译生成的 OVMF。 最后,我们可以将生成的 OVMF 可执行文件用于相应的应用,如虚拟机管理器(例如 QEMU、VirtualBox)中来运行 UEFI 镜像。 总结来说,编译生成 OVMF 需要下载 OVMF 源代码,解压缩,进入命令行终端,执行编译命令,等待编译完成,并获取生成的 OVMF 可执行文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值