博主头像

人間になりたい!!!!!


皖ICP备2025096275号

记录一则给 OrangePi 3B (RK3566) 编译 UEFi 固件的经历

前言

就在前几天 (2026-08-05), Proxmox VE 官方宣布了对 Arm64 平台的支持. 这使得我想起了实验室学长们送我的那块 OrangePi 3B 开发板, 索性尝试使用这块开发板来启动 Proxmox VE 原生的 iso 映像文件. 由于 Proxmox VE 官方提供的映像文件是需要使用 efi 启动的, 查了一圈发现没有专门给 OrangePi 3B 编译的 UEFI 固件, 索性自己尝试编译

本文操作环境

       _,met$$$$$gg.             nanami114@VM-Main 
    ,g$$$$$$$$$$$$$$$P.          ----------------- 
  ,g$$P"        """Y$$.".        OS: Debian GNU/Linux 13.4 (trixie) x86_64 
 ,$$P'              `$$$.        Host: KVM/QEMU (Standard PC (i440FX + PIIX, 1996) pc-i440fx-11.0) 
',$$P       ,ggs.     `$$b:      Kernel: 6.12.74+deb13+1-amd64 
`d$$'     ,$P"'   .    $$$       Uptime: 29 days, 3 hours, 15 mins 
 $$P      d$'     ,    $$P       Packages: 3 (npm), 1526 (dpkg) 
 $$:      $$.   -    ,d$$'       Shell: bash 5.2.37 
 $$;      Y$b._   _,d$P'         Resolution: 1280x800 
 Y$$.    `.`"Y$$$$P"'            Terminal: /dev/pts/1 
 `$$b      "-.__                 CPU: Intel Xeon E5-2696 v4 (44) @ 2.1GHz 
  `Y$$                           GPU: Vendor 1234 Device 1111 
   `Y$$.                         Memory: 20.74 GiB / 31.33 GiB (66%) 
     `$$b.                       Network: Unknown 
       `Y$$b.                    BIOS: SeaBIOS 0.0 (04/01/2014) 
          `"Y$b._
              `"""                                       
                                                         

开整

1. 编译 UEFI

1.1 准备材料

  • 在 Github 中有一个叫做 quartz64_uefi 的项目专门给 RK356X 的平台适配了 UEFI, 所以我们可以从这里入手. 首先 clone 该仓库

    git clone https://github.com/jaredmcneill/quartz64_uefi
  • 查看项目结构, 发现项目中已经包含了专门为 Orange Pi 3B 的 platform, device tree, drivers 等, 并且 build.sh 中也有适用于 OrangePi 3B 的构建流程. 所以这里可以尝试直接构建

    for board in ${RKUEFIBOARDS}; do
          case ${board} in
          QUARTZ64)
                  build_uefi Pine64 Quartz64
                  build_fit Quartz64 rk3566-quartz64-a
                  ;;
          SOQUARTZ)
                  build_uefi Pine64 SOQuartz
                  build_fit SOQuartz rk3566-soquartz-cm4
                  ;;
          ROC-RK3566-PC)
                  build_uefi Firefly ROC-RK3566-PC
                  build_fit ROC-RK3566-PC rk3566-roc-pc
                  ;;
          ROC-RK3568-PC)
                  build_uefi Firefly ROC-RK3568-PC
                  build_fit ROC-RK3568-PC rk3568-firefly-roc-pc
                  ;;
    # OrangePi 3B Here...
          ORANGEPI3B)
                  build_uefi OrangePi OrangePi3B
                  build_fit OrangePi3B rk3566-orangepi-3b
                  ;;
          PINETAB2)
                  build_uefi Pine64 PineTab2
                  build_fit PineTab2 rk3566-pinetab2
                  ;;
          ZERO-3W)
                  build_uefi Radxa Zero-3W
                  build_fit Zero-3W rk3566-radxa-zero-3w
                  ;;
          ODROID-M1S)
                  build_uefi HardKernel Odroid-M1S
                  build_fit Odroid-M1S rk3566-hardkernel-odroid-m1s
                  ;;
          *)
                  echo "Unknown board ${board}"
                  exit 1
                  ;;
          esac
    done

1.2 检查环境

  • 检查 Git 子模块状态

    git submodule status

    如果你当前所处的目录属主与当前执行的用户不一致, 则 Git 会报错 dubious ownership, 此时执行这条指令添加信任

    git config --global --add safe.directory path/to/quartz64_uefi
  • 检查编译工具链
    由于博主这里是在 amd64 架构的设备上去编译 arm64 的固件, 故这里需要配置交叉编译工具链.
    我们从官方 CI 配置文件中提取依赖清单并安装

    cat .github/workflows/build.yml

    从这份配置文件中我们可以得到官方构建所需要的所有依赖, 分别为 gcc-aarch64-linux-gnu iasl device-tree-compiler python3-pyelftools uuid-dev. 这里我们直接安装

    sudo apt-get update
    sudo apt-get install -y --no-install-recommends gcc-aarch64-linux-gnu iasl device-tree-compiler python3-pyelftools uuid-dev
  • 检查 edk2-rockchip 目录性质

    git -C ed2k-rockchip rev-parse HEAD
    ls edk2-rockchip/.git
    git ls-files | grep edk2-rockchip

    执行完后我们可以发现, 项目里 edk2-rockchip/edk2-rockchip-non-osi/rkbin/ 是 platform 代码和 Rockchip 官方 vendor 组件 (DDR 初始化固件, BL31, OP-TEE, boot_merger/ddrbin_tool 工具). 我们需要确认它们是 submodule 还是直接打进 git 的:

    • .git 文件不存在, 同时 git ls-files 显示 234 个文件被直接跟踪. 因此得出它们是 vendored 进主仓库的, 我们只需要克隆主仓库就齐了.
    • 只有 edk2 是真正的 submodule, 因此只有 edk2 需要单独初始化.

1.3 初始化编译环境

  • 这里我们更新并初始化所有 submodule

    git submodule update --init --recursive
    • --rescursive 的作用是连带嵌套 submodule 一起克隆 edk2 自己还有 cmocka/googletest/subhook 等测试框架子模块
    • edk2 是一个 200MB+ 的大仓库, 这里更新需要拥有一个稳定的网络环境.

1.4 尝试编译

  • 使用 make 工具启动构建

    make BOARDS=ORANGEPI3B uefi
    这里通常只需要等待几分钟, 如果编译时间过长请检查之前的动作有没有问题
  • 编译完成后, 使用 make 编译一个可烧录进 SD 卡的映像文件

    make BOARDS=ORANGEPI3B sdcard
    这里需要提前安装 parted, 否则会报错
  • 编译完成后我们会得到一份 ORANGEPI3B_EFI.img 文件, 这份文件可以直接烧录进 SD 卡尝试启动.

2. 启动 UEFI

2.1 烧录

使用 Win32DiskImagerORANGEPI3B_EFI.img 烧录至 SD 卡即可.

2.2 启动

重启之后会看到 Orange Pi 的 Logo, 还有 tianocore 项目的文字. 如果没有插入任何启动设备, 则会自动进入 BIOS.

据了解, 在以前的版本中, 只有 USB3.0 处于可用状态. 但这里博主编译的版本, 四个 USB-A 接口都处于可用状态.

2.3 烧录系统

这里可以使用 UltraISO 之类的软件, 将可启动映像烧录至 U 盘等存储介质中, 然后直接上电启动, UEFI 会自动引导到您的安装介质.

至此, 整个 UEFI 编译及烧录过程就结束了.


结语

本人并非专业人士, 如有错误或疏漏请指出, 谢谢!

附件

ORANGEPI3B_EFI.zip

记录一则给 OrangePi 3B (RK3566) 编译 UEFi 固件的经历
https://blog.nanami.tech/archives/363/
本文作者 Madobi Nanami
发布时间 2026-08-09
许可协议 CC BY-NC-SA 4.0
发表新评论