0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在U-Boot中實(shí)現(xiàn)對(duì)Yaffs鏡像的設(shè)計(jì)?

電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2018-08-29 05:02 ? 次閱讀

0 引 言

U-Boot是目前廣泛使用的嵌入式操作系統(tǒng)通用引導(dǎo)程序,具有功能豐富強(qiáng)大,支持多種操作系統(tǒng)和CPU體系,易于功能擴(kuò)展和移植,源碼開(kāi)放等多種優(yōu)點(diǎn)。U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開(kāi)放源碼項(xiàng)目。從FADSROM、8xxROM、PPCBOOT逐步發(fā)展演化而來(lái)。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實(shí)上,不少U-Boot源碼就是相應(yīng)的Linux內(nèi)核源程序的簡(jiǎn)化,尤其是一些設(shè)備的驅(qū)動(dòng)程序,這從U-Boot源碼的注釋中能體現(xiàn)這一點(diǎn)。U-Boot不僅僅支持嵌入式Linux系統(tǒng)的引導(dǎo),當(dāng)前,它還支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系統(tǒng)。其目前要支持的目標(biāo)操作系統(tǒng)是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS.Yaffs文件系統(tǒng)是專門針對(duì)NAND FLASH設(shè)計(jì)的可讀寫型文件系統(tǒng),在NAND FLASH上性能穩(wěn)定優(yōu)異。U-Boot自身沒(méi)有實(shí)現(xiàn)對(duì)Yaffs文件系統(tǒng)鏡像讀寫的直接支持。由于Yaffs文件系統(tǒng)的特殊結(jié)構(gòu),需要對(duì)nand命令做一定的修改,從而實(shí)現(xiàn)其在NANDFLASH上對(duì)Yaffs鏡像的讀寫。

1 相關(guān)工作簡(jiǎn)介

1.1 Yaffs文件系統(tǒng)結(jié)構(gòu)簡(jiǎn)述

目前,嵌入式系統(tǒng)中常用的FLASH文件系統(tǒng)有Cramfs,Jffs 2,Yaffs,exfat等。Cramfs是一種壓縮型只讀型文件系統(tǒng),其在系統(tǒng)啟動(dòng)時(shí)解壓至內(nèi)存中運(yùn)行。Jffs 2,Yaffs,Exfat等是可讀寫型文件系統(tǒng),Jffs 2一般應(yīng)用于NOR型FLASH;Exfat不是開(kāi)源的文件系統(tǒng)實(shí)現(xiàn),一般應(yīng)用于Windows CE操作系統(tǒng)中。

通常一個(gè)NAND FLASH存儲(chǔ)設(shè)備由若干塊組成;1個(gè)塊由若干頁(yè)組成。一般128 MB以下容量的NAND FLASH芯片,一頁(yè)大小為528 B,依次分為2個(gè)256 B的主數(shù)據(jù)區(qū)和16 B的額外空間;128 MB以上容量的NAND FLASH芯片,一頁(yè)大小通常為2 KB.由于NAND FLASH出現(xiàn)位反轉(zhuǎn)的概率較大,一般在讀寫時(shí)需要使用ECC進(jìn)行錯(cuò)誤檢驗(yàn)和恢復(fù)。

Yaffs(Yet Another Flash File System)文件系統(tǒng)是專門針對(duì)NAND閃存設(shè)計(jì)的嵌入式文件系統(tǒng),目前有YAFFS和YAFFS2兩個(gè)版本,兩個(gè)版本的主要區(qū)別之一在于YAFFS2能夠更好的支持大容量的NAND FLASH芯片。

