DSP

在dsp DM642上移植YAFFS2之一:概况与方案

2019-07-13 19:58发布

                Yaffs2 之一:Yaffs2的选择与考虑 由于项目里面用到大容量的NAND-flash,所以考虑采用 yaffs2的文件系统来做,因为用来管理NAND的一般用yaffs Jffs ,但由于jffs需要更多内存空间,及代码量大,所以一般会选择Yaffs来做。 FAT也可用,但需要做大量修改工作,而且Yaffslinux 上用得成熟,大其系统上也很成功。 因为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的读解与移植.