学习笔记F1C100S之u-boot编译过程记录
F1C200S使用SD卡引导UBOOT过程
- 20260521 11:40
在 u-boot-licheepi 文件 make menuconfig 配置好后编译生成 u-boot-sunxi-with-spl.bin文件就是uboot文件,之前文章主要是讲述Linux下使用dd工具烧录,现在使用的是window下的 DiskGenius 工具,其他工具也类似,因为原理都一样!
首先将SD删除所有分区
然后一定要分配两个fat32分区,前面部分放 u-boot-sunxi-with-spl.bin 文件,而且是要被破坏的,因此够用就行(后续也可以调整分区)。注意:如果现在仅分一个分区,后边破坏分区表后就没法使用了
将 u-boot-sunxi-with-spl.bin 写到 SD 卡 ** 偏移 8KB(扇区 16)** 开始的位置(扇区 0~15:保留 / 分区表,扇区 16 开始:放 u‑boot)
打开DiskGenius Pro软件–>选择SD卡–>扇区编辑–>扇区复制–>镜像文件选择u-boot-sunxi-with-spl.bin,目标盘选择SD卡,设置目标盘(SD卡)起始扇区为16,扇区数会根据bin文件提供,然后复制即可
F1C100s 制作 SD 卡启动
本文详细介绍如何将 SD 卡分区、写入 U-Boot,制作 LicheePi 镜像 并启动 F1C100s 开发板。涵盖分区格式、U-Boot 写入方法、启动脚本编写、注意事项。
1. SD 卡分区
- SD 卡分为两个分区:(注:现在做裸机freertos-就直接做FAT32了)
- 第1分区:FAT32 格式,用于放置内核镜像、设备树文件和启动脚本(如
boot.scr)。 - 第2分区:ext4 格式,用于放置根文件系统(rootfs)。
- 第1分区:FAT32 格式,用于放置内核镜像、设备树文件和启动脚本(如
示例分区表:
1 | /dev/mmcblk0p1 * 2048 18431 16384 8M c W95 FAT32 (LBA) |
- 其中第1分区从第2048扇区(约1MB)开始。(注:这就是SD卡启动本质)
2. U-Boot 写入说明
U-Boot 是裸机启动程序,不能作为普通文件放在 FAT 分区里。
正确做法是将 U-Boot 二进制文件(通常为
u-boot-sunxi-with-spl.bin)写入 SD 卡的前 1MB 空间,通常从 8KB(seek=8)处开始写入。写入命令示例:(注:这就是DD工具写入,window下也有就是太久没更新了)
1
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8 conv=fsync
这样写不会破坏 SD 卡的 MBR 和分区表,也不会影响 FAT/ext4 分区。(注:使用DiskGenius写这个前要分好区-否则后边8K这个位置被破坏了)
3. boot.env 与 boot.scr 的关系
boot.env是一个纯文本格式的 U-Boot 脚本,里面写启动命令。(注:可以进入uboot后再写)U-Boot 不会直接识别
boot.env,必须用mkimage工具将其转换成二进制脚本文件boot.scr。
转换命令:1
mkimage -C none -A arm -T script -d boot.env boot.scr
生成的
boot.scr放入 FAT 分区根目录,U-Boot 启动时会自动执行。
4. F1C100s 启动流程
- 设备上电后,硬件首先读取 SD 卡前部的 U-Boot。
- U-Boot 初始化硬件,挂载第1分区(FAT32)。
- U-Boot 加载并执行
boot.scr脚本。 - 脚本加载内核(
zImage)和设备树文件(.dtb)。 - 启动 Linux 内核,挂载根文件系统(ext4 分区)。
5. 如何写入 U-Boot 不破坏分区
查看分区起始扇区
1
sudo fdisk -l /dev/mmcblk0
确认第1分区起始扇区(通常≥2048,代表1MB起始)。(注:所以只要分区的时候记得跨过这个区域就行-毕竟会被破坏掉)
使用
dd命令跳过前8KB,写入 U-Boot:1
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8 conv=fsync
这样写入位置在 8KB 到 1MB 之间,不会覆盖 MBR 或分区表,保证数据安全。(注:跟DiskGenius理解一样,反正不能跟uboot重叠)
6. 生成并使用 boot.scr
编写启动脚本
boot.env,例如:1
2
3
4setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=5
fatload mmc 0:1 0x80008000 zImage
fatload mmc 0:1 0x80A00000 f1c100s-licheepi-nano.dtb
bootz 0x80008000 - 0x80A00000使用
mkimage转换:1
mkimage -C none -A arm -T script -d boot.env boot.scr
把
boot.scr放入 FAT 分区:1
sudo cp boot.scr /mnt/boot/
这里注意,如果仍从nor-flash启动,uboot的bootcmd 改为 run distro_bootcmd,即按顺序尝试各启动方式。
🧠 总结图解流程
1 | run distro_bootcmd |
7. 写入命令带进度显示
使用支持的
dd版本加参数1
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8 conv=fsync status=progress
或者使用
pv结合dd(需要安装pv)1
2sudo apt install pv
sudo pv u-boot-sunxi-with-spl.bin | sudo dd of=/dev/mmcblk0 bs=1024 seek=8 conv=fsync
8. 判断写入成功的方法
dd命令执行结束无报错,并显示写入字节数。fdisk -l /dev/mmcblk0查看分区表正常。- 可用
dd和hexdump查看写入扇区内容:1
sudo dd if=/dev/mmcblk0 bs=1024 skip=8 count=16 | hexdump -C
- 最终将 SD 卡插入开发板,连接串口,观察启动日志,确认 U-Boot 正常启动。
9. 参考分区表示例分析
1 | /dev/mmcblk0p1 * 2048 18431 16384 8M c W95 FAT32 (LBA) |
- 起始扇区2048对应1MB起始。
dd写入从8KB开始,完全位于第1分区起始前。- MBR 和分区表在扇区0,大小不足8KB,不被覆盖
10. 总结
| 步骤 | 说明 |
|---|---|
| 分区 | 一个 FAT32 分区放内核、设备树、启动脚本,一个 ext4 放 rootfs |
| 写入 U-Boot | 使用 dd 从 8KB 开始写入 u-boot-sunxi-with-spl.bin 到裸设备 |
| 生成启动脚本 | 用 mkimage 转换 boot.env 为 boot.scr |
| 拷贝启动文件 | 将 boot.scr、zImage、.dtb 拷入 FAT32 分区 |
| 写入 rootfs | 解压或拷贝 rootfs 到 ext4 分区 |
| 启动验证 | 观察串口日志确认 U-Boot 和 Linux 内核启动正常 |
Linux 启动需要的文件
内核镜像:比如
zImage或uImage设备树文件:比如
suniv-f1c100s-licheepi-nano.dtb启动脚本:
boot.scr(或者直接用命令启动)
两种启动方式
方式 1:直接在 U-Boot 命令行手动启动
在=>提示符下,依次输入这几条命令,就能直接启动 Linux:
1 | # 1. 从SD卡FAT分区加载内核到内存地址0x80008000 |
内核是uImage,把bootz换成bootm即可
1 | bootm 0x80008000 - 0x80C00000 |
方式 2:制作自动启动脚本(boot.scr)
方式 2:制作自动启动脚本(boot.scr)
每次手动输命令太麻烦,你可以做一个自动启动脚本,开机自动跑:
在电脑上新建一个文件
boot.cmd,内容如下:1
2
3
4load mmc 0:1 0x80008000 zImage
load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rw rootwait
bootz 0x80008000 - 0x80C00000用 U-Boot 的工具把它编译成
boot.scr:1
mkimage -C none -A arm -T script -d boot.cmd boot.scr
把
boot.scr放到 SD 卡的 FAT32 分区里,U-Boot 开机就会自动执行它,不用再手动输命令了。
分区说明
| 分区 | 格式 | 用途 | 放什么文件 |
|---|---|---|---|
mmc0p1 |
FAT32 | 启动分区 | zImage、.dtb、boot.scr |
mmc0p2 |
EXT4 | 根文件系统 | Linux 系统文件 |
之前格式化的是mmc0p1,剩下的空间需要格式化成 EXT4 分区,用来放根文件系统(rootfs)。
启动流程总结
把 SD 卡插到电脑上,在 FAT32 分区放入
zImage、dtb、boot.scr用 DiskGenius 把剩下的空间新建一个 EXT4 分区,写入根文件系统
把 SD 卡插回开发板,上电,U-Boot 会自动执行
boot.scr,直接启动 Linux
📦 2GB SD 卡分区推荐方案
| 分区 | 大小 | 格式 | 用途 | 存放内容 |
|---|---|---|---|---|
| 分区 1(boot) | 128 MiB | FAT32 | U-Boot 与内核启动分区 | u-boot-spl.bin、u-boot.bin、zImage/uImage、*.dtb、boot.scr |
| 分区 2(rootfs) | 剩余全部(约 1.7GiB) | EXT4 | 根文件系统分区 | Linux 系统、用户程序、数据 |
128MB FAT32 启动分区足够用
- U-Boot + 内核 + 设备树 + 启动脚本,加起来也不到 20MB
- 128MB 留足了余量,以后更新内核 / 固件也不用重分区
- FAT32 格式电脑读写方便,调试时直接拷贝文件
剩下的全给 EXT4 根文件系统
- 1.7GB 足够跑一个带图形界面的 Linux 系统,或者装很多应用
- 没有多余的交换分区(Lichee Pi Nano 只有 64MB 内存,开 swap 反而拖慢速度,没必要)
🛠️ 分区操作步骤(在电脑上用 DiskGenius)
删除 SD 卡上所有现有分区
新建分区 1:
- 大小:
128 MB - 文件系统:
FAT32 - 卷标:
BOOT
新建分区 2:
- 大小:剩下的全部空间
- 文件系统:
EXT4 - 卷标:
ROOTFS
保存分区表,格式化两个分区
📝 分区后使用说明
- 把
zImage、suniv-f1c100s-licheepi-nano.dtb、boot.scr放到 FAT32 分区 - 把根文件系统解压到 EXT4 分区的根目录
- 烧写 U-Boot 到 SD 卡的扇区 16(不是分区里)
💡 补充说明:不要把 U-Boot 写到 FAT32 分区里,它必须写在分区表前面的扇区(扇区 16 开始)
本人纯属软件文盲,linux更文盲,本身做硬件设计的,对软件一窍不通 :) 自从掉到咱们论坛这个大坑后,翻贴无数,在此做一下记录,尽量多配截图,以方便后面的新手少走弯路,快速体验编译成功的小成就~ 高手勿喷高手勿喷高手勿喷~~~
由于是学习,所以采用了虚拟机安装ubuntu的方式,比较耐折腾,安装好后复制出来备份,需要重新安装系统的时候替换出来就可以了~
1、具体虚拟机安装ubuntu的过程在此不详细记录了,百度一堆一堆的。建议安装的时候断网,免得安装过程中下载插件。
2、安装好系统后,第一步先更新一下apt-get,具体命令是:
1 | sudo apt-get update |
备注:快速打开命令行的快捷键是Ctrl+Alt+t
3、紧着接安装git工具,具体命令是:
1 | sudo apt-get install git |
4、获取编译工具,具体命令是:
1 | mkdir f1c100s |
以上是先建立了一个f1c100s的目录,然后进入f1c100s。也可以省去此步骤、没有影响。
1 | 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 |
5、此时技巧来了,再次按Ctrl+Alt+t新建一个命令行窗口,拽取u-boot源码,具体命令是:
1 | mkdir uboot |
当然上面两行诗创建uboot目录和进入uboot目录的命令,可以省去,没有影响。
1 | git clone https://github.com/Lichee-Pi/u-boot.git |
这时等待拽取源码或者获取编译工具结束,静静的等待 ·-· 。。。
6、其实我们还可以做点别的
根据坛友们的经验,尤其是晕哥的全志开发资料精华汇总, 持续更新 (请大家继续补充**)LinjieGuo的尝试从零构建F1C100s开发环境
需要补充安装下面这些包,具体命令如下:
1 | sudo apt-get install libncurses5-dev |
7、待获取编译环境的命令行窗口获取完毕后,安装vim编辑器,不装用vi也可以,具体命令是:
1 | sudo apt install vim |
我也搞不清楚什么时候用apt install什么时候用apt-get install,好像喵过一眼是说这是两个组合命令,get是获取,apt是安装,不作数,我这里糊涂着呢~
另外,不管你开了多少个命令行,貌似只能有一个apt-get运行,如果有运行中的apt-get再运行会报错。
有关vim编辑器的使用自行百度补脑,不细说了~百度有很多。
8、解压编译环境,命令是:
1 | tar -vxJf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz |
9、拷贝编译环境到/opt/目录,也就是平常说的安装,命令是:
1 | sudo cp -r ./gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi /opt/ |
10、配置编译环境,添加path环境变量,具体方法是用vim打开/etc/目录下面的bash.bashrc,在末尾添加
PATH=”$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin”,这一行,具体操作是运行sudo vim /etc/bash.bashrc命令
然后按光标向下按键移动显示内容到最后面一行,再按光标向右键,移动到行尾,这时按“i”键,转化为插入模式。输入PATH=”$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin”输入完后按ESC键,甭管显示什么,输入:wq保存退出即可。还是如前面提到的,具体怎么使用请百度。
1 | sudo vim /etc/bash.bashrc |
这里少截了一个图,借用后面更新source /etc/bash.bashrc命令的图吧~
添加的内容是:
1 | PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin" |