Yaffs文件系統(tǒng)有些類似于JFFS/JFFS2文件系統(tǒng),與之不同的是JFFS1/2文件系統(tǒng)最初是針對(duì)NOR FLASH的應(yīng)用場(chǎng)合設(shè)計(jì)的,而NOR FLASH和NAND FLASH本質(zhì)上有較大的區(qū)別,所以盡管JFFS1/2 文件系統(tǒng)也能應(yīng)用于NAND FLASH,但由于它在內(nèi)存占用和啟動(dòng)時(shí)間方面針對(duì)NOR的特性做了一些取舍,所以對(duì)NAND來(lái)說(shuō)通常并不是最優(yōu)的方案。

Yaffs文件系統(tǒng)的設(shè)計(jì)充分考慮到NAND FLASH以頁(yè)為存取單位等的特點(diǎn),將文件組織成固定大小的段(Chunk)。以528 B的頁(yè)為例,Yaffs文件系統(tǒng)使用前512 B存儲(chǔ)數(shù)據(jù)、16 B的額外空間,用以存放數(shù)據(jù)的ECC和文件系統(tǒng)的組織信息等(稱為OOB數(shù)據(jù))。通過(guò)OOB數(shù)據(jù),不但能實(shí)現(xiàn)錯(cuò)誤檢測(cè)和壞塊處理;同時(shí)可以避免加載時(shí)對(duì)整個(gè)存儲(chǔ)介質(zhì)的掃描,加快了文件系統(tǒng)的加載速度。一個(gè)頁(yè)面的具體結(jié)構(gòu)如表1所示。

如何在U-Boot中實(shí)現(xiàn)對(duì)Yaffs鏡像的設(shè)計(jì)?

由此可知,與其他文件系統(tǒng)相比,在生成Yaffs鏡像時(shí)就包含了OOB數(shù)據(jù),所以在燒寫Yaffs鏡像時(shí),不需要計(jì)算ECC,僅依次寫入512 B的數(shù)據(jù)和16 B的OOB數(shù)據(jù)即可。同時(shí),Yaffs鏡像要使用分區(qū)上的第一個(gè)塊來(lái)存儲(chǔ)一個(gè)名為Yaffs_ObjectHeader的結(jié)構(gòu)體。該結(jié)構(gòu)體記錄了該分區(qū)中的文件、路徑以及相關(guān)的鏈接,所以在燒寫時(shí)還需要跳過(guò)第一個(gè)可用的塊。Yaffs文件系統(tǒng)目前常用的版本為Yaffs 2,性能在許多方面都有了很大的提高。

1.2 U-Boot對(duì)常見(jiàn)文件系統(tǒng)的支持

U-Boot可支持的主要功能列表 系統(tǒng)引導(dǎo);支持NFS掛載、RAMDISK(壓縮或非壓縮)形式的根文件系統(tǒng);支持NFS掛載、從FLASH中引導(dǎo)壓縮或非壓縮系統(tǒng)內(nèi)核;基本輔助功能 強(qiáng)大的操作系統(tǒng)接口功能;可靈活設(shè)置、傳遞多個(gè)關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開(kāi)發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤對(duì)Linux支持最為強(qiáng)勁; 在實(shí)際開(kāi)發(fā)過(guò)程中,一般使用引導(dǎo)程序,比如U-Boot,完成文件向FLASH中的燒寫和啟動(dòng)引導(dǎo)等工作。U-Boot能夠支持Cramfs,Jffs 2文件系統(tǒng)的燒寫。這些文件系統(tǒng)是針對(duì)NOR型FLASH設(shè)計(jì)的,所有文件數(shù)據(jù)就是簡(jiǎn)單的線性表組織形式。對(duì)于目前大量使用的NAND型FLASH,由于帶有用于數(shù)據(jù)校驗(yàn)等功能的OOB區(qū),所以Yaffs文件系統(tǒng)的數(shù)據(jù)組織形式不再是線性表的形式。

U-Boot沒(méi)有提供對(duì)Yaffs文件系統(tǒng)的讀寫支持。但由于該文件系統(tǒng)的讀寫過(guò)程與其他文件系統(tǒng)的讀寫類似,因此可以通過(guò)修改U-Boot的FLASH讀寫命令,增加處理00B區(qū)域數(shù)據(jù)的功能,即可以實(shí)現(xiàn)對(duì)Yaffs文件系統(tǒng)的讀寫支持。

