ubuntu20.04 构建环境安装
1
2
3
4
5
6
7
8
sudo apt install -y make vim
sudo apt install -y ccache debian-archive-keyring debootstrap device-tree-compiler dwarves
sudo apt install -y gcc-arm-linux-gnueabihf jq libbison-dev libc6-dev-armhf-cross
sudo apt install -y libelf-dev libfl-dev liblz4-tool libpython2.7-dev libusb-1.0-0-dev
sudo apt install -y pigz pixz pv swig pkg-config python3-distutils qemu-user-static u-boot-tools
sudo apt install -y distcc uuid-dev lib32ncurses-dev lib32stdc++6 apt-cacher-ng
sudo apt install -y aptly aria2 libfdt-dev libssl-dev
sudo apt install -y build-essential libncurses-dev bison flex
aarch64-none-linux-gnu-gcc交叉编译工具安装:
- 解压arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar
1
tar -xJvf arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
- 配置环境变量
1
2
cd ~
vim .bashrc
- 在结尾添加
1
2
export PATH=$PATH:<path>/arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu/bin/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<path>/arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu/lib/
path : arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz 解压路径
- 测试
1
aarch64-none-linux-gnu-gcc -v
sunxi-fel 工具安装:
1
2
3
4
5
tar -xvf sunxi-tools.tar
cd sunxi-tools
make
cd ~
vim .bashrc
- 在结尾添加
1
export PATH=$PATH:<path>/sunxi-tools/
path : sunxi-tools.tar 解压路径
编译 Arm Trusted Firmware (arm64)
1
2
3
tar -xvf arm-trusted-firmware.tar
cd arm-trusted-firmware
make CROSS_COMPILE=aarch64-none-linux-gnu- DEBUG=1 bl31
编译 u-boot
1
2
3
4
tar -xvf u-boot.tar
cd u-boot
make CROSS_COMPILE=aarch64-none-linux-gnu- ARCH=arm64 BL31=bl31.bin h616_defconfig
make CROSS_COMPILE=aarch64-none-linux-gnu- BL31=bl31.bin -j12
测试u-boot
1
sudo sunxi-fel uboot u-boot-sunxi-with-spl.bin
编译 linux-kernel
1
2
3
4
make CROSS_COMPILE=aarch64-none-linux-gnu- ARCH=arm64 defconfig
make menuconfig
- 选择平台
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-> Platform selection
[*] Allwinner sunxi 64-bit SoC Family #只勾选这个
#其他的全部取消勾选
-> Boot options
[ ] UEFI runtime support #取消勾选
-> Device Drivers
-> I2C support
-> I2C support
-> I2C Hardware Bus
< > Marvell mv64xxx I2C Controller #取消勾选
< > Rockchip RK3xxx I2C adapter
< > ChromeOS EC tunnel I2C bus
-> Kernel Features
[ ] NUMA Memory Allocation and Scheduler Support
制作启动盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 进入磁盘管理
fdisk /dev/sda
# 多执行几次删除所有分区
d
# 新建分区 (扇区为单位,前面空开1MB用于存放uboot,制作200MB的分区)
n
p
2048
+200M
n
p
w
# 进行 FAT 格式化
sudo mkfs.fat /dev/sda1
sudo mkfs.ext4 /dev/sda2
# 写入 uboot 到 8KB 的位置
sudo dd if=./u-boot/u-boot-sunxi-with-spl.bin of=/dev/sda bs=8K seek=1
# 挂载 FAT 文件系统
sudo mount /dev/sda1 /mnt/boot/
# 复制内核以及设备树到FAT分区
sudo cp linux-6.1-sun50iw9/arch/arm64/boot/Image /mnt/boot/
sudo cp linux-6.1-sun50iw9/arch/arm64/boot/dts/allwinner/sun50i-h616-fire-start.dtb /mnt/boot/
# 卸载 FAT 文件系统
sudo umount /mnt/boot
- uboot启动命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim boot.cmd
# 复制以下内容
# 在进入 uboot 后检查文件是否存在
ext4ls mmc 0:2
# 设置启动命令
setenv bootcmd 'fatload mmc 0:1 0x40200000 Image;fatload mmc 0:1 0x4fa00000 sun50i-h616-fire-start.dtb;booti 0x40200000 - 0x4fa00000'
# 设置 bootargs 变量
setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw init=/sbin/init debug panic=30'
# 启动内核以及根文件系统
boot
转换打包boot.scr文件:
mkimage -C none -A arm64 -T script -d boot.cmd boot.scr
mkimage 是一个用于创建 U-Boot 镜像的工具。在这个命令中,具体参数的含义如下:
-
-C none:指定压缩类型为 none,表示不对镜像进行压缩。
-
-A arm64:指定架构为 arm64,即目标架构是 64 位 ARM。
-
-T script:指定镜像的类型为 script,表示这是一个脚本文件。
-
-d boot.cmd:指定输入文件为 boot.cmd,这是你想要转换的脚本文件。
-
boot.scr:这是输出文件名,生成的 U-Boot 脚本镜像将保存为 boot.scr。
booti 讲解:
在u-boot中, bootm是一个可以执行位于memory中的应用程序的命令 booti是bootm命令的一个子集, 可用于执行位于memory中的ARM64 kernel Image,其格式如下:
booti addr [initrd[:size]] [fdt]
其中: addr是kernel Image文件所在的memory地址;
[initrd[:size]]是initrd在memory中的位置和size, 可以不指定, 使用“-”代替即可;
fdt是flat device tree(就是传说中的dtb文件)在memory中的地址, 在ARM64中, 它是必选的