全志F1C100S/F1C200S开发实战:从零构建Linux交叉编译环境

张开发
2026/4/11 9:58:22 15 分钟阅读

分享文章

全志F1C100S/F1C200S开发实战:从零构建Linux交叉编译环境
1. 全志F1C系列开发板入门指南第一次接触全志F1C100S/F1C200S开发板时很多开发者都会感到无从下手。这块仅有拇指大小的芯片却蕴含着强大的处理能力能够运行完整的Linux系统。我刚开始玩这块板子时光是搭建开发环境就折腾了好几天现在回想起来其实只要掌握几个关键步骤就能轻松上手。全志F1C系列芯片最大的特点就是性价比极高特别适合用来学习嵌入式Linux开发。相比树莓派这类成熟平台F1C的开发环境搭建确实要复杂一些但这也正是它的魅力所在——你能真正深入到嵌入式系统的每个细节。我建议新手可以从F1C200S入手它的资源更丰富调试起来也相对容易。在开始之前你需要准备以下硬件一台运行Ubuntu 18.04/20.04的电脑虚拟机也可以F1C100S/F1C200S开发板推荐荔枝派Nano一张8GB以上的TF卡建议使用品牌卡杂牌卡容易出问题USB转串口模块用于调试数据线和电源适配器注意开发过程中建议使用有线网络连接避免WiFi带来的不稳定性。我在实际项目中遇到过因为无线网络波动导致编译失败的情况。2. 搭建交叉编译环境2.1 安装基础工具在Ubuntu终端中执行以下命令安装必要工具sudo apt update sudo apt install -y vim git make gcc bison flex libssl-dev libncurses5-dev这些工具是后续编译u-boot和内核的基础。我建议先全部安装好避免后面因为缺少依赖而中断编译过程。记得有一次我因为没装libssl-dev编译内核时卡了整整两个小时才找到问题所在。2.2 配置交叉编译工具链全志F1C芯片使用的是ARM9架构我们需要安装对应的交叉编译器。经过多次测试我推荐使用Linaro 7.2.1版本这个版本稳定性最好wget https://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 sudo mkdir -p /usr/local/arm-linux-gcc tar -xvf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz sudo cp -r gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/* /usr/local/arm-linux-gcc/然后编辑/etc/profile文件在末尾添加export PATH$PATH:/usr/local/arm-linux-gcc/bin使配置生效source /etc/profile验证安装是否成功arm-linux-gnueabi-gcc -v如果看到版本信息输出说明工具链安装正确。这里有个小技巧建议把工具链路径也添加到.bashrc中这样每次打开终端都会自动加载。2.3 安装32位兼容库由于工具链是32位的在64位系统上需要安装兼容库sudo apt install -y lib32z1 lib32ncurses5 lib32stdc6缺少这些库会导致各种奇怪的错误。我曾经遇到过找不到动态链接库的问题就是因为没装这些兼容库。3. 移植u-boot引导程序3.1 获取u-boot源码推荐使用荔枝派Nano的u-boot分支这个版本对F1C系列支持最好git clone https://github.com/Lichee-Pi/u-boot.git -b nano-v2018.01 cd u-boot3.2 配置编译选项修改Makefile文件确保以下配置正确ARCHarm CROSS_COMPILEarm-linux-gnueabi-然后执行配置命令make licheepi_nano_defconfig make menuconfig在menuconfig界面中需要特别注意以下配置Boot arguments中设置consolettyS0,115200 panic5 rootwait root/dev/mmcblk0p2 earlyprintk rw确保Enable boot arguments选项被选中3.3 编译u-boot使用以下命令开始编译make -j$(nproc)编译完成后会生成u-boot-sunxi-with-spl.bin文件这个文件就是我们需要的引导程序。如果编译过程中出现错误可以尝试先执行make clean再重新编译。4. 移植Linux内核4.1 获取内核源码推荐使用5.7.x版本的内核这个版本对F1C系列支持较好wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.7.1.tar.gz tar -xvf linux-5.7.1.tar.gz cd linux-5.7.14.2 应用补丁和配置下载荔枝派Nano的默认配置文件wget http://dl.sipeed.com/LICHEE/Nano/SDK/config/linux-licheepi_nano_defconfig cp linux-licheepi_nano_defconfig arch/arm/configs/然后执行配置命令make ARCHarm licheepi_nano_defconfig make ARCHarm menuconfig在配置界面中需要特别注意确保系统类型选择的是Allwinner F1C100s/F1C200s文件系统支持中启用EXT4和SquashFS字符设备中启用串口支持4.3 编译内核使用以下命令开始编译make ARCHarm CROSS_COMPILEarm-linux-gnueabi- -j$(nproc)编译完成后在arch/arm/boot目录下会生成zImage内核镜像在arch/arm/boot/dts目录下会生成设备树文件。编译过程可能会比较长建议耐心等待。5. 构建根文件系统5.1 使用Buildroot构建Buildroot是最方便的根文件系统构建工具推荐使用2018.02版本wget https://buildroot.org/downloads/buildroot-2018.02.11.tar.gz tar -xvf buildroot-2018.02.11.tar.gz cd buildroot-2018.02.11 make menuconfig在配置界面中需要设置Target options → Target Architecture选择ARM (little endian)Toolchain中选择使用外部工具链路径指向我们之前安装的Linaro工具链System configuration中设置root密码和主机名Target packages中选择需要的软件包如busybox、dropbear等5.2 编译根文件系统配置完成后执行make编译完成后在output/images目录下会生成rootfs.tar文件。这个过程会根据选择的软件包数量花费不同时间第一次编译可能需要较长时间下载各种源码包。6. 制作可启动TF卡6.1 分区和格式化首先使用fdisk对TF卡进行分区sudo fdisk /dev/sdX按照以下步骤操作输入o创建新的DOS分区表输入n创建新分区第一个分区为16M用于存放u-boot输入n创建第二个分区大小为128M用于存放内核输入n创建第三个分区使用剩余所有空间用于根文件系统输入w保存分区表然后格式化分区sudo mkfs.vfat /dev/sdX1 sudo mkfs.ext4 /dev/sdX2 sudo mkfs.ext4 /dev/sdX36.2 写入u-boot将编译好的u-boot写入TF卡sudo dd ifu-boot-sunxi-with-spl.bin of/dev/sdX bs1024 seek8这个命令会将u-boot写入TF卡的8K偏移处这是全志芯片的特殊要求。6.3 复制内核和根文件系统挂载分区并复制文件sudo mount /dev/sdX1 /mnt/boot sudo mount /dev/sdX2 /mnt/rootfs sudo cp zImage suniv-f1c100s-licheepi-nano.dtb /mnt/boot sudo tar -xvf rootfs.tar -C /mnt/rootfs最后不要忘记创建boot.scr文件并复制到boot分区这个文件包含了u-boot的启动参数。7. 常见问题解决在实际开发过程中我遇到过不少坑这里分享几个典型问题的解决方法问题1TF卡无法识别现象插入开发板后没有任何反应 解决方法尝试更换TF卡某些廉价卡兼容性不好检查u-boot是否正确写入使用hexdump查看TF卡内容确保写入偏移量是8Kseek8问题2内核启动卡住现象启动时停在某个位置不动 解决方法检查串口输出确定卡住的位置尝试减小内核配置去掉不必要的驱动检查设备树文件是否正确问题3根文件系统无法挂载现象内核panic提示无法挂载rootfs 解决方法检查内核是否支持你的文件系统类型确认root参数指定的设备节点正确检查根文件系统是否完整开发过程中建议随时保存工作成果我在第一次移植时就因为没及时备份导致一整天的工作白费。另外多利用串口调试输出它能提供最直接的错误信息。

更多文章