2 具體實(shí)現(xiàn)

在此,采用U-Boot 1.1.6版,NAND FLASH使用三星公司的K9F1208UOM.該NAND FLASH每頁(yè)為512 B,外加16 B額外空間,整個(gè)芯片容量為64 MB.在此之前,已經(jīng)正確配置了相關(guān)的宏定義,并移植了相關(guān)NAND FLASH的驅(qū)動(dòng)程序,使U-Boot能夠正確操作該芯片。

2.1 為U-Boot添加新的命令

實(shí)際上,U-Boot中已經(jīng)實(shí)現(xiàn)了所需的nand命令,只要編寫好正確的NAND FLASH驅(qū)動(dòng)程序,并定義相應(yīng)的宏,就可實(shí)現(xiàn)對(duì)NAND FLASH的基本讀寫操作。欲添加對(duì)Yaffs鏡像的支持,只要實(shí)現(xiàn)一個(gè)新的參數(shù)即可。為了給下述工作一個(gè)清晰的步驟,在此先簡(jiǎn)述如何向U-Boot中添加一個(gè)新命令。以下所述的路徑均在U-Boot源碼目錄下。

(1)在include/cmd_confdefs.h文件中定義相應(yīng)命令的宏,不能與已有的宏值重復(fù)。

(2)在common/cmd_name.c中實(shí)現(xiàn)命令操作的具體代碼,文件名中的name即為相應(yīng)命令的名稱。在這個(gè)文件中,首先要編寫命令的實(shí)現(xiàn)函數(shù);此外還要使用一個(gè)U_BOOT_CMD()的宏函數(shù)來(lái)填寫該命令的cmd_tbl_t結(jié)構(gòu)體。該結(jié)構(gòu)體的原型是在include\command.h 中定義的,包含相應(yīng)命令的名稱、參數(shù)個(gè)數(shù)、實(shí)現(xiàn)函數(shù)、用法說(shuō)明、幫助等信息。

(3)在相應(yīng)的開(kāi)發(fā)板頭文件(位于include/con-figs/下)中的CONFIG_COMMANDS宏中添加(1)所定義的宏即可使用該命令。

在實(shí)現(xiàn)以上步驟時(shí),參照已有命令的相應(yīng)代碼作適當(dāng)修改即可。

2.2 為nand命令添加新參數(shù)

根據(jù)以上分析,下面給nand命令添加write.yaffs參數(shù),從而實(shí)現(xiàn)對(duì)Yaffs鏡像的支持。按照第2.1節(jié)中的步驟,由于nand命令已經(jīng)實(shí)現(xiàn),僅需要修改com-mon/cmd_nand.c文件即可。

(1)在common/cmd_nand.c文件的U_BOOT_CMD()宏函數(shù)中仿照其他參數(shù),添加該參數(shù)的使用說(shuō)明

定義讀寫操作的結(jié)構(gòu)體原型中一部分參數(shù)沒(méi)有使用,這些參數(shù)與選擇ECC的方式有關(guān),由于Yaffs文件系統(tǒng)已包含了OOB數(shù)據(jù),故不使用這些參數(shù)。另外, opts.skipfirstblk是向nand_write_options_t結(jié)構(gòu)體中新添加的變量,因此需要修改該結(jié)構(gòu)體。在 include/nand.h中,向struct nand_write_options結(jié)構(gòu)體添加如下變量定義:

如何在U-Boot中實(shí)現(xiàn)對(duì)Yaffs鏡像的設(shè)計(jì)?

int skipfirstblk;

此外,需要再修改nand_write_opts函數(shù),以增加對(duì)此變量的支持。

2.3 修改nand_write_opts函數(shù)

