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