你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】FatSL 移植笔记

[复制链接]
STMCU小助手 发布时间:2022-3-1 12:15
一. FatSL 介绍
FatSL 是嵌入式软件供应商 HCC 开发的一种 FAT 类型的文件系统。FatSL 具有以下特性:
极低的 RAM 和 ROM 需求 <1K bytes RAM, 大约 4K bytes ROM
高性能,针对 FAT 风险的安全特性设计
支持 FAT12,FAT16,FAT32 类型
FatSL 的结构如下图所示 (FatSL 的软件结构设置的非常清晰,赞)

95E3N88(}UTM~}L[IAY5LDT.png


二.FatSL 的移植
如果了解 FAT 的系统结构,并理解了 FatSL 的软件结构,那么文件系统移植并不困难(其实文件系统移植都是大同小异的)。本文给出的例子是基于 STEVAL-CCM007V1 硬件平台,通过 NFTL层(NAND Flash Translation Layer)在 NAND Flash 上建立该文件系统的情况。
1. 数据结构
F_PHY 主要是对存储介质的描述
  1. <div>typedef struct</div><div>{</div><div> unsigned short number_of_cylinders; // 磁盘的参数,现在已经很少用到</div><div> unsigned short sector_per_track;</div><div> unsigned short number_of_heads;</div><div> unsigned long number_of_sectors; // 扇区数</div><div> unsigned char media_descriptor; // 介质是否支持拔插</div><div> unsigned short bytes_per_sector; // 扇区大小 512bytes</div><div>} F_PHY;</div>
复制代码


_F_DRIVER 就是文件系统对存储介质的驱动接口了,通过 user_ptr 指针(例如指向用户自定
义的存储介质的数据结构)可以为驱动实现更好的设计。
  1. <div>typedef struct F_DRIVER</div><div>{</div><div> unsigned long user_data; /* 用户自定义数据 */</div><div> void * user_ptr; /* 用户定义指针 */</div><div> /* 驱动函数 */</div><div> F_WRITESECTOR writesector;</div><div> F_READSECTOR readsector;</div><div> F_GETPHY getphy;</div><div> F_GETSTATUS getstatus;</div><div> F_RELEASE release;</div><div>} _F_DRIVER;</div>
复制代码


2. 驱动函数的编写
F_DRIVER *( *F_DRIVERINIT )( unsigned long ulDriverParameter );
初始化文件系统和存储介质驱动的接口,为 F_DRIVER 结构体添加内容
  1. F_DRIVER *Nand_initfunc(unsigned long driver_param)
  2. {
  3. t_nandDrv *p;
  4. p = nandDrv;

  5. if (p->use)
  6. {
  7. return 0;
  8. }
  9. (void)psp_memset( p->driver, 0, sizeof( F_DRIVER ) );
  10. p->driver->readsector = nand_readsector;
  11. p->driver->writesector = nand_writesector;
  12. p->driver->getphy = nand_getphy;
  13. p->driver->getstatus = nand_getstatus;
  14. p->driver->release = nand_release;
  15. p->driver->user_ptr = p;
  16. p->use = 1;
  17. return p->driver;
  18. }
复制代码

typedef int ( *F_GETPHY )( F_DRIVER * pxDriver, F_PHY * pxPhy );
将存储介质的信息添加到 F_PHY 结构体中
  1. static int nand_getphy(F_DRIVER *driver, F_PHY *phy)
  2. {
  3. phy->number_of_sectors = MassBlockCount;
  4. phy->media_descriptor = F_MEDIADESC_FIX;
  5. phy->bytes_per_sector = 512u;
  6. return 0;
  7. }
复制代码

typedef int ( *F_READSECTOR )( F_DRIVER * pxDriver, void * pvBuffer, unsigned long
ulSector );
读扇区函数,从逻辑扇区 ulSector 中将数据读到 pvBuffer 所指向的缓存中
  1. static int nand_readsector(F_DRIVER *driver, void *data, unsigned long sector)
  2. {
  3. uint16_t res;

  4. t_nandDrv *p = (t_nandDrv *)(driver->user_ptr);

  5. if(sector >= p->maxsector)
  6. {
  7. return 2;
  8. }

  9. res = NAND_Read(sector, data, 512);

  10. if(res != NAND_OK)
  11. return 1;

  12. return 0;
  13. }
复制代码

typedef int ( *F_WRITESECTOR )( F_DRIVER * pxDriver, void * pvBuffer, unsigned long
ulSector );
写扇区函数,把 pvBuffer 指向的数据写入逻辑扇区 ulSector 中
  1. static int nand_writesector(F_DRIVER *driver, void *data, unsigned long sector)
  2. {
  3. uint16_t res;

  4. t_nandDrv *p = (t_nandDrv *)(driver->user_ptr);

  5. if(sector >= p->maxsector)
  6. {
  7. return 2;
  8. }

  9. res = NAND_Write(sector, data, 512);

  10. if(res != NAND_OK)
  11. return 1;

  12. return 0;
  13. }
复制代码

typedef long ( *F_GETSTATUS )( F_DRIVER * pxDriver );
typedef void ( *F_RELEASE )( F_DRIVER * pxDriver );
这两个函数是检测设备拔插的。
三. 经验杂谈
关于文件系统的移植,推荐大家阅读一些 FAT 结构的资料,至少要做到对 FAT 结构心中有数,对调试会有很大的帮助的(工欲善其事,必先利其器)。

收藏 评论0 发布时间:2022-3-1 12:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版