荔枝派Zero作为一款基于全志V3s芯片的轻量级开发板,凭借其丰富的接口和适中的性能,在嵌入式开发领域广受欢迎。与官方提供的Camdriod SDK相比,采用主线Uboot和Linux内核的方案能够获得更现代的驱动支持、更活跃的社区维护以及更灵活的系统配置方式。本文将详细介绍从零开始构建完整系统的每个步骤,帮助开发者避开常见陷阱,快速实现开发板启动。
在开始编译之前,我们需要搭建一个稳定高效的交叉编译环境。全志V3s采用ARM Cortex-A7架构,这意味着我们需要针对ARM架构的工具链来编译我们的系统组件。
推荐使用Ubuntu 20.04 LTS作为开发主机系统,因为它提供了良好的软件包支持和稳定性。首先安装必要的依赖项:
bash复制sudo apt update
sudo apt install -y gcc-arm-linux-gnueabihf build-essential bison flex \
libssl-dev u-boot-tools device-tree-compiler bc swig python3-dev \
git make gcc g++ cpio unzip rsync
对于工具链的选择,Linaro提供的GCC工具链是一个可靠的选择:
bash复制wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
tar xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
export CROSS_COMPILE=$(pwd)/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
提示:将工具链路径添加到.bashrc文件中可以避免每次打开新终端都需要重新设置环境变量
验证工具链是否安装成功:
bash复制${CROSS_COMPILE}gcc --version
如果一切正常,这将输出ARM架构的GCC版本信息。至此,我们的基础编译环境已经准备就绪。
主线Uboot为荔枝派Zero提供了最新的硬件支持和功能特性。我们将从Lichee Pi维护的仓库获取适配V3s的Uboot版本。
首先克隆Uboot仓库:
bash复制git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current
cd u-boot
配置Uboot以适配荔枝派Zero:
bash复制make ARCH=arm licheepi_zero_defconfig
编译Uboot镜像:
bash复制make ARCH=arm menuconfig # 可选,用于自定义配置
make ARCH=arm
编译完成后,我们将在u-boot目录下获得几个关键文件:
u-boot-sunxi-with-spl.bin:包含SPL和Uboot主程序的完整镜像.config:当前的配置信息spl/sunxi-spl.bin:第一阶段引导加载程序为了确保Uboot能够正确初始化硬件,我们需要为荔枝派Zero准备一个合适的启动脚本。创建一个名为boot.cmd的文件:
bash复制setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait panic=10
load mmc 0:1 0x41800000 zImage
load mmc 0:1 0x43000000 sun8i-v3s-licheepi-zero-dock.dtb
bootz 0x41800000 - 0x43000000
然后将其编译为Uboot可识别的格式:
bash复制mkimage -C none -A arm -T script -d boot.cmd boot.scr
这个启动脚本将在后续步骤中与内核镜像一起放入启动分区。
主线Linux内核为V3s提供了设备树(DTS)支持,相比传统的fex配置方式更加灵活和现代化。我们将使用Lichee Pi维护的Linux内核分支。
获取内核源代码:
bash复制git clone https://github.com/Lichee-Pi/linux.git -b zero-5.2.y
cd linux
配置内核选项:
bash复制make ARCH=arm licheepi_zero_defconfig
make ARCH=arm menuconfig
在menuconfig界面中,确保以下选项已启用:
开始编译内核和设备树:
bash复制make ARCH=arm -j$(nproc) zImage dtbs modules
编译完成后,关键文件位于:
arch/arm/boot/zImage:压缩的内核镜像arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dtb:设备树二进制文件为了减少根文件系统的大小,我们可以将模块安装到一个临时目录中:
bash复制make ARCH=arm INSTALL_MOD_PATH=../modules modules_install
根文件系统包含了Linux运行所需的所有基础程序和库。我们将使用Buildroot来构建一个轻量级的根文件系统。
首先获取Buildroot源代码:
bash复制git clone https://git.buildroot.net/buildroot
cd buildroot
配置Buildroot:
bash复制make menuconfig
在配置界面中,需要设置以下关键选项:
保存配置后开始构建:
bash复制make
构建完成后,根文件系统镜像将位于output/images/rootfs.tar。我们可以将其解压到SD卡的第二个分区:
bash复制tar xvf output/images/rootfs.tar -C /mnt/rootfs
现在我们已经准备好了所有组件,接下来需要将它们烧录到SD卡中。建议使用至少4GB的SD卡。
首先插入SD卡并确定设备名称(通常是/dev/sdX):
bash复制lsblk
使用fdisk对SD卡进行分区:
bash复制sudo fdisk /dev/sdX
在fdisk交互界面中执行以下操作:
o创建新的空DOS分区表n创建新分区,选择主分区,分区号1,起始扇区2048,大小16Mt,选择分区1,类型设为a2(表示启动分区)n创建第二个主分区,使用剩余空间w保存并退出格式化分区:
bash复制sudo mkfs.vfat /dev/sdX1
sudo mkfs.ext4 /dev/sdX2
挂载分区并复制文件:
bash复制sudo mount /dev/sdX1 /mnt/boot
sudo mount /dev/sdX2 /mnt/rootfs
# 复制Uboot
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8
# 复制内核和设备树
sudo cp arch/arm/boot/zImage /mnt/boot/
sudo cp arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dtb /mnt/boot/
sudo cp boot.scr /mnt/boot/
# 复制根文件系统
sudo tar xvf output/images/rootfs.tar -C /mnt/rootfs
sudo cp -r ../modules/lib /mnt/rootfs/
最后,卸载分区并安全移除SD卡:
bash复制sudo umount /mnt/boot /mnt/rootfs
sync
将准备好的SD卡插入荔枝派Zero,连接串口调试工具(通常使用CP2102等USB转TTL模块),然后上电启动。串口配置应为115200波特率,8数据位,无校验,1停止位。
在启动过程中,你可以在串口终端中看到Uboot和Linux的启动信息。如果系统启动成功,你将看到登录提示。默认情况下,Buildroot创建的用户名为root,无密码。
常见问题及解决方案:
Uboot无法加载内核:
内核panic或无法挂载根文件系统:
网络接口无法工作:
通过串口终端,你可以执行各种系统管理任务,如配置网络、安装额外软件包或调试硬件接口。例如,配置以太网接口:
bash复制ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up
route add default gw 192.168.1.1
系统成功启动后,我们可以进行一些优化和定制工作,以提升使用体验或适应特定应用场景。
内核优化:
重新配置内核,移除不需要的驱动和功能可以显著减小内核大小并提升启动速度:
bash复制cd linux
make ARCH=arm menuconfig
建议移除的选项包括:
根文件系统精简:
Buildroot允许我们进一步精简根文件系统:
bash复制cd buildroot
make menuconfig
在配置中可以考虑:
启动加速:
通过以下措施可以优化启动时间:
quiet参数减少控制台输出init=/sbin/init指定最小init进程应用开发环境:
如果需要开发应用程序,可以在Buildroot中启用开发工具:
bash复制make menuconfig
然后选择:
最后重新构建根文件系统:
bash复制make
荔枝派Zero提供了丰富的硬件接口,下面展示几个常用接口的配置和使用方法。
GPIO控制:
Linux系统通过sysfs接口提供GPIO访问。首先需要在设备树中启用所需GPIO,然后可以通过以下方式控制:
bash复制# 导出GPIO
echo 38 > /sys/class/gpio/export # PB2对应GPIO38
echo out > /sys/class/gpio/gpio38/direction
# 设置高低电平
echo 1 > /sys/class/gpio/gpio38/value
echo 0 > /sys/class/gpio/gpio38/value
PWM控制:
V3s提供多个PWM通道,可用于控制LED亮度或电机速度:
bash复制# 启用PWM
echo 0 > /sys/class/pwm/pwmchip0/export
echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/period
echo 500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
I2C设备访问:
首先确保内核配置中启用了I2C支持,然后可以使用i2c-tools与设备通信:
bash复制# 安装工具
opkg update
opkg install i2c-tools
# 扫描I2C总线
i2cdetect -y 0
# 读取设备寄存器
i2cget -y 0 0x50 0x00
USB Gadget功能:
V3s支持USB OTG功能,可以配置为各种设备类型。例如,配置为以太网设备:
bash复制modprobe g_ether
ifconfig usb0 192.168.7.2 netmask 255.255.255.0 up
通过这些示例,开发者可以快速开始利用荔枝派Zero的硬件功能进行项目开发。根据具体应用需求,可以进一步探索SPI、UART、MIPI CSI等接口的使用方法。