在dsp DM642上移植YAFFS2之一:概况与方案
2019-07-13 19:58发布
生成海报
Yaffs2 之一:Yaffs2的选择与考虑
由于项目里面用到大容量的NAND-flash,所以考虑采用 yaffs2的文件系统来做,因为用来管理NAND的一般用yaffs 与 Jffs ,但由于jffs需要更多内存空间,及代码量大,所以一般会选择Yaffs来做。 FAT也可用,但需要做大量修改工作,而且Yaffs在linux 上用得成熟,大其系统上也很成功。
因为Yaffs是直接挂在linux 系统上的,而我的是处理器是DSP 或 nios, 所以剥去与linux 相关的部分。如何下面先查找相关的信息,
1, 下载源码:可以下面网站下到Yaffs 与 Yaffs2 。
http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/ #dirlist
2, 解压后有如下内容:
一堆C源码,四个文件夹: direct, mtdemul, patches , utils
其中各文件夹与文件的功能与意义参见http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs2/
3,读guide可得到:
Yaffs原来是为linux设计的,但是它是按模块化方式设计的,file-system-specific 也与主filesystem分开了,这样通过os moudle可以很方便地植入到其它操作系统,也可以不用RTOS,这个性化模块就是YAFFS Direct Interface (YDI),
Yaffs支持32位的处理器,对16bit以下的需要做较多修改.
Yaffs 有三部接口供程序员做移植与应用:1- 应用程序接口,2- RTOS集成接口, .
1- 应用程序接口:
是定义在yaffsfs.h文件里面,是带有yaffs_前缀的c标准库函数,如下(部分)
int yaffs_open(,,);
int yaffs_close(int fd);
int yaffs_flush(int fd);
int yaffs_access(,,);
int yaffs_read(,,);
int yaffs_write(,,);
int yaffs_lseek(,,);
int yaffs_rename(,,,)
int yaffs_mount(path)
int yaffs_unmount(path);
int yaffs_freespace(,,);
int yaffs_totalspace(,,);
int yaffs_startup();
应用例子如下:
int maint(…)
{ //initialsation
f= yaffs_open(…);
yaffs_read(f,…);
yaffs_close(f);
}
2- RTOS集成接口:
为了能集成到操作系统里面,必顺针对RTOS的特点来修改配置文件yaffscfg.c,在yaffscfg.c文件里面定义了系统的接口,如void yaffsfs_SetErro(int err);
void yaffsfs_Lock(void);
void yaffsfs_Unlock(void);
void yaffsfs_LocalInitialsation(void);
如果yaffs 用在多线程环境,这个void yaffsfs_LocalInitialsation(void)将初始化适应RTOS的信号与旗语,并用yaffs_Lock,yaffs_Unlock来lock 和 release 旗语.
另外,yaffs 也需要申请内存与释放内存的函数,默认为 malloc()和 free();其它函数在ydirectenv.h 里面。 在用yaffs文件系统时候,首先要调用 yaffs_StartUp(),和yasffs_mount(),如下例子:
yaffs_StarUp();
yaffs_mount(“/boot”);
3 – NAND 配置与访问接口
这一部分包括配置与访问函数,在yasffscfg.c文件里面的yaffs_StartUp();
yaffs_DeviceConfiguration 是一个入口它分成两部分:mount 点名字和yaffs_Device.
yaffs_Device是一个逻辑实体,对应下面几个情况:整个flash芯片,一部flash芯片,或其它非flash设备。也就说多个yaffs_Device可以放在一块芯片里面。
总体查到这里,下面工作就是针对 YAFFS Direct Interface的读解与移植.
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