这段时间太忙,一直没有时间搞硬件,群里多次有朋友问RTT下DFS的使用问题。
这里做个说明,因为没有用硬件试,所有内容是记忆和QQ聊天记录中找回来的。
具体步骤可能有些出入,想用的朋友可能要稍爬一下坑。
一些说明:
如果文件以读为主,可以用FAT格式,rtthread\env_released_1.1.2\env\tools\fatdisk中有现成的工具。
如果经常要写入,建议用littlefs 有写均衡,性能上FAT比littlefs稍强。lfsdisk.zip
lfsdisk与fatdisk用法基本相同。
RTT上的处理
勾上这个。
然后pkgs --update
然后根据模板建一个fal_cfg.h
从第2M开始,后面是14M建一个分区,因为一般固件不会超过2M
将下面的代码放到需要初始化文件系统的地方,比如我就放在applications/main中
/* 初始化 fal 功能 */
fal_init();
/* 在 spi flash 中名为 "filesystem" 的分区上创建一个块设备 */
flash_res_dev = fal_blk_device_create("res");
// struct rt_device *flash_res_dev = fal_mtd_nor_device_create("res");
if (flash_res_dev == NULL)
{
rt_kprintf("Can't create a block device on 'res' partition.");
return 0;
}
/* 挂载 spi flash 中名为 "filesystem" 的分区上的文件系统 lfs elm jffs2 */
if (dfs_mount(flash_res_dev->parent.name, "/", "elm", 0, 0) != 0)
{
/* 格式化文件系统 lfs elm jffs2 */
dfs_mkfs("elm", flash_res_dev->parent.name);
/* 挂载 lfs elm jffs2 */
if (dfs_mount(flash_res_dev->parent.name, "/", "elm", 0, 0) != 0)
{
rt_kprintf("Failed to initialize filesystem!");
}
}
然后在main里面。将res挂到/目录。
现在其实以可以在rtt的控制台中ls cd这些了。
上面的代码中可以看到,挂载不成功会mkfs,也就是说产生的是空的。
现实中我们往往需要将电脑上的文件夹拷到FLASH中去。
以FAT格式为例
在电脑上建一个文件夹 root 将要上传的文件放进去
建一个root.xml
<?xml version="1.0" encoding="UTF-8"?>
<fatdisk>
<disk_size>14336</disk_size>
<sector_size>4096</sector_size>
<root_dir>root</root_dir>
<output>root.bin</output>
<strip>1</strip>
</fatdisk>
fatdisk.exe -f root.xml
会生成root.bin
实际上可以建多个分区,比如我建了一个root存放程序要的图片,再建一个data存用户数据。
将root.bin写到对应的位置,比如我上面定义的是从2M开始
sunxi-fel -p spiflash-write 0x00200000 root.bin
这样在RTT中cd sl就可以看到你上传的文件了。
littlefs基本上差不多,只是在RTT中要引入对应的文件系统。
至于LVGL中怎么使用这些文件,应该比较简单,请其它小伙伴补上。
离线
补个效果图(从QQ聊天记录中找到的)
离线