關於從NAND Flash啟動的問題

2021-05-23 05:27:12 字數 3370 閱讀 7066

椐了解 nor flash 是容量小,速度快,穩定性好,適合做程式儲存器。nand flash 總容量大,適合做資料儲存器是不能從nand flash啟動的,nand flash是的讀寫時序是不能直接有arm硬體產生的,要讀寫nand flash是要通過程式來實現的,很明顯能看出來的就是nand flash只有8個資料、位址復用的資料位址介面,2410/2440可以直接從nand flash啟動的,因為它把nand前面的4k對映到了ram的空間

首先應該先了解flash rom的種類

nor flash位址線和資料線分開,來了位址和控制訊號,資料就出來。

nand flash位址線和資料線在一起,需要用程式來控制,才能出資料。

通俗的說,就是光給位址不行,要先命令,再給位址,才能讀到nand的資料。

而且都是在乙個匯流排完成的。

結論是:arm無法從nand直接啟動。除非裝載完程式,才能使用nand flash.

裝載程式只能從mask rom 或者nor flash.

三星的2410可以從nf啟動程式,它會把第一塊的前4kb複製到內部sram中然後從 sram執行,也就是說,你需要編寫乙個長度小於4k的引導程式,作用是將主程式拷貝到sdram中執行(nf位址不是線性的,程式不能直接執行,必須拷 貝到線性ram中)

從nand flash啟動u-boot的基本原理

-------------------------------------------

前4k的問題

如果s3c2410被配置成從nand flash啟動(配置由硬體工程師在電路板設定 ), s3c2410的nand flash控制器有乙個特殊的功能,在s3c2410上電後,nand flash控制器會自動的把nand flash上的前4k資料搬移到4k內部ram中 ,並把0x00000000設定內部ram的起始位址,cpu從內部ram的0x00000000位置開始啟動。這個過程不需要程式干涉。

程式設計師需要完成的工作,是把最核心的啟動程式放在nand flash的前4k中。

啟動程式的安排

由於nand flash控制器從nand flash中搬移到內部ram的**是有限的,所以在啟動**的前4k裡,我們必須完成s3c2410的核心配置以及把啟動**(u-boot)剩餘部分 搬到ram中執行。

u-boot原始碼不支援從nand flash啟動,可是s3c2410支援從nand flash啟動,開發板(sbc-2410x)加電後s3c2410將nand flash的前4k(儲存有u-boot的部分功能--拷貝功能--把nand flash中的內容拷貝到sdram)拷貝到sram(s3c2410晶元內的sram)。這就需要修改u-boot原始碼,增加u-boot的功能: 使u-boot在得到執行權後能夠將其自身拷貝到開發板上sdram中,以便處理器能夠執行u-boot

.nand flash的命令、位址、資料都通過i/o口傳送,管腳復用,這樣做做的好處是,可以明顯減少nand flash的管腳數目,將來如果設計者想將nand flash更換為更高密度、更大容量的,也不必改動電路板。

nand flash不能夠執行程式,本人總結其原因如下 :

1. nand flash本身是連線到了控制器上而不是系統匯流排上。cpu啟動後是要取指令執行的,如果是srom、nor flash 等之類的,cpu 發個位址就可以取得指令並執行,nand flash不行,因為nand flash 是管腳復用,它有自己的一套時序,這樣cpu無法取得可以執行的**,也就不能初始化系統了。

2. nand flash是順序訪問裝置,不能夠被隨機訪問,程式就不能夠分支或跳轉,這樣你如何去設計程式。

u-boot 支援arm、 powerpc等多種架構的處理器,也支援linux、netbsd和vxworks等多種作業系統,主要用來開發嵌入式系統初始化** bootloader。bootloader是晶元復位後進入作業系統之前執行的一段**,完成由硬體啟動到作業系統啟動的過渡,為執行作業系統提供基本 的執行環境,如初始化cpu、堆疊、初始化儲存器系統等,其功能類似於pc機的bios.

nand快閃儲存器工作原理

s3c2410開發板的nand快閃儲存器由nand快閃儲存器控制器(整合在s3c2410 cpu中)和nand快閃儲存器晶元(k9f1208u0a)兩大部分組成。當要訪問nand快閃儲存器晶元中的資料時,必須通過nand快閃儲存器控制器傳送命令才能完 成。所以, nand快閃儲存器相當於s3c2410的乙個外設,而不位於它的記憶體位址區。

nand快閃儲存器(k9f1208u0a)的資料儲存結構分層為:1裝置(device) = 4096 塊(block);1塊= 32頁/行(page/row);1頁= 528b = 資料塊 (512b) + oob塊 (16b)

在每一頁中,最後16個位元組(又稱oob)在nand快閃儲存器命令執行完畢後設定狀態,剩餘512個位元組又分為前半部分和後半部分。可以通過nand快閃儲存器命令 00h/01h/50h分別對前半部、後半部、oob進行定位,通過nand快閃儲存器內建的指標指向各自的首位址。

nand快閃儲存器的操作特點為:擦除操作的最小單位是塊;nand快閃儲存器晶元每一位只能從1變為0,而不能從0變為1,所以在對其進行寫入操作之前一定要將相應 塊擦除;oob部分的第6位元組為壞快標誌,即如果不是壞塊該值為ff,否則為壞塊;除oob第6位元組外,通常用oob的前3個位元組存放nand快閃儲存器的硬體 ecc(校驗暫存器)碼;

從nand快閃儲存器啟動u-boot的設計思路

如果s3c2410被配置成從nand快閃儲存器啟動,上電後,s3c2410的nand快閃儲存器控制器會自動把nand快閃儲存器中的前4k資料搬移到內部ram中, 並把0x00000000設定為內部ram的起始位址, cpu從內部ram的0x00000000位置開始啟動。因此要把最核心的啟動程式放在nand快閃儲存器的前4k中。

由於nand快閃儲存器控制器從nand快閃儲存器中搬移到內部ram的**是有限的,所以, 在啟動**的前4k裡,必須完成s3c2410的核心配置,並把啟動**的剩餘部分搬到ram中執行。在u-boot中, 前4k完成的主要工作就是u-boot啟動的第乙個階段(stage1)。

根據u-boot的執行流程圖,可知要實現從nand快閃儲存器中啟動u-boot,首先需要初始化nand快閃儲存器,並從nand快閃儲存器中把u-boot搬移到 ram中,最後需要讓u-boot支援nand快閃儲存器的命令操作。

結語

以往將u-boot移植到arm9平台中的解決方案主要針對的是arm9中的nor快閃儲存器,因為nor快閃儲存器的結構特點致使應用程式可以直接在其內部執行,不 用把**讀到ram中,移植過程相對簡單。從nand快閃儲存器中啟動u-boot的設計難點在於nand快閃儲存器需要把u-boot的**搬移到ram中,並要讓 u-boot支援nand快閃儲存器的命令操作。本文介紹了實現這一設計的思路及具體程式。移植後,u-boot在嵌入式系統中執行良好。

關於NandFlash 啟動問題

最初學習嵌入式linux驅動時,按照韋東山老師的移植教程糊里糊塗的完成了2440的norflash和nandflash的啟動,但並不明白所以然,所以就花時間研究一下,解除心中的疑惑。並附上韋東山的講解 如下圖2440的記憶體對映所示 norflash啟動 根據手冊可知,當晶元配置為norflash啟...

nandflash的啟動原理

大部分arm9的cpu內部都整合有乙個sram,sram是英文static ram的縮寫,它是一種具有靜止訪問功能的記憶體,不需要重新整理電路即能儲存它內部儲存的資料。這樣他不需要初始化就能夠直接使用。這與我們在外部擴充套件的大容量的sdram是不一樣的,外部大容量的sdram是需要初始化後才能使用...

nandflash啟動理解

有很多同學在移植u boot時,都會對s3c2440從nand flash啟動的過程非常迷惑。這裡發這個帖子給大家介紹一下它的啟動流程。大部分arm9的cpu內部都整合有乙個sram,sram是英文static ram的縮寫,它是一種具有靜止訪問功能的記憶體,不需要重新整理電路即能儲存它內部儲存的資...