写在前面
其实对于新手而言,用官方给的镜像包完全足够了,但是吧,由于这个官方给的东西实在是有点不行。比如不能reboot重启,TF卡镜像给了200M等等。因此,为了能有更符合自己体质的荔枝派,我决定,自己尝试着编译内核和根文件系统。
编译的步骤
说实话,作为一个纯新手,一开始根本不知道哪些东西是什么意思,因此开始我也是看着荔枝派官方给的文档,当然,更不懂了,而且理所当然的没整出来。之后在网上各种找教程,坑网看帖子,才模模糊糊、稀里糊涂的搞定了。
在我自己移植的过程中主要有这几个步骤:
1. 安装arm的交叉编译器
2.buildroot 编译根文件系统
3.U-boot移植
4.Linux内核移植
下面我从当时学习的视角来对每个步骤可能遇到的问题以及哪些可能网上文档的坑进行介绍。
1. 安装arm的交叉编译器
首先是安装交叉编译器,至于为什么要安装交叉编译器开始我是不理解的,但是后来遇到了一些坑后我就明白了。在网上搜索会发现,交叉编译就是在一个架构下去编译另外一个架构的程序,比如我现在在我的笔记本电脑上去编译我的程序,他是x86的,但是我们的目标是在arm架构下运行,这当然不可以。所以我们需要用交叉编译来进行代码的编译。
这一环节我跟着官方文档安装的版本,没有踩雷。
wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
tar -vxJf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
sudo cp -r ./gcc-linaro-7.2.1-201711-x86_64_arm-linux-gnueabi /opt/
sudo gedit /etc/bash.bashrc
在文件末尾添加以下内容:
PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"
保存在后终端运行下面的命令:
source /etc/bash.bashrc
用 arm-linux-gnueabi-gcc -v
进行测试;若普通用户状态下没有成功,通过 sudo su
切换到root用户再尝试;
2.buildroot 编译根文件系统
为了方便管理呢,可以新建一个工作目录
mkdir f1c100s-sdk
cd f1c100s-sdk/
在上面新建的工作目录下安装
安装各种依赖
apt-get install linux-headers-$(uname -r)
wget https://buildroot.org/downloads/buildroot-2022.02.tar.xz
tar -xJf buildroot-2022.02.tar.xz
#进入buildroot目录
cd buildroot-2022.02/
#使用编译菜单
make menuconfig
配置可以按照下图:
在buildroot编译的时候会下载很多的包,有些包下载会很慢,最初我是自己下载后丢在dl文件夹中,后来知道可以在menuconfig中更改国内加速源。在Build options中选择 Mirrors and Download loactions。更改国内源。
更换后的下载地址,这些可以只从网上搜到,搜索buildroot 国内源即可
更换国内源后下载速度就是正常网速,可以节省大量时间。退出保存后直接 make
# 在buildroot-2022.02目录
make
使用国内源后首次在这里编译大概需要半小时,但是最初我编译完后会遇到各种问题,这里先简单介绍下会出现的问题,比如启动日志报错内核太老了,FATAL: kernel too old。这就是下文中我们移植的内核版本带不动buildroot下的一些功能包,可以选择降低这里Toolchain中的 Kernel Headers 版本,这个版本要低于或等于你使用的内核版本。
还有可能没有开发板一直在重启失败,如下图:
这也是根文件报的错,可能的问题有很多,比如编译后在buildroot-2022.02/output下的roottf压缩包解压缩问题,导致有些文件失效。还有可能是在roottf解压后的bin文件夹下的busybox文件属性错误,利用 file busybox 命令查看属性,正常应该是下图的arm属性。
如果发现这里的ARM变成了X86那就是编译时候没有执行arm的编译, 出来的文件当然不能在荔枝派上使用。可以通过指定编译架构来重新编译。
make clean
# 设置CPU架构
export ARCH=arm
# 设置交叉编译工具链前缀
export CROSS_COMPILE=arm-buildroot-linux-gnueabi-
编译完成后再次检查busybox,如果是arm属性,基本就没什么问题了。
3.U-boot移植
# cd ~/f1c100s-sdk/
git clone -b nano-lcd800480 --depth=1 https://github.com/Lichee-Pi/u-boot.git
# 进入u-boot目录
cd u-boot/
# 加载配置文件
# 此处告知make采用arm-linux-gnueabi下的所有交叉编译工具,目标架构为Arm,设定各项默认配置为 nano 的spiflash支持版
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_defconfig
# 修改默认bootcmd
gedit include/configs/suniv.h
修改定义:
#define CONFIG_BOOTCOMMAND "run distro_bootcmd"
这里可以使用 make ARCH=arm menuconfig 进行配置,但是下载的u-boot基本已经配置好了,可以参考官方的文档,我是直接编译使用的。
编译 U-boot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j12
设置boot.scr
在上文中修改了bootcmd,而u-boot启动需要读取boot.scr的文件,进行参数的传递,因此需要在u-boot目录下设置boot.scr文件
# cd ~/f1c100s-sdk/u-boot/
touch boot.cmd
gedit boot.cmd
在 boot.cmd文件中写入下面的命令:
# 设置传递给内核的bootargs参数
# 读取内核镜像和设备树到内存中指定位置
# 启动内核程序
setenv bootargs console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 rw
load mmc 0:1 0x80008000 zImage
load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb
bootz 0x80008000 - 0x80C00000
将u-boot-sunxi-with-spl.bin 文件需要放置在SD卡8k开始的位置上:
# cd ~/f1c100s-sdk/u-boot/
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
然后使用u-boot下的一个工具生成boot.scr文件:
# arm架构;不压缩;script文件;输入boot.cmd文件;输出boot.scr文件
tools/mkimage -A arm -C none -T script -d boot.cmd boot.scr
4.Linux内核移植
#下载内核文件
git clone -b nano-5.2-tf https://github.com/Lichee-Pi/linux.git
这个会有时候会很慢,可以选择到github上直接下载。下载完成后进入linux目录,配置内核。
wget http://dl.sipeed.com/LICHEE/Nano/SDK/config
cd linux-nano-5.2-tf
cp config .config
或者直接
make ARCH=arm licheepi_nano_defconfig
make ARCH=arm menuconfig
这里可以使能看门狗,方便后续可以使用reboot重启。在Device drivers/watchdog timer support,选择watchdog timer driver core和allinwiner socs watchdog support
保存退出后编译:
开始编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j12
在f1c100s-sdk/linux/arch/arm/boot/dts目录下找到suniv-f1c100s.dtsi,将
wdt: watchdog@1c20ca0 {
compatible = "allwinner, suniv-f1c100s-wdt",
"allwinner, sun4i-a10-wdt";
reg = <0x1c20ca0 0x20>;};
修改为:
wdt: watchdog@1c20ca0 {
compatible = "allwinner, suniv-f1c100s-wdt",
"allwinner, sun6i-a31-wdt";
reg = <0x1c20ca0 0x20>;
};
保存后执行编译命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 dtbs
文件烧录
至此,我们将所需的文件都已经编译完成,下面就需要烧录。将tf卡插入读卡器。在之前一章中利用win32烧录官方镜像后在tf上已经分好了区,这样我们就可以直接在分好的分区上直接复制粘贴需要的文件就行。这里也可以利用虚拟机上的磁盘程序将分区扩容。比如我这里将第二分区扩到了31g。
此时我们需要移植的文件有:
1. u-boot下的boot.scr
到第一分区
2. linux/arch/arm/boot/下的zImage
到第一分区,
arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb
到第一分区
3. f1c100s-sdk/buildroot-2022.02/output/images/rootfs.tar
文件解压后移植到第二分区,或者直接复制到第二分区后在第二分区下解压
复制完成后将tf插入荔枝派,上电测试。可以正常启动,也可以重启
参考:
根文件系统编译 - Sipeed Wikihttps://wiki.sipeed.com/soft/Lichee/zh/Nano-Doc-Backup/build_sys/rootfs.html
F1C100S linux-4.15 无法软件重启的问题原因 / 全志 SOC / WhyCan Forum(哇酷开发者社区)https://whycan.com/t_3275.html
关于F1C100s打开watchdog后仍然无法重启的解决办法 / 全志 SOC / WhyCan Forum(哇酷开发者社区)https://whycan.com/t_3832.html