精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在U-Boot中實現對Yaffs鏡像的設計?

電子設計 ? 作者:電子設計 ? 2018-08-29 05:02 ? 次閱讀

0 引 言

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

1 相關工作簡介

1.1 Yaffs文件系統結構簡述

目前,嵌入式系統中常用的FLASH文件系統有Cramfs,Jffs 2,Yaffs,exfat等。Cramfs是一種壓縮型只讀型文件系統,其在系統啟動時解壓至內存中運行。Jffs 2,Yaffs,Exfat等是可讀寫型文件系統,Jffs 2一般應用于NOR型FLASH;Exfat不是開源的文件系統實現,一般應用于Windows CE操作系統中。

通常一個NAND FLASH存儲設備由若干塊組成;1個塊由若干頁組成。一般128 MB以下容量的NAND FLASH芯片,一頁大小為528 B,依次分為2個256 B的主數據區和16 B的額外空間;128 MB以上容量的NAND FLASH芯片,一頁大小通常為2 KB.由于NAND FLASH出現位反轉的概率較大,一般在讀寫時需要使用ECC進行錯誤檢驗和恢復。

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

Yaffs文件系統有些類似于JFFS/JFFS2文件系統,與之不同的是JFFS1/2文件系統最初是針對NOR FLASH的應用場合設計的,而NOR FLASH和NAND FLASH本質上有較大的區別,所以盡管JFFS1/2 文件系統也能應用于NAND FLASH,但由于它在內存占用和啟動時間方面針對NOR的特性做了一些取舍,所以對NAND來說通常并不是最優的方案。

Yaffs文件系統的設計充分考慮到NAND FLASH以頁為存取單位等的特點,將文件組織成固定大小的段(Chunk)。以528 B的頁為例,Yaffs文件系統使用前512 B存儲數據、16 B的額外空間,用以存放數據的ECC和文件系統的組織信息等(稱為OOB數據)。通過OOB數據,不但能實現錯誤檢測和壞塊處理;同時可以避免加載時對整個存儲介質的掃描,加快了文件系統的加載速度。一個頁面的具體結構如表1所示。

如何在U-Boot中實現對Yaffs鏡像的設計?

由此可知,與其他文件系統相比,在生成Yaffs鏡像時就包含了OOB數據,所以在燒寫Yaffs鏡像時,不需要計算ECC,僅依次寫入512 B的數據和16 B的OOB數據即可。同時,Yaffs鏡像要使用分區上的第一個塊來存儲一個名為Yaffs_ObjectHeader的結構體。該結構體記錄了該分區中的文件、路徑以及相關的鏈接,所以在燒寫時還需要跳過第一個可用的塊。Yaffs文件系統目前常用的版本為Yaffs 2,性能在許多方面都有了很大的提高。

1.2 U-Boot對常見文件系統的支持

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

U-Boot沒有提供對Yaffs文件系統的讀寫支持。但由于該文件系統的讀寫過程與其他文件系統的讀寫類似,因此可以通過修改U-Boot的FLASH讀寫命令,增加處理00B區域數據的功能,即可以實現對Yaffs文件系統的讀寫支持。

2 具體實現

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

2.1 為U-Boot添加新的命令

實際上,U-Boot中已經實現了所需的nand命令,只要編寫好正確的NAND FLASH驅動程序,并定義相應的宏,就可實現對NAND FLASH的基本讀寫操作。欲添加對Yaffs鏡像的支持,只要實現一個新的參數即可。為了給下述工作一個清晰的步驟,在此先簡述如何向U-Boot中添加一個新命令。以下所述的路徑均在U-Boot源碼目錄下。

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

(2)在common/cmd_name.c中實現命令操作的具體代碼,文件名中的name即為相應命令的名稱。在這個文件中,首先要編寫命令的實現函數;此外還要使用一個U_BOOT_CMD()的宏函數來填寫該命令的cmd_tbl_t結構體。該結構體的原型是在include\command.h 中定義的,包含相應命令的名稱、參數個數、實現函數、用法說明、幫助等信息。

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

在實現以上步驟時,參照已有命令的相應代碼作適當修改即可。

2.2 為nand命令添加新參數

根據以上分析,下面給nand命令添加write.yaffs參數,從而實現對Yaffs鏡像的支持。按照第2.1節中的步驟,由于nand命令已經實現,僅需要修改com-mon/cmd_nand.c文件即可。

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

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

如何在U-Boot中實現對Yaffs鏡像的設計?

int skipfirstblk;

此外,需要再修改nand_write_opts函數,以增加對此變量的支持。

2.3 修改nand_write_opts函數

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

如何在U-Boot中實現對Yaffs鏡像的設計?

通過以上步驟,U-Boot已經可以支持Yaffs文件系統鏡像的讀寫。一般地,在進行NAND FLASH寫操作時,可以先通過串口或網絡等接口將數據下載到內存中,進而按照命令格式將其燒寫到NAND FLASH中。例如:

如何在U-Boot中實現對Yaffs鏡像的設計?

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

Writing data at 0xd67200-100%complete.

3663264 bytes written:OK

另外,由于沒有使用ECC,燒寫過程中會有大量如下提示:

Writing data without ECC to NAND_FLASH is not recom-mended

事實上,ECC數據在生成Yaffs鏡像時已經包含在鏡像里,因此這里的提示并沒有關系。在drivers/nand/nand_basec.c文件中,將nand_write_page函數中case NAND_ECC_NONE:語句分支中的printk函數注釋掉即可消除此提示。

如何在U-Boot中實現對Yaffs鏡像的設計?

3 Yaffs文件系統的性能

在實際使用中,一般CPU的運行速度遠大于FLASH的讀寫速度,所以yaffs文件系統的讀寫速度主要由具體FLASH芯片的讀寫時間延遲來決定。

對于常使用的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.由于一般嵌入式系統數據交換量不大,所以該文件系統完全能夠滿足一般實時性操作的要求。

此外,作為日志型文件系統,Yaffs文件系統能夠有效地保護數據完整性,避免系統掉電等情況對數據產生的破壞。同時,與其他FLASH文件系統相比,Yaffs文件系統的實現給NAND型FLASH帶來了很多優化,在速度、內存占用以及能耗等方面都有更好的表現。

4 結 語

這里在分析Yaffs文件系統基本結構的基礎上,通過為U-Boot已有命令添加新的參數,實現了U- Boot讀寫Yaffs文件系統鏡像的支持。最后通過一個簡單試驗進行了驗證。結果表明,燒寫入FLASH中的文件系統鏡像可以被嵌入式Linux等操作系統的內核掛載使用。方便了嵌入式系統的Yaffs根文件系統鏡像的創建和調試。YAFFS是專門為NAND閃存設計的,它的出現使得價格低廉的NAND閃存芯片具有了高效性和健壯性。YAFFS文件系統性能優越且易于移植,已經成功應用于Linux、mClinux和Windows CE等嵌入式操作系統上。現在,每頁大小為2Kb的新型超大容量NAND閃存已經出現,針對這種Flash的文件系統YAFFS2正處于研究和應用當中。可以預見,基于NAND閃存的文件系統YAFFS/ YAFFS2將會應用于更多的嵌入式系統



:

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    453

    文章

    50406

    瀏覽量

    421833
  • 嵌入式
    +關注

    關注

    5068

    文章

    19019

    瀏覽量

    303292
  • NAND
    +關注

    關注

    16

    文章

    1677

    瀏覽量

    136022
收藏 人收藏

    評論

    相關推薦

    U-boot的基本介紹

    從本文開始,將陸續推送“手把手教你移植U-boot”系列文章,目標是由淺入深地講解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默認硬件開發平臺為ARM,操作系統為Linux。
    發表于 07-14 16:52 ?2777次閱讀
    <b class='flag-5'>U-boot</b>的基本介紹

    U-boot的執行流程

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

    U-Boot的啟動及移植分析

    bootloader 開發是嵌入式系統必不可少而且十分重要的部分,U-Boot 為功能強大的bootloader 開發軟件。本文詳細分析了U-Boot 的啟動流程,并結合其源碼,闡述了U-Boot 在S3C2410 目標板上的
    發表于 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
    發表于 01-25 15:45 ?13次下載

    一種在U-BOOT嵌入千兆網絡功能的方法

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

    u-boot的Makefile分析

    u-boot的Makefile分析 U-BOOT是一個LINUX下的工程,在編譯之前必須已經安裝對應體系結構的交叉編譯環境,這里只針對ARM,編譯器系列軟件為arm-linux-*。 U-BOOT的下載
    發表于 05-17 09:16 ?2057次閱讀

    基于S3C2440的U-Boot開機logo的設計

    在對U-Boot進行深入分析的基礎上,同時對S3C2440的LCD控制器原理以及INNOLUX 7寸LCD的成像原理進行分析,最后結合系統軟硬件特性實現基于U-Boot的開機logo。通過實驗驗證表明,在
    發表于 12-06 15:14 ?96次下載
    基于S3C2440的<b class='flag-5'>U-Boot</b>開機logo的設計

    u-boot簡介

    演化而來。其源碼目錄、編譯形式與Linux內核很相似,事實上,不少U-Boot源碼就是根據相應的Linux內核源程序進行簡化而形成的,尤其是一些設備的驅動程序,這從U-Boot源碼的注釋能體現這一點
    發表于 10-14 11:17 ?3540次閱讀

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

    RK U-Boot 基于開源的 U-Boot 進行開發,工作模式有啟動加載模式和下載模式。
    的頭像 發表于 12-24 10:00 ?1615次閱讀
    fireflyAIO-3399J主板<b class='flag-5'>U-Boot</b>使用介紹

    深度解析U-Boot網絡實現

    對于U-Boot而言,并沒有完整的實現上述模型,u-boot需要控制固件的尺寸,所以根據需要做了一些簡化,其拓撲框架如下圖所示:
    發表于 02-07 11:53 ?2次下載
    深度解析<b class='flag-5'>U-Boot</b>網絡<b class='flag-5'>實現</b>

    U-Boot架構淺析

    導讀:嵌入式Linux系統搭建,bootloader是必不可少的一環,而U-Boot已成嵌入式Linux事實標準。所以較為深入的分析U-Boot的設計,對于更...
    發表于 02-07 11:56 ?7次下載
    <b class='flag-5'>U-Boot</b>架構淺析

    u-boot中使用ethernet的方法

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

    在Vitis調試ARM可信固件和U-boot

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

    Linux U-Boot開發指南

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

    u-boot armv8鏈接腳本

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