最后运行更新命令,命令如下:
1 | source /etc/bash.bashrc |
小试一下gcc是否正常,使用gcc显示版本号的方式测试安装是否正常,出来一堆,反正我看不懂~~~
命令是:
1 | arm-linux-gnueabi-gcc -v |

自此整个编译环境获取、配置完毕。嗷嗷嗷,忘记说了,觉得有必要提醒一下,
从步骤7开始,都是在最开始打开的那个窗口或者说是步骤4哪里的那个窗口才可以完成的。
也许在其他窗口执行会有问题。
11、关闭所有的命令行窗口,按Ctrl+Alt+t重新打开一个窗口(因为之前分开三个窗口操作,为了节省时间),
命令行窗口之间操作的内容比如安装了XX,是不会过度到操作窗口以外的,除非是后面新打开的命令行窗口,不严谨的描述~高手勿喷!
正题:进入uboot目录,在进入u-boot目录,反正最终你找的u-boot目录,进去就OK了,运行git branch -a查看分支。具体命令是:
1 | cd uboot |

选择nano-v2018.01分支,命令是:
1 | git checkout nano-v2018.01 |

12、开始编译咯,运行命令make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig指定配置信息
1 | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig |

可视化配置,具体怎么配置坛内或者百度搜吧,我也不造~
1 | make ARCH=arm menuconfig |

正式开始编译,运行命令如下:
1 | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j1 |

顺利编译
其中末尾的J1是因为我电脑配置低,只分配给了虚拟机一个处理器,只有一个核心,可根据具体实际情况更改,核心数量越多编译越快。四核就是J4,J8都是土豪~~~~~
相关链接(侵删)
欢迎到公众号来唠嗑:


