当前位置:首页 > 单片机 > 单片机
[导读]Nand作为市面上最主要的非易失性闪存技术之一,应用在各种固态大容量存储解决方案中。由于Nand flash自身的特点,Nand存储器往往需要一款专用的Nand文件系统进行管理。开源的Yaffs文件系统由于其优异的性能,在Nand

Nand作为市面上最主要的非易失性闪存技术之一,应用在各种固态大容量存储解决方案中。由于Nand flash自身的特点,Nand存储器往往需要一款专用的Nand文件系统进行管理。开源的Yaffs文件系统由于其优异的性能,在Nand flash中受到广泛的应用,笔者此处就Yaffs的移植作一个简单的介绍。

1. Yaffs概述

Yaffs是由Aleph One公司所发展出来的Nand flash文件系统,专门为Nand flash存储器设计,适用于大容量的存储设备。在GPL协议下发布,可在其官网上免费获得源码。

Yaffs是基于日志的文件系统,提供了坏块管理、磨损平衡和掉电恢复的健壮性,保证数据在系统对文件系统修改的过程中发生意外也不被破坏。特别针对Nand flash,在启动时间、内存空间占用、读写速度等方面做了优化,已经在Linux、Android、WinCE等商业产品中使用。

2. Yaffs移植

Yaffs文件系统分为文件系统管理层接口、Yaffs内部实现层和Nand接口层,这简化了与系统的接口设计,便于集成到系统中去。移植即为实现Nand接口层。由于Yaffs一直在维护更新,其内部数据结构、函数实现流程等有细微的更新。因此对于时间跨度比较大的版本,再者之间的移植将会有较大的差异。对于可移植的开源项目,一般应在源码包相应的makefile、readme等文档中获知项目的目录架构,提取相应的源码。接口的移植也应参考源码包中的Demo接口移植,了解相应接口应实现的功能需求,便于针对特定设备重新实现类似的接口功能。应用编程也可以参考源码中的应用测试代码。笔者此处以2015/06版本的源码为例说明Yaffs的移植。

2.1. 编译器相关

对于可移植开源项目,不会使用编译器的数据类型、扩展语法等,因为不同体系的cpu、不同编译器这部分是不同的,是不可移植的,开源项目有自己定义的数据类型,这是需要根据具体的cpu、具体的编译器重定义的。Yaffs提供posix文件操作接口,使用了posix文件操作数据类型,而posix为unix下可移植操作系统应用编程接口,并不是c标准,c编译器不必实现posix,因此需自定义Yaffs中使用到的posix数据类型。Yaffs应用编程跟posix文件操作应用编程是完全一致的。即基于posix的应用程序在基于unix类、windows、支持posix的rtos等都是源码级可移植的。

#ifndef __YAFFS_CONFIG_H__

#define __YAFFS_CONFIG_H__

#define CONFIG_YAFFS_DIRECT

#define CONFIG_YAFFS_YAFFS2

#define CONFIG_YAFFS_PROVIDE_DEFS

#define CONFIG_YAFFSFS_PROVIDE_VALUES

#define CONFIG_YAFFS_DEFINES_TYPES

#define inline __inline

typedef unsigned short dev_t;

typedef unsigned short mode_t;

typedef long off_t;

typedef long long loff_t;

#endif

2.2. 操作系统相关

Yaffs需要访问操作系统资源,如提供锁、时间戳、系统错误等。对于单线程访问、无操作系统并不需要操作系统的锁等相关功能。在Yaffs中yaffs_osglue.h列出了所需实现的操作系统相关接口函数。

#include"stdio.h"

#include"stdlib.h"

#include"time.h"

static intyaffs_errno;

/*

* yaffs_bug_fn()

* Function to report a bug.

*/

void yaffs_bug_fn(constchar *fn, int n)

{

printf("yaffs bug at %s:%dn", fn,n);

}

/*

* yaffsfs_CurrentTime() retrns a 32-bittimestamp.

*

* Can return 0 if your system does not careabout time.

*/

unsigned intyaffsfs_CurrentTime(void)

{

return time(NULL);

}

/*

* yaffsfs_SetError() andyaffsfs_GetLastError()

* Do whatever to set the system error.

* yaffsfs_GetLastError() just fetches the lasterror.

*/

