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

【经验分享】FatSL 移植笔记

[复制链接]
STMCU小助手 发布时间:2022-3-1 12:15
一. FatSL 介绍, d: [) |8 d. [9 U; |% d& P
FatSL 是嵌入式软件供应商 HCC 开发的一种 FAT 类型的文件系统。FatSL 具有以下特性:5 C9 s! C, r; D( K  _  J) Y3 A
极低的 RAM 和 ROM 需求 <1K bytes RAM, 大约 4K bytes ROM
2 N7 M( P, l+ A; n: f4 R" t高性能,针对 FAT 风险的安全特性设计
  O; P8 S% G) ~支持 FAT12,FAT16,FAT32 类型
; Y, @0 m  N- A5 k' z4 dFatSL 的结构如下图所示 (FatSL 的软件结构设置的非常清晰,赞)
& Z# g# L+ w$ l) t
. D7 f' C0 C, S( N( ^ 95E3N88(}UTM~}L[IAY5LDT.png
, I. s0 `- ~# |% O: O5 b" }+ {' O  J5 E# I% e# k

; j, J1 A0 ]5 b
二.FatSL 的移植* D8 t& Y' r7 W0 Q( d) z3 E' M) @
如果了解 FAT 的系统结构,并理解了 FatSL 的软件结构,那么文件系统移植并不困难(其实文件系统移植都是大同小异的)。本文给出的例子是基于 STEVAL-CCM007V1 硬件平台,通过 NFTL层(NAND Flash Translation Layer)在 NAND Flash 上建立该文件系统的情况。/ b: F4 w  P  N+ t. s
1. 数据结构
3 o1 I; G  X' z8 O/ h/ W- H F_PHY 主要是对存储介质的描述7 g2 v1 f% m) {! P  z6 I* D
  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>
复制代码
' P5 T; ]8 m8 {/ z, T1 L) K

& N2 ~3 x. U0 p3 H& r" u_F_DRIVER 就是文件系统对存储介质的驱动接口了,通过 user_ptr 指针(例如指向用户自定% h" O0 ?5 _* A( ~
义的存储介质的数据结构)可以为驱动实现更好的设计。! S1 q4 v6 T8 }+ x' w
  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>
复制代码
4 c  t  f( C/ w# S
, d6 R# g2 ^% y" W7 P. V
2. 驱动函数的编写
/ [0 j& p' v' y: E5 o" tF_DRIVER *( *F_DRIVERINIT )( unsigned long ulDriverParameter );0 |) E( m- [) e% `( l4 E
初始化文件系统和存储介质驱动的接口,为 F_DRIVER 结构体添加内容
# t) o1 y) l; C
  1. F_DRIVER *Nand_initfunc(unsigned long driver_param)4 g5 k  O: J9 M- f, h
  2. {7 M( N1 B/ j) I6 ^! J& {
  3. t_nandDrv *p;$ c: ~' h+ O2 u2 }3 u* T' \9 u! M
  4. p = nandDrv;
    ) v5 ~) G% H' m& T0 @
  5. + j2 Q% F2 V6 x9 `; e
  6. if (p->use)8 ?" r! V! q# S- K
  7. {
    ; `. \7 F- H2 E( \( l
  8. return 0;: H, V; m- P. y" U7 B# h
  9. }+ Z; W' X* w& V( x7 p1 f5 n
  10. (void)psp_memset( p->driver, 0, sizeof( F_DRIVER ) );- Y  a* J9 \' {* n
  11. p->driver->readsector = nand_readsector;
    ' n4 p. v) T% Y5 x' ^) P
  12. p->driver->writesector = nand_writesector;; H, Z7 P* i: c- S4 W: }( ], |
  13. p->driver->getphy = nand_getphy;. ^" m, m0 @7 N4 p$ t6 Z
  14. p->driver->getstatus = nand_getstatus;
    % s, z: @1 w( q; q1 }" a
  15. p->driver->release = nand_release;: L) i- r& G# ?; E
  16. p->driver->user_ptr = p;
    ) i0 f0 C% h, E4 ~
  17. p->use = 1;! q# L/ J" D# o( X9 i
  18. return p->driver;7 h& z* B; H/ x& _4 `( _
  19. }
复制代码

' u' y- x, l; K5 f) j, Ctypedef int ( *F_GETPHY )( F_DRIVER * pxDriver, F_PHY * pxPhy );! k1 x9 d3 f; d. ~; d4 ~: c
将存储介质的信息添加到 F_PHY 结构体中! S( P, r2 o6 c2 G! R
  1. static int nand_getphy(F_DRIVER *driver, F_PHY *phy)3 q3 w4 r3 E* M) q' u
  2. {
    . a7 [* {  h( M+ b$ u$ n* d" P3 J
  3. phy->number_of_sectors = MassBlockCount;- R6 K, O( S, A4 E) b  c- y3 q
  4. phy->media_descriptor = F_MEDIADESC_FIX;+ Z9 L0 F9 i. d0 U) x8 v, `
  5. phy->bytes_per_sector = 512u;4 r4 F) b/ g' F8 x* h
  6. return 0;
    7 v! L" q" h# P) E* N! G8 h# a/ J! g
  7. }
