日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]Nand作為市面上最主要的非易失性閃存技術(shù)之一,應(yīng)用在各種固態(tài)大容量存儲(chǔ)解決方案中。由于Nand flash自身的特點(diǎn),Nand存儲(chǔ)器往往需要一款專用的Nand文件系統(tǒng)進(jìn)行管理。開(kāi)源的Yaffs文件系統(tǒng)由于其優(yōu)異的性能,在Nand

Nand作為市面上最主要的非易失性閃存技術(shù)之一,應(yīng)用在各種固態(tài)大容量存儲(chǔ)解決方案中。由于Nand flash自身的特點(diǎn),Nand存儲(chǔ)器往往需要一款專用的Nand文件系統(tǒng)進(jìn)行管理。開(kāi)源的Yaffs文件系統(tǒng)由于其優(yōu)異的性能,在Nand flash中受到廣泛的應(yīng)用,筆者此處就Yaffs的移植作一個(gè)簡(jiǎn)單的介紹。

1. Yaffs概述

Yaffs是由Aleph One公司所發(fā)展出來(lái)的Nand flash文件系統(tǒng),專門為Nand flash存儲(chǔ)器設(shè)計(jì),適用于大容量的存儲(chǔ)設(shè)備。在GPL協(xié)議下發(fā)布,可在其官網(wǎng)上免費(fèi)獲得源碼。

Yaffs是基于日志的文件系統(tǒng),提供了壞塊管理、磨損平衡和掉電恢復(fù)的健壯性,保證數(shù)據(jù)在系統(tǒng)對(duì)文件系統(tǒng)修改的過(guò)程中發(fā)生意外也不被破壞。特別針對(duì)Nand flash,在啟動(dòng)時(shí)間、內(nèi)存空間占用、讀寫速度等方面做了優(yōu)化,已經(jīng)在Linux、Android、WinCE等商業(yè)產(chǎn)品中使用。

2. Yaffs移植

Yaffs文件系統(tǒng)分為文件系統(tǒng)管理層接口、Yaffs內(nèi)部實(shí)現(xiàn)層和Nand接口層,這簡(jiǎn)化了與系統(tǒng)的接口設(shè)計(jì),便于集成到系統(tǒng)中去。移植即為實(shí)現(xiàn)Nand接口層。由于Yaffs一直在維護(hù)更新,其內(nèi)部數(shù)據(jù)結(jié)構(gòu)、函數(shù)實(shí)現(xiàn)流程等有細(xì)微的更新。因此對(duì)于時(shí)間跨度比較大的版本,再者之間的移植將會(huì)有較大的差異。對(duì)于可移植的開(kāi)源項(xiàng)目,一般應(yīng)在源碼包相應(yīng)的makefile、readme等文檔中獲知項(xiàng)目的目錄架構(gòu),提取相應(yīng)的源碼。接口的移植也應(yīng)參考源碼包中的Demo接口移植,了解相應(yīng)接口應(yīng)實(shí)現(xiàn)的功能需求,便于針對(duì)特定設(shè)備重新實(shí)現(xiàn)類似的接口功能。應(yīng)用編程也可以參考源碼中的應(yīng)用測(cè)試代碼。筆者此處以2015/06版本的源碼為例說(shuō)明Yaffs的移植。

2.1. 編譯器相關(guān)

對(duì)于可移植開(kāi)源項(xiàng)目,不會(huì)使用編譯器的數(shù)據(jù)類型、擴(kuò)展語(yǔ)法等,因?yàn)椴煌w系的cpu、不同編譯器這部分是不同的,是不可移植的,開(kāi)源項(xiàng)目有自己定義的數(shù)據(jù)類型,這是需要根據(jù)具體的cpu、具體的編譯器重定義的。Yaffs提供posix文件操作接口,使用了posix文件操作數(shù)據(jù)類型,而posix為unix下可移植操作系統(tǒng)應(yīng)用編程接口,并不是c標(biāo)準(zhǔn),c編譯器不必實(shí)現(xiàn)posix,因此需自定義Yaffs中使用到的posix數(shù)據(jù)類型。Yaffs應(yīng)用編程跟posix文件操作應(yīng)用編程是完全一致的。即基于posix的應(yīng)用程序在基于unix類、windows、支持posix的rtos等都是源碼級(jí)可移植的。