voidyaffsfs_SetError(int err)

{

yaffs_errno = err;

}

intyaffsfs_GetLastError(void)

{

return yaffs_errno;

}

/*

* yaffsfs_CheckMemRegion()

* Check that access to an address is valid.

* This can check memory is in bounds and iswritable etc.

*

* Returns 0 if ok, negative if not.

*/

intyaffsfs_CheckMemRegion(const void *addr, size_t size, int write_request)

{

if(!addr) {

return -1;

}

return 0;

}

/*

* yaffsfs_malloc()

* yaffsfs_free()

*

* Functions to allocate and free memory.

*/

void*yaffsfs_malloc(size_t size)

{

return malloc(size);

}

voidyaffsfs_free(void *ptr)

{

free(ptr);

}

/*

* yaffsfs_Lock()

* yaffsfs_Unlock()

* A single mechanism to lock and unlock yaffs.Hook up to a mutex or whatever.

*/

voidyaffsfs_Lock(void)

{

}

voidyaffsfs_Unlock(void)

{

}

voidyaffsfs_OSInitialisation(void)

{

/* No locking used */

}

#if defined(__CC_ARM)/* ARMCC compiler */

// MDK不支持strnlen函数,重新实现

int strnlen(const char *Str, int MaxLen)

{

int i;

for (i=0;i

if(Str[i] == 0) {

break;

}

}

return i;

}

#endif

2.3. Nand接口相关

Nand驱动在前面章节有详细的描述,一般针对Nand flash的特性,Nand底层驱动应实现Nand初始化、Nand页读、Nand页编程、Nand块擦除、Nand坏块标记、Nand坏块检查。Yaffs通过函数指针的方式实现访问以上的Nand底层驱动接口,需实现的Nand接口函数指针如下:

int(*drv_write_chunk_fn) (struct yaffs_dev *dev, int nand_chunk,

const u8 *data, int data_len,

const u8 *oob, int oob_len);

int(*drv_read_chunk_fn) (struct yaffs_dev *dev, int nand_chunk,

u8 *data, int data_len,

u8 *oob, int oob_len,

enum yaffs_ecc_result *ecc_result);

int(*drv_erase_fn) (struct yaffs_dev *dev, int block_no);

int(*drv_mark_bad_fn) (struct yaffs_dev *dev, int block_no);

int(*drv_check_bad_fn) (struct yaffs_dev *dev, int block_no);

int(*drv_initialise_fn) (struct yaffs_dev *dev);

int(*drv_deinitialise_fn) (struct yaffs_dev *dev);

2.3.1. drv_initialise_fn函数指针

drv_initialise_fn主要实现Nand的初始化,在文件系统挂载时,会最先调用该函数指针对Nand进行初始化。

static int yaffs_nand_drv_Initialise(struct yaffs_dev*dev)

{

Nand_Init();

returnYAFFS_OK;

}

2.3.2. drv_erase_fn函数指针

drv_erase_fn主要对某一个块进行擦除。

static int yaffs_nand_drv_EraseBlock(struct yaffs_dev*dev, int block_no)

{

if (Nand_EraseBlock(block_no)!= 0) {

returnYAFFS_FAIL;

}

returnYAFFS_OK;

}

2.3.3. drv_mark_bad_fn函数指针

drv_mark_bad_fn需实现对某一块进行坏块标记。

static int yaffs_nand_drv_MarkBad(struct yaffs_dev*dev, int block_no)

{

if(Nand_MarkBadBlock(block_no) != 0) {

returnYAFFS_FAIL;

}

returnYAFFS_OK;

}

2.3.4. drv_check_bad_fn函数指针

drv_check_bad_fn需实现对某一块进行检查,是否坏块。

static int yaffs_nand_drv_CheckBad(struct yaffs_dev*dev, int block_no)

{

if(Nand_IsBadBlock(block_no) != 0) {

// badblock

returnYAFFS_FAIL;

}

returnYAFFS_OK;

}

2.3.5. drv_write_chunk_fn函数指针

drv_write_chunk_fn需实现对某chunk(page)在Nand data area写入特定长度的数据,通常为1 chunk(page),在Nand spare area写入特定长度的oob数据(tags)。