复制代码
( P/ z5 w, N1 u/ O( V, a* n
typedef int ( *F_READSECTOR )( F_DRIVER * pxDriver, void * pvBuffer, unsigned long
! p$ `3 e, B6 [ulSector );6 }' D$ n( W4 G4 m5 ]  o; @* P
读扇区函数,从逻辑扇区 ulSector 中将数据读到 pvBuffer 所指向的缓存中$ g5 C5 d: U) e. k3 z: U
  1. static int nand_readsector(F_DRIVER *driver, void *data, unsigned long sector)- w8 N: \4 H5 c: \; F6 p
  2. {
      U7 @" h; W! a
  3. uint16_t res;" p% l0 h5 a6 J, C
  4. 5 ~6 M! _1 _6 x
  5. t_nandDrv *p = (t_nandDrv *)(driver->user_ptr);
    - n# k7 ?/ m& s8 |2 m- N3 S" i
  6. 2 N; E" }$ j: e9 Z  X
  7. if(sector >= p->maxsector)
    ' V, R( p! i" Z- e6 I: j
  8. {' w$ O! _9 w4 G: s1 N- {) F7 Z
  9. return 2;
    , B) x% Y, ?+ s: J7 m8 y; }
  10. }
    3 A! k8 w8 |. V/ O  `% H2 B3 b$ G
  11. , V" j) A- O5 T
  12. res = NAND_Read(sector, data, 512);
    1 k# c7 J1 h$ L# K. R

  13. 9 g, H8 A/ z- P. I
  14. if(res != NAND_OK), y' \  @3 d4 F; N
  15. return 1;1 }! d& ~  q0 N* ]/ Z; q

  16. 7 {6 F! ^) d1 S$ A
  17. return 0;: x4 _- c3 k) x7 A
  18. }
复制代码

3 y5 H7 g/ m5 G+ b8 l' W6 \9 t7 ntypedef int ( *F_WRITESECTOR )( F_DRIVER * pxDriver, void * pvBuffer, unsigned long
% q8 m! _6 d% x* xulSector );* \: e+ P6 L2 s& A, z. b- s* }
写扇区函数,把 pvBuffer 指向的数据写入逻辑扇区 ulSector 中
# a5 @, Q0 y; b. @. F5 z$ y9 I& o0 r. y
  1. static int nand_writesector(F_DRIVER *driver, void *data, unsigned long sector)
    ! ]8 m$ K/ v2 w
  2. {0 ~2 k/ S/ x+ ~
  3. uint16_t res;
    9 ]* {$ F, D% p0 v

  4. ; u- h. o! o' r. `  O+ B
  5. t_nandDrv *p = (t_nandDrv *)(driver->user_ptr);
    ; a3 D3 P. z$ }9 o2 M; I
  6. 7 ]& A: _% P& N3 x4 U3 M% w
  7. if(sector >= p->maxsector)* q) i; C! k2 L% f
  8. {
    , Y! r4 e/ t. t, H
  9. return 2;  D7 B$ a' {6 [$ \) G: u. ~  \
  10. }9 o5 t: a6 }% v: w

  11.   s- g% G* [/ C% @5 q
  12. res = NAND_Write(sector, data, 512);' S. h" u! [8 f: @
  13. ( ?  H" ^* Y. a! g5 i; K2 J& `
  14. if(res != NAND_OK)
    4 L) [. m- P1 z* L( L5 Y
  15. return 1;
    - s: I! i8 J4 v/ s0 k

  16. : x. C0 y8 D* X
  17. return 0;9 Q6 {; L! ^/ o/ |# ?
  18. }
复制代码
) m1 g* F( `8 L* p+ G4 @
typedef long ( *F_GETSTATUS )( F_DRIVER * pxDriver );8 n* y) Z+ V! R& o( i
typedef void ( *F_RELEASE )( F_DRIVER * pxDriver );  ]' G: `% ^8 `
这两个函数是检测设备拔插的。
9 y' ^+ W2 y% G" `! J三. 经验杂谈) O6 B, n5 D8 i: E( j
关于文件系统的移植,推荐大家阅读一些 FAT 结构的资料,至少要做到对 FAT 结构心中有数,对调试会有很大的帮助的(工欲善其事,必先利其器)。
. I, Z# l! |4 T( }6 q8 a9 a/ X' q1 A. _, x! q
赞 收藏 评论0 发布时间:2022-3-1 12:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版