buildroot构建hisi平台根文件系统和工具链
前面使用了arm-hisiv300-linux
工具链来作为Buildroot
的外部工具链进行编译,然后遇到了很多编译问题。
https://blog.csdn.net/duapple/article/details/128516133?spm=1001.2014.3001.5501
这里不使用hisi
的工具链,我们还是选择外部工具链,从远程下载工具链并安装。编译过程一切顺利,除了有的包下载非常缓慢以后,没有再报任何的编译问题,这里做个记录。
1. 下载最新源码
2. Menuconfig配置
Target options
Toolchain
可选的只有三种,直接选择ARM 2014.5
。
System configuration
Filesystem images
3. 编译及测试
sudo make
一切顺利。最后工具链会生成在output/host/opt/ext-toolchain
目录下。
duapple@92fa1c7e1a00:/media/data/workspace/buildroot-2022.02.8/output/host/opt/ext-toolchain$ ls
arm-none-linux-gnueabi bin i686-pc-linux-gnu lib libexec share
duapple@92fa1c7e1a00:/media/data/workspace/buildroot-2022.02.8/output/host/opt/ext-toolchain$ ls bin
arm-none-linux-gnueabi-addr2line arm-none-linux-gnueabi-cs arm-none-linux-gnueabi-gcc-ar arm-none-linux-gnueabi-ld arm-none-linux-gnueabi-size
arm-none-linux-gnueabi-ar arm-none-linux-gnueabi-cs-daemon arm-none-linux-gnueabi-gcc-nm arm-none-linux-gnueabi-nm arm-none-linux-gnueabi-strings
arm-none-linux-gnueabi-as arm-none-linux-gnueabi-elfedit arm-none-linux-gnueabi-gcc-ranlib arm-none-linux-gnueabi-objcopy arm-none-linux-gnueabi-strip
arm-none-linux-gnueabi-c++ arm-none-linux-gnueabi-g++ arm-none-linux-gnueabi-gcov arm-none-linux-gnueabi-objdump cache
arm-none-linux-gnueabi-c++filt arm-none-linux-gnueabi-gcc arm-none-linux-gnueabi-gdb arm-none-linux-gnueabi-ranlib
arm-none-linux-gnueabi-cpp arm-none-linux-gnueabi-gcc-4.8.3 arm-none-linux-gnueabi-gprof arm-none-linux-gnueabi-readelf
通过设置环境变量就能直接使用这个工具链了。然后可以用这个工具链来编译Hi SDK中的linux-3.4
内核。
export PATH=$PATH:/media/data/workspace/buildroot-2022.02.8/output/host/opt/ext-toolchain/bin
cp arch/arm/configs/hi3518ev200_full_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage -j12
最后烧录uImage
和 rootfs.jffs2
。
我这里烧录使用arm-hisiv300-linux
工具链编译的内核,arm-none-linux-gnueabi
工具链编译根文件系统,系统也是能够直接启动并运行成功的。
tips:最后测试发现,还是不使用hisi的编译工具链编译Buildroot根文件系统比较好。这样,编译过程都不报错,十分的顺利。
4. 集成Hi SDK中的kernel
尝试使用buildroot编译内核,试了3.4到5.10的内核,5.0以下的内核可以编译通过,但是烧录后无法启动,应该是hisi对该版本的内核做了适配的,因此无法直接使用官方的kernel版本。最后还是使用buildroot生成的工具链编译Hi SDK中的内核。
但是可以把Hi SDK中的kernel集成到Buildroot中去。这样还能解决根文件系统启动后,/lib/module
下面没有内核模块的问题。另外还可以解决squashfs根文件系统启动无法创建/dev/console以及其它设备的问题,由于Buildroot识别不到kernel的配置,因此devtmpfs无法生效,导致devtmpfs没有挂载到/dev
上。
先把kernel打包成.tar.xz
格式的文件。
tar cvf linux-3.4.y.tar linux-3.4.y
xz -z linux-3.4.y.tar -0
然后将打包好的kernel放到Buildroot中去:
sudo cp linux-3.4.y.tar.xz /media/data/workspace/buildroot-2022.02.8/dl/linux/
最后需要配置Buildroot编译kernel,设置自定义版本:
然后保存配置并退出,重新编译即可。这是将使用Buildroot生成的工具链编译Hi SDK中的Linux内核。编译完成之后,会在output/images
下生成我们的uImage
文件 。这时通过tftp烧录uImage
和rootfs.jffs2
。
此时能够发现,启动不会报/lib/modules
的错误了,并且可加载的ko文件也被放到了对应的位置。另外,kernel中配置的devtmpfs
也生效了,devtmpfs
目录挂载到了/dev
下。按理来说,squashfs启动也能够正常了,不会因为无法在/dev
下面创建/dev/console
而报错进不了console了。
squashfs测试
OK,启动正常。
# cat /proc/version
Linux version 3.4.35 (root@92fa1c7e1a00) (collect2: error: ld returned 1 exit status) #3 Mon Jan 2 23:44:06 CST 2023
# uname -a
Linux buildroot 3.4.35 #3 Mon Jan 2 23:44:06 CST 2023 armv5tejl GNU/Linux
# cat /usr/lib/os-release
NAME=Buildroot
VERSION=2022.02.8
ID=buildroot
VERSION_ID=2022.02.8
PRETTY_NAME="Buildroot 2022.02.8"
#