static int yaffs_nand_drv_WriteChunk(struct yaffs_dev*dev, int nand_chunk,

const u8 *data,int data_len, const u8 *oob, int oob_len)

{

if (!data ||!oob) {

returnYAFFS_FAIL;

}

if(Nand_WriteWithOob(nand_chunk, data, data_len, oob, oob_len) != 0) {

returnYAFFS_FAIL;

}

returnYAFFS_OK;

}

2.3.6.drv_read_chunk_fn函数指针

drv_read_chunk_fn需实现对某chunk(page)在Nand data area读取特定长度的数据,通常为1 chunk(page),在Nand spare area读取特定长度的oob数据(tags)。此处采用Nand驱动硬件ecc,而未使用Yaffs自带的软件ecc,需处理数据是否无错或可纠错。

static int yaffs_nand_drv_ReadChunk(struct yaffs_dev*dev, int nand_chunk,

u8*data, int data_len, u8 *oob, int oob_len,

enumyaffs_ecc_result *ecc_result_out)

{

int ret;

if (data ==NULL) {

data_len= 0;

}

ret =Nand_ReadWithOob(nand_chunk, data, data_len, oob, oob_len);

if (ret != 0){

if(ecc_result_out) {

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

加利福尼亚库尔弗城2024年7月16日 /美通社/ -- Snail, Inc. (纳斯达克股票代码: SNAL) (以下简称"蜗牛游戏"或"公司")是一家领先的全球独立开发商和发行商,专注于互动数字娱乐,今日宣布方舟:...

关键字: iOS 安卓系统 移植 移动平台

上海2023年2月16日 /美通社/ -- 近日,诺华中国宣布与中国红十字基金会正式启动"中国地中海贫血救助项目"广西地区专项援助,将在当地定向资助困难家庭地中海贫血患儿,同时通过相关医生培...

关键字: BSP 控制 移植 大众

北京2022年12月7日 /美通社/ -- 2022年12月3日,由高博医学(血液病)广东研究中心南方春富(儿童)血液病研究院、南方医科大学南方医院共同主办的高博医学论坛·华南造血干细胞移植论坛通过线下线上...

关键字: 移植 HD PID 血细胞

捐款近4000万 上海2022年12月7日 /美通社/ -- 2022年12月7日下午,中芯国际"芯肝宝贝计划"十年纪念暨2022年度捐赠仪式在上海仁济医院举行。十年来,该项目捐赠善款总额近4000...

关键字: 中芯国际 移植

北京2022年11月14日 /美通社/ -- 2022年10月,高博医学(血液病)北京研究中心北京高博博仁医院造血干细胞移植科迎来了五周岁"生日"。在吴彤主任带领下,移植科于2017年从无到有,历经五...

关键字: 移植 OS MT CD

上海2022年11月6日 /美通社/ -- 在第五届中国国际进口博览会期间,武田制药携5款创新产品亮相武田罕见遗传与血液疾病领域专场发布会。用于移植后抗巨细胞病毒(CMV)感染或疾病治疗[1]的马立巴韦[2]迎来&quo...

关键字: 移植 BSP CD FDA

亘喜生物科技集团宣布正在中国开展的、旨在全面评估GC007g治疗复发/难治性急性B淋巴细胞白血病效果的1/2期注册性临床试验顺利进入2期研究阶段,首例入组患者已给药。GC007g是亘喜生物旗下的一款靶向CD19的供者来源...

关键字: 移植 CD

北京2022年9月9日 /美通社/ -- 诺诚健华(香港联交所代码:09969)今天宣布,tafasitamab (Minjuvi®)联合来那度胺治疗不适合自体干细胞移植 (ASCT) 条件的复发/难治弥漫性大B...

关键字: VI NJU BSP 移植

苏州2022年8月19日 /美通社/ -- 近日,华中科技大学同济医学院附属协和医院心外科董念国教授团队运用与心擎医疗联合研发的短中期体外全磁悬浮心室辅助装置MoyoAssist®,成功救治三例危重的终...

关键字: 磁悬浮 移植 IC 静脉

上海2022年8月17日 /美通社/ -- 2022年8月16日,聚焦于基因和细胞治疗的上海邦耀生物科技有限公司(以下简称"邦耀生物")宣布,其...

关键字: CD 移植 BSP ISP
关闭