#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. 操作系統(tǒng)相關(guān)

Yaffs需要訪問(wèn)操作系統(tǒng)資源,如提供鎖、時(shí)間戳、系統(tǒng)錯(cuò)誤等。對(duì)于單線程訪問(wèn)、無(wú)操作系統(tǒng)并不需要操作系統(tǒng)的鎖等相關(guān)功能。在Yaffs中yaffs_osglue.h列出了所需實(shí)現(xiàn)的操作系統(tǒng)相關(guān)接口函數(shù)。

#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函數(shù),重新實(shí)現(xiàn)

int strnlen(const char *Str, int MaxLen)

{

int i;

for (i=0;i

if(Str[i] == 0) {

break;

}

}

return i;

}

#endif

2.3. Nand接口相關(guān)

Nand驅(qū)動(dòng)在前面章節(jié)有詳細(xì)的描述,一般針對(duì)Nand flash的特性,Nand底層驅(qū)動(dòng)應(yīng)實(shí)現(xiàn)Nand初始化、Nand頁(yè)讀、Nand頁(yè)編程、Nand塊擦除、Nand壞塊標(biāo)記、Nand壞塊檢查。Yaffs通過(guò)函數(shù)指針的方式實(shí)現(xiàn)訪問(wèn)以上的Nand底層驅(qū)動(dòng)接口,需實(shí)現(xiàn)的Nand接口函數(shù)指針如下:

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函數(shù)指針

drv_initialise_fn主要實(shí)現(xiàn)Nand的初始化,在文件系統(tǒng)掛載時(shí),會(huì)最先調(diào)用該函數(shù)指針對(duì)Nand進(jìn)行初始化。

static int yaffs_nand_drv_Initialise(struct yaffs_dev*dev)

{

Nand_Init();

returnYAFFS_OK;

}

2.3.2. drv_erase_fn函數(shù)指針

drv_erase_fn主要對(duì)某一個(gè)塊進(jìn)行擦除。

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函數(shù)指針

drv_mark_bad_fn需實(shí)現(xiàn)對(duì)某一塊進(jìn)行壞塊標(biāo)記。

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函數(shù)指針

drv_check_bad_fn需實(shí)現(xiàn)對(duì)某一塊進(jìn)行檢查,是否壞塊。

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函數(shù)指針

drv_write_chunk_fn需實(shí)現(xiàn)對(duì)某chunk(page)在Nand data area寫入特定長(zhǎng)度的數(shù)據(jù),通常為1 chunk(page),在Nand spare area寫入特定長(zhǎng)度的oob數(shù)據(jù)(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函數(shù)指針

drv_read_chunk_fn需實(shí)現(xiàn)對(duì)某chunk(page)在Nand data area讀取特定長(zhǎng)度的數(shù)據(jù),通常為1 chunk(page),在Nand spare area讀取特定長(zhǎng)度的oob數(shù)據(jù)(tags)。此處采用Nand驅(qū)動(dòng)硬件ecc,而未使用Yaffs自帶的軟件ecc,需處理數(shù)據(jù)是否無(wú)錯(cuò)或可糾錯(cuò)。

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) {

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

加利福尼亞庫(kù)爾弗城2024年7月16日 /美通社/ --?Snail, Inc. (納斯達(dá)克股票代碼: SNAL) (以下簡(jiǎn)稱"蝸牛游戲"或"公司")是一家領(lǐng)先的全球獨(dú)立開(kāi)發(fā)商和發(fā)行商,專注于互動(dòng)數(shù)字娛樂(lè),今日宣布方舟:...

關(guān)鍵字: iOS 安卓系統(tǒng) 移植 移動(dòng)平臺(tái)

上海2023年2月16日 /美通社/ -- 近日,諾華中國(guó)宣布與中國(guó)紅十字基金會(huì)正式啟動(dòng)"中國(guó)地中海貧血救助項(xiàng)目"廣西地區(qū)專項(xiàng)援助,將在當(dāng)?shù)囟ㄏ蛸Y助困難家庭地中海貧血患兒,同時(shí)通過(guò)相關(guān)醫(yī)生培...