在drivers/nand/nand_util.c中,根據(jù)其代碼,在while(blockstart!=(mtdoffset&(~erasesize_blockalign+1)))循環(huán)體之后添加如下代碼:

如何在U-Boot中實(shí)現(xiàn)對(duì)Yaffs鏡像的設(shè)計(jì)?

通過(guò)以上步驟,U-Boot已經(jīng)可以支持Yaffs文件系統(tǒng)鏡像的讀寫。一般地,在進(jìn)行NAND FLASH寫操作時(shí),可以先通過(guò)串口或網(wǎng)絡(luò)等接口將數(shù)據(jù)下載到內(nèi)存中,進(jìn)而按照命令格式將其燒寫到NAND FLASH中。例如:

如何在U-Boot中實(shí)現(xiàn)對(duì)Yaffs鏡像的設(shè)計(jì)?

在U-Boot中使用以上三條命令,將名為test.yaffs的Yaffs文件系統(tǒng)鏡像下載到內(nèi)存中,然后擦除一塊FLASH空間,最后用Nand Write.yaffs命令將其寫入NAND FLASH.燒寫完畢后會(huì)提示:

Writing data at 0xd67200-100%complete.

3663264 bytes written:OK

另外,由于沒(méi)有使用ECC,燒寫過(guò)程中會(huì)有大量如下提示:

Writing data without ECC to NAND_FLASH is not recom-mended

事實(shí)上,ECC數(shù)據(jù)在生成Yaffs鏡像時(shí)已經(jīng)包含在鏡像里,因此這里的提示并沒(méi)有關(guān)系。在drivers/nand/nand_basec.c文件中,將nand_write_page函數(shù)中case NAND_ECC_NONE:語(yǔ)句分支中的printk函數(shù)注釋掉即可消除此提示。

如何在U-Boot中實(shí)現(xiàn)對(duì)Yaffs鏡像的設(shè)計(jì)?

3 Yaffs文件系統(tǒng)的性能

在實(shí)際使用中,一般CPU的運(yùn)行速度遠(yuǎn)大于FLASH的讀寫速度,所以yaffs文件系統(tǒng)的讀寫速度主要由具體FLASH芯片的讀寫時(shí)間延遲來(lái)決定。

對(duì)于常使用的Yaffs 2,寫操作的速度為1.5~4.5 MB/S,讀操作的速度為7.6~16.7 MB/S,刪除操作為7.8~62.5 MB/s,垃圾回收為2.1~7.7 MB/s.由于一般嵌入式系統(tǒng)數(shù)據(jù)交換量不大,所以該文件系統(tǒng)完全能夠滿足一般實(shí)時(shí)性操作的要求。

此外,作為日志型文件系統(tǒng),Yaffs文件系統(tǒng)能夠有效地保護(hù)數(shù)據(jù)完整性,避免系統(tǒng)掉電等情況對(duì)數(shù)據(jù)產(chǎn)生的破壞。同時(shí),與其他FLASH文件系統(tǒng)相比,Yaffs文件系統(tǒng)的實(shí)現(xiàn)給NAND型FLASH帶來(lái)了很多優(yōu)化,在速度、內(nèi)存占用以及能耗等方面都有更好的表現(xiàn)。

4 結(jié) 語(yǔ)

