F1C200S使用SD卡引导UBOOT过程

  • 20260521 11:40
    u-boot-licheepi 文件 make menuconfig 配置好后编译生成 u-boot-sunxi-with-spl.bin文件就是uboot文件,之前文章主要是讲述Linux下使用dd工具烧录,现在使用的是window下的 DiskGenius 工具,其他工具也类似,因为原理都一样!
  1. 首先将SD删除所有分区

  2. 然后一定要分配两个fat32分区,前面部分放 u-boot-sunxi-with-spl.bin 文件,而且是要被破坏的,因此够用就行(后续也可以调整分区)。注意:如果现在仅分一个分区,后边破坏分区表后就没法使用了

  3. u-boot-sunxi-with-spl.bin 写到 SD 卡 ** 偏移 8KB(扇区 16)** 开始的位置(扇区 0~15:保留 / 分区表,扇区 16 开始:放 u‑boot)

  4. 打开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
2
/dev/mmcblk0p1 *     2048   18431   16384    8M  c W95 FAT32 (LBA)
/dev/mmcblk0p2 18432 7774207 7755776 3.7G 83 Linux
  • 其中第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 启动流程

  1. 设备上电后,硬件首先读取 SD 卡前部的 U-Boot。
  2. U-Boot 初始化硬件,挂载第1分区(FAT32)。
  3. U-Boot 加载并执行 boot.scr 脚本。
  4. 脚本加载内核(zImage)和设备树文件(.dtb)。
  5. 启动 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
    4
    setenv 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
2
3
4
5
6
7
8
9
10
11
run distro_bootcmd
└─> boot_targets=fel mmc0 pxe dhcp
├─> run bootcmd_fel
├─> run bootcmd_mmc0
└─> mmc dev 0
└─> scan_dev_for_boot_part
└─> for partition:
└─> if boot.scr → source
└─> if extlinux.conf → sysboot
├─> run bootcmd_pxe
└─> run bootcmd_dhcp

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
    2
    sudo apt install pv
    sudo pv u-boot-sunxi-with-spl.bin | sudo dd of=/dev/mmcblk0 bs=1024 seek=8 conv=fsync

8. 判断写入成功的方法

  1. dd 命令执行结束无报错,并显示写入字节数。
  2. fdisk -l /dev/mmcblk0 查看分区表正常。
  3. 可用 ddhexdump 查看写入扇区内容:
    1
    sudo dd if=/dev/mmcblk0 bs=1024 skip=8 count=16 | hexdump -C
  4. 最终将 SD 卡插入开发板,连接串口,观察启动日志,确认 U-Boot 正常启动。

9. 参考分区表示例分析

1
2
/dev/mmcblk0p1 *     2048   18431   16384    8M  c W95 FAT32 (LBA)
/dev/mmcblk0p2 18432 7774207 7755776 3.7G 83 Linux
  • 起始扇区2048对应1MB起始。
  • dd 写入从8KB开始,完全位于第1分区起始前。
  • MBR 和分区表在扇区0,大小不足8KB,不被覆盖

10. 总结

步骤 说明
分区 一个 FAT32 分区放内核、设备树、启动脚本,一个 ext4 放 rootfs
写入 U-Boot 使用 dd 从 8KB 开始写入 u-boot-sunxi-with-spl.bin 到裸设备
生成启动脚本 mkimage 转换 boot.envboot.scr
拷贝启动文件 boot.scrzImage.dtb 拷入 FAT32 分区
写入 rootfs 解压或拷贝 rootfs 到 ext4 分区
启动验证 观察串口日志确认 U-Boot 和 Linux 内核启动正常

Linux 启动需要的文件

  1. 内核镜像:比如 zImageuImage

  2. 设备树文件:比如 suniv-f1c100s-licheepi-nano.dtb

  3. 启动脚本boot.scr(或者直接用命令启动)

两种启动方式

方式 1:直接在 U-Boot 命令行手动启动

=>提示符下,依次输入这几条命令,就能直接启动 Linux:

1
2
3
4
5
6
7
8
9
10
11
# 1. 从SD卡FAT分区加载内核到内存地址0x80008000
load mmc 0:1 0x80008000 zImage

# 2. 从SD卡FAT分区加载设备树到内存地址0x80C00000
load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb

# 3. 设置bootargs(传递给内核的启动参数)
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rw rootwait