關(guān)鍵字: BSP 控制 移植 大眾

北京2022年12月7日 /美通社/ -- 2022年12月3日,由高博醫(yī)學(xué)(血液?。V東研究中心南方春富(兒童)血液病研究院、南方醫(yī)科大學(xué)南方醫(yī)院共同主辦的高博醫(yī)學(xué)論壇·華南造血干細(xì)胞移植論壇通過(guò)線下線上...

關(guān)鍵字: 移植 HD PID 血細(xì)胞

捐款近4000萬(wàn) 上海2022年12月7日 /美通社/ -- 2022年12月7日下午,中芯國(guó)際"芯肝寶貝計(jì)劃"十年紀(jì)念暨2022年度捐贈(zèng)儀式在上海仁濟(jì)醫(yī)院舉行。十年來(lái),該項(xiàng)目捐贈(zèng)善款總額近4000...

關(guān)鍵字: 中芯國(guó)際 移植

北京2022年11月14日 /美通社/ -- 2022年10月,高博醫(yī)學(xué)(血液病)北京研究中心北京高博博仁醫(yī)院造血干細(xì)胞移植科迎來(lái)了五周歲"生日"。在吳彤主任帶領(lǐng)下,移植科于2017年從無(wú)到有,歷經(jīng)五...

關(guān)鍵字: 移植 OS MT CD

上海2022年11月6日 /美通社/ -- 在第五屆中國(guó)國(guó)際進(jìn)口博覽會(huì)期間,武田制藥攜5款創(chuàng)新產(chǎn)品亮相武田罕見(jiàn)遺傳與血液疾病領(lǐng)域?qū)?chǎng)發(fā)布會(huì)。用于移植后抗巨細(xì)胞病毒(CMV)感染或疾病治療[1]的馬立巴韋[2]迎來(lái)&quo...

關(guān)鍵字: 移植 BSP CD FDA

亙喜生物科技集團(tuán)宣布正在中國(guó)開(kāi)展的、旨在全面評(píng)估GC007g治療復(fù)發(fā)/難治性急性B淋巴細(xì)胞白血病效果的1/2期注冊(cè)性臨床試驗(yàn)順利進(jìn)入2期研究階段,首例入組患者已給藥。GC007g是亙喜生物旗下的一款靶向CD19的供者來(lái)源...

關(guān)鍵字: 移植 CD

北京2022年9月9日 /美通社/ -- 諾誠(chéng)健華(香港聯(lián)交所代碼:09969)今天宣布,tafasitamab (Minjuvi®)聯(lián)合來(lái)那度胺治療不適合自體干細(xì)胞移植 (ASCT) 條件的復(fù)發(fā)/難治彌漫性大B...

關(guān)鍵字: VI NJU BSP 移植

蘇州2022年8月19日 /美通社/ -- 近日,華中科技大學(xué)同濟(jì)醫(yī)學(xué)院附屬協(xié)和醫(yī)院心外科董念國(guó)教授團(tuán)隊(duì)運(yùn)用與心擎醫(yī)療聯(lián)合研發(fā)的短中期體外全磁懸浮心室輔助裝置MoyoAssist®,成功救治三例危重的終...

關(guān)鍵字: 磁懸浮 移植 IC 靜脈

上海2022年8月17日 /美通社/ -- 2022年8月16日,聚焦于基因和細(xì)胞治療的上海邦耀生物科技有限公司(以下簡(jiǎn)稱"邦耀生物")宣布,其...

關(guān)鍵字: CD 移植 BSP ISP
關(guān)閉