EDK2编译记录

2023-11-02

  • 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做的镜像的确是不错,各种功能都开齐全了,可以玩。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EDK2编译记录 的相关文章

随机推荐

  • PAT题库代码(个人版本)~~持续更新,持续改进!

    引言 之前在网上看到浙江大学的题目系统PAT 想要刷一刷玩 目前是乙级题库 题目不多 持续更新 努力 话不多说 上代码 题目以及运行效果这里就不给出了 与PAT网站上的相同 1002 写出这个数 include
  • CMOS到触发器(一)

    1 MOS晶体管结构与工作原理简述 我们或多或少知道 晶体管在数字电路中的主要作用就是一个电子开关 通过电压或者电流 控制这个 开关 开还是关 晶体管大概有两种分类 一种是双极性晶体管 BJT bipolar junction transi
  • AJAX模拟Form表单上传

    当前端上传图片的时候 需要传递给后端的是一个file对象 而不是一个路径 而files就是包含了图片的所有设置 包括大小 类型 内容等等 var xxx this container find xxx 0 files 将jquery转换成d
  • IDEA主菜单栏不小心按消失了的解决方法

    如图所示 这两行的消失解决方法如下 第一行 在代码区按两下shift键 出现搜索栏 在搜索栏里输入view 如下 这里没有找到Main Menu 点击左下方的很小的more 显示如下 找到Main Menu 点击使其变为ON即可 第二行 点
  • 【C++】map/multimap容器

    1 map基本概念 2 map构造和赋值 include
  • numpy如何将数组元素全部输出,不折叠展示!

    在print之前添加 np set printoptions threshold np inf 将数组的元素全部打印出来 添加前 添加后
  • 本网站服务器。。。。。。。。这句话是什么意思呢?

    网站一般是建立在服务器中 服务器一般是由中央机房管理 所以中央机房在哪个国家地区 一般是由当地的政府进行管理 其他的地方暂时无法管理 今天我们在分享一些写真壁纸 更多写真壁纸 可以关注公众号 优星馆
  • python导入模块的变量,使用python中的变量导入模块

    本问题已经有最佳答案 请猛点这里访问 我有一个即时导入模块的脚本 由于模块名称会在新版本出现时立即更改 因此很难检查脚本中的特定模块名称是否也发生了更改 因此 我将模块名保存在脚本顶部的变量中 如本例中所示 var1 moduleName1
  • 我接手前同事写的烂Java代码,不小心搞出了一个内存泄露事故

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 String 字符串在内存里是如何存储的 String intern 方法 String 字符串是如何引发内存泄漏呢 总结 今天给大家聊聊咱们平时写代码的时候
  • 【python】12.比较运算符与逻辑运算符

    比较运算符 运算符 描述 示例 判断相等 如果两个操作数的结果相等 则条件结果为真 True 否则条件结果为假 False a 3 b 3 则 a b 为True 不相等 如果两个操作数的结果不相等 则条件结果为真 True 否则条件结果为
  • Springbot启动报错-类文件具有错误的版本 61.0, 应为 52.0

    这是由于Spring6以及SprinBoot3 0开始最低支持JDK17 所以如果springboot版本设置过高 而jdk过低的话 就会报该错误 可以降低springboot或是提高jdk版本 降低springboot方式如下 打开pom
  • 【xshell】xshell 自动换行设置

    1 概述 linux连接终端使用从putty切换到xshell时 发现xshell中在显示长文本时不会自动换行 甚是郁闷 查看官方文档 解决方法为启用xshell中VT模式下的Auto Wrap Mode 搞定 如下图 初始VT模式 Aut
  • RTThread中falut定位方法

    RTThread中fault定位方法 在 RTThread中HardFault Handler分析 一文中已经分析了RTThread中对于fault中断的处理方法 接下来讲解如何根据错误输出信息对程序出现fault的位置进行定位 rtthr
  • Python基础(list列表的扩展方式和dict的用法)

    一 list列表扩展的方式有几种 或者说添加元素的方法 1 append 将对象追加到列表中最后一个元素的末尾 2 extend 通过从可选对象追加元素来扩展列表 3 insert 在索引前插入对象 以此来扩展列表 二 对 cherry l
  • 车与羊的选择

    电影 决胜21点 开始部分 课堂上教授问了这样一个问题 假设你正在参加一个电视游戏节目 被要求在三扇门中选择一扇 其中一扇后面有一辆车 其余两扇后面则是羊 你选择了一扇门 假设是1号门 这时候不知什么原因 主持人 他知道各个门后面都有什么
  • Typec协议之PD通信消息详解一

    Messages 消息由消息头和可变长度 包括零 数据部分组成 消息 头 数据 格式如下图 1 只包含头消息 其它为PHY Layer 2 包含消息头和数据消息 3 包含消息头和数据消息 和扩展的消息 Message Header 从表中可
  • 学习笔记--Verilog HDL高级数字设计--第六章组合逻辑与时序逻辑的综合

    组合逻辑与时序逻辑的综合 综合引擎能够自动完成一组布尔函数的最简化 并将结果映射成能满足设计目标的硬件实现 转换 优化 映射 本章将介绍如何编写易于综合的Verilog模型 综合工具完成的工作 1 检测并消除冗余项 2 查找组合反馈环路 3
  • 模糊c均值聚类_模式识别:K均值算法&模糊c均值算法的应用

    1 背景介绍 在实际应用场景中我们会遇见很多无监督分类的任务 样本不具有类别标注 我们无法通过有监督学习设计分类器 基于样本间相似性度量的聚类方法是无监督学习的重要组成部分 一般来说 聚类准则是根据样本之间的距离或相似程度来定义的 通常将相
  • mysql死锁问题分析

    线上某服务时不时报出如下异常 大约一天二十多次 Deadlock found when trying to get lock Oh My God 是死锁问题 尽管报错不多 对性能目前看来也无太大影响 但还是需要解决 保不齐哪天成为性能瓶颈
  • EDK2编译记录

    EDK2 EDK2 PLATFORM EDK2 NON OSI 以上三个仓库 EDK2是主仓库 EDK2 PLATFORM是和EDK2版本对应的板子和CPU相关的仓库 比如树莓派的就在这个里面 EDK2 NON OSI是有一些license