# 4. 启动内核
bootz 0x80008000 - 0x80C00000

内核是uImage,把bootz换成bootm即可

1
bootm 0x80008000 - 0x80C00000

方式 2:制作自动启动脚本(boot.scr)

方式 2:制作自动启动脚本(boot.scr)

每次手动输命令太麻烦,你可以做一个自动启动脚本,开机自动跑:

  1. 在电脑上新建一个文件 boot.cmd,内容如下:

    1
    2
    3
    4
    load 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
  2. 用 U-Boot 的工具把它编译成boot.scr

    1
    mkimage -C none -A arm -T script -d boot.cmd boot.scr
  3. boot.scr放到 SD 卡的 FAT32 分区里,U-Boot 开机就会自动执行它,不用再手动输命令了。

分区说明

分区 格式 用途 放什么文件
mmc0p1 FAT32 启动分区 zImage.dtbboot.scr
mmc0p2 EXT4 根文件系统 Linux 系统文件

之前格式化的是mmc0p1,剩下的空间需要格式化成 EXT4 分区,用来放根文件系统(rootfs)。

启动流程总结

  1. 把 SD 卡插到电脑上,在 FAT32 分区放入zImagedtbboot.scr

  2. 用 DiskGenius 把剩下的空间新建一个 EXT4 分区,写入根文件系统

  3. 把 SD 卡插回开发板,上电,U-Boot 会自动执行boot.scr,直接启动 Linux

📦 2GB SD 卡分区推荐方案

分区 大小 格式 用途 存放内容
分区 1(boot) 128 MiB FAT32 U-Boot 与内核启动分区 u-boot-spl.binu-boot.binzImage/uImage*.dtbboot.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

保存分区表,格式化两个分区

📝 分区后使用说明

  • zImagesuniv-f1c100s-licheepi-nano.dtbboot.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
2
mkdir f1c100s
cd 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
2
mkdir uboot
cd uboot

当然上面两行诗创建uboot目录和进入uboot目录的命令,可以省去,没有影响。

1
git clone https://github.com/Lichee-Pi/u-boot.git

这时等待拽取源码或者获取编译工具结束,静静的等待 ·-· 。。。
6、其实我们还可以做点别的
根据坛友们的经验,尤其是晕哥的全志开发资料精华汇总, 持续更新 (请大家继续补充**)LinjieGuo的尝试从零构建F1C100s开发环境

需要补充安装下面这些包,具体命令如下:

1
2
3
4
sudo apt-get install libncurses5-dev
sudo apt-get install device-tree-compiler
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install swig python-dev python3-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"

path
wq
最后运行更新命令,命令如下:

1
source /etc/bash.bashrc

小试一下gcc是否正常,使用gcc显示版本号的方式测试安装是否正常,出来一堆,反正我看不懂~~~
命令是:

1
arm-linux-gnueabi-gcc -v

gcc
自此整个编译环境获取、配置完毕。嗷嗷嗷,忘记说了,觉得有必要提醒一下,
从步骤7开始,都是在最开始打开的那个窗口或者说是步骤4哪里的那个窗口才可以完成的。
也许在其他窗口执行会有问题。

11、关闭所有的命令行窗口,按Ctrl+Alt+t重新打开一个窗口(因为之前分开三个窗口操作,为了节省时间),
命令行窗口之间操作的内容比如安装了XX,是不会过度到操作窗口以外的,除非是后面新打开的命令行窗口,不严谨的描述~高手勿喷!
正题:进入uboot目录,在进入u-boot目录,反正最终你找的u-boot目录,进去就OK了,运行git branch -a查看分支。具体命令是:

1
2
3
cd uboot
cd u-boot
git branch -a

gitbranch
选择nano-v2018.01分支,命令是:

1
git checkout nano-v2018.01

nano2018

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

makearch1.jpg
可视化配置,具体怎么配置坛内或者百度搜吧,我也不造~

1
make ARCH=arm menuconfig

menuconfig

正式开始编译,运行命令如下:

1
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j1

make_ok
顺利编译
makels
其中末尾的J1是因为我电脑配置低,只分配给了虚拟机一个处理器,只有一个核心,可根据具体实际情况更改,核心数量越多编译越快。四核就是J4,J8都是土豪~~~~~


相关链接(侵删)

  1. 学习笔记F1C100S之u-boot编译过程记录

=================我是分割线=================

欢迎到公众号来唠嗑: