目录

为V3s开发板制作Linux系统镜像

制作完毕V3s开发板的硬件之后,接下来就要为开发板编译系统镜像了。本文介绍如何基于V3s开发板编写设备树并编译基于最新Linux内核的系统镜像。

编译环境搭建

本文的编译环境与为荔枝派Zero制作可启动Linux系统镜像一文中相同,具体的安装步骤可以参考此文,这里只列出安装步骤。

安装arm-linux-gnueabihf交叉编译器,并安装到/opt目录下。此处以7.5.0版本为例。

cd ~/Download
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
sudo tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt
sudo mv gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf arm-linux-gnueabihf-gcc #重命名文件夹为arm-linux-gnueabihf-gcc

将编译器所在路径加入到PATH中。

echo "PATH=\$PATH:/opt/arm-linux-gnueabihf-gcc/bin" >> ~/.bashrc
source ~/.bashrc

安装编译过程中所需的依赖。

sudo apt install u-boot-tools python3-distutils python3-dev swig build-essential libncurses5-dev git flex bison libssl-dev python texinfo

编译系统镜像

修改设备树

本开发板的设备树基于荔枝派Zero提供的设备树进行修改。共有2个设备树文件需要修改,分别是sun8i-v3s.dtsisun8i-v3s-player.dts,它们分别是V3s芯片内部的外设定义与开发板上外设的定义。在sun8i-v3s-player.dts中,适配了开发板上的LED、lradc按键、屏幕与背光、GT9147电容触摸屏以及DS3231RTC时钟、USB接口、以太网、3个UART和音频codec。具体的修改过程在此不再赘述,修改完毕的设备树可以在文末压缩文件中下载。

编译U-boot

编译U-boot的具体步骤也与为荔枝派Zero制作可启动Linux系统镜像一文中相同,这里简略介绍。

从GitHub拉下源码。

cd ~/code/v3s
git clone https://github.com/Lichee-Pi/u-boot -b v3s-current

进入代码文件夹,由于本文是为自己制作的开发板制作系统镜像,因此需要进行一些修改。将前文提到的sun8i-v3s.dtsisun8i-v3s-player.dts设备树文件拷贝到u-boot/arch/arm/dts/目录下并覆盖原有文件,然后在u-boot/arch/arm/dts/Makefile文件中找到dtb-$(CONFIG_MACH_SUN8I_V3S),并在这行下面加上sun8i-v3s-player.dtb文件,将开发板的dts文件加入到编译目标中。

# ......
dtb-$(CONFIG_MACH_SUN8I_V3S) += \
	sun8i-v3s-player.dtb
# ......

然后,在u-boot/目录下执行以下命令来使用默认的800x480屏幕的配置文件配置u-boot,并进入配置菜单。

make ARCH=arm LicheePi_Zero_800x480LCD_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

在配置菜单中,选择Device Tree Control,在其中的Default Device Tree for DT control中填入开发板设备树文件的名字sun8i-v3s-player

加快启动速度
可以将delay in seconds before automatically booting设置为0来禁用开机时的读秒。
启动时的logo
为了能够在启动的过程中显示图像,我参考了基于荔枝派实现uboot到系统应用启动过程不间断logo显示 一文,对U-boot进行了配置,具体配置过程请参考该文章。

配置完毕后进行编译即可。

cd u-boot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

编译Linux内核

荔枝派Zero官方提供的内核是5.2版本的,上次更新还在2017年。该内核主要对设备树进行了修改,并添加了个别V3s的硬件驱动。随着时间的过去,主线Linux内核已经合入了所有V3s的驱动,因此直接使用主线Linux是最好的选择。我选择了5.10LTS版本的内核,截至本文完成时,最新版本为5.10.20。首先,下载并解压内核的源码。

cd ~/code/v3s
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.20.tar.gz
tar xf linux-5.10.20.tar.gz
mv linux-5.10.20 linux-5.10

然后,对内核进行配置。可以直接将荔枝派Zero官方5.2内核中的.config文件复制进Linux源码目录中,执行下面的命令以基于老版本内核的配置文件对新版本内核进行配置。配置完成后直接编译即可。在文末的压缩文件中,我提供了一个配置好的.config文件,直接复制进Linux源码目录就可以使用。实际上,内核中新增的大部分配置项都与我们使用的V3s无关。

cd linux-5.10
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
版本更新
若读者在编译时使用了更新版本的LTS内核,在编译时提示有新的选项,可以先进入menuconfig中,无需配置直接保存退出即可添加这些新的设置项。之后编译就不会提示有新的选项了。

编译rootfs

对rootfs的编译与为荔枝派Zero制作可启动Linux系统镜像完全一致。在此不再展开介绍。

其他文件

~/code/v3s/目录下,新建启动脚本boot.cmd,将下面内容写入。

setenv bootargs console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw
load mmc 0:1 0x41000000 zImage
load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero.dtb
bootz 0x41000000 - 0x41800000

若加入了启动过程中logo显示的功能,还需要将logo.bmp复制到~/code/v3s/目录下。

镜像制作

制作镜像的脚本可以在文末压缩文件中找到。请注意镜像同级目录应该有linux-5.10 u-boot buildroot-2020.02三个文件夹,以及boot.cmd logo.bmp

执行./pack.sh,稍等片刻即可获得v3s_player_br2020.bin。将该文件烧入SD卡,插入开发板启动即可。下面提供了一个编译好的系统镜像,支持Qt运行环境。

 系统镜像

 配置文件及打包脚本

启动后自动运行用户程序

设置启动logo之后,若在启动完毕之后自动运行用户程序,会获得非常流畅的使用体验。在这里,以Qt自带的计算器Demo为例,演示启动后自动运行程序。

将安装有系统的内存卡插入电脑,将编译好的可执行文件calculator放置到合适的位置并加上可执行权限,此处以/root目录为例。

然后,启动开发板并登录进入终端。然后,在/etc/init.d/目录下,新建S30userapp文件并编辑。

注意
这只适合于基于busybox构建的系统。
cd /etc/init.d/
nano S30userapp

向文件填入如下内容。

#! /bin/sh
nohup /root/calculator > /dev/null &

编辑完成后,保存退出,并为这个文件加上可执行权限。

chmod +x S30userapp

重启开发板之后,在系统引导完毕之前,会持续显示开机logo,引导完毕后会立即打开计算器Demo。

https://img.yuanze.wang/posts/v3s-dev-board-software/v3s-calculator-app.gif
运行效果