www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(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),專門(mén)為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)存空間占用、讀寫(xiě)速度等方面做了優(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寫(xiě)入特定長(zhǎng)度的數(shù)據(jù),通常為1 chunk(page),在Nand spare area寫(xiě)入特定長(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)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉
關(guān)閉