更新 rockchip 及其他开发板的 openEuler 构建说明,添加全志及飞腾 u-boot 说明。
This commit is contained in:
parent
7a1f09cd15
commit
91e7d64d51
@ -1,8 +1,10 @@
|
||||
- [描述](#描述)
|
||||
- [准备编译环境](#准备编译环境)
|
||||
- [编译 u-boot 启动文件](#编译-u-boot-启动文件)
|
||||
- [编译 RK3399 u-boot](#编译-rk3399-u-boot)
|
||||
- [编译 RK356x/RK3588 u-boot](#编译-rk356xrk3588-u-boot)
|
||||
- [编译 U-Boot 启动文件](#编译-u-boot-启动文件)
|
||||
- [编译 RK3399 U-Boot](#编译-rk3399-u-boot)
|
||||
- [编译 RK356x/RK3588 U-Boot](#编译-rk356xrk3588-u-boot)
|
||||
- [编译 H616/H618 U-Boot](#编译-h616h618-u-boot)
|
||||
- [关于 PhytiumPi U-Boot](#关于-phytiumpi-u-boot)
|
||||
- [基于 openEuler 内核编译内核镜像](#基于-openeuler-内核编译内核镜像)
|
||||
- [编译内核代码](#编译内核代码)
|
||||
- [构建 boot 镜像](#构建-boot-镜像)
|
||||
@ -23,7 +25,7 @@
|
||||
- [设置 boot 分区为可启动](#设置-boot-分区为可启动)
|
||||
- [使用 losetup 将磁盘镜像文件虚拟成块设备](#使用-losetup-将磁盘镜像文件虚拟成块设备)
|
||||
- [使用 kpartx 创建分区表 /dev/loop0 的设备映射](#使用-kpartx-创建分区表-devloop0-的设备映射)
|
||||
- [写入 u-boot](#写入-u-boot)
|
||||
- [写入 U-Boot](#写入-u-boot)
|
||||
- [格式化分区](#格式化分区)
|
||||
- [创建要挂载的根目录和 boot 分区路径](#创建要挂载的根目录和-boot-分区路径)
|
||||
- [挂载根目录和 boot 分区](#挂载根目录和-boot-分区)
|
||||
@ -38,11 +40,11 @@
|
||||
|
||||
# 描述
|
||||
|
||||
本文档介绍如何构建适用于 Rockchip 开发板的 openEuler 镜像。
|
||||
本文档介绍如何构建适用于 Rockchip、Allwinner 以及 Phytium 开发板的 openEuler 镜像。
|
||||
|
||||
# 准备编译环境
|
||||
|
||||
1. 系统要求。
|
||||
1. 系统要求
|
||||
- 操作系统:openEuler
|
||||
- 架构:AArch64
|
||||
|
||||
@ -60,9 +62,9 @@
|
||||
cd $WORKDIR
|
||||
```
|
||||
|
||||
# 编译 u-boot 启动文件
|
||||
# 编译 U-Boot 启动文件
|
||||
|
||||
## 编译 RK3399 u-boot
|
||||
## 编译 RK3399 U-Boot
|
||||
|
||||
1. 下载源码
|
||||
|
||||
@ -78,7 +80,7 @@
|
||||
wget -O bl31.elf https://github.com/rockchip-linux/rkbin/raw/master/bin/rk33/rk3399_bl31_v1.35.elf
|
||||
```
|
||||
|
||||
3. 编译 u-boot
|
||||
3. 编译 U-Boot
|
||||
|
||||
```
|
||||
make ARCH=arm firefly-rk3399_defconfig
|
||||
@ -96,18 +98,18 @@
|
||||
cd $WORKDIR
|
||||
```
|
||||
|
||||
## 编译 RK356x/RK3588 u-boot
|
||||
## 编译 RK356x/RK3588 U-Boot
|
||||
|
||||
1. 下载源码
|
||||
|
||||
- 如果是 RK3566/RK3568 开发板,执行以下命令来下载 u-boot 源码,以 `Firefly ROC-RK3566-PC` 和 `Firefly ROC-RK3568-PC-SE` 为例,使用 Firefly 的 u-boot 源码:
|
||||
- RK3566/RK3568 开发板:以 `Firefly ROC-RK3566-PC` 和 `Firefly ROC-RK3568-PC-SE` 为例,下载其官方提供的 U-Boot 源码:
|
||||
|
||||
```
|
||||
cd $WORKDIR
|
||||
git clone --branch rk356x/firefly-5.10 --depth=1 https://gitlab.com/firefly-linux/u-boot.git
|
||||
```
|
||||
|
||||
- 如果是 RK3588 开发板,执行以下命令来下载 u-boot 源码,以 `Firefly ROC-RK3588S-PC` 为例,使用 Firefly 的 u-boot 源码:
|
||||
- RK3588 开发板:以 `Firefly ROC-RK3588S-PC` 为例,下载其官方提供的 U-Boot 源码:
|
||||
|
||||
```
|
||||
cd $WORKDIR
|
||||
@ -121,27 +123,27 @@
|
||||
git clone --depth=1 https://github.com/rockchip-linux/u-boot.git -o 7c35e21a8529b3758d1f051d1a5dc62aae934b2b --recursive --depth=1
|
||||
```
|
||||
|
||||
3. 编译 u-boot
|
||||
3. 编译 U-Boot
|
||||
|
||||
- 如果是 RK3566/RK3568 开发板,执行以下命令来编译 u-boot 源码,以 `Firefly ROC-RK3566-PC` 和 `Firefly ROC-RK3568-PC-SE` 为例,使用 Firefly 的 u-boot 源码:
|
||||
- RK3566/RK3568 开发板:以 `Firefly ROC-RK3566-PC` 和 `Firefly ROC-RK3568-PC-SE` 为例,使用其官方的 U-Boot 源码进行编译:
|
||||
|
||||
```
|
||||
make ARCH=arm rk3568_defconfig
|
||||
make ARCH=arm -j$(nproc)
|
||||
```
|
||||
|
||||
注意:这里 Firefly 的 u-boot 源码中的 `rk3568_defconfig` u-boot 配置文件中指定的 `rk3568-evb.dts` 仅保证可用于 Firefly 的 RK3566/RK3568 设备:
|
||||
注意:这里 Firefly 的 U-Boot 源码中的 `rk3568_defconfig` U-Boot 配置文件中指定的 `rk3568-evb.dts` 仅保证可用于 Firefly 的 RK3566/RK3568 设备:
|
||||
|
||||
https://gitlab.com/firefly-linux/u-boot/-/blob/rk356x/firefly-5.10/configs/rk3568_defconfig?ref_type=heads#L21
|
||||
|
||||
- 如果是 RK3588 开发板,执行以下命令来编译 u-boot 源码,以 `Firefly ROC-RK3588S-PC` 为例,使用 Firefly 的 u-boot 源码:
|
||||
- RK3588 开发板:以 `Firefly ROC-RK3588S-PC` 为例,使用其官方的 U-Boot 源码进行编译:
|
||||
|
||||
```
|
||||
make ARCH=arm rk3588_defconfig
|
||||
make ARCH=arm -j$(nproc)
|
||||
```
|
||||
|
||||
注意:这里 Firefly 的 u-boot 源码中的 `rk3588_defconfig` u-boot 配置文件中指定的 `rk3588-evb.dts` 仅保证可用于 Firefly 的 RK3588 设备:
|
||||
注意:这里 Firefly 的 U-Boot 源码中的 `rk3588_defconfig` U-Boot 配置文件中指定的 `rk3588-evb.dts` 仅保证可用于 Firefly 的 RK3588 设备:
|
||||
|
||||
https://gitlab.com/firefly-linux/u-boot/-/blob/rk3588/firefly/configs/rk3588_defconfig?ref_type=heads#L23
|
||||
|
||||
@ -282,6 +284,91 @@
|
||||
cd $WORKDIR
|
||||
```
|
||||
|
||||
## 编译 H616/H618 U-Boot
|
||||
|
||||
1. 下载源码
|
||||
|
||||
1. 下载 Arm Trusted Firmware 源码
|
||||
|
||||
```
|
||||
git clone --depth=1 https://github.com/ARM-software/arm-trusted-firmware.git -b lts-v2.10.26
|
||||
```
|
||||
|
||||
2. 下载 U-Boot 源码
|
||||
|
||||
U-Boot 版本参考 [Sipeed 官方构建仓库使用的版本](https://github.com/sipeed/LonganPi-3H-SDK/blob/main/mkuboot.sh#L26C2-L26C55)
|
||||
|
||||
```
|
||||
git clone https://github.com/u-boot/u-boot.git
|
||||
git checkout da2e3196e4dc28298b58a018ace07f85eecd1652
|
||||
```
|
||||
|
||||
2. 下载并应用 U-Boot 补丁
|
||||
|
||||
对于 LonganPi 3H,U-Boot 需要打补丁才能正常工作,OrangePi Zero 2 则不需要。
|
||||
|
||||
从以下位置下载补丁:
|
||||
|
||||
https://github.com/sipeed/LonganPi-3H-SDK/tree/main/uboot
|
||||
|
||||
将补丁放在与 `u-boot` 以及 `arm-trusted-firmware` 同一级的文件夹 `u-boot-patch` 文件夹中,使用以下命令来应用补丁:
|
||||
|
||||
```
|
||||
cd u-boot
|
||||
find ../u-boot-patch/ -name *.patch | sort | while read line
|
||||
do
|
||||
git am < $line
|
||||
done
|
||||
```
|
||||
|
||||
3. 编译 Arm Trusted Firmware
|
||||
|
||||
```
|
||||
cd ..
|
||||
cd arm-trusted-firmware
|
||||
|
||||
make PLAT=sun50i_h616 bl31
|
||||
cp build/sun50i_h616/release/bl31.bin ../
|
||||
```
|
||||
|
||||
此处的参数 `PLAT=sun50i_h616` 指定平台为 `H616` 以及 `H618`。
|
||||
|
||||
4. 编译 U-Boot
|
||||
|
||||
1. 应用 U-boot 配置
|
||||
|
||||
- LonganPi 3H
|
||||
|
||||
```
|
||||
make ARCH=arm64 longanpi_3h_defconfig
|
||||
```
|
||||
|
||||
- OrangePi Zero 2
|
||||
|
||||
```
|
||||
make ARCH=arm64 orangepi_zero2_defconfig
|
||||
```
|
||||
|
||||
2. 编译 u-boot-sunxi-with-spl.bin
|
||||
|
||||
```
|
||||
export BL31=$(pwd)/../bl31.bin
|
||||
make ARCH=arm64 -j$(nproc)
|
||||
```
|
||||
|
||||
5. 收集编译结果
|
||||
|
||||
将生成的 idbloader.img 和 u-boot.itb 文件复制到工作目录。
|
||||
|
||||
```
|
||||
cp u-boot-sunxi-with-spl.bin $WORKDIR
|
||||
cd $WORKDIR
|
||||
```
|
||||
|
||||
## PhytiumPi U-Boot
|
||||
|
||||
PhytiumPi U-Boot 不开源,所使用的预编译二进制文件来自于 `飞腾嵌入式软件部` 开源仓库:<https://gitee.com/phytium_embedded/phytium-rogue-umlibs/tree/develop/phyuboot>
|
||||
|
||||
# 基于 openEuler 内核编译内核镜像
|
||||
|
||||
## 编译内核代码
|
||||
@ -580,7 +667,7 @@ dnf --installroot=$WORKDIR/rootfs/ install -y alsa-utils wpa_supplicant vim net-
|
||||
|
||||
```
|
||||
cd $WORKDIR
|
||||
dd if=/dev/zero of=openeuler-rk3399.img bs=1MiB count=3072 status=progress && sync
|
||||
dd if=/dev/zero of=openeuler.img bs=1MiB count=3072 status=progress && sync
|
||||
```
|
||||
|
||||
注意:这里创建了一个大小为3G的文件,可以根据实际情况适当调整。
|
||||
@ -589,52 +676,40 @@ dnf --installroot=$WORKDIR/rootfs/ install -y alsa-utils wpa_supplicant vim net-
|
||||
|
||||
#### 创建分区表
|
||||
|
||||
`parted openeuler-rk3399.img mktable gpt`
|
||||
1. Rockchip 或 Phytium 开发板:使用 GPT 分区表
|
||||
|
||||
`parted openeuler.img mktable gpt`
|
||||
|
||||
2. Allwinner 开发板:使用 MBR(MS-DOS) 分区表
|
||||
|
||||
`parted openeuler.img mktable msdos`
|
||||
|
||||
#### 镜像分区
|
||||
|
||||
执行 `fdisk openeuler-rk3399.img` 后,根据提示依次输入:
|
||||
执行 `fdisk openeuler.img` 后,根据提示依次输入:
|
||||
|
||||
1. 输入 p,查看分区信息,可以看到当前无分区。
|
||||
2. 输入 n,创建 idbloader 分区。
|
||||
2. 输入 n,创建 boot 分区。
|
||||
3. 输入 p 或直接按 Enter,创建 Primary 类型的分区。
|
||||
4. 输入 1 或直接按 Enter,创建序号为 1 的分区。
|
||||
5. 输入 64,输入第一个分区的起始扇区号。
|
||||
6. 输入 16383,输入第一个分区的末尾扇区号。
|
||||
7. 输入 p,查看当前分区情况,可以看到当前有一个分区。
|
||||
8. 输入 n,创建 u-boot 分区。
|
||||
5. 输入 32768,输入第一个分区的起始扇区号。
|
||||
6. 输入 262143,输入第一个分区的末尾扇区号。
|
||||
7. 输入 p,查看当前分区情况,可以看到当前有 1 个分区。
|
||||
8. 输入 n,创建 root 分区。
|
||||
9. 输入 p 或直接按 Enter,创建 Primary 类型的分区。
|
||||
10. 输入 2 或直接按 Enter,创建序号为 2 的分区。
|
||||
11. 输入 16384,输入第二个分区的起始扇区号。
|
||||
12. 输入 24575,输入第二个分区的末尾扇区号。
|
||||
13. 输入 p,查看当前分区情况,可以看到当前有两个分区。
|
||||
14. 输入 n,创建 trust 分区。
|
||||
15. 输入 p 或直接按 Enter,创建 Primary 类型的分区。
|
||||
16. 输入 3 或直接按 Enter,创建序号为 3 的分区。
|
||||
17. 输入 24576,输入第二个分区的起始扇区号。
|
||||
18. 输入 32767,输入第二个分区的末尾扇区号。
|
||||
19. 输入 p,查看当前分区情况,可以看到当前有三个分区。
|
||||
20. 输入 n,创建 boot 分区。
|
||||
21. 输入 p 或直接按 Enter,创建 Primary 类型的分区。
|
||||
22. 输入 4 或直接按 Enter,创建序号为 4 的分区。
|
||||
23. 输入 32768,输入第二个分区的起始扇区号。
|
||||
24. 输入 262143,输入第二个分区的末尾扇区号。
|
||||
25. 输入 p,查看当前分区情况,可以看到当前有四个分区。
|
||||
26. 输入 n,创建 root 分区。
|
||||
27. 输入 p 或直接按 Enter,创建 Primary 类型的分区。
|
||||
28. 输入 5 或直接按 Enter,创建序号为 5 的分区。
|
||||
29. 输入 262144,输入第三个分区的起始扇区号。
|
||||
30. 按 Enter,输入第三个分区的末尾扇区号,使用最后一个扇区号作为第五个分区的末尾扇区号。
|
||||
31. 输入 p,查看当前分区情况,可以看到当前有五个分区。
|
||||
32. 输入 w,写入并退出。
|
||||
11. 输入 262144,输入第二个分区的起始扇区号。
|
||||
12. 按 Enter,输入第二个分区的末尾扇区号,使用最后一个扇区号作为第二个分区的末尾扇区号。
|
||||
13. 输入 p,查看当前分区情况,可以看到当前有 2 个分区。
|
||||
14. 输入 w,写入并退出。
|
||||
|
||||
#### 设置 boot 分区为可启动
|
||||
|
||||
`parted openeuler-rk3399.img -s set 4 boot on`
|
||||
`parted openeuler -s set 1 boot on`
|
||||
|
||||
## 使用 losetup 将磁盘镜像文件虚拟成块设备
|
||||
|
||||
`losetup -f --show openeuler-rk3399.img`
|
||||
`losetup -f --show openeuler.img`
|
||||
|
||||
例如,显示结果为 /dev/loop0。
|
||||
|
||||
@ -642,40 +717,59 @@ dnf --installroot=$WORKDIR/rootfs/ install -y alsa-utils wpa_supplicant vim net-
|
||||
|
||||
`kpartx -va /dev/loop0`
|
||||
|
||||
得到结果将 /dev/loop0 五个分区挂载了:
|
||||
得到结果将 /dev/loop0 两个分区挂载了:
|
||||
```
|
||||
add map loop0p1 ...
|
||||
add map loop0p2 ...
|
||||
add map loop0p3 ...
|
||||
add map loop0p4 ...
|
||||
add map loop0p5 ...
|
||||
```
|
||||
|
||||
运行 `ls /dev/mapper/loop0p*` 可以看到分区分别对应刚才为 openeuler-rk3399.img 做的五个分区:
|
||||
运行 `ls /dev/mapper/loop0p*` 可以显示 openeuler.img 的两个分区:
|
||||
|
||||
```
|
||||
/dev/mapper/loop0p1 /dev/mapper/loop0p2 /dev/mapper/loop0p3 /dev/mapper/loop0p4 /dev/mapper/loop0p5
|
||||
/dev/mapper/loop0p1 /dev/mapper/loop0p2
|
||||
```
|
||||
|
||||
## 写入 u-boot
|
||||
## 写入 U-Boot
|
||||
|
||||
1. 写入 idbloader.img。
|
||||
### Rockchip 开发板
|
||||
|
||||
`dd if=idbloader.img of=/dev/mapper/loop0p1`
|
||||
1. 写入 idbloader.img
|
||||
|
||||
2. 写入 u-boot.itb。
|
||||
`dd if=idbloader.img of=/dev/loop0 seek=64`
|
||||
|
||||
`dd if=u-boot.itb of=/dev/mapper/loop0p2`
|
||||
2. 写入 u-boot.itb
|
||||
|
||||
`dd if=u-boot.itb of=/dev/loop0 seek=16384`
|
||||
|
||||
### Allwinner 开发板
|
||||
|
||||
写入 u-boot-sunxi-with-spl.bin
|
||||
|
||||
`dd if=u-boot-sunxi-with-spl.bin of=/dev/loop0 seek=8k`
|
||||
|
||||
### Phytium 开发板
|
||||
|
||||
1. 因为 fip-all-sd-boot.bin 自带分区表,写入会破坏以上步骤创建的分区表,所以需要备份分区表
|
||||
|
||||
`sfdisk --dump /dev/loop0 > part.txt`
|
||||
|
||||
2. 写入 fip-all-sd-boot.bin
|
||||
|
||||
`dd if=fip-all-sd-boot.bin of=/dev/loop0`
|
||||
|
||||
3. 恢复分区表
|
||||
|
||||
`sfdisk --no-reread /dev/loop0 < part.txt`
|
||||
|
||||
## 格式化分区
|
||||
|
||||
1. 格式化 boot 分区
|
||||
|
||||
`mkfs.vfat -n boot /dev/mapper/loop0p4`
|
||||
`mkfs.vfat -n boot /dev/mapper/loop0p1`
|
||||
|
||||
3. 格式化 root 分区
|
||||
|
||||
`mkfs.ext4 /dev/mapper/loop0p5`
|
||||
`mkfs.ext4 /dev/mapper/loop0p2`
|
||||
|
||||
## 创建要挂载的根目录和 boot 分区路径
|
||||
|
||||
@ -683,17 +777,17 @@ add map loop0p5 ...
|
||||
|
||||
## 挂载根目录和 boot 分区
|
||||
|
||||
`mount -t vfat -o uid=root,gid=root,umask=0000 /dev/mapper/loop0p4 $WORKDIR/bootp/`
|
||||
`mount -t vfat -o uid=root,gid=root,umask=0000 /dev/mapper/loop0p1 $WORKDIR/bootp/`
|
||||
|
||||
`mount -t ext4 /dev/mapper/loop0p5 $WORKDIR/rootp/`
|
||||
`mount -t ext4 /dev/mapper/loop0p2 $WORKDIR/rootp/`
|
||||
|
||||
## 获取生成的 img 镜像的 blkid
|
||||
|
||||
执行命令 blkid 得到三个分区的 UUID,例如:
|
||||
执行命令 blkid 得到两个分区的 UUID,例如:
|
||||
```
|
||||
...
|
||||
/dev/mapper/loop0p4: SEC_TYPE="msdos" LABEL="boot" UUID="2785-C7C3" TYPE="vfat" PARTUUID="e0a091bd-04"
|
||||
/dev/mapper/loop0p5: UUID="67b5fc1c-9cd3-4884-968c-4ca35e5ae154" TYPE="ext4" PARTUUID="e0a091bd-05"
|
||||
/dev/mapper/loop0p1: SEC_TYPE="msdos" LABEL="boot" UUID="2785-C7C3" TYPE="vfat" PARTUUID="e0a091bd-04"
|
||||
/dev/mapper/loop0p2: UUID="67b5fc1c-9cd3-4884-968c-4ca35e5ae154" TYPE="ext4" PARTUUID="e0a091bd-05"
|
||||
```
|
||||
|
||||
## 修改 fstab
|
||||
@ -732,6 +826,6 @@ UUID=2785-C7C3 /boot vfat defaults,noatime 0 0
|
||||
|
||||
`losetup -d /dev/loop0`
|
||||
|
||||
这样,最终就生成了需要的 openeuler-rk3399.img 镜像文件。
|
||||
这样,最终就生成了需要的 openeuler.img 镜像文件。
|
||||
|
||||
之后就可以使用镜像刷写 SD 卡并使用 Firefly-RK3399 了。
|
||||
之后就可以使用生成镜像刷写 SD 卡并使用 openEuler 了。
|
||||
Loading…
x
Reference in New Issue
Block a user