全志F1C100S开发基本流程
基本启动过程
芯片启动的全过程大概是:Bootloader->Kernel->RootFS
对于我们这次实验来说,就是:uboot->linux kernel6.1.19->Buildroot
环境准备
本次实验宿主机使用全新的Ubuntu20.04环境,并在完成实验后用户目录下有以下结构的文件夹。
首先需要创建架构。
1 | workspace |
然后下载所有本次实验会使用到的代码和依赖。
1 | # 安装依赖 |
每一章节结束后请返回workspace目录。
编译U-Boot
1 | cd u-boot |
接下来我们需要准备U-Boot启动所需的配置文件,将以下内容写入boot.cmd。
1 | setenv bootargs console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 rw |
接着编译配置文件。
1 | mkimage -C none -A arm -T script -d boot.cmd ./partitions/boot/boot.scr |
编译Kernel
1 | cd linux |
我们需要修改内核配置菜单中的部分项目,否则在之后会遇到很多问题。
| 配置位置 | 操作 | 用途 |
|---|---|---|
| System Type -> Platform selection | 取消所有勾,勾选ARMv5支持 | CPU架构支持 |
| System Type -> Allwinner SoCs | 勾选Armv5支持 | CPU架构支持,本选项不勾选会影响DTB文件生成 |
| Kernel Features | 勾选ARM EABI | 不勾选会导致Kernel可以运行,但是无法加载RootFS的Init |
1 | # 编译内核,-j4的4可以修改为你的CPU核心数 |
编译Buildroot
我们使用Buildroot默认的BusyBox程序和GLIBC,如果需要剪裁大小,可以选择其他的C支持库。
1 | cd buildroot |
| 配置位置 | 操作 | 用途 |
|---|---|---|
| Target options | Target Arch设置为ARM (little endian) | 设置大小端 |
| Target options | Target Arch Variant设置为arm926t | 设置CPU架构 |
| Toolchain | Kernel Headers设置为你下载的LTS版本内核对应的版本号 | 匹配内核版本 |
1 | # 编译,Buildroot不支持多线程编译,所以不携带-j |
同时修改partitions/root/etc/fstab文件中的ext2为ext4
写入SD卡
请替换CARD_PATH为你的SD卡设备路径,如/dev/sdb
1 | cd partitions |
开机测试
将SD卡安全拔出后插入设备,接入uart0后开机,可以看到U-Boot和Kernel的启动过程并顺利看到sh。
参考文档
https://blog.csdn.net/kencaber/article/details/107575210
https://linux-sunxi.org/Manual_build_howto
https://linux-sunxi.org/Mainline_Kernel_Howto
https://linux-sunxi.org/Manual_build_howto
https://linux-sunxi.org/U-Boot
全志F1C100s使用记录:u-boot & linux & rootfs 编译与烧录测试(基于SD卡)(好详细)
目的
这篇文章中将测试在 F1C100s 中运行Linux系统( 基于SD卡 / TF卡),一些背景资料请查看 《全志F1C100s使用记录:资料索引与基础说明》 这篇文章。
基础准备
硬件准备
测试用开发板可以参考上面文章中电路绘制,或者也可以直接购买荔枝派Nano进行测试。
开发环境
下载安装Ubuntu Desktop(使用版本为20.04):
https://ubuntu.com/download/desktop
安装完成后进行基础环境安装与设置:
1 | sudo apt update |
因为需要从GitHub下载项目所以还要安装git:
1 | sudo apt install -y git |
建立工作目录并进入:
1 | # 本文将工作目录设置在用户目录($HOME)下的f1c100s-sdk文件夹中 |
制作toolchain和rootfs
为了方便这里使用buildroot来制作rootfs,这里有个坑。这里如果使用linaro等组织提供的现成的交叉编译工具链来编译buildroot项目生成rootfs,在使用时系统启动过程中可能会出现 Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b ,而使用buildroot自己生成的编译工具链就不会出现这个问题了。所以我们这里统一使用buildroot生成的编译工具链。
下载、解压与配置:
1 | # cd ~/f1c100s-sdk/ |
编译完成后 output 目录下的 host 目录中就是交叉编译工具链(toolchain); output 目录下的 images 目录中的 rootfs.tar 就是生成的根文件系统。
设置编译工具链
注意PATH使用自己的路径,每次打开终端都需要重新设置:
1 | export ARCH=arm |
u-boot & linux编译
u-boot
下载、配置、编译:
1 | # cd ~/f1c100s-sdk/ |
需要修改为:
1 |
然后就可以编译了:
1 | # 根据电脑配置使用make -jx等加快编译速度 |
编译后当前目录下的 u-boot-sunxi-with-spl.bin 文件就是我们需要的。
boot.scr
根据上面对bootcmd的修改,u-boot启动时会从第一分区读取 boot.scr 文件,并执行其中的脚本。我们可以通过这个来设置要传递给linux内核的参数、来加载内核和设备树、来启动内核。
在uboot目录下新建boot.cmd文件,向其中写入u-boot要执行的脚本:
1 | # cd ~/f1c100s-sdk/u-boot/ |
写入以下内容:
1 | # 设置传递给内核的bootargs参数 |
使用u-boot编译后tools目录下的 mkimage 工具可以将boot.cmd文件生成为 boot.scr 文件,通过下面命令:
1 | # arm架构;不压缩;script文件;输入boot.cmd文件;输出boot.scr文件 |
生成的 boot.scr 文件就在当前目录下。
linux
1 | # cd ~/f1c100s-sdk/ |
编译后在 arch/arm/boot/ 目录下的 zImage 文件就是压缩后的内核程序;在 arch/arm/boot/dts/ 目录下的 suniv-f1c100s-licheepi-nano.dtb 或 suniv-f1c100s-licheepi-nano-with-lcd.dtb 文件就是编译后的设备树文件。
测试程序
嵌入式linux开发最终是需要在系统上运行应用程序来实现特定的功能需求,这里编写个基础的应用程序用于测试:
1 | # cd ~/f1c100s-sdk/ |
写入以下内容:
1 |
|
编译生成可执行文件:
1 | arm-buildroot-linux-gnueabi-gcc helloworld.c -o helloworld |
生成的 helloworld 就是我们需要的可执行文件了。
文件烧录
前面编译生成的内容可以分块分别烧录进SD卡进行测试,也可以将 u-boot & linux & rootfs 整块打包烧录进SD卡进行测试,其实本质上是一样的,这里先进行分块测试的介绍,打包烧录介绍将在后面的章节说明。
1 | # 先将SD卡插入Ubuntu中 |
分区设置
准备SD卡并按要求分区,空间划分参考本文开头的给出的文章,下面是在Ubuntu终端中进行分区划分示例:
1 | # 如果已经分过区了那么Ubuntu可能会自动挂载 |
分块烧录
u-boot
u-boot-sunxi-with-spl.bin 文件需要放置在SD卡8k开始的位置上:
1 | # cd ~/f1c100s-sdk/u-boot/ |
linux & dtb & boot.scr
这三个放在刚才新建的第一个分区里(sdb1):
1 | # 如果分区已挂载到别的地方先进行卸载 |
rootfs
这个放在刚才新建的第二个分区里(sdb2):
1 | # 如果分区已挂载到别的地方先进行卸载 |
测试程序
1 | # 如果分区已挂载到别的地方先进行卸载 |
上电测试
上电打印信息与应用程序测试结果与关键日志如下:
默认通过UART0 PE0-RX PE1-TX 波特率115200
我这里使用的是F1C200s,所以内存显示为 64 MiB
前面生成的rootfs登陆用户名为root,无密码
1 | U-Boot SPL 2018.01-gd83b2fe-dirty (Mar 15 2022 - 15:52:58) |
系统镜像
前面分块烧录在测试的时候用用还行,但是如果是要批量生产或是交给他人使用就不方便了,这个时候可以制作系统成单个系统镜像文件来处理。
前面讲了对SD卡分区等操作,其实不管是分区还是数据拷贝等,最终在SD卡上无非就是一片按照一定顺序存储的数据。把这段数据原模原样的拷贝成一个文件,这就是系统镜像文件,使用的时候只要把这个文件内容拷贝到SD卡上就可以了。
制作镜像文件
从已有SD卡制作镜像文件
如果有已经烧录完成所有内容的SD卡的话直接使用 dd 命令将SD卡内容复制到一个文件即可得到系统镜像文件。比如针对前面流程下的SD卡可以使用下面方式:
1 | # cd ~/f1c100s-sdk/ |
从编译生成的文件制作
如果还没有烧录好的SD卡也可以直接从编译生成的文件制作
1 | # cd ~/f1c100s-sdk/ |
压缩系统镜像
前面生成的系统镜像比较大,不适合存储,可以对镜像镜像压缩:
1 | # cd ~/f1c100s-sdk/ |
使用镜像文件
在Linux上可以直接使用 *dd* 命令将镜像文件写入SD卡中
1 | # cd ~/f1c100s-sdk/ |
当然我更加推荐使用工具来烧录,这里推荐使用 BalenaEtcher 工具 ,这个工具支持windos、macos、linux,其官方页面和项目地址分别如下:
https://www.balena.io/etcher/
https://github.com/balena-io/etcher
下面是用这个工具进行烧录的演示:
上面演示了使用BalenaEtcher工具进行烧录和启动测试,其中有两点值得注意的:
- 原始的.bin后缀名的系统进行经过压缩后变得非常小(235MB > 5.98MB),可见压缩非常有用;
- BalenaEtcher可以直接使用压缩包进行烧录(比如我上面演示中);
可能会遇到的问题
- buildroot编译过程中下载文件慢
buildroot编译过程中会下载很多文件,有可能会下着下着就不动了,或是下载缓慢。首先可以尝试使用ctrl + c终止当前工作后再make,会从终止的步骤重新开始;
如果上面的方式不行,那自行查看编译输出信息,其中有文件下载地址的,手动用下载工具进行下载,把下载的内容压缩包或解压后内容放到buildroot的dl目录下,然后重复前面步骤; - 编译过程中因为缺少文件报错
百度、必应等查找Ubuntu下安装这些文件的方法; - 编译或使用中其它不明的问题
使用make clean或者make distclean后重复配置编译过程;
SDK数据包
鉴于整个过程中有很多东西需要下载,部分内容可能下载缓慢,所以将本文中出现的主要的几个项目内容进行了打包,方便将来使用。下载链接如下:
链接:https://pan.baidu.com/s/1BJPKuZJQmczxh82JJOGG_g
提取码:ezrw
下载下来是个zip格式压缩包,解压后得到下面内容(Ubuntu上可以使用 unzip 进行解压):
各个文件说明如下:
| 文件 | 说明 |
|---|---|
| helloworld | 内部含有helloworld.c文件 |
| buildroot-2022.02.tar.xz | 使用 wget https://buildroot.org/downloads/buildroot-2022.02.tar.xz 下载得到的压缩包 |
| buildroot-2022.02-with-dl.tar.xz | 根据上面项目 make menuconfig > make > make clean 后的文件夹进行重新打包压缩 其dl文件夹中包含了所有make时需要下载的东西 |
| linux.tar.xz | 使用 git clone -b nano-4.14-exp –depth=1 https://github.com/Lichee-Pi/linux.git 下载 得到的linux文件夹中放入使用 wget https://dl.sipeed.com/fileList/LICHEE/Nano/SDK/config 下载的config文件 然后对linux文件夹重新打包 |
| sunxi-tools.tar.xz | 使用 git clone -b f1c100s-spiflash –depth=1 https://github.com/Icenowy/sunxi-tools.git 下载 得到的sunxi-tools文件夹重新打包 |
| u-boot.tar.xz | 使用 git clone -b nano-lcd800480 –depth=1 https://github.com/Lichee-Pi/u-boot.git 下载 到的u-boot文件夹重新打包 |
总结
本文基于现有的一些项目,详细记录 u-boot & linux & rootfs 编译与烧录测试( 基于SD卡) 整个流程内容,可以作为进一步的移植、开发与使用的基础。
相关链接(侵删)
欢迎到公众号来唠嗑:



