实现需求

想用中由于使用了LVGL做UI,图片资源有点多,需要将图片资源作为独立的bin文件存放到外部的flash中, 而外部的flash直接SPI读写是很麻烦的,所以就用到了FAT文件系统, 通过将要用到的bin文件,制作一个名为flash.bin的文件, 此文件是一个FAT格式的磁盘分区的镜像文件,大小为16MB,给写入到芯片做准备。

准备工作

  • Ubuntu Linux ISO文件 开源的Linux系统镜像
  • OracleVitralBox 免费的虚拟机软件

A.安装好VBox虚拟机软件,创建好系统。

B.创建一个文件共享,挂载到/home/grabbyte/osdev/data/位置,实现windows与虚拟机文件互通,到这里,准备工作完毕。

注意:这里的路径换成你自己的 /home/grabbyte/osdev/data/,以下有这个路径的地方都要换成你自己的。

Linux 创建FAT

具体操作

进入到Linux系统,启动终端命令行工具, Linux 创建FAT

以制作16MB大小的flash.bin文件为例,在Linux下几行命令搞定:

1
2
3
mkdir -p /home/grabbyte/osdev/data/
mkfs.vfat -n "FlashDisk" -F 32 -C usbdisk.tmp 16384
dd if=usbdisk.tmp of=flash.bin bs=1024 count=20480

Linux 创建FAT

参数说明:

-n "FlashDisk" 是指定了卷标,windows上看到的就是盘符上边上的文字 16384 是磁盘空间大小,单位是KB 计算公式 16M=16*1024KB=16384KB dd这个命令的目的就是将前面20MB的内容抠出来。 flash.bin 这个是输出的镜像文件

文件制作好后,写一套flash下载算法,将bin文件下载到外部挂载的16MB Flash芯片上。

如果向镜像文件中写入数据

第一步:复制数据进Linux系统

创建文件夹命令:

1
sudo mkdir -p /home/grabbyte/osdev/data/udisk/

然后,进入到udisk文件夹

Linux 创建FAT

在widnows上将要写入镜像的图片文件复制到udisk这个文件夹下面来。

Linux 创建FAT

第二步:复制图片文件到新建的flash.bin磁盘镜像

通过Linux命令 mount 挂载镜像文件到指定位置,就可以在上面添加和修改文件了。

1
2
3
4
sudo mkdir -p /tmp/udisk
sudo mount -o loop /home/grabbyte/osdev/data/flash.bin /tmp/udisk -o fat=32
sudo cp -r /home/grabbyte/osdev/data/udisk/* /tmp/udisk/
sudo umount /tmp/udisk

上面的命令是挂载flash.bin这个镜像到/tmp/udisk这个位置, 然后复制/home/grabbyte/osdev/data/udisk/下面的数据到/tmp/udisk,然后卸载文件系统,实现了镜像文件的修改。

处理 设备上没有空间 问题

报错:

1
cp: 写入 xxx 出错:设备上没有空间

如图: Linux 创建FAT

如果提示了 设备上没有空间,由于我们创建的是16MB大小的磁盘,所以说明你复制的文件总大小已经超过了16MB,要删除多余的文件

如何删除文件

要删除文件的话,直接cd /tmp/udisk 跳转到/tmp/udisk下,用rm命令进行删除文件操作,

例如,删除 镜像中的test.txt文件,则命令是:

1
2
3
cd /tmp/udisk
sudo rm -rf test.txt
sudo umount /tmp/udisk