這里在分析Yaffs文件系統(tǒng)基本結(jié)構(gòu)的基礎(chǔ)上,通過(guò)為U-Boot已有命令添加新的參數(shù),實(shí)現(xiàn)了U- Boot讀寫Yaffs文件系統(tǒng)鏡像的支持。最后通過(guò)一個(gè)簡(jiǎn)單試驗(yàn)進(jìn)行了驗(yàn)證。結(jié)果表明,燒寫入FLASH中的文件系統(tǒng)鏡像可以被嵌入式Linux等操作系統(tǒng)的內(nèi)核掛載使用。方便了嵌入式系統(tǒng)的Yaffs根文件系統(tǒng)鏡像的創(chuàng)建和調(diào)試。YAFFS是專門為NAND閃存設(shè)計(jì)的,它的出現(xiàn)使得價(jià)格低廉的NAND閃存芯片具有了高效性和健壯性。YAFFS文件系統(tǒng)性能優(yōu)越且易于移植,已經(jīng)成功應(yīng)用于Linux、mClinux和Windows CE等嵌入式操作系統(tǒng)上。現(xiàn)在,每頁(yè)大小為2Kb的新型超大容量NAND閃存已經(jīng)出現(xiàn),針對(duì)這種Flash的文件系統(tǒng)YAFFS2正處于研究和應(yīng)用當(dāng)中??梢灶A(yù)見(jiàn),基于NAND閃存的文件系統(tǒng)YAFFS/ YAFFS2將會(huì)應(yīng)用于更多的嵌入式系統(tǒng)



:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 芯片
    +關(guān)注

    關(guān)注

    456

    文章

    50949

    瀏覽量

    424718
  • 嵌入式
    +關(guān)注

    關(guān)注

    5087

    文章

    19145

    瀏覽量

    306113
  • NAND
    +關(guān)注

    關(guān)注

    16

    文章

    1685

    瀏覽量

    136229
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    U-boot的基本介紹

    從本文開(kāi)始,將陸續(xù)推送“手把手教你移植U-boot”系列文章,目標(biāo)是由淺入深地講解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默認(rèn)硬件開(kāi)發(fā)平臺(tái)為ARM,操作系統(tǒng)為L(zhǎng)inux。
    發(fā)表于 07-14 16:52 ?2974次閱讀
    <b class='flag-5'>U-boot</b>的基本介紹

    U-boot的執(zhí)行流程

    本文主要講述了U-boot的執(zhí)行流程。
    發(fā)表于 07-14 16:58 ?719次閱讀
    <b class='flag-5'>U-boot</b>的執(zhí)行流程

    U-Boot的啟動(dòng)及移植分析

    bootloader 開(kāi)發(fā)是嵌入式系統(tǒng)必不可少而且十分重要的部分,U-Boot 為功能強(qiáng)大的bootloader 開(kāi)發(fā)軟件。本文詳細(xì)分析了U-Boot 的啟動(dòng)流程,并結(jié)合其源碼,闡述了U-Boot 在S3C2410 目標(biāo)板上的
    發(fā)表于 09-01 16:34 ?27次下載

    Porting U-Boot to the Control

    In this paper, the way of porting U-Boot to Control Computer Based MPC8349 will beintroduced
    發(fā)表于 01-25 15:45 ?13次下載

    一種在U-BOOT嵌入千兆網(wǎng)絡(luò)功能的方法

    一種在U-BOOT嵌入千兆網(wǎng)絡(luò)功能的方法摘 要:U-BOOT是一種開(kāi)放源碼的、用于多種嵌入式微處理器的引導(dǎo)加載程序,目前U-BOOT僅支持10M/100M網(wǎng)絡(luò)功能。本文介紹了一種讓
    發(fā)表于 02-05 17:38 ?17次下載

    u-boot的Makefile分析

    u-boot的Makefile分析 U-BOOT是一個(gè)LINUX下的工程,在編譯之前必須已經(jīng)安裝對(duì)應(yīng)體系結(jié)構(gòu)的交叉編譯環(huán)境,這里只針對(duì)ARM,編譯器系列軟件為arm-linux-*。 U-BOOT的下載
    發(fā)表于 05-17 09:16 ?2074次閱讀

    基于S3C2440的U-Boot開(kāi)機(jī)logo的設(shè)計(jì)

    在對(duì)U-Boot進(jìn)行深入分析的基礎(chǔ)上,同時(shí)對(duì)S3C2440的LCD控制器原理以及INNOLUX 7寸LCD的成像原理進(jìn)行分析,最后結(jié)合系統(tǒng)軟硬件特性實(shí)現(xiàn)基于U-Boot的開(kāi)機(jī)logo。通過(guò)實(shí)驗(yàn)驗(yàn)證表明,在
    發(fā)表于 12-06 15:14 ?96次下載
    基于S3C2440的<b class='flag-5'>U-Boot</b>開(kāi)機(jī)logo的設(shè)計(jì)

    u-boot簡(jiǎn)介

    演化而來(lái)。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實(shí)上,不少U-Boot源碼就是根據(jù)相應(yīng)的Linux內(nèi)核源程序進(jìn)行簡(jiǎn)化而形成的,尤其是一些設(shè)備的驅(qū)動(dòng)程序,這從U-Boot源碼的注釋能體現(xiàn)這一點(diǎn)
    發(fā)表于 10-14 11:17 ?3578次閱讀

    fireflyAIO-3399J主板U-Boot使用介紹

    RK U-Boot 基于開(kāi)源的 U-Boot 進(jìn)行開(kāi)發(fā),工作模式有啟動(dòng)加載模式和下載模式。
    的頭像 發(fā)表于 12-24 10:00 ?1672次閱讀
    fireflyAIO-3399J主板<b class='flag-5'>U-Boot</b>使用介紹

    深度解析U-Boot網(wǎng)絡(luò)實(shí)現(xiàn)

    對(duì)于U-Boot而言,并沒(méi)有完整的實(shí)現(xiàn)上述模型,u-boot需要控制固件的尺寸,所以根據(jù)需要做了一些簡(jiǎn)化,其拓?fù)淇蚣苋缦聢D所示:
    發(fā)表于 02-07 11:53 ?2次下載
    深度解析<b class='flag-5'>U-Boot</b>網(wǎng)絡(luò)<b class='flag-5'>實(shí)現(xiàn)</b>

    U-Boot架構(gòu)淺析

    導(dǎo)讀:嵌入式Linux系統(tǒng)搭建,bootloader是必不可少的一環(huán),而U-Boot已成嵌入式Linux事實(shí)標(biāo)準(zhǔn)。所以較為深入的分析U-Boot的設(shè)計(jì),對(duì)于更...
    發(fā)表于 02-07 11:56 ?7次下載
    <b class='flag-5'>U-Boot</b>架構(gòu)淺析

    u-boot中使用ethernet的方法

    KV260 petalinux BSP在u-boot device treedisable了GEM3,也就是說(shuō)ethernet在u-boot不建議使用ethernet。
    的頭像 發(fā)表于 07-21 10:25 ?3968次閱讀

    在Vitis調(diào)試ARM可信固件和U-boot

    在本篇博文中,我們將探討如何在 Vitis 調(diào)試 Zynq UltraScale 器件啟動(dòng)鏡像。這些啟動(dòng)鏡像包括 ARM 可信固件 (ATF) 和
    的頭像 發(fā)表于 08-02 10:14 ?3695次閱讀
    在Vitis<b class='flag-5'>中</b>調(diào)試ARM可信固件和<b class='flag-5'>U-boot</b>

    Linux U-Boot開(kāi)發(fā)指南

    介紹 U-Boot 的編譯打包、基本配置、常用命令的使用、基本調(diào)試方法等, 為 U-BOOT 的移植及應(yīng)用開(kāi)發(fā)提供了基礎(chǔ)。
    的頭像 發(fā)表于 03-06 10:28 ?1342次閱讀
    Linux <b class='flag-5'>U-Boot</b>開(kāi)發(fā)指南

    u-boot armv8鏈接腳本

    armv8u-boot使用arch/arm/cpu/armv8/u-boot.lds進(jìn)行鏈接。 u-boot-spl和u-boot-tp
    的頭像 發(fā)表于 12-07 11:19 ?719次閱讀