S3C2440從NAND Flash啟動和NOR FLASH啟動的問題
1.為什麼NAND FLASH不能直接執行程式
NAND FLASH本身是連線到了控制器上而不是系統匯流排上。CPU執行機制為:CPU啟動後是要取指令執行的,如果是SROM、NOR FLASH 等之類的,CPU 透過地址線發個地址就可以取得指令並執行,NAND FLASH不行,因為NAND FLASH 是管腳複用,它有自己的一套時序,這樣CPU無法取得可以執行的程式碼,也就不能初始化系統了。
NAND FLASH是順序存取裝置,不能夠被隨機訪問,程式就不能夠分支或跳轉,這樣你如何去設計程式。
U-BOOT 支援ARM、 PowerPC等多種架構的處理器,也支援Linux、NetBSD和VxWorks等多種作業系統,主要用來開發嵌入式系統初始化程式碼 bootloader。bootloader是晶片復位後進入作業系統之前執行的一段程式碼,完成由硬體啟動到作業系統啟動的過渡,為執行作業系統提供基本的執行環境,如初始化CPU、堆疊、初始化儲存器系統等,其功能類似於PC機的BIOS。
2.為什麼s3c2440可以從NAND FLASH啟動
椐瞭解 NOR FLASH 是容量小,速度快,穩定性好,適合做程式儲存器。
NAND FLASH 總容量大,適合做資料儲存器是不能從NAND FLASH啟動的,NAND FLASH是的讀寫時序是不能直接有ARM硬體產生的,要讀寫NAND FLASH是要透過程式來實現的,很明顯能看出來的就是NAND FLASH只有8個資料、地址複用的資料地址介面。2410/2440可以直接從NAND FLASH啟動的,因為它把NAND前面的4K對映到了RAM的空間
2.1 Flash種類
NOR FLASH地址線和資料線分開,來了地址和控制訊號,資料就出來。
NAND Flash地址線和資料線在一起,需要用程式來控制,才能出資料。
通俗的說,就是光給地址不行,要先命令,再給地址,才能讀到NAND的資料。而且都是在一個匯流排完成的。
結論是:ARM無法從NAND直接啟動。除非裝載完程式,才能使用NAND Flash.
裝載程式只能從mask rom 或者Nor flash。
三星的2410可以從NAND FLASH啟動程式,它會把第一塊的前4KB複製到內部SRAM中然後從SRAM執行,也就是說,你需要編寫一個長度小於4K的載入程式,作用是將主程式複製到SDRAM中執行(NAND FLASH地址不是線性的,程式不能直接執行,必須複製到線性RAM中)
3.NAND啟動和NOR啟動:
需要檢測硬體啟動方式,啟動方式是由硬體OM0管腳決定的,軟體無法檢測硬體電平狀態,但可以根據CPU的啟動特性來檢測。
3.1 NAND啟動:
如果配置為NAND FLASH啟動(啟動模式選擇開關拔到nand端,此時OM0管腳拉低)S3C2440的NAND控制器會自動把NAND FLASH中的前4K程式碼資料搬到內部SRAM中(地址為0x40000000),同時還把這塊SRAM地址對映到了0x00000000地址。CPU從0x00000000位置開始執行程式。 【從NAND FLASH啟動CPU時,CPU會透過內部的硬體將NAND FLASH開始的4KB資料複製到稱為“Steppingstone”的4KB的內部RAM中(起始地址為0),然後跳到地址0開始執行】
3.2 NOR啟動:
如果配置為NOR FLASH啟動(啟動模式選擇開關拔到nor端,此時OM0管腳拉高),0x00000000就是NOR FLASH實際的起始地址,NOR FLASH中的程式就從這裡開始執行,不涉及到資料複製和地址對映。
3.3 總結:
NAND啟動時,地址0x00000000為內部SRAM對映的地址;
NOR啟動時,地址0x00000000為NOR FLASH的實際起始地址。向NOR FLASH中寫資料需要特定的命令時序,而向記憶體中寫資料可以直接向記憶體地址賦值。
對於S3C2440處理器 M[1:0]選擇01 或 10時:norflash基地址為0x00000000 ,SRAM頂端地址0x40000FFF。上電後處理器直接從0x00000000處取出指令,arm處理器的SP(堆疊指標暫存器)指向0x40000FFF。
OM[1:0]選擇00,S3C2440會啟用內部的SRAM緩衝器會將nandflash中的前4KB大小的程式自動複製到BootSRAM中。BootSRAM基地址0x00000000,頂端0x00000FFF。上電後,arm處理器從0x00000000取出第一條指令,arm處理器的SP(堆疊指標暫存器)指向0x00000FFF。
4.從Nand Flash啟動U-BOOT的基本原理
4.1 前4K問題
如果S3C2410被配置成從Nand Flash啟動(配置由硬體工程師在電路板設定), S3C2410的Nand Flash控制器有一個特殊的功能,在S3C2410上電後,Nand Flash控制器會自動的把Nand Flash上的前4K資料搬移到4K內部RAM中,並把0x00000000設定內部RAM的起始地址,CPU從內部RAM的0x00000000位置開始啟動。這個過程不需要程式干涉。程式設計師需要完成的工作,是把最核心的啟動程式放在Nand Flash的前4K中。
4.2 程式大於4K時怎麼辦?
那麼當程式大於 4k 的時候,當我們以 nand flash啟動後,前面的4Kb 被複製到 片內RAM中去執行(自動完成)。我們在這前4K的程式中初始化SDRAM(SDRAM 使用前需要初始化) ,然後將剩下的程式複製到 SDRAM中(不是隻有4kb 被複製到片內RAM中執行了嘛)然後跳轉到 SDRAM中去執行剩下的程式。
那麼也就是說 通常當程式大於 4kb的 時候,我們就需要把程式複製到SDRAM中去執行。(程式小於4KB 那麼也就可以不用複製了,以nand flash方式 啟動後,程式全被複製到 片內4kb的 RAM中去執行。)
那麼,既然程式大於4kb的時候需要從nand flash中複製到 SDRAM中去執行。自然可以想到 燒到nand flash中的程式前面一部分程式碼應該 是初始化SDRAM(程式最終需要複製到SDRAM中去執行)和 將NAND flash中的剩餘的程式複製到SDRAM中去(全考過去也行,方便點),然後跳轉到SDRAM中執行。
4.2 啟動程式的安排
由於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更換為更高密度、更大容量的,也不必改動電路板。
5.為什麼NOR啟動要將sp設定為0x40000000+4096
用NOR啟動時,片內的儲存控制器的BANK0-BANK7這8個BANK都對應了其他用途,所以設計者在BANK7結束的地址0x40000000的地方作為NOR FLASH的啟動地址,而NAND FLASH啟動的地址則是0x00000000。
因為對於啟動檔案.S來說,4K的空間是足夠存放,程式碼段、BSS…和堆疊段了,因為堆疊的SP是從高地址往低地址移動的,所以要將堆疊的起始地址放在堆疊段的高地址。
你也可以不用設定成4096,但要保證堆疊的長度不能和下面其他段重疊,若重疊,就會出BUG,保險值是4096(4K,見上圖),因為SRAM就是4K設計的。
** 大家的鼓勵是我繼續創作的動力,如果覺得寫的不錯,歡迎關注,點贊,收藏,轉發,謝謝!**
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3705/viewspace-2826697/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- NAND Flash和NOR Flash的區別NaN
- nor flash 和nand flash 傻傻分不清楚NaN
- 宏旺半導體科普SPI NAND Flash和SPI NOR Flash的區別NaN
- NAND FlashNaN
- u-boot-2014.10移植第16天----Nor flash啟動boot
- ZYNQ FLASH+EMMC手動移植LINUX啟動Linux
- u-boot-2014.10移植第28天----nand flash啟動(六)bootNaN
- u-boot-2014.10移植第27天----nand flash啟動(五)bootNaN
- u-boot-2014.10移植第25天----nand flash啟動(三)bootNaN
- u-boot-2014.10移植第26天----nand flash啟動(四)bootNaN
- u-boot-2014.10移植第23天----nand flash啟動(一)bootNaN
- u-boot-2014.10移植第24天----nand flash啟動(二)bootNaN
- u-boot-2014.10移植第29天----nand flash的SPL啟動(一)bootNaN
- u-boot-2014.10移植第30天----nand flash的SPL啟動(二)bootNaN
- 痞子衡嵌入式:在i.MXRT啟動頭FDCB裡使能序列NOR Flash的DTR模式模式
- NAND FLASH的介面控制設計NaN
- Mini2440 64M Nand Flash 更改為128M Nand FlashNaN
- 痞子衡嵌入式:深入i.MXRT1050系列ROM中序列NOR Flash啟動初始化流程
- NAND FLASH系統的權衡利弊NaN
- 痞子衡嵌入式:在i.MXRT啟動頭FDCB裡使能序列NOR Flash的Continuous read模式模式
- rabbitmq的啟動問題MQ
- 關於NAND FLASH解釦的認識NaN
- NAND Flash是如何生產出來的?NaN
- 痞子衡嵌入式:序列NOR Flash的Continuous read模式下軟復位後i.MXRT無法啟動問題解決方案之RESET#模式
- 痞子衡嵌入式:序列NOR Flash的Continuous read模式下軟復位後i.MXRT無法啟動問題解決方案之SW Reset模式
- win10 microsoft edge flash player當前已禁用如何啟動Win10ROS
- 痞子衡嵌入式:在i.MXRT啟動頭FDCB裡配置序列NOR Flash多個暫存器的注意事項
- Nand Flash結構及錯誤機制NaN
- ARM學習之Nand FLash控制器NaN
- 痞子衡嵌入式:導致序列NOR Flash在i.MXRT下無法正常下載/啟動的常見因素之QE bit
- WIN10在哪開啟Flash外掛 win10系統flash外掛怎麼啟用Win10
- 為什麼NOR FLASH仍是汽車行業的優選行業
- 痞子衡嵌入式:瞭解i.MXRT1060系列ROM中序列NOR Flash啟動初始化流程優化點優化
- 痞子衡嵌入式:飛思卡爾i.MX RT系列MCU啟動那些事(9)- 從Parallel NOR啟動Parallel
- ryu啟動問題總結
- windows 卡在正在啟動問題Windows
- Oracle啟動問題處理Oracle
- 資料庫啟動問題資料庫