实现需求
想用中由于使用了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系统,启动终端命令行工具,
以制作16MB大小的flash.bin文件为例,在Linux下几行命令搞定:
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
参数说明:
-n "FlashDisk"
是指定了卷标,windows上看到的就是盘符上边上的文字16384
是磁盘空间大小,单位是KB 计算公式 16M=16*1024KB=16384KB
dd
这个命令的目的就是将前面20MB的内容抠出来。flash.bin
这个是输出的镜像文件
文件制作好后,写一套flash下载算法,将bin文件下载到外部挂载的16MB Flash芯片上。
如果向镜像文件中写入数据
第一步:复制数据进Linux系统
创建文件夹命令:
sudo mkdir -p /home/grabbyte/osdev/data/udisk/
然后,进入到udisk文件夹
在widnows上将要写入镜像的图片文件复制到udisk
这个文件夹下面来。
第二步:复制图片文件到新建的flash.bin磁盘镜像
通过Linux命令 mount 挂载镜像文件到指定位置,就可以在上面添加和修改文件了。
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
,然后卸载文件系统,实现了镜像文件的修改。
处理 设备上没有空间 问题
报错:
cp: 写入 xxx 出错:设备上没有空间
如图:
如果提示了 设备上没有空间,由于我们创建的是16MB大小的磁盘,所以说明你复制的文件总大小已经超过了16MB,要删除多余的文件
如何删除文件
要删除文件的话,直接cd /tmp/udisk
跳转到/tmp/udisk
下,用rm
命令进行删除文件操作,
例如,删除 镜像中的test.txt
文件,则命令是:
cd /tmp/udisk
sudo rm -rf test.txt
sudo umount /tmp/udisk